From 40c582a09ae48d0774f64f4d91b867af728551ee Mon Sep 17 00:00:00 2001 From: jkoberg Date: Tue, 25 Apr 2023 12:31:56 +0200 Subject: [PATCH 1/4] changelog Signed-off-by: jkoberg --- changelog/unreleased/disable-notifications.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelog/unreleased/disable-notifications.md diff --git a/changelog/unreleased/disable-notifications.md b/changelog/unreleased/disable-notifications.md new file mode 100644 index 0000000000..671a106163 --- /dev/null +++ b/changelog/unreleased/disable-notifications.md @@ -0,0 +1,5 @@ +Enhancement: Disable Notifications + +Introduce new setting to disable notifications + +https://github.com/owncloud/ocis/pull/6136 From 3bf24746e6bc6842f6cdaf08eddbf2286bebb4f4 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Tue, 25 Apr 2023 11:54:49 +0200 Subject: [PATCH 2/4] add new setting to disable emails Signed-off-by: jkoberg --- .../settings/pkg/store/defaults/defaults.go | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/services/settings/pkg/store/defaults/defaults.go b/services/settings/pkg/store/defaults/defaults.go index 6e7b463f6b..39108d97bd 100644 --- a/services/settings/pkg/store/defaults/defaults.go +++ b/services/settings/pkg/store/defaults/defaults.go @@ -33,6 +33,13 @@ const ( // LanguageReadWriteName is the hardcoded setting name for the language read write permission LanguageReadWriteName string = "language-readwrite" + // DisableEmailNotificationsPermissionID is the hardcoded setting UUID for the language read write permission + DisableEmailNotificationsPermissionID string = "ad5bb5e5-dc13-4cd3-9304-09a424564ea8" + // DisableEmailNotificationsPermissionName is the hardcoded setting name for the language read write permission + DisableEmailNotificationsPermissionName string = "disable-email-notifications" + // DisableEmailNotificationsPermissionDisplayName is the hardcoded setting name for the language read write permission + DisableEmailNotificationsPermissionDisplayName string = "Disable Email Notifications" + // SetPersonalSpaceQuotaPermissionID is the hardcoded setting UUID for the set personal space quota permission SetPersonalSpaceQuotaPermissionID string = "4e6f9709-f9e7-44f1-95d4-b762d27b7896" // SetPersonalSpaceQuotaPermissionName is the hardcoded setting name for the set personal space quota permission @@ -75,6 +82,8 @@ const ( // SettingUUIDProfileLanguage is the hardcoded setting UUID for the user profile language SettingUUIDProfileLanguage = "aa8cfbe5-95d4-4f7e-a032-c3c01f5f062f" + // SettingUUIDProfileDisableNotifications is the hardcoded setting UUID for the disable notifications setting + SettingUUIDProfileDisableNotifications = "33ffb5d6-cd07-4dc0-afb0-84f7559ae438" // AccountManagementPermissionID is the hardcoded setting UUID for the account management permission AccountManagementPermissionID string = "8e587774-d929-4215-910b-a317b1e80f73" @@ -169,6 +178,21 @@ func generateBundleAdminRole() *settingsmsg.Bundle { }, }, }, + { + Id: DisableEmailNotificationsPermissionID, + Name: DisableEmailNotificationsPermissionName, + DisplayName: DisableEmailNotificationsPermissionDisplayName, + Resource: &settingsmsg.Resource{ + Type: settingsmsg.Resource_TYPE_SETTING, + Id: SettingUUIDProfileDisableNotifications, + }, + Value: &settingsmsg.Setting_PermissionValue{ + PermissionValue: &settingsmsg.Permission{ + Operation: settingsmsg.Permission_OPERATION_READWRITE, + Constraint: settingsmsg.Permission_CONSTRAINT_OWN, + }, + }, + }, { Id: AccountManagementPermissionID, Name: AccountManagementPermissionName, @@ -426,6 +450,21 @@ func generateBundleSpaceAdminRole() *settingsmsg.Bundle { }, }, }, + { + Id: DisableEmailNotificationsPermissionID, + Name: DisableEmailNotificationsPermissionName, + DisplayName: DisableEmailNotificationsPermissionDisplayName, + Resource: &settingsmsg.Resource{ + Type: settingsmsg.Resource_TYPE_SETTING, + Id: SettingUUIDProfileDisableNotifications, + }, + Value: &settingsmsg.Setting_PermissionValue{ + PermissionValue: &settingsmsg.Permission{ + Operation: settingsmsg.Permission_OPERATION_READWRITE, + Constraint: settingsmsg.Permission_CONSTRAINT_OWN, + }, + }, + }, { Id: SelfManagementPermissionID, Name: SelfManagementPermissionName, @@ -502,6 +541,21 @@ func generateBundleUserRole() *settingsmsg.Bundle { }, }, }, + { + Id: DisableEmailNotificationsPermissionID, + Name: DisableEmailNotificationsPermissionName, + DisplayName: DisableEmailNotificationsPermissionDisplayName, + Resource: &settingsmsg.Resource{ + Type: settingsmsg.Resource_TYPE_SETTING, + Id: SettingUUIDProfileDisableNotifications, + }, + Value: &settingsmsg.Setting_PermissionValue{ + PermissionValue: &settingsmsg.Permission{ + Operation: settingsmsg.Permission_OPERATION_READWRITE, + Constraint: settingsmsg.Permission_CONSTRAINT_OWN, + }, + }, + }, { Id: SelfManagementPermissionID, Name: SelfManagementPermissionName, @@ -578,6 +632,21 @@ func generateBundleGuestRole() *settingsmsg.Bundle { }, }, }, + { + Id: DisableEmailNotificationsPermissionID, + Name: DisableEmailNotificationsPermissionName, + DisplayName: DisableEmailNotificationsPermissionDisplayName, + Resource: &settingsmsg.Resource{ + Type: settingsmsg.Resource_TYPE_SETTING, + Id: SettingUUIDProfileDisableNotifications, + }, + Value: &settingsmsg.Setting_PermissionValue{ + PermissionValue: &settingsmsg.Permission{ + Operation: settingsmsg.Permission_OPERATION_READWRITE, + Constraint: settingsmsg.Permission_CONSTRAINT_OWN, + }, + }, + }, }, } } @@ -603,6 +672,16 @@ func generateBundleProfileRequest() *settingsmsg.Bundle { }, Value: &languageSetting, }, + { + Id: SettingUUIDProfileDisableNotifications, + Name: "disable email notifications", + DisplayName: "Disable Email Notifications", + Description: "Disable email notifications", + Resource: &settingsmsg.Resource{ + Type: settingsmsg.Resource_TYPE_USER, + }, + Value: &settingsmsg.Setting_BoolValue{BoolValue: &settingsmsg.Bool{Default: false, Label: "disable notifications"}}, + }, }, } } From 8b7b8d083ad00cee7eb0a15245ebd5aff1ae1c79 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Tue, 25 Apr 2023 12:29:59 +0200 Subject: [PATCH 3/4] respect disable email setting in notification service Signed-off-by: jkoberg --- services/notifications/pkg/service/service.go | 58 +++++++++++++------ 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/services/notifications/pkg/service/service.go b/services/notifications/pkg/service/service.go index e20b917c28..df17067f98 100644 --- a/services/notifications/pkg/service/service.go +++ b/services/notifications/pkg/service/service.go @@ -109,10 +109,7 @@ func (s eventsNotifier) render(ctx context.Context, template email.MessageTempla // Render the Email Template for each user recipientList := make([]recipient, len(granteeList)) for i, userID := range granteeList { - locale, err := s.getUserLang(ctx, userID) - if err != nil { - return nil, err - } + locale := s.getUserLang(ctx, userID) grantee, err := s.getUserName(ctx, userID) if err != nil { return nil, err @@ -137,9 +134,12 @@ func (s eventsNotifier) send(ctx context.Context, recipientList []recipient, sen } } -func (s eventsNotifier) getGranteeList(ctx context.Context, owner, u *user.UserId, g *group.GroupId) ([]*user.UserId, error) { +func (s eventsNotifier) getGranteeList(ctx context.Context, executant, u *user.UserId, g *group.GroupId) ([]*user.UserId, error) { switch { case u != nil: + if s.disableEmails(ctx, u) { + return []*user.UserId{}, nil + } return []*user.UserId{u}, nil case g != nil: res, err := s.gwClient.GetGroup(ctx, &group.GetGroupRequest{GroupId: g}) @@ -149,14 +149,22 @@ func (s eventsNotifier) getGranteeList(ctx context.Context, owner, u *user.UserI if res.Status.Code != rpc.Code_CODE_OK { return nil, errors.New("could not get group") } - for i, userID := range res.GetGroup().GetMembers() { - // remove an executant from a list - if userID.GetOpaqueId() == owner.GetOpaqueId() { - res.Group.Members[i] = res.Group.Members[len(res.Group.Members)-1] - return res.Group.Members[:len(res.Group.Members)-1], nil + + var grantees []*user.UserId + for _, userID := range res.GetGroup().GetMembers() { + // don't add the executant + if userID.GetOpaqueId() == executant.GetOpaqueId() { + continue } + + // don't add users who opted out + if s.disableEmails(ctx, userID) { + continue + } + + grantees = append(grantees, userID) } - return res.Group.Members, nil + return grantees, nil default: return nil, errors.New("need at least one non-nil grantee") } @@ -176,22 +184,34 @@ func (s eventsNotifier) getUserName(ctx context.Context, u *user.UserId) (string return r.GetUser().GetDisplayName(), nil } -func (s eventsNotifier) getUserLang(ctx context.Context, u *user.UserId) (string, error) { +func (s eventsNotifier) getUserLang(ctx context.Context, u *user.UserId) string { granteeCtx := metadata.Set(ctx, middleware.AccountID, u.OpaqueId) if resp, err := s.valueService.GetValueByUniqueIdentifiers(granteeCtx, &settingssvc.GetValueByUniqueIdentifiersRequest{ AccountUuid: u.OpaqueId, SettingId: defaults.SettingUUIDProfileLanguage, - }); err == nil { - if resp == nil { - return _defaultLocale, nil - } - val := resp.Value.GetValue().GetListValue().GetValues() + }, + ); err == nil { + val := resp.GetValue().GetValue().GetListValue().GetValues() if len(val) > 0 && val[0] != nil { - return val[0].GetStringValue(), nil + return val[0].GetStringValue() } } - return _defaultLocale, nil + return _defaultLocale +} + +func (s eventsNotifier) disableEmails(ctx context.Context, u *user.UserId) bool { + granteeCtx := metadata.Set(ctx, middleware.AccountID, u.OpaqueId) + if resp, err := s.valueService.GetValueByUniqueIdentifiers(granteeCtx, + &settingssvc.GetValueByUniqueIdentifiersRequest{ + AccountUuid: u.OpaqueId, + SettingId: defaults.SettingUUIDProfileDisableNotifications, + }, + ); err == nil { + return resp.GetValue().GetValue().GetBoolValue() + + } + return false } func (s eventsNotifier) getResourceInfo(ctx context.Context, resourceID *provider.ResourceId, fieldmask *fieldmaskpb.FieldMask) (*provider.ResourceInfo, error) { From 7d13ce519da2b507f811205b35608dc90c2dfb2c Mon Sep 17 00:00:00 2001 From: jkoberg Date: Thu, 27 Apr 2023 10:06:16 +0200 Subject: [PATCH 4/4] better naming for setting and permission Signed-off-by: jkoberg --- services/settings/pkg/store/defaults/defaults.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/services/settings/pkg/store/defaults/defaults.go b/services/settings/pkg/store/defaults/defaults.go index 39108d97bd..241bc8bd6e 100644 --- a/services/settings/pkg/store/defaults/defaults.go +++ b/services/settings/pkg/store/defaults/defaults.go @@ -33,11 +33,11 @@ const ( // LanguageReadWriteName is the hardcoded setting name for the language read write permission LanguageReadWriteName string = "language-readwrite" - // DisableEmailNotificationsPermissionID is the hardcoded setting UUID for the language read write permission + // DisableEmailNotificationsPermissionID is the hardcoded setting UUID for the disable email notifications permission DisableEmailNotificationsPermissionID string = "ad5bb5e5-dc13-4cd3-9304-09a424564ea8" - // DisableEmailNotificationsPermissionName is the hardcoded setting name for the language read write permission - DisableEmailNotificationsPermissionName string = "disable-email-notifications" - // DisableEmailNotificationsPermissionDisplayName is the hardcoded setting name for the language read write permission + // DisableEmailNotificationsPermissionName is the hardcoded setting name for the disable email notifications permission + DisableEmailNotificationsPermissionName string = "EmailNotifications.ReadWriteDisabled" + // DisableEmailNotificationsPermissionDisplayName is the hardcoded setting name for the disable email notifications permission DisableEmailNotificationsPermissionDisplayName string = "Disable Email Notifications" // SetPersonalSpaceQuotaPermissionID is the hardcoded setting UUID for the set personal space quota permission @@ -674,7 +674,7 @@ func generateBundleProfileRequest() *settingsmsg.Bundle { }, { Id: SettingUUIDProfileDisableNotifications, - Name: "disable email notifications", + Name: "disable-email-notifications", DisplayName: "Disable Email Notifications", Description: "Disable email notifications", Resource: &settingsmsg.Resource{