From f71f7c75216bb00bd9ce7c849921f739a33913f6 Mon Sep 17 00:00:00 2001 From: Ralf Haferkamp Date: Wed, 28 Sep 2022 17:15:39 +0200 Subject: [PATCH] Fix grantee lookup for Share/Space Created event for groups 'ShareCreated' and 'SpaceCreate' events for group shares have an empty GranteeUserID attribute. We need to lookup the GranteeGroup to get the Grantee Name for the notification mail Partial Fix: #4703 --- services/notifications/pkg/service/service.go | 97 ++++++++++++++----- 1 file changed, 74 insertions(+), 23 deletions(-) diff --git a/services/notifications/pkg/service/service.go b/services/notifications/pkg/service/service.go index d2f35e117..126382c96 100644 --- a/services/notifications/pkg/service/service.go +++ b/services/notifications/pkg/service/service.go @@ -10,6 +10,7 @@ import ( "syscall" gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" + groupv1beta1 "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" userv1beta1 "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" rpcv1beta1 "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" providerv1beta1 "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" @@ -85,16 +86,6 @@ func (s eventsNotifier) handleSpaceShared(e events.SpaceShared) { return } - granteeUserResponse, err := s.gwClient.GetUser(context.Background(), &userv1beta1.GetUserRequest{ - UserId: e.GranteeUserID, - }) - if err != nil || sharerUserResponse.Status.Code != rpcv1beta1.Code_CODE_OK { - s.logger.Error(). - Err(err). - Str("event", "SpaceCreated"). - Msg("Could not get user response from gatway client") - return - } // Get auth context ownerCtx := ctxpkg.ContextSetUser(context.Background(), sharerUserResponse.User) authRes, err := s.gwClient.Authenticate(ownerCtx, &gateway.AuthenticateRequest{ @@ -165,10 +156,45 @@ func (s eventsNotifier) handleSpaceShared(e events.SpaceShared) { Msg("could not create link to the share") return } + spaceGrantee := "" + switch { + // Note: We're using the 'ownerCtx' (authenticated as the share owner) here for requesting + // the Grantees of the shares. Ideally the notfication service would use some kind of service + // user for this. + case e.GranteeUserID != nil: + granteeUserResponse, err := s.gwClient.GetUser(ownerCtx, &userv1beta1.GetUserRequest{ + UserId: e.GranteeUserID, + }) + if err != nil || granteeUserResponse.Status.Code != rpcv1beta1.Code_CODE_OK { + s.logger.Error(). + Err(err). + Str("event", "ShareCreated"). + Msg("Could not get user response from gatway client") + return + } + spaceGrantee = granteeUserResponse.GetUser().DisplayName + case e.GranteeGroupID != nil: + granteeGroupResponse, err := s.gwClient.GetGroup(ownerCtx, &groupv1beta1.GetGroupRequest{ + GroupId: e.GranteeGroupID, + }) + if err != nil || granteeGroupResponse.Status.Code != rpcv1beta1.Code_CODE_OK { + s.logger.Error(). + Err(err). + Str("event", "ShareCreated"). + Msg("Could not get group response from gatway client") + return + } + spaceGrantee = granteeGroupResponse.GetGroup().DisplayName + default: + s.logger.Error(). + Str("event", "ShareCreated"). + Msg("Event 'ShareCreated' has no grantee") + return + } sharerDisplayName := sharerUserResponse.GetUser().DisplayName msg, err := email.RenderEmailTemplate("sharedSpace.email.tmpl", map[string]string{ - "SpaceGrantee": granteeUserResponse.GetUser().DisplayName, + "SpaceGrantee": spaceGrantee, "SpaceSharer": sharerDisplayName, "SpaceName": md.GetInfo().GetSpace().Name, "ShareLink": shareLink, @@ -207,17 +233,6 @@ func (s eventsNotifier) handleShareCreated(e events.ShareCreated) { return } - granteeUserResponse, err := s.gwClient.GetUser(context.Background(), &userv1beta1.GetUserRequest{ - UserId: e.GranteeUserID, - }) - if err != nil || sharerUserResponse.Status.Code != rpcv1beta1.Code_CODE_OK { - s.logger.Error(). - Err(err). - Str("event", "ShareCreated"). - Msg("Could not get user response from gatway client") - return - } - // Get auth context ownerCtx := ctxpkg.ContextSetUser(context.Background(), sharerUserResponse.User) authRes, err := s.gwClient.Authenticate(ownerCtx, &gateway.AuthenticateRequest{ @@ -279,9 +294,45 @@ func (s eventsNotifier) handleShareCreated(e events.ShareCreated) { return } + shareGrantee := "" + switch { + // Note: We're using the 'ownerCtx' (authenticated as the share owner) here for requesting + // the Grantees of the shares. Ideally the notfication service would use some kind of service + // user for this. + case e.GranteeUserID != nil: + granteeUserResponse, err := s.gwClient.GetUser(ownerCtx, &userv1beta1.GetUserRequest{ + UserId: e.GranteeUserID, + }) + if err != nil || granteeUserResponse.Status.Code != rpcv1beta1.Code_CODE_OK { + s.logger.Error(). + Err(err). + Str("event", "ShareCreated"). + Msg("Could not get user response from gatway client") + return + } + shareGrantee = granteeUserResponse.GetUser().DisplayName + case e.GranteeGroupID != nil: + granteeGroupResponse, err := s.gwClient.GetGroup(ownerCtx, &groupv1beta1.GetGroupRequest{ + GroupId: e.GranteeGroupID, + }) + if err != nil || granteeGroupResponse.Status.Code != rpcv1beta1.Code_CODE_OK { + s.logger.Error(). + Err(err). + Str("event", "ShareCreated"). + Msg("Could not get group response from gatway client") + return + } + shareGrantee = granteeGroupResponse.GetGroup().DisplayName + default: + s.logger.Error(). + Str("event", "ShareCreated"). + Msg("Event 'ShareCreated' has no grantee") + return + } + sharerDisplayName := sharerUserResponse.GetUser().DisplayName msg, err := email.RenderEmailTemplate("shareCreated.email.tmpl", map[string]string{ - "ShareGrantee": granteeUserResponse.GetUser().DisplayName, + "ShareGrantee": shareGrantee, "ShareSharer": sharerDisplayName, "ShareFolder": md.GetInfo().Name, "ShareLink": shareLink,