github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/app/migrations.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package app 5 6 import ( 7 "fmt" 8 "reflect" 9 10 "github.com/mattermost/mattermost-server/v5/mlog" 11 "github.com/mattermost/mattermost-server/v5/model" 12 "github.com/mattermost/mattermost-server/v5/utils" 13 ) 14 15 const ADVANCED_PERMISSIONS_MIGRATION_KEY = "AdvancedPermissionsMigrationComplete" 16 const EMOJIS_PERMISSIONS_MIGRATION_KEY = "EmojisPermissionsMigrationComplete" 17 const GUEST_ROLES_CREATION_MIGRATION_KEY = "GuestRolesCreationMigrationComplete" 18 19 // This function migrates the default built in roles from code/config to the database. 20 func (a *App) DoAdvancedPermissionsMigration() { 21 // If the migration is already marked as completed, don't do it again. 22 if _, err := a.Srv().Store.System().GetByName(ADVANCED_PERMISSIONS_MIGRATION_KEY); err == nil { 23 return 24 } 25 26 mlog.Info("Migrating roles to database.") 27 roles := model.MakeDefaultRoles() 28 roles = utils.SetRolePermissionsFromConfig(roles, a.Config(), a.Srv().License() != nil) 29 30 allSucceeded := true 31 32 for _, role := range roles { 33 _, err := a.Srv().Store.Role().Save(role) 34 if err == nil { 35 continue 36 } 37 38 // If this failed for reasons other than the role already existing, don't mark the migration as done. 39 fetchedRole, err := a.Srv().Store.Role().GetByName(role.Name) 40 if err != nil { 41 mlog.Critical("Failed to migrate role to database.", mlog.Err(err)) 42 allSucceeded = false 43 continue 44 } 45 46 // If the role already existed, check it is the same and update if not. 47 if !reflect.DeepEqual(fetchedRole.Permissions, role.Permissions) || 48 fetchedRole.DisplayName != role.DisplayName || 49 fetchedRole.Description != role.Description || 50 fetchedRole.SchemeManaged != role.SchemeManaged { 51 role.Id = fetchedRole.Id 52 if _, err = a.Srv().Store.Role().Save(role); err != nil { 53 // Role is not the same, but failed to update. 54 mlog.Critical("Failed to migrate role to database.", mlog.Err(err)) 55 allSucceeded = false 56 } 57 } 58 } 59 60 if !allSucceeded { 61 return 62 } 63 64 config := a.Config() 65 if *config.ServiceSettings.DEPRECATED_DO_NOT_USE_AllowEditPost == model.ALLOW_EDIT_POST_ALWAYS { 66 *config.ServiceSettings.PostEditTimeLimit = -1 67 if err := a.SaveConfig(config, true); err != nil { 68 mlog.Error("Failed to update config in Advanced Permissions Phase 1 Migration.", mlog.Err(err)) 69 } 70 } 71 72 system := model.System{ 73 Name: ADVANCED_PERMISSIONS_MIGRATION_KEY, 74 Value: "true", 75 } 76 77 if err := a.Srv().Store.System().Save(&system); err != nil { 78 mlog.Critical("Failed to mark advanced permissions migration as completed.", mlog.Err(err)) 79 } 80 } 81 82 func (a *App) SetPhase2PermissionsMigrationStatus(isComplete bool) error { 83 if !isComplete { 84 if _, err := a.Srv().Store.System().PermanentDeleteByName(model.MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2); err != nil { 85 return err 86 } 87 } 88 a.Srv().phase2PermissionsMigrationComplete = isComplete 89 return nil 90 } 91 92 func (a *App) DoEmojisPermissionsMigration() { 93 // If the migration is already marked as completed, don't do it again. 94 if _, err := a.Srv().Store.System().GetByName(EMOJIS_PERMISSIONS_MIGRATION_KEY); err == nil { 95 return 96 } 97 98 var role *model.Role 99 var systemAdminRole *model.Role 100 var err *model.AppError 101 102 mlog.Info("Migrating emojis config to database.") 103 switch *a.Config().ServiceSettings.DEPRECATED_DO_NOT_USE_RestrictCustomEmojiCreation { 104 case model.RESTRICT_EMOJI_CREATION_ALL: 105 role, err = a.GetRoleByName(model.SYSTEM_USER_ROLE_ID) 106 if err != nil { 107 mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(err)) 108 return 109 } 110 case model.RESTRICT_EMOJI_CREATION_ADMIN: 111 role, err = a.GetRoleByName(model.TEAM_ADMIN_ROLE_ID) 112 if err != nil { 113 mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(err)) 114 return 115 } 116 case model.RESTRICT_EMOJI_CREATION_SYSTEM_ADMIN: 117 role = nil 118 default: 119 mlog.Critical("Failed to migrate emojis creation permissions from mattermost config. Invalid restrict emoji creation setting") 120 return 121 } 122 123 if role != nil { 124 role.Permissions = append(role.Permissions, model.PERMISSION_CREATE_EMOJIS.Id, model.PERMISSION_DELETE_EMOJIS.Id) 125 if _, nErr := a.Srv().Store.Role().Save(role); nErr != nil { 126 mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(nErr)) 127 return 128 } 129 } 130 131 systemAdminRole, err = a.GetRoleByName(model.SYSTEM_ADMIN_ROLE_ID) 132 if err != nil { 133 mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(err)) 134 return 135 } 136 137 systemAdminRole.Permissions = append(systemAdminRole.Permissions, 138 model.PERMISSION_CREATE_EMOJIS.Id, 139 model.PERMISSION_DELETE_EMOJIS.Id, 140 model.PERMISSION_DELETE_OTHERS_EMOJIS.Id, 141 ) 142 if _, err := a.Srv().Store.Role().Save(systemAdminRole); err != nil { 143 mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(err)) 144 return 145 } 146 147 system := model.System{ 148 Name: EMOJIS_PERMISSIONS_MIGRATION_KEY, 149 Value: "true", 150 } 151 152 if err := a.Srv().Store.System().Save(&system); err != nil { 153 mlog.Critical("Failed to mark emojis permissions migration as completed.", mlog.Err(err)) 154 } 155 } 156 157 func (a *App) DoGuestRolesCreationMigration() { 158 // If the migration is already marked as completed, don't do it again. 159 if _, err := a.Srv().Store.System().GetByName(GUEST_ROLES_CREATION_MIGRATION_KEY); err == nil { 160 return 161 } 162 163 roles := model.MakeDefaultRoles() 164 165 allSucceeded := true 166 if _, err := a.Srv().Store.Role().GetByName(model.CHANNEL_GUEST_ROLE_ID); err != nil { 167 if _, err := a.Srv().Store.Role().Save(roles[model.CHANNEL_GUEST_ROLE_ID]); err != nil { 168 mlog.Critical("Failed to create new guest role to database.", mlog.Err(err)) 169 allSucceeded = false 170 } 171 } 172 if _, err := a.Srv().Store.Role().GetByName(model.TEAM_GUEST_ROLE_ID); err != nil { 173 if _, err := a.Srv().Store.Role().Save(roles[model.TEAM_GUEST_ROLE_ID]); err != nil { 174 mlog.Critical("Failed to create new guest role to database.", mlog.Err(err)) 175 allSucceeded = false 176 } 177 } 178 if _, err := a.Srv().Store.Role().GetByName(model.SYSTEM_GUEST_ROLE_ID); err != nil { 179 if _, err := a.Srv().Store.Role().Save(roles[model.SYSTEM_GUEST_ROLE_ID]); err != nil { 180 mlog.Critical("Failed to create new guest role to database.", mlog.Err(err)) 181 allSucceeded = false 182 } 183 } 184 185 schemes, err := a.Srv().Store.Scheme().GetAllPage("", 0, 1000000) 186 if err != nil { 187 mlog.Critical("Failed to get all schemes.", mlog.Err(err)) 188 allSucceeded = false 189 } 190 for _, scheme := range schemes { 191 if scheme.DefaultTeamGuestRole == "" || scheme.DefaultChannelGuestRole == "" { 192 // Team Guest Role 193 teamGuestRole := &model.Role{ 194 Name: model.NewId(), 195 DisplayName: fmt.Sprintf("Team Guest Role for Scheme %s", scheme.Name), 196 Permissions: roles[model.TEAM_GUEST_ROLE_ID].Permissions, 197 SchemeManaged: true, 198 } 199 200 if savedRole, err := a.Srv().Store.Role().Save(teamGuestRole); err != nil { 201 mlog.Critical("Failed to create new guest role for custom scheme.", mlog.Err(err)) 202 allSucceeded = false 203 } else { 204 scheme.DefaultTeamGuestRole = savedRole.Name 205 } 206 207 // Channel Guest Role 208 channelGuestRole := &model.Role{ 209 Name: model.NewId(), 210 DisplayName: fmt.Sprintf("Channel Guest Role for Scheme %s", scheme.Name), 211 Permissions: roles[model.CHANNEL_GUEST_ROLE_ID].Permissions, 212 SchemeManaged: true, 213 } 214 215 if savedRole, err := a.Srv().Store.Role().Save(channelGuestRole); err != nil { 216 mlog.Critical("Failed to create new guest role for custom scheme.", mlog.Err(err)) 217 allSucceeded = false 218 } else { 219 scheme.DefaultChannelGuestRole = savedRole.Name 220 } 221 222 _, err := a.Srv().Store.Scheme().Save(scheme) 223 if err != nil { 224 mlog.Critical("Failed to update custom scheme.", mlog.Err(err)) 225 allSucceeded = false 226 } 227 } 228 } 229 230 if !allSucceeded { 231 return 232 } 233 234 system := model.System{ 235 Name: GUEST_ROLES_CREATION_MIGRATION_KEY, 236 Value: "true", 237 } 238 239 if err := a.Srv().Store.System().Save(&system); err != nil { 240 mlog.Critical("Failed to mark guest roles creation migration as completed.", mlog.Err(err)) 241 } 242 } 243 244 func (a *App) DoAppMigrations() { 245 a.DoAdvancedPermissionsMigration() 246 a.DoEmojisPermissionsMigration() 247 a.DoGuestRolesCreationMigration() 248 // This migration always must be the last, because can be based on previous 249 // migrations. For example, it needs the guest roles migration. 250 a.DoPermissionsMigrations() 251 }