From 7410fd4edaf021c21b4523e0891c0ddefcb4ed4c Mon Sep 17 00:00:00 2001 From: mkitsdts Date: Mon, 12 Jan 2026 10:05:36 +0800 Subject: [PATCH 01/12] fix(webdav/drivers):add errors check --- drivers/189pc/driver.go | 20 +++++++++++++------- drivers/189pc/types.go | 38 ++++++++++++++++++++++++++++++++++++++ internal/op/fs.go | 4 ++-- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/drivers/189pc/driver.go b/drivers/189pc/driver.go index 6aa06c068..af719401d 100644 --- a/drivers/189pc/driver.go +++ b/drivers/189pc/driver.go @@ -271,29 +271,35 @@ func (y *Cloud189PC) Rename(ctx context.Context, srcObj model.Obj, newName strin queryParam["familyId"] = y.FamilyID } - var newObj model.Obj - switch f := srcObj.(type) { + switch srcObj.(type) { case *Cloud189File: fullUrl += "/renameFile.action" queryParam["fileId"] = srcObj.GetID() queryParam["destFileName"] = newName - newObj = &Cloud189File{Icon: f.Icon} // 复用预览 case *Cloud189Folder: fullUrl += "/renameFolder.action" queryParam["folderId"] = srcObj.GetID() queryParam["destFolderName"] = newName - newObj = &Cloud189Folder{} default: return nil, errs.NotSupport } - + var resp RenameResp _, err := y.request(fullUrl, method, func(req *resty.Request) { req.SetContext(ctx).SetQueryParams(queryParam) - }, nil, newObj, isFamily) + }, nil, resp, isFamily) if err != nil { + if resp.ResCode == "FileAlreadyExists" { + return nil, errs.ObjectAlreadyExists + } return nil, err } - return newObj, nil + switch f := srcObj.(type) { + case *Cloud189File: + return resp.toFile(f), nil + case *Cloud189Folder: + return resp.toFolder(), nil + } + return nil, errs.NotSupport } func (y *Cloud189PC) Copy(ctx context.Context, srcObj, dstDir model.Obj) error { diff --git a/drivers/189pc/types.go b/drivers/189pc/types.go index 32996debd..eed447e25 100644 --- a/drivers/189pc/types.go +++ b/drivers/189pc/types.go @@ -427,3 +427,41 @@ type CapacityResp struct { } `json:"familyCapacityInfo"` TotalSize uint64 `json:"totalSize"` } + +type RenameResp struct { + ResMsg string `json:"res_message"` + CreateDate Time `json:"createDate"` + FileCate int `json:"fileCata"` + ID string `json:"id"` + LastOpTime Time `json:"lastOpTime"` + MD5 string `json:"md5"` + MediaType int `json:"mediaType"` + Name string `json:"name"` + Oeientation int `json:"orientation"` + ParentID int64 `json:"parentId"` + Rev string `json:"rev"` + Size int64 `json:"size"` + ResCode string `json:"res_code"` +} + +func (r *RenameResp) toFile(f *Cloud189File) *Cloud189File { + return &Cloud189File{ + ID: String(r.ID), + Name: r.Name, + Size: r.Size, + Md5: r.MD5, + LastOpTime: r.LastOpTime, + CreateDate: r.CreateDate, + Icon: f.Icon, + } +} + +func (r *RenameResp) toFolder() *Cloud189Folder { + return &Cloud189Folder{ + ID: String(r.ID), + Name: r.Name, + ParentID: r.ParentID, + LastOpTime: r.LastOpTime, + CreateDate: r.CreateDate, + } +} diff --git a/internal/op/fs.go b/internal/op/fs.go index 5116bbef5..5c5e63988 100644 --- a/internal/op/fs.go +++ b/internal/op/fs.go @@ -470,7 +470,7 @@ func Rename(ctx context.Context, storage driver.Driver, srcPath, dstName string) return errs.NotImplement } if err != nil { - return errors.WithStack(err) + return err } dirKey := Key(storage, stdpath.Dir(srcPath)) @@ -632,7 +632,7 @@ func Put(ctx context.Context, storage driver.Driver, dstDirPath string, file mod } else if storage.Config().NoOverwriteUpload { // try to rename old obj err = Rename(ctx, storage, dstPath, tempName) - if err != nil { + if err != nil && err != errs.ObjectAlreadyExists { return err } } else { From d0cdc6426e421e502974a3aae0c7f60414336132 Mon Sep 17 00:00:00 2001 From: mkitsdts Date: Thu, 22 Jan 2026 20:30:31 +0800 Subject: [PATCH 02/12] chore(pkg/error):add errs.IsObjectAlreadyExists function --- internal/errs/object.go | 4 ++++ internal/op/fs.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/errs/object.go b/internal/errs/object.go index ab78f314a..6f4befb2e 100644 --- a/internal/errs/object.go +++ b/internal/errs/object.go @@ -17,3 +17,7 @@ var ( func IsObjectNotFound(err error) bool { return errors.Is(pkgerr.Cause(err), ObjectNotFound) } + +func IsObjectAlreadyExists(err error) bool { + return errors.Is(pkgerr.Cause(err), ObjectAlreadyExists) +} diff --git a/internal/op/fs.go b/internal/op/fs.go index 5c5e63988..46a8637b8 100644 --- a/internal/op/fs.go +++ b/internal/op/fs.go @@ -632,7 +632,7 @@ func Put(ctx context.Context, storage driver.Driver, dstDirPath string, file mod } else if storage.Config().NoOverwriteUpload { // try to rename old obj err = Rename(ctx, storage, dstPath, tempName) - if err != nil && err != errs.ObjectAlreadyExists { + if err != nil && errs.IsObjectAlreadyExists(err) { return err } } else { From 2b70975419f143995ab04474cbf8ad04edd7dd7b Mon Sep 17 00:00:00 2001 From: mkitsdts Date: Sat, 24 Jan 2026 13:10:24 +0800 Subject: [PATCH 03/12] chore(pkg/error):rollback error change --- internal/op/fs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/op/fs.go b/internal/op/fs.go index 46a8637b8..f112aba87 100644 --- a/internal/op/fs.go +++ b/internal/op/fs.go @@ -470,7 +470,7 @@ func Rename(ctx context.Context, storage driver.Driver, srcPath, dstName string) return errs.NotImplement } if err != nil { - return err + return errors.WithStack(err) } dirKey := Key(storage, stdpath.Dir(srcPath)) From 6b25c8e05cad5e000625227c039db605a04ae3a3 Mon Sep 17 00:00:00 2001 From: mkitsdts Date: Sat, 24 Jan 2026 16:21:59 +0800 Subject: [PATCH 04/12] chore(op/makedir):add IsObjectAlreadyExists check --- internal/op/fs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/op/fs.go b/internal/op/fs.go index f112aba87..5089a4cc9 100644 --- a/internal/op/fs.go +++ b/internal/op/fs.go @@ -322,7 +322,7 @@ func MakeDir(ctx context.Context, storage driver.Driver, path string) error { return nil, errors.WithMessage(err, "failed to check if dir exists") } parentPath, dirName := stdpath.Split(path) - if err = MakeDir(ctx, storage, parentPath); err != nil { + if err = MakeDir(ctx, storage, parentPath); err != nil && !errs.IsObjectAlreadyExists(err) { return nil, errors.WithMessagef(err, "failed to make parent dir [%s]", parentPath) } parentDir, err := GetUnwrap(ctx, storage, parentPath) From cb14c2635d1d85df19712766ba78be744419aa11 Mon Sep 17 00:00:00 2001 From: mkitsdts Date: Sat, 24 Jan 2026 17:21:38 +0800 Subject: [PATCH 05/12] fix(driver/quark_uc):add makedir response checking --- drivers/quark_uc/driver.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/quark_uc/driver.go b/drivers/quark_uc/driver.go index a1371243c..6cef30f98 100644 --- a/drivers/quark_uc/driver.go +++ b/drivers/quark_uc/driver.go @@ -77,12 +77,16 @@ func (d *QuarkOrUC) MakeDir(ctx context.Context, parentDir model.Obj, dirName st "file_name": dirName, "pdir_fid": parentDir.GetID(), } + resp := Resp{} _, err := d.request("/file", http.MethodPost, func(req *resty.Request) { req.SetBody(data) - }, nil) - if err == nil { + }, &resp) + if err == nil || resp.Message == "file is doloading[存在同名文件]" || resp.Code == 23008 { time.Sleep(time.Second) } + if resp.Message == "file is doloading[存在同名文件]" || resp.Code == 23008 { + return errs.ObjectAlreadyExists + } return err } From da429fba7522fb31284c54da5c4bd82ba6a6d079 Mon Sep 17 00:00:00 2001 From: mkitsdts Date: Sat, 24 Jan 2026 17:55:02 +0800 Subject: [PATCH 06/12] fix(op/put):add makedir error checking --- internal/op/fs.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/op/fs.go b/internal/op/fs.go index 5089a4cc9..4c1a6739d 100644 --- a/internal/op/fs.go +++ b/internal/op/fs.go @@ -343,7 +343,7 @@ func MakeDir(ctx context.Context, storage driver.Driver, path string) error { default: return nil, errs.NotImplement } - if err != nil { + if err != nil && !errs.IsObjectAlreadyExists(err) { return nil, errors.WithStack(err) } if storage.Config().NoCache { @@ -640,7 +640,7 @@ func Put(ctx context.Context, storage driver.Driver, dstDirPath string, file mod } } err = MakeDir(ctx, storage, dstDirPath) - if err != nil { + if err != nil && !errs.IsObjectAlreadyExists(err) { return errors.WithMessagef(err, "failed to make dir [%s]", dstDirPath) } parentDir, err := GetUnwrap(ctx, storage, dstDirPath) From df83fcbb7e031b937125582bbd6b462e70543d3a Mon Sep 17 00:00:00 2001 From: mkitsdts Date: Sat, 24 Jan 2026 19:37:50 +0800 Subject: [PATCH 07/12] chore(op/put):fix logic error --- internal/op/fs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/op/fs.go b/internal/op/fs.go index 4c1a6739d..193681976 100644 --- a/internal/op/fs.go +++ b/internal/op/fs.go @@ -632,7 +632,7 @@ func Put(ctx context.Context, storage driver.Driver, dstDirPath string, file mod } else if storage.Config().NoOverwriteUpload { // try to rename old obj err = Rename(ctx, storage, dstPath, tempName) - if err != nil && errs.IsObjectAlreadyExists(err) { + if err != nil { return err } } else { From b3e607fc724e2845da4e18ee023161bbef806ea5 Mon Sep 17 00:00:00 2001 From: mkitsdts Date: Tue, 27 Jan 2026 17:11:53 +0800 Subject: [PATCH 08/12] fix(driver/uc):fix error resp check --- drivers/quark_uc/driver.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/quark_uc/driver.go b/drivers/quark_uc/driver.go index 6cef30f98..2b82bfdf7 100644 --- a/drivers/quark_uc/driver.go +++ b/drivers/quark_uc/driver.go @@ -77,14 +77,13 @@ func (d *QuarkOrUC) MakeDir(ctx context.Context, parentDir model.Obj, dirName st "file_name": dirName, "pdir_fid": parentDir.GetID(), } - resp := Resp{} _, err := d.request("/file", http.MethodPost, func(req *resty.Request) { req.SetBody(data) - }, &resp) - if err == nil || resp.Message == "file is doloading[存在同名文件]" || resp.Code == 23008 { + }, nil) + if err == nil || err.Error() == "file is doloading[同名冲突]" { time.Sleep(time.Second) } - if resp.Message == "file is doloading[存在同名文件]" || resp.Code == 23008 { + if err.Error() == "file is doloading[同名冲突]" { return errs.ObjectAlreadyExists } return err From 4baff4893ba316b206a06ac12f14c34cfe0767e8 Mon Sep 17 00:00:00 2001 From: mkitsdts Date: Tue, 27 Jan 2026 17:14:25 +0800 Subject: [PATCH 09/12] chore(op/makedir):add parentPath check --- internal/op/fs.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/op/fs.go b/internal/op/fs.go index 193681976..402806df3 100644 --- a/internal/op/fs.go +++ b/internal/op/fs.go @@ -322,10 +322,13 @@ func MakeDir(ctx context.Context, storage driver.Driver, path string) error { return nil, errors.WithMessage(err, "failed to check if dir exists") } parentPath, dirName := stdpath.Split(path) - if err = MakeDir(ctx, storage, parentPath); err != nil && !errs.IsObjectAlreadyExists(err) { + if err = MakeDir(ctx, storage, parentPath); err != nil { return nil, errors.WithMessagef(err, "failed to make parent dir [%s]", parentPath) } parentDir, err := GetUnwrap(ctx, storage, parentPath) + if parentPath != "/" && !parentDir.IsDir() { + return nil, errs.NotFolder + } // this should not happen if err != nil { return nil, errors.WithMessagef(err, "failed to get parent dir [%s]", parentPath) @@ -346,6 +349,9 @@ func MakeDir(ctx context.Context, storage driver.Driver, path string) error { if err != nil && !errs.IsObjectAlreadyExists(err) { return nil, errors.WithStack(err) } + if newObj != nil && !newObj.IsDir() { + return nil, errors.WithStack(errs.NotFolder) + } if storage.Config().NoCache { return nil, nil } From da0b9a266a8ef71cceb86615d1a5b921036273ae Mon Sep 17 00:00:00 2001 From: mkitsdts Date: Tue, 27 Jan 2026 19:22:26 +0800 Subject: [PATCH 10/12] fix(op/makedir):fix some errors --- drivers/quark_uc/driver.go | 2 +- internal/op/fs.go | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/quark_uc/driver.go b/drivers/quark_uc/driver.go index 2b82bfdf7..84ab24c1f 100644 --- a/drivers/quark_uc/driver.go +++ b/drivers/quark_uc/driver.go @@ -83,7 +83,7 @@ func (d *QuarkOrUC) MakeDir(ctx context.Context, parentDir model.Obj, dirName st if err == nil || err.Error() == "file is doloading[同名冲突]" { time.Sleep(time.Second) } - if err.Error() == "file is doloading[同名冲突]" { + if err != nil && err.Error() == "file is doloading[同名冲突]" { return errs.ObjectAlreadyExists } return err diff --git a/internal/op/fs.go b/internal/op/fs.go index 402806df3..d4ef365d5 100644 --- a/internal/op/fs.go +++ b/internal/op/fs.go @@ -326,7 +326,7 @@ func MakeDir(ctx context.Context, storage driver.Driver, path string) error { return nil, errors.WithMessagef(err, "failed to make parent dir [%s]", parentPath) } parentDir, err := GetUnwrap(ctx, storage, parentPath) - if parentPath != "/" && !parentDir.IsDir() { + if !parentDir.IsDir() { return nil, errs.NotFolder } // this should not happen @@ -349,9 +349,6 @@ func MakeDir(ctx context.Context, storage driver.Driver, path string) error { if err != nil && !errs.IsObjectAlreadyExists(err) { return nil, errors.WithStack(err) } - if newObj != nil && !newObj.IsDir() { - return nil, errors.WithStack(errs.NotFolder) - } if storage.Config().NoCache { return nil, nil } From cd315e0388734f6d5ca1db905eba429b7bfff671 Mon Sep 17 00:00:00 2001 From: mkitsdts Date: Fri, 30 Jan 2026 13:24:00 +0800 Subject: [PATCH 11/12] fix(op/makedir):fix logic error --- internal/op/fs.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/op/fs.go b/internal/op/fs.go index d4ef365d5..ab1128be1 100644 --- a/internal/op/fs.go +++ b/internal/op/fs.go @@ -326,13 +326,13 @@ func MakeDir(ctx context.Context, storage driver.Driver, path string) error { return nil, errors.WithMessagef(err, "failed to make parent dir [%s]", parentPath) } parentDir, err := GetUnwrap(ctx, storage, parentPath) - if !parentDir.IsDir() { - return nil, errs.NotFolder - } // this should not happen if err != nil { return nil, errors.WithMessagef(err, "failed to get parent dir [%s]", parentPath) } + if !parentDir.IsDir() { + return nil, errs.NotFolder + } if model.ObjHasMask(parentDir, model.NoWrite) { return nil, errors.WithStack(errs.PermissionDenied) } From 09c29c85c97157b96e9e6debce77f04571b0eed3 Mon Sep 17 00:00:00 2001 From: MadDogOwner Date: Sun, 1 Feb 2026 00:32:01 +0800 Subject: [PATCH 12/12] fix(drivers/cloudreve_v4): add object existence error Signed-off-by: MadDogOwner --- drivers/cloudreve_v4/util.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/cloudreve_v4/util.go b/drivers/cloudreve_v4/util.go index f8fe5f269..e22938daf 100644 --- a/drivers/cloudreve_v4/util.go +++ b/drivers/cloudreve_v4/util.go @@ -33,6 +33,7 @@ const ( CodeLoginRequired = http.StatusUnauthorized CodePathNotExist = 40016 // Path not exist CodeCredentialInvalid = 40020 // Failed to issue token + CodeObjectExisted = 40004 // Object existed ) var ( @@ -106,6 +107,9 @@ func (d *CloudreveV4) _request(method string, path string, callback base.ReqCall if r.Code == CodePathNotExist { return errs.ObjectNotFound } + if r.Code == CodeObjectExisted { + return errs.ObjectAlreadyExists + } return fmt.Errorf("%d: %s", r.Code, r.Msg) }