@@ -46,6 +46,7 @@ const (
4646 invalidIdMsg = "invalid driveID or itemID"
4747 parseDriveIDErrMsg = "could not parse driveID"
4848 federatedRolesODataFilter = "@libre.graph.permissions.roles.allowedValues/rolePermissions/any(p:contains(p/condition, '@Subject.UserType==\" Federated\" '))"
49+ noLinksODataFilter = "grantedToV2 ne ''"
4950)
5051
5152// DriveItemPermissionsProvider contains the methods related to handling permissions on drive items
@@ -80,10 +81,11 @@ const (
8081)
8182
8283type ListPermissionsQueryOptions struct {
83- count bool
84- noValues bool
85- filterFederatedRoles bool
86- selectedAttrs []string
84+ Count bool
85+ NoValues bool
86+ NoLinkPermissions bool
87+ FilterFederatedRoles bool
88+ SelectedAttrs []string
8789}
8890
8991// NewDriveItemPermissionsService creates a new DriveItemPermissionsService
@@ -375,17 +377,17 @@ func (s DriveItemPermissionsService) ListPermissions(ctx context.Context, itemID
375377
376378 collectionOfPermissions = libregraph.CollectionOfPermissionsWithAllowedValues {}
377379
378- if len (queryOptions .selectedAttrs ) == 0 || slices .Contains (queryOptions .selectedAttrs , "@libre.graph.permissions.actions.allowedValues" ) {
380+ if len (queryOptions .SelectedAttrs ) == 0 || slices .Contains (queryOptions .SelectedAttrs , "@libre.graph.permissions.actions.allowedValues" ) {
379381 collectionOfPermissions .LibreGraphPermissionsActionsAllowedValues = allowedActions
380382 }
381383
382- if len (queryOptions .selectedAttrs ) == 0 || slices .Contains (queryOptions .selectedAttrs , "@libre.graph.permissions.roles.allowedValues" ) {
384+ if len (queryOptions .SelectedAttrs ) == 0 || slices .Contains (queryOptions .SelectedAttrs , "@libre.graph.permissions.roles.allowedValues" ) {
383385 collectionOfPermissions .LibreGraphPermissionsRolesAllowedValues = conversions .ToValueSlice (
384386 unifiedrole .GetRolesByPermissions (
385387 unifiedrole .GetRoles (unifiedrole .RoleFilterIDs (s .config .UnifiedRoles .AvailableRoles ... )),
386388 allowedActions ,
387389 condition ,
388- queryOptions .filterFederatedRoles ,
390+ queryOptions .FilterFederatedRoles ,
389391 false ,
390392 ),
391393 )
@@ -397,7 +399,7 @@ func (s DriveItemPermissionsService) ListPermissions(ctx context.Context, itemID
397399 collectionOfPermissions .LibreGraphPermissionsRolesAllowedValues [i ] = definition
398400 }
399401
400- if len (queryOptions .selectedAttrs ) > 0 {
402+ if len (queryOptions .SelectedAttrs ) > 0 {
401403 // no need to fetch shares, we are only interested allowedActions and/or allowedRoles
402404 return collectionOfPermissions , nil
403405 }
@@ -414,7 +416,7 @@ func (s DriveItemPermissionsService) ListPermissions(ctx context.Context, itemID
414416
415417 if IsSpaceRoot (statResponse .GetInfo ().GetId ()) {
416418 var permissions []libregraph.Permission
417- permissions , permissionsCount , err = s .getSpaceRootPermissions (ctx , statResponse .GetInfo ().GetSpace ().GetId (), queryOptions .noValues )
419+ permissions , permissionsCount , err = s .getSpaceRootPermissions (ctx , statResponse .GetInfo ().GetSpace ().GetId (), queryOptions .NoValues )
418420 if err != nil {
419421 return collectionOfPermissions , err
420422 }
@@ -439,22 +441,25 @@ func (s DriveItemPermissionsService) ListPermissions(ctx context.Context, itemID
439441 }
440442 }
441443 }
442- // finally get public shares, which are possible for spaceroots and "normal" resources
443- driveItems , err = s .listPublicShares (ctx , []* link.ListPublicSharesRequest_Filter {
444- publicshare .ResourceIDFilter (itemID ),
445- }, driveItems )
446- if err != nil {
447- return collectionOfPermissions , err
444+
445+ if ! queryOptions .NoLinkPermissions {
446+ // finally get public shares, which are possible for spaceroots and "normal" resources
447+ driveItems , err = s .listPublicShares (ctx , []* link.ListPublicSharesRequest_Filter {
448+ publicshare .ResourceIDFilter (itemID ),
449+ }, driveItems )
450+ if err != nil {
451+ return collectionOfPermissions , err
452+ }
448453 }
449454
450455 for _ , driveItem := range driveItems {
451456 permissionsCount += len (driveItem .Permissions )
452- if ! queryOptions .noValues {
457+ if ! queryOptions .NoValues {
453458 collectionOfPermissions .Value = append (collectionOfPermissions .Value , driveItem .Permissions ... )
454459 }
455460 }
456461
457- if queryOptions .count {
462+ if queryOptions .Count {
458463 collectionOfPermissions .SetOdataCount (int32 (permissionsCount ))
459464 }
460465
@@ -819,10 +824,15 @@ func (api DriveItemPermissionsApi) ListSpaceRootPermissions(w http.ResponseWrite
819824}
820825
821826func (api DriveItemPermissionsApi ) getListPermissionsQueryOptions (odataReq * godata.GoDataRequest ) (ListPermissionsQueryOptions , error ) {
822- var listFederatedRoles bool
827+ queryOptions := ListPermissionsQueryOptions {}
823828 if odataReq .Query .Filter != nil {
824- if odataReq .Query .Filter .RawValue == federatedRolesODataFilter {
825- listFederatedRoles = true
829+ switch odataReq .Query .Filter .RawValue {
830+ case federatedRolesODataFilter :
831+ queryOptions .FilterFederatedRoles = true
832+ case noLinksODataFilter :
833+ queryOptions .NoLinkPermissions = true
834+ default :
835+ return ListPermissionsQueryOptions {}, errorcode .New (errorcode .InvalidRequest , "invalid filter value" )
826836 }
827837 }
828838
@@ -831,22 +841,19 @@ func (api DriveItemPermissionsApi) getListPermissionsQueryOptions(odataReq *goda
831841 return ListPermissionsQueryOptions {}, err
832842 }
833843
834- queryOptions := ListPermissionsQueryOptions {
835- filterFederatedRoles : listFederatedRoles ,
836- selectedAttrs : selectAttrs ,
837- }
844+ queryOptions .SelectedAttrs = selectAttrs
838845 if odataReq .Query .Count != nil {
839- queryOptions .count = bool (* odataReq .Query .Count )
846+ queryOptions .Count = bool (* odataReq .Query .Count )
840847 }
841848 if odataReq .Query .Top != nil {
842849 top := int (* odataReq .Query .Top )
843850 switch {
844851 case top != 0 :
845852 return ListPermissionsQueryOptions {}, err
846- case top == 0 && ! queryOptions .count :
853+ case top == 0 && ! queryOptions .Count :
847854 return ListPermissionsQueryOptions {}, err
848855 default :
849- queryOptions .noValues = true
856+ queryOptions .NoValues = true
850857 }
851858 }
852859 return queryOptions , nil
0 commit comments