From a503ace11ff7f0e13e7cc0e944e8b44b6518af15 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Thu, 16 Mar 2023 10:10:50 +0100 Subject: [PATCH] don't check quota permission in graph Signed-off-by: jkoberg --- services/graph/pkg/service/v0/drives.go | 27 ++++++++++++++++++--- services/graph/pkg/service/v0/graph_test.go | 4 +++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/services/graph/pkg/service/v0/drives.go b/services/graph/pkg/service/v0/drives.go index 9842c10ca..4e29f1403 100644 --- a/services/graph/pkg/service/v0/drives.go +++ b/services/graph/pkg/service/v0/drives.go @@ -17,6 +17,7 @@ import ( gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" userv1beta1 "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" cs3rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" + rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" storageprovider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" revactx "github.com/cs3org/reva/v2/pkg/ctx" @@ -30,7 +31,7 @@ import ( v0 "github.com/owncloud/ocis/v2/protogen/gen/ocis/messages/settings/v0" settingssvc "github.com/owncloud/ocis/v2/protogen/gen/ocis/services/settings/v0" "github.com/owncloud/ocis/v2/services/graph/pkg/service/v0/errorcode" - settingsServiceExt "github.com/owncloud/ocis/v2/services/settings/pkg/service/v0" + settingsServiceExt "github.com/owncloud/ocis/v2/services/settings/pkg/store/defaults" "github.com/pkg/errors" merrors "go-micro.dev/v4/errors" ) @@ -408,7 +409,21 @@ func (g Graph) UpdateDrive(w http.ResponseWriter, r *http.Request) { if drive.Quota.HasTotal() { user := revactx.ContextMustGetUser(r.Context()) - canSetSpaceQuota, err := g.canSetSpaceQuota(r.Context(), user) + + // NOTE: a space admin cannot get a space by ID. We need to fetch all spaces and search for it + dt := _spaceTypePersonal + filters := []*storageprovider.ListStorageSpacesRequest_Filter{listStorageSpacesTypeFilter(_spaceTypeProject)} + res, err := g.ListStorageSpacesWithFilters(r.Context(), filters, true) + if err == nil && res.GetStatus().GetCode() == rpc.Code_CODE_OK { + for _, sp := range res.StorageSpaces { + id, _ := storagespace.ParseID(sp.GetId().GetOpaqueId()) + if id.GetSpaceId() == rid.GetSpaceId() { + dt = _spaceTypeProject + } + } + } + + canSetSpaceQuota, err := g.canSetSpaceQuota(r.Context(), user, dt) if err != nil { logger.Error().Err(err).Msg("could not update drive: failed to check if the user can set space quota") errorcode.GeneralException.Render(w, r, http.StatusInternalServerError, err.Error()) @@ -832,8 +847,12 @@ func getQuota(quota *libregraph.Quota, defaultQuota string) *storageprovider.Quo } } -func (g Graph) canSetSpaceQuota(ctx context.Context, user *userv1beta1.User) (bool, error) { - _, err := g.permissionsService.GetPermissionByID(ctx, &settingssvc.GetPermissionByIDRequest{PermissionId: settingsServiceExt.SetSpaceQuotaPermissionID}) +func (g Graph) canSetSpaceQuota(ctx context.Context, user *userv1beta1.User, typ string) (bool, error) { + permID := settingsServiceExt.SetPersonalSpaceQuotaPermissionID + if typ == _spaceTypeProject { + permID = settingsServiceExt.SetProjectSpaceQuotaPermissionID + } + _, err := g.permissionsService.GetPermissionByID(ctx, &settingssvc.GetPermissionByIDRequest{PermissionId: permID}) if err != nil { merror := merrors.FromError(err) if merror.Status == http.StatusText(http.StatusNotFound) { diff --git a/services/graph/pkg/service/v0/graph_test.go b/services/graph/pkg/service/v0/graph_test.go index e7e6d86fe..717f6f6f8 100644 --- a/services/graph/pkg/service/v0/graph_test.go +++ b/services/graph/pkg/service/v0/graph_test.go @@ -1031,6 +1031,10 @@ var _ = Describe("Graph", func() { driveJson, err := json.Marshal(drive) Expect(err).ToNot(HaveOccurred()) + gatewayClient.On("ListStorageSpaces", mock.Anything, mock.Anything).Return(&provider.ListStorageSpacesResponse{ + Status: status.NewOK(ctx), + StorageSpaces: []*provider.StorageSpace{{SpaceType: "project"}}, + }, nil) gatewayClient.On("UpdateStorageSpace", mock.Anything, mock.Anything).Return(func(_ context.Context, req *provider.UpdateStorageSpaceRequest, _ ...grpc.CallOption) *provider.UpdateStorageSpaceResponse { return &provider.UpdateStorageSpaceResponse{ Status: status.NewOK(ctx),