diff options
author | Jean-Baptiste Vilain <jean-baptiste.vilain@sonarsource.com> | 2013-07-15 17:02:38 +0200 |
---|---|---|
committer | Jean-Baptiste Vilain <jean-baptiste.vilain@sonarsource.com> | 2013-07-15 17:03:04 +0200 |
commit | 02459fcf2a9c7bf30ca8e3f14b79738d30248caf (patch) | |
tree | 8a26df68d286937e8094678c2232a9e7dfe8746e | |
parent | 184756cd798fa9c5120b3d25c068e1f90767eaf0 (diff) | |
download | sonarqube-02459fcf2a9c7bf30ca8e3f14b79738d30248caf.tar.gz sonarqube-02459fcf2a9c7bf30ca8e3f14b79738d30248caf.zip |
SONAR-4463 Re-added schema migration to cover existing permission settings conversion
3 files changed, 147 insertions, 1 deletions
diff --git a/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql b/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql index 90a76eae421..98231f3ff1d 100644 --- a/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql +++ b/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql @@ -170,6 +170,7 @@ INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('414'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('415'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('416'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('417'); +INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('418'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('419'); INSERT INTO USERS(ID, LOGIN, NAME, EMAIL, CRYPTED_PASSWORD, SALT, CREATED_AT, UPDATED_AT, REMEMBER_TOKEN, REMEMBER_TOKEN_EXPIRES_AT) VALUES (1, 'admin', 'Administrator', '', 'a373a0e667abb2604c1fd571eb4ad47fe8cc0878', '48bc4b0d93179b5103fd3885ea9119498e9d161b', '2011-09-26 22:27:48.0', '2011-09-26 22:27:48.0', null, null); diff --git a/sonar-server/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java b/sonar-server/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java index 51fc1cc2890..5447ccd6b67 100644 --- a/sonar-server/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java +++ b/sonar-server/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java @@ -29,6 +29,7 @@ import org.sonar.core.permission.PermissionDao; import org.sonar.core.permission.PermissionTemplateDto; import org.sonar.core.template.LoadedTemplateDao; import org.sonar.core.template.LoadedTemplateDto; +import org.sonar.core.user.GroupDto; import org.sonar.core.user.UserDao; import org.sonar.server.platform.PersistentSettings; @@ -81,7 +82,12 @@ public class RegisterPermissionTemplates { if(DefaultGroups.isAnyone(groupName)) { groupId = null; } else { - groupId = userDao.selectGroupByName(groupName).getId(); + GroupDto groupDto = userDao.selectGroupByName(groupName); + if(groupDto != null) { + groupId = userDao.selectGroupByName(groupName).getId(); + } else { + throw new IllegalArgumentException("Cannot setup default permission for group: " + groupName); + } } permissionDao.addGroupPermission(template.getId(), groupId, permission); } diff --git a/sonar-server/src/main/webapp/WEB-INF/db/migrate/418_migrate_default_permissions.rb b/sonar-server/src/main/webapp/WEB-INF/db/migrate/418_migrate_default_permissions.rb new file mode 100644 index 00000000000..5fecb4e6de2 --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/db/migrate/418_migrate_default_permissions.rb @@ -0,0 +1,139 @@ +# +# SonarQube, open source software quality management tool. +# Copyright (C) 2008-2013 SonarSource +# mailto:contact AT sonarsource DOT com +# +# SonarQube is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# SonarQube is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# + +# +# @since SonarQube 3.7 +# + +class MigrateDefaultPermissions < ActiveRecord::Migration + + ROOT_QUALIFIERS = {:TRK => 'Projects', :VW => 'Views', :SVW => 'Subviews', :DEV => 'Developers'} + + class Group < ActiveRecord::Base + end + + class GroupRole < ActiveRecord::Base + end + + class User < ActiveRecord::Base + end + + class UserRole < ActiveRecord::Base + end + + class Property < ActiveRecord::Base + set_table_name 'properties' + end + + class PermissionTemplate < ActiveRecord::Base + end + + class PermissionTemplateUser < ActiveRecord::Base + set_table_name 'perm_templates_users' + end + + class PermissionTemplateGroup < ActiveRecord::Base + set_table_name 'perm_templates_groups' + end + + class LoadedTemplate < ActiveRecord::Base + end + + def self.up + Group.reset_column_information + GroupRole.reset_column_information + User.reset_column_information + UserRole.reset_column_information + Property.reset_column_information + PermissionTemplate.reset_column_information + PermissionTemplateUser.reset_column_information + PermissionTemplateGroup.reset_column_information + + @is_fresh_install = LoadedTemplate.count == 0 + + migrate_existing_default_permissions + + end + + private + + def self.migrate_existing_default_permissions + + ROOT_QUALIFIERS.keys.each do |qualifier| + existing_properties = [] + existing_properties << Property.find_by_prop_key("sonar.role.admin.#{qualifier}.defaultGroups") + existing_properties << Property.find_by_prop_key("sonar.role.user.#{qualifier}.defaultGroups") + existing_properties << Property.find_by_prop_key("sonar.role.codeviewer.#{qualifier}.defaultGroups") + existing_properties << Property.find_by_prop_key("sonar.role.admin.#{qualifier}.defaultUsers") + existing_properties << Property.find_by_prop_key("sonar.role.user.#{qualifier}.defaultUsers") + existing_properties << Property.find_by_prop_key("sonar.role.codeviewer.#{qualifier}.defaultUsers") + + existing_properties.reject! {|prop| prop.nil?} + + # Existing properties are migrated only when upgrading an existing SonarQube instance + # Subviews permissions are not migrated since they are not used + if !@is_fresh_install && existing_properties.length > 0 && qualifier != :SVW + migrate_existing_permissions(qualifier, existing_properties) + end + + delete_existing_default_permissions(existing_properties) + end + + end + + def self.migrate_existing_permissions(qualifier, properties) + + unless properties.empty? + + qualifier_template = PermissionTemplate.create( + :name => "Default template for #{ROOT_QUALIFIERS[qualifier]}", + :kee => "default_template_for_#{ROOT_QUALIFIERS[qualifier].downcase}", + :description => "This template has been automatically created using the previously configured default permissions for #{ROOT_QUALIFIERS[qualifier]}") + + properties.each do |property| + key_fields = property.prop_key.split('.') + value_fields = property.text_value.split(',') + role = key_fields[2] + if 'defaultGroups'.eql?(key_fields[4]) + value_fields.each do |group_name| + group_id = 'Anyone'.eql?(group_name) ? nil : Group.find_by_name(group_name).id + PermissionTemplateGroup.create(:group_id => group_id, :permission_reference => role, :template_id => qualifier_template.id) + end + else + value_fields.each do |user_name| + user = User.find_by_name(user_name) + PermissionTemplateUser.create(:user_id => user.id, :permission_reference => role, :template_id => qualifier_template.id) + end + end + end + + Property.create(:prop_key => "sonar.permission.template.#{qualifier}.default", :text_value => qualifier_template.id.to_s) + + end + + end + + def self.delete_existing_default_permissions(properties) + properties.each do |property| + Property.delete(property.id) unless property.nil? + end + end + +end |