Skip to content

Commit

Permalink
fixed the activity when file with file-id gives move activity instead…
Browse files Browse the repository at this point in the history
… of rename
  • Loading branch information
2403905 committed Oct 2, 2024
1 parent c33c803 commit 5c46b5f
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 13 deletions.
6 changes: 6 additions & 0 deletions changelog/unreleased/fix-activity-rename.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Bugfix: Fix rename activity

We fixed the activity when file with file-id gives move activity instead of rename.

https://github.com/cs3org/reva/pull/4874
https://github.com/owncloud/ocis/issues/9744
5 changes: 1 addition & 4 deletions internal/grpc/interceptors/eventsmiddleware/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ func NewUnary(m map[string]interface{}) (grpc.UnaryServerInterceptor, int, error

executant, _ := revactx.ContextGetUser(ctx)

// The MoveResponse event is moved to the decomposedfs
var ev interface{}
switch v := res.(type) {
case *collaboration.CreateShareResponse:
Expand Down Expand Up @@ -141,10 +142,6 @@ func NewUnary(m map[string]interface{}) (grpc.UnaryServerInterceptor, int, error
if isSuccess(v) {
ev = ItemTrashed(v, req.(*provider.DeleteRequest), ownerID, executant)
}
case *provider.MoveResponse:
if isSuccess(v) {
ev = ItemMoved(v, req.(*provider.MoveRequest), ownerID, executant)
}
case *provider.PurgeRecycleResponse:
if isSuccess(v) {
ev = ItemPurged(v, req.(*provider.PurgeRecycleRequest), executant)
Expand Down
105 changes: 96 additions & 9 deletions pkg/storage/utils/decomposedfs/decomposedfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ import (
user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
rpcv1beta1 "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1"
provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1"
"github.com/cs3org/reva/v2/pkg/appctx"
ctxpkg "github.com/cs3org/reva/v2/pkg/ctx"
revactx "github.com/cs3org/reva/v2/pkg/ctx"
"github.com/cs3org/reva/v2/pkg/errtypes"
"github.com/cs3org/reva/v2/pkg/events"
"github.com/cs3org/reva/v2/pkg/logger"
Expand Down Expand Up @@ -836,13 +838,13 @@ func (fs *Decomposedfs) Move(ctx context.Context, oldRef, newRef *provider.Refer
return
}

rp, err := fs.p.AssemblePermissions(ctx, oldNode)
orp, err := fs.p.AssemblePermissions(ctx, oldNode)
switch {
case err != nil:
return err
case !rp.Move:
case !orp.Move:
f, _ := storagespace.FormatReference(oldRef)
if rp.Stat {
if orp.Stat {
return errtypes.PermissionDenied(f)
}
return errtypes.NotFound(f)
Expand All @@ -856,19 +858,19 @@ func (fs *Decomposedfs) Move(ctx context.Context, oldRef, newRef *provider.Refer
return
}

rp, err = fs.p.AssemblePermissions(ctx, newNode)
nrp, err := fs.p.AssemblePermissions(ctx, newNode)
switch {
case err != nil:
return err
case oldNode.IsDir(ctx) && !rp.CreateContainer:
case oldNode.IsDir(ctx) && !nrp.CreateContainer:
f, _ := storagespace.FormatReference(newRef)
if rp.Stat {
if nrp.Stat {
return errtypes.PermissionDenied(f)
}
return errtypes.NotFound(f)
case !oldNode.IsDir(ctx) && !rp.InitiateFileUpload:
case !oldNode.IsDir(ctx) && !nrp.InitiateFileUpload:
f, _ := storagespace.FormatReference(newRef)
if rp.Stat {
if nrp.Stat {
return errtypes.PermissionDenied(f)
}
return errtypes.NotFound(f)
Expand All @@ -882,7 +884,13 @@ func (fs *Decomposedfs) Move(ctx context.Context, oldRef, newRef *provider.Refer
return err
}

return fs.tp.Move(ctx, oldNode, newNode)
if err := fs.tp.Move(ctx, oldNode, newNode); err != nil {
return err
}

fs.publishEvent(ctx, fs.moveEvent(ctx, oldRef, newRef, oldNode, newNode, orp, nrp))

return nil
}

// GetMD returns the metadata for the specified resource
Expand Down Expand Up @@ -1241,3 +1249,82 @@ func (fs *Decomposedfs) PurgeRecycleItem(ctx context.Context, ref *provider.Refe
func (fs *Decomposedfs) EmptyRecycle(ctx context.Context, ref *provider.Reference) error {
return fs.trashbin.EmptyRecycle(ctx, ref)
}

func (fs *Decomposedfs) getNodePath(ctx context.Context, n *node.Node, perms *provider.ResourcePermissions) (string, error) {
hp := func(n *node.Node) bool {
if perms == nil {
return false
}
return perms.GetPath
}
return fs.lu.Path(ctx, n, hp)
}

func (fs *Decomposedfs) refFromNode(ctx context.Context, n *node.Node, storageId string, perms *provider.ResourcePermissions) (*provider.Reference, error) {
var err error
if perms == nil {
perms, err = fs.p.AssemblePermissions(ctx, n)
if err != nil {
return nil, err
}
}
path, err := fs.getNodePath(ctx, n, perms)
if err != nil {
return nil, err
}
return &provider.Reference{
ResourceId: &provider.ResourceId{
StorageId: storageId,
OpaqueId: n.SpaceID,
SpaceId: n.SpaceID,
},
Path: path,
}, nil
}

func (fs *Decomposedfs) publishEvent(ctx context.Context, evf func() (any, error)) {
log := appctx.GetLogger(ctx)
ev, err := evf()
if err != nil {
log.Error().Err(err).Msg("Failed to crete the event")
}
if err := events.Publish(ctx, fs.stream, ev); err != nil {
log.Error().Err(err).Msg("Failed to publish event")
}
}

func (fs *Decomposedfs) moveEvent(ctx context.Context, oldRef, newRef *provider.Reference, oldNode, newNode *node.Node, orp, nrp *provider.ResourcePermissions) func() (any, error) {
return func() (any, error) {
executant, _ := revactx.ContextGetUser(ctx)
ev := events.ItemMoved{
SpaceOwner: newNode.Owner(),
Executant: executant.GetId(),
Ref: newRef,
OldReference: oldRef,
Timestamp: utils.TSNow(),
ImpersonatingUser: extractImpersonator(executant),
}
log := appctx.GetLogger(ctx)
if nref, err := fs.refFromNode(ctx, newNode, newRef.GetResourceId().GetStorageId(), nrp); err == nil {
ev.Ref = nref
} else {
log.Error().Err(err).Msg("Failed to get destination reference")
}

if oref, err := fs.refFromNode(ctx, oldNode, oldRef.GetResourceId().GetStorageId(), orp); err == nil {
ev.OldReference = oref
} else {
log.Error().Err(err).Msg("Failed to get source reference")
}

return ev, nil
}
}

func extractImpersonator(u *user.User) *user.User {
var impersonator user.User
if err := utils.ReadJSONFromOpaque(u.Opaque, "impersonating-user", &impersonator); err != nil {
return nil
}
return &impersonator
}

0 comments on commit 5c46b5f

Please sign in to comment.