From 08edebc66cda02b8798a4a6b9e14c418833ec305 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Duffeck?= Date: Wed, 7 Oct 2026 12:45:13 +0200 Subject: [PATCH] Use the stored guest id when returning an invite permission The share provider now stores the guest's mail address in its canonical form, so build the returned identity from the created share instead of the request. --- .../service/v0/api_driveitem_permissions.go | 3 +- .../v0/api_driveitem_permissions_test.go | 29 ++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/services/graph/pkg/service/v0/api_driveitem_permissions.go b/services/graph/pkg/service/v0/api_driveitem_permissions.go index e19eec5aa8..7d43726744 100644 --- a/services/graph/pkg/service/v0/api_driveitem_permissions.go +++ b/services/graph/pkg/service/v0/api_driveitem_permissions.go @@ -182,7 +182,8 @@ func (s DriveItemPermissionsService) Invite(ctx context.Context, resourceId *sto cTime = createShareResponse.GetShare().GetCtime() expiration = createShareResponse.GetShare().GetExpiration() - guestIdentity, err := cs3UserIdToIdentity(ctx, s.identityCache, createShareRequest.GetGrant().GetGrantee().GetUserId()) + // the share provider stores the guest's mail address in its canonical form + guestIdentity, err := cs3UserIdToIdentity(ctx, s.identityCache, createShareResponse.GetShare().GetGrantee().GetUserId()) if err != nil { s.logger.Debug().Err(err).Msg("failed to convert guest user id to identity") return libregraph.Permission{}, err diff --git a/services/graph/pkg/service/v0/api_driveitem_permissions_test.go b/services/graph/pkg/service/v0/api_driveitem_permissions_test.go index 5c386b69f6..cf6ecd44c7 100644 --- a/services/graph/pkg/service/v0/api_driveitem_permissions_test.go +++ b/services/graph/pkg/service/v0/api_driveitem_permissions_test.go @@ -176,7 +176,8 @@ var _ = Describe("DriveItemPermissionsService", func() { {Email: libregraph.PtrString("guest@example.com")}, } createShareResponse.Share = &collaboration.Share{ - Id: &collaboration.ShareId{OpaqueId: "guest123"}, + Id: &collaboration.ShareId{OpaqueId: "guest123"}, + Grantee: guestGrantee("guest@example.com"), } permission, err := driveItemPermissionsService.Invite(ctx, driveItemId, driveItemInvite) @@ -187,6 +188,23 @@ var _ = Describe("DriveItemPermissionsService", func() { Expect(permission.GrantedToV2.User.GetLibreGraphUserType()).To(Equal("Guest")) }) + It("returns the guest id as stored by the share provider", func() { + cfg.Commons = &shared.Commons{EnableGuestLinks: true} + gatewayClient.On("GetUser", mock.Anything, mock.Anything).Return(getUserResponse, nil) + gatewayClient.On("CreateShare", mock.Anything, mock.Anything).Return(createShareResponse, nil) + driveItemInvite.Recipients = []libregraph.DriveRecipient{ + {Email: libregraph.PtrString("Guest@\u0130nfocorp.com")}, + } + createShareResponse.Share = &collaboration.Share{ + Id: &collaboration.ShareId{OpaqueId: "guest123"}, + Grantee: guestGrantee("guest@xn--infocorp-o0e.com"), + } + + permission, err := driveItemPermissionsService.Invite(ctx, driveItemId, driveItemInvite) + Expect(err).ToNot(HaveOccurred()) + Expect(permission.GrantedToV2.User.GetId()).To(Equal("guest@xn--infocorp-o0e.com")) + }) + It("rejects guest shares when guest invites are disabled by default", func() { driveItemInvite.Recipients = []libregraph.DriveRecipient{ {Email: libregraph.PtrString("guest@example.com")}, @@ -1477,3 +1495,12 @@ var _ = Describe("DriveItemPermissionsApi", func() { }) }) }) + +func guestGrantee(mail string) *provider.Grantee { + return &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{ + UserId: &userpb.UserId{Type: userpb.UserType_USER_TYPE_GUEST, OpaqueId: mail}, + }, + } +}