]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9020 Copy 'sonar-users' permission templates when creating "members" group...
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Tue, 4 Apr 2017 08:18:06 +0000 (10:18 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 13 Apr 2017 09:51:55 +0000 (11:51 +0200)
server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateDao.java
server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateMapper.java
server/sonar-db-dao/src/main/resources/org/sonar/db/permission/template/PermissionTemplateMapper.xml
server/sonar-db-dao/src/test/java/org/sonar/db/permission/template/PermissionTemplateDaoTest.java
server/sonar-server/src/main/java/org/sonar/server/organization/ws/EnableSupportAction.java
server/sonar-server/src/test/java/org/sonar/server/organization/ws/EnableSupportActionTest.java

index 952e5e71c76fd03236f3ded618bcbeb96379c00e..a09a9b6d96f9eed8038407b1823019dfd6fcf5f5 100644 (file)
@@ -142,6 +142,10 @@ public class PermissionTemplateDao implements Dao {
       });
   }
 
+  public List<PermissionTemplateGroupDto> selectAllGroupPermissionTemplatesByGroupId(DbSession dbSession, long groupId) {
+    return mapper(dbSession).selectAllGroupPermissionTemplatesByGroupId(groupId);
+  }
+
   public void deleteById(DbSession session, long templateId) {
     PermissionTemplateMapper mapper = mapper(session);
     mapper.deleteUserPermissionsByTemplateId(templateId);
index ad28f928212689387c59740c6b7a6d42c0e271d0..7cb00625d4c030445b50a9bdb46d68de770c7398 100644 (file)
@@ -88,4 +88,6 @@ public interface PermissionTemplateMapper {
 
   List<Long> selectTemplateIdsByOrganization(@Param("organizationUuid") String organizationUuid);
 
+  List<PermissionTemplateGroupDto> selectAllGroupPermissionTemplatesByGroupId(@Param("groupId") Long groupId);
+
 }
index 4847bd056a57da493d04d39cb4f43e4aaa423414..90efe932bdae2b7975723bb3c90da2e2f7025672 100644 (file)
     where
       organization_uuid = #{organizationUuid,jdbcType=VARCHAR}
   </select>
+
+  <select id="selectAllGroupPermissionTemplatesByGroupId" parameterType="Long" resultType="PermissionTemplateGroup">
+    SELECT
+      ptg.id,
+      ptg.template_id as templateId,
+      ptg.permission_reference AS permission,
+      ptg.group_id AS groupId,
+      g.name AS groupName,
+      ptg.created_at as createdAt,
+      ptg.updated_at as updatedAt
+    FROM perm_templates_groups ptg
+    INNER JOIN groups g ON g.id=ptg.group_id
+    <where>
+      ptg.group_id=#{groupId,jdbcType=INTEGER}
+    </where>
+  </select>
 </mapper>
index f9e75c0d5c7f9525a57f08bbe4eabb52c23beb23..b2b07613a9352aae5d1231df4f0f72fd1c540bdb 100644 (file)
@@ -367,6 +367,20 @@ public class PermissionTemplateDaoTest {
     assertThat(resultWithoutUser).containsOnly(UserRole.ISSUE_ADMIN);
   }
 
+  @Test
+  public void selectAllGroupPermissionTemplatesByGroupId() {
+    PermissionTemplateDto permissionTemplate = templateDb.insertTemplate(db.getDefaultOrganization());
+    GroupDto group1 = db.users().insertGroup();
+    GroupDto group2 = db.users().insertGroup();
+    templateDb.addGroupToTemplate(permissionTemplate, group1, "user");
+    templateDb.addGroupToTemplate(permissionTemplate, group1, "admin");
+    templateDb.addGroupToTemplate(permissionTemplate, group2, "user");
+
+    assertThat(db.getDbClient().permissionTemplateDao().selectAllGroupPermissionTemplatesByGroupId(db.getSession(), group1.getId()))
+      .extracting(PermissionTemplateGroupDto::getGroupId, PermissionTemplateGroupDto::getPermission)
+      .containsOnly(tuple(group1.getId(), "user"), tuple(group1.getId(), "admin"));
+  }
+
   @Test
   public void deleteByOrganization_does_not_fail_on_empty_db() {
     underTest.deleteByOrganization(dbSession, "some uuid");
index a8132ad5fe497457af72df1f91f276626eaa8f4e..a887cf94cae43e5487659dcb28a93d5a7c4083c5 100644 (file)
@@ -29,6 +29,7 @@ import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.permission.GroupPermissionDto;
 import org.sonar.db.permission.OrganizationPermission;
+import org.sonar.db.permission.template.PermissionTemplateGroupDto;
 import org.sonar.db.user.GroupDto;
 import org.sonar.db.user.UserGroupDto;
 import org.sonar.server.organization.DefaultOrganizationProvider;
@@ -103,7 +104,10 @@ public class EnableSupportAction implements OrganizationsWsAction {
       .setDescription("All members of the organization")
       .setOrganizationUuid(defaultOrganizationUuid);
     dbClient.groupDao().insert(dbSession, members);
-    copyUserGroupsPermissionsToMembersGroup(dbSession, members);
+    int sonarUsersGroupId = dbClient.organizationDao().getDefaultGroupId(dbSession, defaultOrganizationUuid)
+      .orElseThrow(() -> new IllegalStateException(String.format("Default group doesn't exist on default organization '%s'", defaultOrganizationProvider.get().getKey())));
+    copySonarUsersGroupPermissionsToMembersGroup(dbSession, sonarUsersGroupId, members);
+    copySonarUsersGroupPermissionTemplatesToMembersGroup(dbSession, sonarUsersGroupId, members);
     associateMembersOfDefaultOrganizationToGroup(dbSession, members);
     dbClient.organizationDao().setDefaultGroupId(dbSession, defaultOrganizationUuid, members);
   }
@@ -113,10 +117,8 @@ public class EnableSupportAction implements OrganizationsWsAction {
     organizationMembers.forEach(member -> dbClient.userGroupDao().insert(dbSession, new UserGroupDto().setGroupId(membersGroup.getId()).setUserId(member)));
   }
 
-  private void copyUserGroupsPermissionsToMembersGroup(DbSession dbSession, GroupDto membersGroup) {
+  private void copySonarUsersGroupPermissionsToMembersGroup(DbSession dbSession, int sonarUsersGroupId, GroupDto membersGroup) {
     String defaultOrganizationUuid = defaultOrganizationProvider.get().getUuid();
-    int sonarUsersGroupId = dbClient.organizationDao().getDefaultGroupId(dbSession, defaultOrganizationUuid)
-      .orElseThrow(() -> new IllegalStateException(String.format("Default group doesn't exist on default organization '%s'", defaultOrganizationProvider.get().getKey())));
     dbClient.groupPermissionDao().selectAllPermissionsByGroupId(dbSession, defaultOrganizationUuid, sonarUsersGroupId,
       context -> {
         GroupPermissionDto groupPermissionDto = (GroupPermissionDto) context.getResultObject();
@@ -127,6 +129,12 @@ public class EnableSupportAction implements OrganizationsWsAction {
       });
   }
 
+  private void copySonarUsersGroupPermissionTemplatesToMembersGroup(DbSession dbSession, int sonarUsersGroupId, GroupDto membersGroup) {
+    List<PermissionTemplateGroupDto> sonarUsersPermissionTemplates = dbClient.permissionTemplateDao().selectAllGroupPermissionTemplatesByGroupId(dbSession, sonarUsersGroupId);
+    sonarUsersPermissionTemplates.forEach(permissionTemplateGroup -> dbClient.permissionTemplateDao().insertGroupPermission(dbSession,
+      permissionTemplateGroup.getTemplateId(), membersGroup.getId(), permissionTemplateGroup.getPermission()));
+  }
+
   private void enableFeature(DbSession dbSession) {
     organizationFlags.enable(dbSession);
   }
index 05ff7ba3aa8060dc113270068269e161a0f2cc42..38e85f3e46c6f45a4583bc7729092e28cf2ed323 100644 (file)
@@ -31,6 +31,8 @@ import org.sonar.db.DbTester;
 import org.sonar.db.component.ComponentDto;
 import org.sonar.db.organization.OrganizationDto;
 import org.sonar.db.permission.GroupPermissionDto;
+import org.sonar.db.permission.template.PermissionTemplateDto;
+import org.sonar.db.permission.template.PermissionTemplateGroupDto;
 import org.sonar.db.user.GroupDto;
 import org.sonar.db.user.UserDto;
 import org.sonar.server.exceptions.ForbiddenException;
@@ -104,7 +106,7 @@ public class EnableSupportActionTest {
   }
 
   @Test
-  public void enabling_support_copy_sonar_users_permission_to_members_group() throws Exception {
+  public void enabling_support_copy_sonar_users_permissions_to_members_group() throws Exception {
     OrganizationDto defaultOrganization = db.getDefaultOrganization();
     UserDto user = db.users().insertUser();
     GroupDto sonarUsersGroup = db.users().insertDefaultGroup(defaultOrganization, "sonar-users");
@@ -126,6 +128,27 @@ public class EnableSupportActionTest {
       tuple(null, "user"), tuple(project.getId(), "codeviewer"));
   }
 
+  @Test
+  public void enabling_support_copy_sonar_users_permission_templates_to_members_group() throws Exception {
+    OrganizationDto defaultOrganization = db.getDefaultOrganization();
+    UserDto user = db.users().insertUser();
+    GroupDto sonarUsersGroup = db.users().insertDefaultGroup(defaultOrganization, "sonar-users");
+    PermissionTemplateDto permissionTemplate = db.permissionTemplates().insertTemplate(db.getDefaultOrganization());
+    db.permissionTemplates().addGroupToTemplate(permissionTemplate, sonarUsersGroup, "user");
+    db.permissionTemplates().addGroupToTemplate(permissionTemplate, sonarUsersGroup, "admin");
+    // Should be ignored
+    GroupDto otherGroup = db.users().insertGroup();
+    db.permissionTemplates().addGroupToTemplate(permissionTemplate, otherGroup, "user");
+    logInAsSystemAdministrator(user.getLogin());
+
+    call();
+
+    int defaultGroupId = db.getDbClient().organizationDao().getDefaultGroupId(db.getSession(), defaultOrganization.getUuid()).get();
+    assertThat(db.getDbClient().permissionTemplateDao().selectAllGroupPermissionTemplatesByGroupId(db.getSession(), defaultGroupId))
+      .extracting(PermissionTemplateGroupDto::getGroupId, PermissionTemplateGroupDto::getPermission)
+      .containsOnly(tuple(defaultGroupId, "user"), tuple(defaultGroupId, "admin"));
+  }
+
   @Test
   public void throw_IAE_when_members_group_already_exists() throws Exception {
     UserDto user = db.users().insertUser();
@@ -138,6 +161,7 @@ public class EnableSupportActionTest {
     call();
   }
 
+
   @Test
   public void throw_UnauthorizedException_if_not_logged_in() {
     userSession.anonymous();