FsMove performs batch move (individual item permission checks skipped for performance).
(c *gin.Context)
| 67 | |
| 68 | // FsMove performs batch move (individual item permission checks skipped for performance). |
| 69 | func FsMove(c *gin.Context) { |
| 70 | var req MoveCopyReq |
| 71 | if err := c.ShouldBind(&req); err != nil { |
| 72 | common.ErrorResp(c, err, 400) |
| 73 | return |
| 74 | } |
| 75 | if len(req.Names) == 0 { |
| 76 | common.ErrorStrResp(c, "Empty file names", 400) |
| 77 | return |
| 78 | } |
| 79 | user := c.Request.Context().Value(conf.UserKey).(*model.User) |
| 80 | if !user.CanMove() { |
| 81 | common.ErrorResp(c, errs.PermissionDenied, 403) |
| 82 | return |
| 83 | } |
| 84 | srcDir, err := user.JoinPath(req.SrcDir) |
| 85 | if err != nil { |
| 86 | common.ErrorResp(c, err, 403) |
| 87 | return |
| 88 | } |
| 89 | srcMeta, err := op.GetNearestMeta(srcDir) |
| 90 | if err != nil && !errors.Is(errors.Cause(err), errs.MetaNotFound) { |
| 91 | common.ErrorResp(c, err, 500, true) |
| 92 | return |
| 93 | } |
| 94 | if !common.CanWrite(user, srcMeta, srcDir) { |
| 95 | common.ErrorResp(c, errs.PermissionDenied, 403) |
| 96 | return |
| 97 | } |
| 98 | dstDir, err := user.JoinPath(req.DstDir) |
| 99 | if err != nil { |
| 100 | common.ErrorResp(c, err, 403) |
| 101 | return |
| 102 | } |
| 103 | dstMeta, err := op.GetNearestMeta(dstDir) |
| 104 | if err != nil && !errors.Is(errors.Cause(err), errs.MetaNotFound) { |
| 105 | common.ErrorResp(c, err, 500, true) |
| 106 | return |
| 107 | } |
| 108 | if !common.CanWrite(user, dstMeta, dstDir) { |
| 109 | common.ErrorResp(c, errs.PermissionDenied, 403) |
| 110 | return |
| 111 | } |
| 112 | if !strings.HasSuffix(srcDir, "/") { |
| 113 | srcDir += "/" |
| 114 | } |
| 115 | for i, name := range req.Names { |
| 116 | // ensure req.Names is not a relative path |
| 117 | srcPath := stdpath.Join(srcDir, name) |
| 118 | if !strings.HasPrefix(srcPath+"/", srcDir) { |
| 119 | req.Names[i] = "" |
| 120 | continue |
| 121 | } |
| 122 | req.Names[i] = srcPath |
| 123 | if !req.Overwrite { |
| 124 | base := stdpath.Base(srcPath) |
| 125 | if base == "." || base == "/" { |
| 126 | common.ErrorStrResp(c, fmt.Sprintf("invalid file name [%s]", name), 400) |
nothing calls this directly
no test coverage detected