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 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} 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 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) }