diff --git a/services/notifications/pkg/command/server.go b/services/notifications/pkg/command/server.go index 9c82a2d7d..93998f7c0 100644 --- a/services/notifications/pkg/command/server.go +++ b/services/notifications/pkg/command/server.go @@ -36,6 +36,7 @@ func Server(cfg *config.Config) *cli.Command { evs := []events.Unmarshaller{ events.ShareCreated{}, events.SpaceShared{}, + events.SpaceUnshared{}, } evtsCfg := cfg.Notifications.Events diff --git a/services/notifications/pkg/email/templates/spaces/unsharedSpace.email.body.tmpl b/services/notifications/pkg/email/templates/spaces/unsharedSpace.email.body.tmpl new file mode 100644 index 000000000..4c6fa9ece --- /dev/null +++ b/services/notifications/pkg/email/templates/spaces/unsharedSpace.email.body.tmpl @@ -0,0 +1,18 @@ +Hello {{ .SpaceGrantee }}, + +{{ .SpaceSharer }} has removed you from "{{ .SpaceName }}". + +You might still have access through your other groups or direct membership. Click here to check it: {{ .ShareLink }} + +---------------------------------------------------------- + +Hallo {{ .SpaceGrantee }}, + +{{ .SpaceSharer }} hat dich aus dem Space "{{ .SpaceName }}" entfernt. + +Du könntest über deine anderen Gruppen oder deiner direkten Mitgliedschaft noch Zugriff haben. Klicke hier zum Überprüfen: {{ .ShareLink }} + + +--- +ownCloud - Store. Share. Work. +https://owncloud.com diff --git a/services/notifications/pkg/email/templates/spaces/unsharedSpace.email.subject.tmpl b/services/notifications/pkg/email/templates/spaces/unsharedSpace.email.subject.tmpl new file mode 100644 index 000000000..b4a526abd --- /dev/null +++ b/services/notifications/pkg/email/templates/spaces/unsharedSpace.email.subject.tmpl @@ -0,0 +1 @@ +{{ .SpaceSharer }} removed you from {{ .SpaceName }} diff --git a/services/notifications/pkg/service/service.go b/services/notifications/pkg/service/service.go index 2b3c55b44..b9a10734c 100644 --- a/services/notifications/pkg/service/service.go +++ b/services/notifications/pkg/service/service.go @@ -68,6 +68,8 @@ func (s eventsNotifier) Run() error { switch e := evt.(type) { case events.SpaceShared: s.handleSpaceShared(e) + case events.SpaceUnshared: + s.handleSpaceUnshared(e) case events.ShareCreated: s.handleShareCreated(e) } diff --git a/services/notifications/pkg/service/spaces.go b/services/notifications/pkg/service/spaces.go index 790e24ca4..9fd01342b 100644 --- a/services/notifications/pkg/service/spaces.go +++ b/services/notifications/pkg/service/spaces.go @@ -67,7 +67,7 @@ func (s eventsNotifier) handleSpaceShared(e events.SpaceShared) { Msg("Could not get user response from gatway client") return } - spaceGrantee = granteeUserResponse.GetUser().DisplayName + spaceGrantee = granteeUserResponse.GetUser().GetDisplayName() case e.GranteeGroupID != nil: granteeGroupResponse, err := s.gwClient.GetGroup(ownerCtx, &groupv1beta1.GetGroupRequest{ GroupId: e.GranteeGroupID, @@ -78,14 +78,14 @@ func (s eventsNotifier) handleSpaceShared(e events.SpaceShared) { Msg("Could not get group response from gatway client") return } - spaceGrantee = granteeGroupResponse.GetGroup().DisplayName + spaceGrantee = granteeGroupResponse.GetGroup().GetDisplayName() default: logger.Error(). Msg("Event 'SpaceShared' has no grantee") return } - sharerDisplayName := impersonateRes.GetUser().DisplayName + sharerDisplayName := impersonateRes.GetUser().GetDisplayName() msg, err := email.RenderEmailTemplate("spaces/sharedSpace.email.body.tmpl", map[string]string{ "SpaceGrantee": spaceGrantee, "SpaceSharer": sharerDisplayName, @@ -121,3 +121,112 @@ func (s eventsNotifier) handleSpaceShared(e events.SpaceShared) { Msg("failed to send a message") } } + +func (s eventsNotifier) handleSpaceUnshared(e events.SpaceUnshared) { + logger := s.logger.With(). + Str("event", "SpaceUnshared"). + Str("itemid", e.ID.OpaqueId). + Logger() + + impersonateRes, err := s.impersonate(e.Executant) + if err != nil { + logger.Error(). + Err(err). + Msg("could not handle space unshared event") + return + } + ownerCtx := metadata.AppendToOutgoingContext(context.Background(), revactx.TokenHeader, impersonateRes.Token) + + resourceID, err := storagespace.ParseID(e.ID.OpaqueId) + if err != nil { + logger.Error(). + Err(err). + Msg("could not parse resourceid from ItemID ") + return + } + + resourceInfo, err := s.getResourceInfo(ownerCtx, &resourceID, nil) + if err != nil { + logger.Error(). + Err(err). + Msg("could not get space info") + return + } + + shareLink, err := urlJoinPath(s.ocisURL, "f", e.ID.OpaqueId) + if err != nil { + logger.Error(). + Err(err). + 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 { + logger.Error(). + Err(err). + Msg("Could not get user response from gatway client") + return + } + spaceGrantee = granteeUserResponse.GetUser().GetDisplayName() + 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 { + logger.Error(). + Err(err). + Msg("Could not get group response from gatway client") + return + } + spaceGrantee = granteeGroupResponse.GetGroup().GetDisplayName() + default: + logger.Error(). + Msg("Event 'SpaceShared' has no grantee") + return + } + + sharerDisplayName := impersonateRes.GetUser().GetDisplayName() + msg, err := email.RenderEmailTemplate("spaces/unsharedSpace.email.body.tmpl", map[string]string{ + "SpaceGrantee": spaceGrantee, + "SpaceSharer": sharerDisplayName, + "SpaceName": resourceInfo.GetSpace().Name, + "ShareLink": shareLink, + }, s.emailTemplatePath) + + if err != nil { + logger.Error(). + Err(err). + Msg("Could not render E-Mail body template for spaces") + } + + emailSubject, err := email.RenderEmailTemplate("spaces/unsharedSpace.email.subject.tmpl", map[string]string{ + "SpaceSharer": sharerDisplayName, + "SpaceName": resourceInfo.GetSpace().Name, + }, s.emailTemplatePath) + + if err != nil { + logger.Error(). + Err(err). + Msg("Could not render E-Mail subject template for spaces") + } + + if e.GranteeUserID != nil { + err = s.channel.SendMessage(ownerCtx, []string{e.GranteeUserID.OpaqueId}, msg, emailSubject, sharerDisplayName) + } else if e.GranteeGroupID != nil { + err = s.channel.SendMessageToGroup(ownerCtx, e.GranteeGroupID, msg, emailSubject, sharerDisplayName) + } + if err != nil { + logger.Error(). + Err(err). + Msg("failed to send a message") + } +}