MM-38150 Adding playbooks permissions (#19096)

* Add playbooks related permissions.

* Add RolesGrantPermission to pluginapi

* Fixing scopes.

* New defaults.

* Fix defaults

* Fix tests.

* Fix migration.

* More test and migration fixes.

* Need to add everything to system admin too.

* Move to 63

* Feedback fixes.

* Fix system manager editing playbook permissions.
Этот коммит содержится в:
Christopher Speller
2021-12-07 09:43:33 -08:00
коммит произвёл GitHub
родитель 129f0aabd3
Коммит 5ec78546e2
19 изменённых файлов: 670 добавлений и 59 удалений

Просмотреть файл

@@ -269,6 +269,38 @@ func createDefaultRoles(ss store.Store) {
model.PermissionCreatePost.Id,
},
})
ss.Role().Save(&model.Role{
Name: model.PlaybookAdminRoleId,
DisplayName: model.PlaybookAdminRoleId,
Permissions: []string{
model.PermissionPrivatePlaybookManageMembers.Id,
},
})
ss.Role().Save(&model.Role{
Name: model.PlaybookMemberRoleId,
DisplayName: model.PlaybookMemberRoleId,
Permissions: []string{
model.PermissionPrivatePlaybookManageMembers.Id,
},
})
ss.Role().Save(&model.Role{
Name: model.RunAdminRoleId,
DisplayName: model.RunAdminRoleId,
Permissions: []string{
model.PermissionRunManageMembers.Id,
},
})
ss.Role().Save(&model.Role{
Name: model.RunMemberRoleId,
DisplayName: model.RunMemberRoleId,
Permissions: []string{
model.PermissionRunManageMembers.Id,
},
})
}
func createScheme(ss store.Store) *model.Scheme {

Просмотреть файл

@@ -34,6 +34,10 @@ func newSqlSchemeStore(sqlStore *SqlStore) store.SchemeStore {
table.ColMap("DefaultChannelAdminRole").SetMaxSize(64)
table.ColMap("DefaultChannelUserRole").SetMaxSize(64)
table.ColMap("DefaultChannelGuestRole").SetMaxSize(64)
table.ColMap("DefaultPlaybookAdminRole").SetMaxSize(64).SetDefaultConstraint(model.NewString(""))
table.ColMap("DefaultPlaybookMemberRole").SetMaxSize(64).SetDefaultConstraint(model.NewString(""))
table.ColMap("DefaultRunAdminRole").SetMaxSize(64).SetDefaultConstraint(model.NewString(""))
table.ColMap("DefaultRunMemberRole").SetMaxSize(64).SetDefaultConstraint(model.NewString(""))
}
return s
@@ -72,7 +76,8 @@ func (s *SqlSchemeStore) Save(scheme *model.Scheme) (*model.Scheme, error) {
res, err := s.GetMasterX().NamedExec(`UPDATE Schemes
SET UpdateAt=:UpdateAt, CreateAt=:CreateAt, DeleteAt=:DeleteAt, Name=:Name, DisplayName=:DisplayName, Description=:Description, Scope=:Scope,
DefaultTeamAdminRole=:DefaultTeamAdminRole, DefaultTeamUserRole=:DefaultTeamUserRole, DefaultTeamGuestRole=:DefaultTeamGuestRole,
DefaultChannelAdminRole=:DefaultChannelAdminRole, DefaultChannelUserRole=:DefaultChannelUserRole, DefaultChannelGuestRole=:DefaultChannelGuestRole
DefaultChannelAdminRole=:DefaultChannelAdminRole, DefaultChannelUserRole=:DefaultChannelUserRole, DefaultChannelGuestRole=:DefaultChannelGuestRole,
DefaultPlaybookMemberRole=:DefaultPlaybookMemberRole, DefaultPlaybookAdminRole=:DefaultPlaybookAdminRole, DefaultRunMemberRole=:DefaultRunMemberRole, DefaultRunAdminRole=:DefaultRunAdminRole
WHERE Id=:Id`, scheme)
if err != nil {
@@ -92,7 +97,18 @@ func (s *SqlSchemeStore) Save(scheme *model.Scheme) (*model.Scheme, error) {
func (s *SqlSchemeStore) createScheme(scheme *model.Scheme, transaction *sqlxTxWrapper) (*model.Scheme, error) {
// Fetch the default system scheme roles to populate default permissions.
defaultRoleNames := []string{model.TeamAdminRoleId, model.TeamUserRoleId, model.TeamGuestRoleId, model.ChannelAdminRoleId, model.ChannelUserRoleId, model.ChannelGuestRoleId}
defaultRoleNames := []string{
model.TeamAdminRoleId,
model.TeamUserRoleId,
model.TeamGuestRoleId,
model.ChannelAdminRoleId,
model.ChannelUserRoleId,
model.ChannelGuestRoleId,
model.PlaybookAdminRoleId,
model.PlaybookMemberRoleId,
model.RunAdminRoleId,
model.RunMemberRoleId,
}
defaultRoles := make(map[string]*model.Role)
roles, err := s.SqlStore.Role().GetByNames(defaultRoleNames)
if err != nil {
@@ -100,23 +116,10 @@ func (s *SqlSchemeStore) createScheme(scheme *model.Scheme, transaction *sqlxTxW
}
for _, role := range roles {
switch role.Name {
case model.TeamAdminRoleId:
defaultRoles[model.TeamAdminRoleId] = role
case model.TeamUserRoleId:
defaultRoles[model.TeamUserRoleId] = role
case model.TeamGuestRoleId:
defaultRoles[model.TeamGuestRoleId] = role
case model.ChannelAdminRoleId:
defaultRoles[model.ChannelAdminRoleId] = role
case model.ChannelUserRoleId:
defaultRoles[model.ChannelUserRoleId] = role
case model.ChannelGuestRoleId:
defaultRoles[model.ChannelGuestRoleId] = role
}
defaultRoles[role.Name] = role
}
if len(defaultRoles) != 6 {
if len(defaultRoles) != len(defaultRoleNames) {
return nil, errors.New("createScheme: unable to retrieve default scheme roles")
}
@@ -163,6 +166,58 @@ func (s *SqlSchemeStore) createScheme(scheme *model.Scheme, transaction *sqlxTxW
return nil, err
}
scheme.DefaultTeamGuestRole = savedRole.Name
// playbook admin role
playbookAdminRole := &model.Role{
Name: model.NewId(),
DisplayName: fmt.Sprintf("Playbook Admin Role for Scheme %s", scheme.Name),
Permissions: defaultRoles[model.PlaybookAdminRoleId].Permissions,
SchemeManaged: true,
}
savedRole, err = s.SqlStore.Role().(*SqlRoleStore).createRole(playbookAdminRole, transaction)
if err != nil {
return nil, err
}
scheme.DefaultPlaybookAdminRole = savedRole.Name
// playbook member role
playbookMemberRole := &model.Role{
Name: model.NewId(),
DisplayName: fmt.Sprintf("Playbook Member Role for Scheme %s", scheme.Name),
Permissions: defaultRoles[model.PlaybookMemberRoleId].Permissions,
SchemeManaged: true,
}
savedRole, err = s.SqlStore.Role().(*SqlRoleStore).createRole(playbookMemberRole, transaction)
if err != nil {
return nil, err
}
scheme.DefaultPlaybookMemberRole = savedRole.Name
// run admin role
runAdminRole := &model.Role{
Name: model.NewId(),
DisplayName: fmt.Sprintf("Run Admin Role for Scheme %s", scheme.Name),
Permissions: defaultRoles[model.RunAdminRoleId].Permissions,
SchemeManaged: true,
}
savedRole, err = s.SqlStore.Role().(*SqlRoleStore).createRole(runAdminRole, transaction)
if err != nil {
return nil, err
}
scheme.DefaultRunAdminRole = savedRole.Name
// run member role
runMemberRole := &model.Role{
Name: model.NewId(),
DisplayName: fmt.Sprintf("Run Member Role for Scheme %s", scheme.Name),
Permissions: defaultRoles[model.RunMemberRoleId].Permissions,
SchemeManaged: true,
}
savedRole, err = s.SqlStore.Role().(*SqlRoleStore).createRole(runMemberRole, transaction)
if err != nil {
return nil, err
}
scheme.DefaultRunMemberRole = savedRole.Name
}
if scheme.Scope == model.SchemeScopeTeam || scheme.Scope == model.SchemeScopeChannel {
@@ -234,9 +289,9 @@ func (s *SqlSchemeStore) createScheme(scheme *model.Scheme, transaction *sqlxTxW
}
if _, err := transaction.NamedExec(`INSERT INTO Schemes
(Id, Name, DisplayName, Description, Scope, DefaultTeamAdminRole, DefaultTeamUserRole, DefaultTeamGuestRole, DefaultChannelAdminRole, DefaultChannelUserRole, DefaultChannelGuestRole, CreateAt, UpdateAt, DeleteAt)
(Id, Name, DisplayName, Description, Scope, DefaultTeamAdminRole, DefaultTeamUserRole, DefaultTeamGuestRole, DefaultChannelAdminRole, DefaultChannelUserRole, DefaultChannelGuestRole, CreateAt, UpdateAt, DeleteAt, DefaultPlaybookAdminRole, DefaultPlaybookMemberRole, DefaultRunAdminRole, DefaultRunMemberRole)
VALUES
(:Id, :Name, :DisplayName, :Description, :Scope, :DefaultTeamAdminRole, :DefaultTeamUserRole, :DefaultTeamGuestRole, :DefaultChannelAdminRole, :DefaultChannelUserRole, :DefaultChannelGuestRole, :CreateAt, :UpdateAt, :DeleteAt)`, scheme); err != nil {
(:Id, :Name, :DisplayName, :Description, :Scope, :DefaultTeamAdminRole, :DefaultTeamUserRole, :DefaultTeamGuestRole, :DefaultChannelAdminRole, :DefaultChannelUserRole, :DefaultChannelGuestRole, :CreateAt, :UpdateAt, :DeleteAt, :DefaultPlaybookAdminRole, :DefaultPlaybookMemberRole, :DefaultRunAdminRole, :DefaultRunMemberRole)`, scheme); err != nil {
return nil, errors.Wrap(err, "failed to save Scheme")
}
@@ -309,6 +364,13 @@ func (s *SqlSchemeStore) Delete(schemeId string) (*model.Scheme, error) {
if scheme.Scope == model.SchemeScopeTeam {
roleNames = append(roleNames, scheme.DefaultTeamGuestRole, scheme.DefaultTeamUserRole, scheme.DefaultTeamAdminRole)
}
if scheme.Scope == model.SchemeScopePlaybook {
roleNames = append(roleNames, scheme.DefaultPlaybookAdminRole, scheme.DefaultPlaybookMemberRole)
}
if scheme.Scope == model.SchemeScopeRun {
roleNames = append(roleNames, scheme.DefaultRunAdminRole, scheme.DefaultRunMemberRole)
}
time := model.GetMillis()

Просмотреть файл

@@ -1421,6 +1421,11 @@ func upgradeDatabaseToVersion630(sqlStore *SqlStore) {
// TODO: uncomment when the time arrive to upgrade the DB for 6.3
// if shouldPerformUpgrade(sqlStore, Version620, Version630) {
sqlStore.CreateColumnIfNotExists("Schemes", "DefaultPlaybookAdminRole", "VARCHAR(64)", "VARCHAR(64)", "")
sqlStore.CreateColumnIfNotExists("Schemes", "DefaultPlaybookMemberRole", "VARCHAR(64)", "VARCHAR(64)", "")
sqlStore.CreateColumnIfNotExists("Schemes", "DefaultRunAdminRole", "VARCHAR(64)", "VARCHAR(64)", "")
sqlStore.CreateColumnIfNotExists("Schemes", "DefaultRunMemberRole", "VARCHAR(64)", "VARCHAR(64)", "")
// saveSchemaVersion(sqlStore, Version630)
// }
}