diff --git a/app/permissions_migrations.go b/app/permissions_migrations.go index 613adc927f..2b638be162 100644 --- a/app/permissions_migrations.go +++ b/app/permissions_migrations.go @@ -991,6 +991,27 @@ func (a *App) getPlaybooksPermissionsAddManageRoles() (permissionsMap, error) { return transformations, nil } +func (a *App) getProductsBoardsPermissions() (permissionsMap, error) { + transformations := []permissionTransformation{} + + permissionsProductsRead := []string{model.PermissionSysconsoleReadProductsBoards.Id} + permissionsProductsWrite := []string{model.PermissionSysconsoleWriteProductsBoards.Id} + + // Give the new subsection READ permissions to any user with SYSTEM_MANAGER + transformations = append(transformations, permissionTransformation{ + On: permissionOr(isRole(model.SystemManagerRoleId)), + Add: permissionsProductsRead, + }) + + // Give the new subsection WRITE permissions to any user with SYSTEM_ADMIN + transformations = append(transformations, permissionTransformation{ + On: permissionOr(isRole(model.SystemAdminRoleId)), + Add: permissionsProductsWrite, + }) + + return transformations, nil +} + // DoPermissionsMigrations execute all the permissions migrations need by the current version. func (a *App) DoPermissionsMigrations() error { return a.Srv().doPermissionsMigrations() @@ -1032,6 +1053,7 @@ func (s *Server) doPermissionsMigrations() error { {Key: model.MigrationKeyAddPlaybooksPermissions, Migration: a.getAddPlaybooksPermissions}, {Key: model.MigrationKeyAddCustomUserGroupsPermissions, Migration: a.getAddCustomUserGroupsPermissions}, {Key: model.MigrationKeyAddPlayboosksManageRolesPermissions, Migration: a.getPlaybooksPermissionsAddManageRoles}, + {Key: model.MigrationKeyAddProductsBoardsPermissions, Migration: a.getProductsBoardsPermissions}, } roles, err := s.Store().Role().GetAll() diff --git a/model/config.go b/model/config.go index 886b7e5820..bccc3904a1 100644 --- a/model/config.go +++ b/model/config.go @@ -2747,6 +2747,16 @@ func (s *CloudSettings) SetDefaults() { } } +type ProductSettings struct { + EnablePublicSharedBoards *bool +} + +func (s *ProductSettings) SetDefaults() { + if s.EnablePublicSharedBoards == nil { + s.EnablePublicSharedBoards = NewBool(false) + } +} + type PluginState struct { Enable bool } @@ -3136,6 +3146,7 @@ type Config struct { DataRetentionSettings DataRetentionSettings MessageExportSettings MessageExportSettings JobSettings JobSettings + ProductSettings ProductSettings PluginSettings PluginSettings DisplaySettings DisplaySettings GuestAccountsSettings GuestAccountsSettings @@ -3235,6 +3246,7 @@ func (o *Config) SetDefaults() { o.ThemeSettings.SetDefaults() o.ClusterSettings.SetDefaults() o.PluginSettings.SetDefaults(o.LogSettings) + o.ProductSettings.SetDefaults() o.AnalyticsSettings.SetDefaults() o.ComplianceSettings.SetDefaults() o.LocalizationSettings.SetDefaults() diff --git a/model/migration.go b/model/migration.go index 4958f80e85..e0e9ae2267 100644 --- a/model/migration.go +++ b/model/migration.go @@ -38,4 +38,5 @@ const ( MigrationKeyAddPlaybooksPermissions = "playbooks_permissions" MigrationKeyAddCustomUserGroupsPermissions = "custom_groups_permissions" MigrationKeyAddPlayboosksManageRolesPermissions = "playbooks_manage_roles" + MigrationKeyAddProductsBoardsPermissions = "products_boards" ) diff --git a/model/permission.go b/model/permission.go index 65f8edaca8..76cf07c872 100644 --- a/model/permission.go +++ b/model/permission.go @@ -354,6 +354,9 @@ var PermissionRunManageProperties *Permission var PermissionRunManageMembers *Permission var PermissionRunView *Permission +var PermissionSysconsoleReadProductsBoards *Permission +var PermissionSysconsoleWriteProductsBoards *Permission + // General permission that encompasses all system admin functions // in the future this could be broken up to allow access to some // admin functions but not others @@ -2070,6 +2073,19 @@ func initializePermissions() { PermissionScopeRun, } + PermissionSysconsoleReadProductsBoards = &Permission{ + "sysconsole_read_products_boards", + "", + "", + PermissionScopeSystem, + } + PermissionSysconsoleWriteProductsBoards = &Permission{ + "sysconsole_write_products_boards", + "", + "", + PermissionScopeSystem, + } + SysconsoleReadPermissions = []*Permission{ PermissionSysconsoleReadAboutEditionAndLicense, PermissionSysconsoleReadBilling, @@ -2125,6 +2141,7 @@ func initializePermissions() { PermissionSysconsoleReadExperimentalFeatures, PermissionSysconsoleReadExperimentalFeatureFlags, PermissionSysconsoleReadExperimentalBleve, + PermissionSysconsoleReadProductsBoards, } SysconsoleWritePermissions = []*Permission{ @@ -2182,6 +2199,7 @@ func initializePermissions() { PermissionSysconsoleWriteExperimentalFeatures, PermissionSysconsoleWriteExperimentalFeatureFlags, PermissionSysconsoleWriteExperimentalBleve, + PermissionSysconsoleWriteProductsBoards, } SystemScopedPermissionsMinusSysconsole := []*Permission{ diff --git a/model/role.go b/model/role.go index 7823f133b4..ac3fa3204e 100644 --- a/model/role.go +++ b/model/role.go @@ -261,6 +261,7 @@ func init() { PermissionSysconsoleReadExperimentalFeatures.Id, PermissionSysconsoleReadExperimentalFeatureFlags.Id, PermissionSysconsoleReadExperimentalBleve.Id, + PermissionSysconsoleReadProductsBoards.Id, } SystemManagerDefaultPermissions = []string{ @@ -339,6 +340,8 @@ func init() { PermissionSysconsoleWriteIntegrationsBotAccounts.Id, PermissionSysconsoleWriteIntegrationsGif.Id, PermissionSysconsoleWriteIntegrationsCors.Id, + PermissionSysconsoleReadProductsBoards.Id, + PermissionSysconsoleWriteProductsBoards.Id, } SystemCustomGroupAdminDefaultPermissions = []string{ diff --git a/services/telemetry/telemetry.go b/services/telemetry/telemetry.go index f19e5a4188..821b4c8a91 100644 --- a/services/telemetry/telemetry.go +++ b/services/telemetry/telemetry.go @@ -67,6 +67,7 @@ const ( TrackConfigBleve = "config_bleve" TrackConfigExport = "config_export" TrackFeatureFlags = "config_feature_flags" + TrackConfigProducts = "products" TrackPermissionsGeneral = "permissions_general" TrackPermissionsSystemScheme = "permissions_system_scheme" TrackPermissionsTeamSchemes = "permissions_team_schemes" @@ -827,6 +828,10 @@ func (ts *TelemetryService) trackConfig() { "retention_days": *cfg.ExportSettings.RetentionDays, }) + ts.SendTelemetry(TrackConfigProducts, map[string]any{ + "enable_public_shared_boards": *cfg.ProductSettings.EnablePublicSharedBoards, + }) + // Convert feature flags to map[string]any for sending flags := cfg.FeatureFlags.ToMap() interfaceFlags := make(map[string]any) diff --git a/testlib/store.go b/testlib/store.go index 5566989362..800764da07 100644 --- a/testlib/store.go +++ b/testlib/store.go @@ -69,6 +69,7 @@ func GetMockStoreForSetupFunctions() *mocks.Store { systemStore.On("GetByName", model.MigrationKeyAddCustomUserGroupsPermissions).Return(&model.System{Name: model.MigrationKeyAddCustomUserGroupsPermissions, Value: "true"}, nil) systemStore.On("GetByName", model.MigrationKeyAddPlayboosksManageRolesPermissions).Return(&model.System{Name: model.MigrationKeyAddPlayboosksManageRolesPermissions, Value: "true"}, nil) systemStore.On("GetByName", "CustomGroupAdminRoleCreationMigrationComplete").Return(&model.System{Name: model.MigrationKeyAddPlayboosksManageRolesPermissions, Value: "true"}, nil) + systemStore.On("GetByName", "products_boards").Return(&model.System{Name: "products_boards", Value: "true"}, nil) systemStore.On("InsertIfExists", mock.AnythingOfType("*model.System")).Return(&model.System{}, nil).Once() systemStore.On("Save", mock.AnythingOfType("*model.System")).Return(nil)