From be8be3a6dc87c5cdab950d739cedb6dc9ceaa835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Fri, 23 Nov 2018 18:39:33 +0100 Subject: [PATCH] Moving app level migrations to its own file (#9871) --- app/app.go | 146 ------------------------------------------ app/migrations.go | 158 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+), 146 deletions(-) create mode 100644 app/migrations.go diff --git a/app/app.go b/app/app.go index 96636c3933..399fdd595b 100644 --- a/app/app.go +++ b/app/app.go @@ -8,7 +8,6 @@ import ( "html/template" "net/http" "path" - "reflect" "strconv" "github.com/gorilla/mux" @@ -26,9 +25,6 @@ import ( "github.com/mattermost/mattermost-server/utils" ) -const ADVANCED_PERMISSIONS_MIGRATION_KEY = "AdvancedPermissionsMigrationComplete" -const EMOJIS_PERMISSIONS_MIGRATION_KEY = "EmojisPermissionsMigrationComplete" - type App struct { Srv *Server @@ -449,148 +445,6 @@ func (a *App) Handle404(w http.ResponseWriter, r *http.Request) { utils.RenderWebAppError(a.Config(), w, r, err, a.AsymmetricSigningKey()) } -// This function migrates the default built in roles from code/config to the database. -func (a *App) DoAdvancedPermissionsMigration() { - // If the migration is already marked as completed, don't do it again. - if result := <-a.Srv.Store.System().GetByName(ADVANCED_PERMISSIONS_MIGRATION_KEY); result.Err == nil { - return - } - - mlog.Info("Migrating roles to database.") - roles := model.MakeDefaultRoles() - roles = utils.SetRolePermissionsFromConfig(roles, a.Config(), a.License() != nil) - - allSucceeded := true - - for _, role := range roles { - if result := <-a.Srv.Store.Role().Save(role); result.Err != nil { - // If this failed for reasons other than the role already existing, don't mark the migration as done. - if result2 := <-a.Srv.Store.Role().GetByName(role.Name); result2.Err != nil { - mlog.Critical("Failed to migrate role to database.") - mlog.Critical(fmt.Sprint(result.Err)) - allSucceeded = false - } else { - // If the role already existed, check it is the same and update if not. - fetchedRole := result.Data.(*model.Role) - if !reflect.DeepEqual(fetchedRole.Permissions, role.Permissions) || - fetchedRole.DisplayName != role.DisplayName || - fetchedRole.Description != role.Description || - fetchedRole.SchemeManaged != role.SchemeManaged { - role.Id = fetchedRole.Id - if result := <-a.Srv.Store.Role().Save(role); result.Err != nil { - // Role is not the same, but failed to update. - mlog.Critical("Failed to migrate role to database.") - mlog.Critical(fmt.Sprint(result.Err)) - allSucceeded = false - } - } - } - } - } - - if !allSucceeded { - return - } - - config := a.Config() - if *config.ServiceSettings.DEPRECATED_DO_NOT_USE_AllowEditPost == model.ALLOW_EDIT_POST_ALWAYS { - *config.ServiceSettings.PostEditTimeLimit = -1 - if err := a.SaveConfig(config, true); err != nil { - mlog.Error("Failed to update config in Advanced Permissions Phase 1 Migration.", mlog.String("error", err.Error())) - } - } - - system := model.System{ - Name: ADVANCED_PERMISSIONS_MIGRATION_KEY, - Value: "true", - } - - if result := <-a.Srv.Store.System().Save(&system); result.Err != nil { - mlog.Critical("Failed to mark advanced permissions migration as completed.") - mlog.Critical(fmt.Sprint(result.Err)) - } -} - -func (a *App) SetPhase2PermissionsMigrationStatus(isComplete bool) error { - if !isComplete { - res := <-a.Srv.Store.System().PermanentDeleteByName(model.MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2) - if res.Err != nil { - return res.Err - } - } - a.Srv.phase2PermissionsMigrationComplete = isComplete - return nil -} - -func (a *App) DoEmojisPermissionsMigration() { - // If the migration is already marked as completed, don't do it again. - if result := <-a.Srv.Store.System().GetByName(EMOJIS_PERMISSIONS_MIGRATION_KEY); result.Err == nil { - return - } - - var role *model.Role = nil - var systemAdminRole *model.Role = nil - var err *model.AppError = nil - - mlog.Info("Migrating emojis config to database.") - switch *a.Config().ServiceSettings.DEPRECATED_DO_NOT_USE_RestrictCustomEmojiCreation { - case model.RESTRICT_EMOJI_CREATION_ALL: - role, err = a.GetRoleByName(model.SYSTEM_USER_ROLE_ID) - if err != nil { - mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.") - mlog.Critical(err.Error()) - return - } - case model.RESTRICT_EMOJI_CREATION_ADMIN: - role, err = a.GetRoleByName(model.TEAM_ADMIN_ROLE_ID) - if err != nil { - mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.") - mlog.Critical(err.Error()) - return - } - case model.RESTRICT_EMOJI_CREATION_SYSTEM_ADMIN: - role = nil - default: - mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.") - mlog.Critical("Invalid restrict emoji creation setting") - return - } - - if role != nil { - role.Permissions = append(role.Permissions, model.PERMISSION_MANAGE_EMOJIS.Id) - if result := <-a.Srv.Store.Role().Save(role); result.Err != nil { - mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.") - mlog.Critical(result.Err.Error()) - return - } - } - - systemAdminRole, err = a.GetRoleByName(model.SYSTEM_ADMIN_ROLE_ID) - if err != nil { - mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.") - mlog.Critical(err.Error()) - return - } - - systemAdminRole.Permissions = append(systemAdminRole.Permissions, model.PERMISSION_MANAGE_EMOJIS.Id) - systemAdminRole.Permissions = append(systemAdminRole.Permissions, model.PERMISSION_MANAGE_OTHERS_EMOJIS.Id) - if result := <-a.Srv.Store.Role().Save(systemAdminRole); result.Err != nil { - mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.") - mlog.Critical(result.Err.Error()) - return - } - - system := model.System{ - Name: EMOJIS_PERMISSIONS_MIGRATION_KEY, - Value: "true", - } - - if result := <-a.Srv.Store.System().Save(&system); result.Err != nil { - mlog.Critical("Failed to mark emojis permissions migration as completed.") - mlog.Critical(fmt.Sprint(result.Err)) - } -} - func (a *App) StartElasticsearch() { a.Srv.Go(func() { if err := a.Elasticsearch.Start(); err != nil { diff --git a/app/migrations.go b/app/migrations.go new file mode 100644 index 0000000000..03423e9bbd --- /dev/null +++ b/app/migrations.go @@ -0,0 +1,158 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +package app + +import ( + "fmt" + "reflect" + + "github.com/mattermost/mattermost-server/mlog" + "github.com/mattermost/mattermost-server/model" + "github.com/mattermost/mattermost-server/utils" +) + +const ADVANCED_PERMISSIONS_MIGRATION_KEY = "AdvancedPermissionsMigrationComplete" +const EMOJIS_PERMISSIONS_MIGRATION_KEY = "EmojisPermissionsMigrationComplete" + +// This function migrates the default built in roles from code/config to the database. +func (a *App) DoAdvancedPermissionsMigration() { + // If the migration is already marked as completed, don't do it again. + if result := <-a.Srv.Store.System().GetByName(ADVANCED_PERMISSIONS_MIGRATION_KEY); result.Err == nil { + return + } + + mlog.Info("Migrating roles to database.") + roles := model.MakeDefaultRoles() + roles = utils.SetRolePermissionsFromConfig(roles, a.Config(), a.License() != nil) + + allSucceeded := true + + for _, role := range roles { + if result := <-a.Srv.Store.Role().Save(role); result.Err != nil { + // If this failed for reasons other than the role already existing, don't mark the migration as done. + if result2 := <-a.Srv.Store.Role().GetByName(role.Name); result2.Err != nil { + mlog.Critical("Failed to migrate role to database.") + mlog.Critical(fmt.Sprint(result.Err)) + allSucceeded = false + } else { + // If the role already existed, check it is the same and update if not. + fetchedRole := result.Data.(*model.Role) + if !reflect.DeepEqual(fetchedRole.Permissions, role.Permissions) || + fetchedRole.DisplayName != role.DisplayName || + fetchedRole.Description != role.Description || + fetchedRole.SchemeManaged != role.SchemeManaged { + role.Id = fetchedRole.Id + if result := <-a.Srv.Store.Role().Save(role); result.Err != nil { + // Role is not the same, but failed to update. + mlog.Critical("Failed to migrate role to database.") + mlog.Critical(fmt.Sprint(result.Err)) + allSucceeded = false + } + } + } + } + } + + if !allSucceeded { + return + } + + config := a.Config() + if *config.ServiceSettings.DEPRECATED_DO_NOT_USE_AllowEditPost == model.ALLOW_EDIT_POST_ALWAYS { + *config.ServiceSettings.PostEditTimeLimit = -1 + if err := a.SaveConfig(config, true); err != nil { + mlog.Error("Failed to update config in Advanced Permissions Phase 1 Migration.", mlog.String("error", err.Error())) + } + } + + system := model.System{ + Name: ADVANCED_PERMISSIONS_MIGRATION_KEY, + Value: "true", + } + + if result := <-a.Srv.Store.System().Save(&system); result.Err != nil { + mlog.Critical("Failed to mark advanced permissions migration as completed.") + mlog.Critical(fmt.Sprint(result.Err)) + } +} + +func (a *App) SetPhase2PermissionsMigrationStatus(isComplete bool) error { + if !isComplete { + res := <-a.Srv.Store.System().PermanentDeleteByName(model.MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2) + if res.Err != nil { + return res.Err + } + } + a.Srv.phase2PermissionsMigrationComplete = isComplete + return nil +} + +func (a *App) DoEmojisPermissionsMigration() { + // If the migration is already marked as completed, don't do it again. + if result := <-a.Srv.Store.System().GetByName(EMOJIS_PERMISSIONS_MIGRATION_KEY); result.Err == nil { + return + } + + var role *model.Role = nil + var systemAdminRole *model.Role = nil + var err *model.AppError = nil + + mlog.Info("Migrating emojis config to database.") + switch *a.Config().ServiceSettings.DEPRECATED_DO_NOT_USE_RestrictCustomEmojiCreation { + case model.RESTRICT_EMOJI_CREATION_ALL: + role, err = a.GetRoleByName(model.SYSTEM_USER_ROLE_ID) + if err != nil { + mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.") + mlog.Critical(err.Error()) + return + } + case model.RESTRICT_EMOJI_CREATION_ADMIN: + role, err = a.GetRoleByName(model.TEAM_ADMIN_ROLE_ID) + if err != nil { + mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.") + mlog.Critical(err.Error()) + return + } + case model.RESTRICT_EMOJI_CREATION_SYSTEM_ADMIN: + role = nil + default: + mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.") + mlog.Critical("Invalid restrict emoji creation setting") + return + } + + if role != nil { + role.Permissions = append(role.Permissions, model.PERMISSION_MANAGE_EMOJIS.Id) + if result := <-a.Srv.Store.Role().Save(role); result.Err != nil { + mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.") + mlog.Critical(result.Err.Error()) + return + } + } + + systemAdminRole, err = a.GetRoleByName(model.SYSTEM_ADMIN_ROLE_ID) + if err != nil { + mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.") + mlog.Critical(err.Error()) + return + } + + systemAdminRole.Permissions = append(systemAdminRole.Permissions, model.PERMISSION_MANAGE_EMOJIS.Id) + systemAdminRole.Permissions = append(systemAdminRole.Permissions, model.PERMISSION_MANAGE_OTHERS_EMOJIS.Id) + if result := <-a.Srv.Store.Role().Save(systemAdminRole); result.Err != nil { + mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.") + mlog.Critical(result.Err.Error()) + return + } + + system := model.System{ + Name: EMOJIS_PERMISSIONS_MIGRATION_KEY, + Value: "true", + } + + if result := <-a.Srv.Store.System().Save(&system); result.Err != nil { + mlog.Critical("Failed to mark emojis permissions migration as completed.") + mlog.Critical(fmt.Sprint(result.Err)) + } +}