Skip to content

Commit ca799c6

Browse files
authored
Merge pull request #11931 from kobergj/ExternalSharerPermission
[OCISDEV-454] Add Permission to allow external shares
2 parents cac0409 + f849084 commit ca799c6

File tree

8 files changed

+63
-11
lines changed

8 files changed

+63
-11
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Enhancement: Introduce external shares permission
2+
3+
Introduces a permission allowing to share between instances in multi-instance ocis. This permission is by default added to the admin and space-admin role.
4+
5+
https://github.com/owncloud/ocis/pull/11931

services/graph/pkg/service/v0/api_driveitem_permissions.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,9 @@ type DriveItemPermissionsProvider interface {
6969
// DriveItemPermissionsService contains the production business logic for everything that relates to permissions on drive items.
7070
type DriveItemPermissionsService struct {
7171
BaseGraphService
72-
tp trace.TracerProvider
73-
identityBackend identity.Backend
72+
tp trace.TracerProvider
73+
identityBackend identity.Backend
74+
hasExternalSharePermission externalSharePermissionChecker
7475
}
7576

7677
type permissionType int
@@ -83,17 +84,26 @@ const (
8384
OCM
8485
)
8586

87+
// supposed to return true if the user can share to users from other instances (multi-instance only)
88+
type externalSharePermissionChecker func(context.Context) bool
89+
8690
// NewDriveItemPermissionsService creates a new DriveItemPermissionsService
87-
func NewDriveItemPermissionsService(logger log.Logger, gatewaySelector pool.Selectable[gateway.GatewayAPIClient], identityCache identity.IdentityCache, config *config.Config, tp trace.TracerProvider, be identity.Backend) (DriveItemPermissionsService, error) {
91+
func NewDriveItemPermissionsService(logger log.Logger, gatewaySelector pool.Selectable[gateway.GatewayAPIClient], identityCache identity.IdentityCache, config *config.Config, tp trace.TracerProvider, be identity.Backend, espc externalSharePermissionChecker) (DriveItemPermissionsService, error) {
92+
f := func(context.Context) bool { return false }
93+
if espc != nil {
94+
f = espc
95+
}
96+
8897
return DriveItemPermissionsService{
8998
BaseGraphService: BaseGraphService{
9099
logger: &log.Logger{Logger: logger.With().Str("graph api", "DrivesDriveItemService").Logger()},
91100
gatewaySelector: gatewaySelector,
92101
identityCache: identityCache,
93102
config: config,
94103
},
95-
tp: tp,
96-
identityBackend: be,
104+
tp: tp,
105+
identityBackend: be,
106+
hasExternalSharePermission: f,
97107
}, nil
98108
}
99109

@@ -193,7 +203,7 @@ func (s DriveItemPermissionsService) Invite(ctx context.Context, resourceId *sto
193203
default:
194204
user, err := s.identityCache.GetUser(ctx, objectID)
195205
if errors.Is(err, identity.ErrNotFound) {
196-
if s.config.MultiInstance.Enabled {
206+
if s.config.MultiInstance.Enabled && s.hasExternalSharePermission(ctx) {
197207
user, err = s.identityBackend.AddUser(ctx, objectID, s.config.MultiInstance.InstanceID)
198208
}
199209
if s.config.IncludeOCMSharees && err != nil {

services/graph/pkg/service/v0/api_driveitem_permissions_links_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ var _ = Describe("createLinkTests", func() {
5555
cache := identity.NewIdentityCache(identity.IdentityCacheWithGatewaySelector(gatewaySelector))
5656

5757
cfg := defaults.FullDefaultConfig()
58-
svc, err = service.NewDriveItemPermissionsService(logger, gatewaySelector, cache, cfg, otel.GetTracerProvider(), nil)
58+
svc, err = service.NewDriveItemPermissionsService(logger, gatewaySelector, cache, cfg, otel.GetTracerProvider(), nil, nil)
5959
Expect(err).ToNot(HaveOccurred())
6060
driveItemId = &provider.ResourceId{
6161
StorageId: "1",

services/graph/pkg/service/v0/api_driveitem_permissions_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ var _ = Describe("DriveItemPermissionsService", func() {
8080
cfg.UnifiedRoles.AvailableRoles = slices.DeleteFunc(cfg.UnifiedRoles.AvailableRoles, func(s string) bool {
8181
return s == unifiedrole.UnifiedRoleSecureViewerID
8282
})
83-
service, err := svc.NewDriveItemPermissionsService(logger, gatewaySelector, cache, cfg, otel.GetTracerProvider(), nil)
83+
service, err := svc.NewDriveItemPermissionsService(logger, gatewaySelector, cache, cfg, otel.GetTracerProvider(), nil, nil)
8484
Expect(err).ToNot(HaveOccurred())
8585
driveItemPermissionsService = service
8686
ctx = revactx.ContextSetUser(context.Background(), currentUser)
@@ -270,7 +270,7 @@ var _ = Describe("DriveItemPermissionsService", func() {
270270
// remove SecureViewer from allowed roles for this unit test
271271
return s == unifiedrole.UnifiedRoleSecureViewerID
272272
})
273-
service, err := svc.NewDriveItemPermissionsService(log.NewLogger(), gatewaySelector, cache, cfg, otel.GetTracerProvider(), nil)
273+
service, err := svc.NewDriveItemPermissionsService(log.NewLogger(), gatewaySelector, cache, cfg, otel.GetTracerProvider(), nil, nil)
274274
Expect(err).ToNot(HaveOccurred())
275275

276276
driveItemInvite.Roles = []string{unifiedrole.UnifiedRoleViewerID, unifiedrole.UnifiedRoleSecureViewerID}

services/graph/pkg/service/v0/service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ func NewService(opts ...Option) (Graph, error) { //nolint:maintidx
213213
return svc, err
214214
}
215215

216-
driveItemPermissionsService, err := NewDriveItemPermissionsService(options.Logger, options.GatewaySelector, identityCache, options.Config, options.TraceProvider, svc.identityBackend)
216+
driveItemPermissionsService, err := NewDriveItemPermissionsService(options.Logger, options.GatewaySelector, identityCache, options.Config, options.TraceProvider, svc.identityBackend, svc.contextUserHasExternalSharePermission)
217217
if err != nil {
218218
return svc, err
219219
}

services/graph/pkg/service/v0/users.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,22 @@ func (g Graph) contextUserHasFullAccountPerms(reqctx context.Context) bool {
210210
return true
211211
}
212212

213+
func (g Graph) contextUserHasExternalSharePermission(reqctx context.Context) bool {
214+
// mostly copied from the canCreateSpace method
215+
pr, err := g.permissionsService.GetPermissionByID(reqctx, &settingssvc.GetPermissionByIDRequest{
216+
PermissionId: defaults.CreateExternalSharePermission(0).Id,
217+
})
218+
if err != nil || pr.Permission == nil {
219+
return false
220+
}
221+
222+
if pr.Permission.Constraint != defaults.All {
223+
return false
224+
}
225+
226+
return true
227+
}
228+
213229
// UserWithAttributes is a wrapper for the User type that includes attributes.
214230
// Attributes are a list of attributes that are displayed in the user search results.
215231
type UserWithAttributes struct {
@@ -361,7 +377,7 @@ func (g Graph) GetUsers(w http.ResponseWriter, r *http.Request) {
361377
username, instancename := g.parseExternalSearch(odataReq)
362378

363379
switch {
364-
case username != "" && instancename != "":
380+
case username != "" && instancename != "" && g.contextUserHasExternalSharePermission(r.Context()):
365381
users = make([]*libregraph.User, 1)
366382
users[0], err = g.identityBackend.GetPreciseUser(r.Context(), username, instancename, odataReq)
367383
case odataReq.Query.Filter != nil:

services/settings/pkg/store/defaults/defaults.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ func generateBundleAdminRole() *settingsmsg.Bundle {
114114
AccountManagementPermission(All),
115115
AutoAcceptSharesPermission(Own),
116116
ChangeLogoPermission(All),
117+
CreateExternalSharePermission(All),
117118
CreatePublicLinkPermission(All),
118119
CreateSharePermission(All),
119120
CreateSpacesPermission(All),
@@ -158,6 +159,7 @@ func generateBundleSpaceAdminRole() *settingsmsg.Bundle {
158159
},
159160
Settings: []*settingsmsg.Setting{
160161
AutoAcceptSharesPermission(Own),
162+
CreateExternalSharePermission(All),
161163
CreatePublicLinkPermission(All),
162164
CreateSharePermission(All),
163165
CreateSpacesPermission(All),

services/settings/pkg/store/defaults/permissions.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,25 @@ func ChangeLogoPermission(c settingsmsg.Permission_Constraint) *settingsmsg.Sett
6767
}
6868
}
6969

70+
// CreateExternalSharePermission is the permission to create shares to other instances (Multi-Instance only)
71+
func CreateExternalSharePermission(c settingsmsg.Permission_Constraint) *settingsmsg.Setting {
72+
return &settingsmsg.Setting{
73+
Id: "5c03dc05-0bef-4b30-8ee6-e5a51713fd3a",
74+
Name: "ExternalShare.Write",
75+
DisplayName: "Write external share",
76+
Description: "This permission allows creating shares to users on other instances.",
77+
Resource: &settingsmsg.Resource{
78+
Type: settingsmsg.Resource_TYPE_SHARE,
79+
},
80+
Value: &settingsmsg.Setting_PermissionValue{
81+
PermissionValue: &settingsmsg.Permission{
82+
Operation: settingsmsg.Permission_OPERATION_WRITE,
83+
Constraint: c,
84+
},
85+
},
86+
}
87+
}
88+
7089
// CreatePublicLinkPermission is the permission to create public links
7190
func CreatePublicLinkPermission(c settingsmsg.Permission_Constraint) *settingsmsg.Setting {
7291
return &settingsmsg.Setting{

0 commit comments

Comments
 (0)