]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4463 Re-added schema migration to cover existing permission settings conversion
authorJean-Baptiste Vilain <jean-baptiste.vilain@sonarsource.com>
Mon, 15 Jul 2013 15:02:38 +0000 (17:02 +0200)
committerJean-Baptiste Vilain <jean-baptiste.vilain@sonarsource.com>
Mon, 15 Jul 2013 15:03:04 +0000 (17:03 +0200)
sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql
sonar-server/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java
sonar-server/src/main/webapp/WEB-INF/db/migrate/418_migrate_default_permissions.rb [new file with mode: 0644]

index 90a76eae421f44f6679bba9a1395d614667f457e..98231f3ff1d50742690daf881e8974c177a644e7 100644 (file)
@@ -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);
index 51fc1cc289066d858ed6291076c8ea6ea40b3b53..5447ccd6b6733214b1327e9208696ab38d2453fc 100644 (file)
@@ -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 (file)
index 0000000..5fecb4e
--- /dev/null
@@ -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