From c386d9183defa7cf4ad2b2743f18b319905ba603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Duffeck?= Date: Tue, 9 Jul 2024 11:08:57 +0200 Subject: [PATCH 1/4] Also rename the according lock file if a file is renamed --- pkg/storage/fs/posix/tree/tree.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pkg/storage/fs/posix/tree/tree.go b/pkg/storage/fs/posix/tree/tree.go index 52103ceb42..68498f2070 100644 --- a/pkg/storage/fs/posix/tree/tree.go +++ b/pkg/storage/fs/posix/tree/tree.go @@ -317,6 +317,17 @@ func (t *Tree) Move(ctx context.Context, oldNode *node.Node, newNode *node.Node) return errors.Wrap(err, "Decomposedfs: could not move child") } + // rename the lock (if it exists) + if _, err := os.Stat(oldNode.LockFilePath()); err == nil { + err = os.Rename( + filepath.Join(oldNode.ParentPath(), oldNode.Name+".lock"), + filepath.Join(newNode.ParentPath(), newNode.Name+".lock"), + ) + if err != nil { + return errors.Wrap(err, "Decomposedfs: could not move lock") + } + } + // update the id cache if newNode.ID == "" { newNode.ID = oldNode.ID From 4eab3194dedee8e62cf1975eee4013402260a3bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Duffeck?= Date: Tue, 9 Jul 2024 11:09:16 +0200 Subject: [PATCH 2/4] Do not validate the lock against the destination We currently can not validate locks for both the source and the destination as locks are required to be unique and we can only pass one lock at the moment. --- pkg/storage/utils/decomposedfs/decomposedfs.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pkg/storage/utils/decomposedfs/decomposedfs.go b/pkg/storage/utils/decomposedfs/decomposedfs.go index 7439c4c980..881538afc3 100644 --- a/pkg/storage/utils/decomposedfs/decomposedfs.go +++ b/pkg/storage/utils/decomposedfs/decomposedfs.go @@ -855,11 +855,6 @@ func (fs *Decomposedfs) Move(ctx context.Context, oldRef, newRef *provider.Refer return err } - // check lock on target - if err := newNode.CheckLock(ctx); err != nil { - return err - } - return fs.tp.Move(ctx, oldNode, newNode) } From 636a65caac479ac121ff445ffe37efe42ed36e37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Duffeck?= Date: Tue, 9 Jul 2024 12:11:25 +0200 Subject: [PATCH 3/4] Pass on lock tokens --- internal/http/services/owncloud/ocdav/delete.go | 5 ++++- internal/http/services/owncloud/ocdav/locks.go | 4 ++++ internal/http/services/owncloud/ocdav/move.go | 6 +++++- internal/http/services/owncloud/ocdav/put.go | 1 + 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/internal/http/services/owncloud/ocdav/delete.go b/internal/http/services/owncloud/ocdav/delete.go index 24ed1a7ada..a5a8f31b1d 100644 --- a/internal/http/services/owncloud/ocdav/delete.go +++ b/internal/http/services/owncloud/ocdav/delete.go @@ -61,7 +61,10 @@ func (s *svc) handleDelete(ctx context.Context, w http.ResponseWriter, r *http.R ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(ctx, "delete") defer span.End() - req := &provider.DeleteRequest{Ref: ref} + req := &provider.DeleteRequest{ + Ref: ref, + LockId: requestLockToken(r), + } // FIXME the lock token is part of the application level protocol, it should be part of the DeleteRequest message not the opaque ih, ok := parseIfHeader(r.Header.Get(net.HeaderIf)) diff --git a/internal/http/services/owncloud/ocdav/locks.go b/internal/http/services/owncloud/ocdav/locks.go index 6760bfd90d..5458ec4e58 100644 --- a/internal/http/services/owncloud/ocdav/locks.go +++ b/internal/http/services/owncloud/ocdav/locks.go @@ -647,3 +647,7 @@ func (s *svc) unlockReference(ctx context.Context, _ http.ResponseWriter, r *htt } return http.StatusInternalServerError, err } + +func requestLockToken(r *http.Request) string { + return strings.TrimSuffix(strings.TrimPrefix(r.Header.Get(net.HeaderLockToken), "<"), ">") +} diff --git a/internal/http/services/owncloud/ocdav/move.go b/internal/http/services/owncloud/ocdav/move.go index 3e1f587282..9b1e3c705b 100644 --- a/internal/http/services/owncloud/ocdav/move.go +++ b/internal/http/services/owncloud/ocdav/move.go @@ -294,7 +294,11 @@ func (s *svc) handleMove(ctx context.Context, w http.ResponseWriter, r *http.Req dst.Path = utils.MakeRelativePath(dstStatRes.GetInfo().GetName()) dst.ResourceId = dstStatRes.GetInfo().GetParentId() } - mReq := &provider.MoveRequest{Source: src, Destination: dst} + mReq := &provider.MoveRequest{ + Source: src, + Destination: dst, + LockId: requestLockToken(r), + } mRes, err := client.Move(ctx, mReq) if err != nil { log.Error().Err(err).Msg("error sending move grpc request") diff --git a/internal/http/services/owncloud/ocdav/put.go b/internal/http/services/owncloud/ocdav/put.go index 822480c9fd..5f931a16f8 100644 --- a/internal/http/services/owncloud/ocdav/put.go +++ b/internal/http/services/owncloud/ocdav/put.go @@ -276,6 +276,7 @@ func (s *svc) handlePut(ctx context.Context, w http.ResponseWriter, r *http.Requ uReq := &provider.InitiateFileUploadRequest{ Ref: ref, Opaque: opaque, + LockId: requestLockToken(r), } if ifMatch := r.Header.Get(net.HeaderIfMatch); ifMatch != "" { uReq.Options = &provider.InitiateFileUploadRequest_IfMatch{IfMatch: ifMatch} From 47762141c7dc21a64f6154fe5cfd6ea318fdadff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Duffeck?= Date: Tue, 9 Jul 2024 13:55:25 +0200 Subject: [PATCH 4/4] Add changelog --- changelog/unreleased/fix-locking.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelog/unreleased/fix-locking.md diff --git a/changelog/unreleased/fix-locking.md b/changelog/unreleased/fix-locking.md new file mode 100644 index 0000000000..90955e1803 --- /dev/null +++ b/changelog/unreleased/fix-locking.md @@ -0,0 +1,5 @@ +Bugfix: Fix moving locked files, enable handling locked files via ocdav + +We fixed a problem when trying to move locked files. We also enabled the ocdav service to handle locked files. + +https://github.com/cs3org/reva/pull/4758