diff --git a/pkg/storage/utils/decomposedfs/grants.go b/pkg/storage/utils/decomposedfs/grants.go index f630f2f0fb2..2bcc900bd05 100644 --- a/pkg/storage/utils/decomposedfs/grants.go +++ b/pkg/storage/utils/decomposedfs/grants.go @@ -32,6 +32,9 @@ import ( "github.com/pkg/xattr" ) +// SpaceGrant is the key used to signal not to create a new space when a grant is assigned to a storage space. +var SpaceGrant struct{} + // DenyGrant denies access to a resource. func (fs *Decomposedfs) DenyGrant(ctx context.Context, ref *provider.Reference, g *provider.Grantee) error { return errtypes.NotSupported("decomposedfs: not supported") @@ -68,8 +71,12 @@ func (fs *Decomposedfs) AddGrant(ctx context.Context, ref *provider.Reference, g return err } - if err := fs.createStorageSpace(ctx, "share", node.ID); err != nil { - return err + // when a grant is added to a space, do not add a new space under "shares" + if spaceGrant := ctx.Value(SpaceGrant); spaceGrant == nil { + err := fs.createStorageSpace(ctx, "share", node.ID) + if err != nil { + return err + } } return fs.tp.Propagate(ctx, node) diff --git a/pkg/storage/utils/decomposedfs/spaces.go b/pkg/storage/utils/decomposedfs/spaces.go index c811869dcec..d26babf4f63 100644 --- a/pkg/storage/utils/decomposedfs/spaces.go +++ b/pkg/storage/utils/decomposedfs/spaces.go @@ -31,12 +31,14 @@ import ( v1beta11 "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" + ocsconv "github.com/cs3org/reva/internal/http/services/owncloud/ocs/conversions" "github.com/cs3org/reva/pkg/appctx" ctxpkg "github.com/cs3org/reva/pkg/ctx" "github.com/cs3org/reva/pkg/storage/utils/decomposedfs/node" "github.com/cs3org/reva/pkg/storage/utils/decomposedfs/xattrs" "github.com/cs3org/reva/pkg/utils" "github.com/google/uuid" + "github.com/pkg/errors" "github.com/pkg/xattr" ) @@ -111,6 +113,27 @@ func (fs *Decomposedfs) CreateStorageSpace(ctx context.Context, req *provider.Cr }, } + nPath, err := fs.lu.Path(ctx, n) + if err != nil { + return nil, errors.Wrap(err, "decomposedfs: spaces: could not create space. invalid node path") + } + + ctx = context.WithValue(ctx, SpaceGrant, struct{}{}) + + if err := fs.AddGrant(ctx, &provider.Reference{ + Path: nPath, + }, &provider.Grant{ + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{ + UserId: u.Id, + }, + }, + Permissions: ocsconv.NewEditorRole().CS3ResourcePermissions(), + }); err != nil { + return nil, err + } + return resp, nil }