]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-19785 Fetch all group permissions for a project from the database.
authorWojtek Wajerowicz <115081248+wojciech-wajerowicz-sonarsource@users.noreply.github.com>
Thu, 6 Jul 2023 09:19:05 +0000 (11:19 +0200)
committersonartech <sonartech@sonarsource.com>
Tue, 18 Jul 2023 20:03:21 +0000 (20:03 +0000)
server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoIT.java
server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDao.java
server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionMapper.java
server/sonar-db-dao/src/main/resources/org/sonar/db/permission/GroupPermissionMapper.xml

index 61bdc90987a6860f6a90d3c7eee43755b20dba4e..3fff15626da4acead795d7aa89735ce2674df7ad 100644 (file)
@@ -39,6 +39,7 @@ import org.sonar.db.component.ComponentTesting;
 import org.sonar.db.component.ProjectData;
 import org.sonar.db.project.ProjectDto;
 import org.sonar.db.user.GroupDto;
+import org.sonar.db.user.UserDto;
 
 import static java.util.Arrays.asList;
 import static java.util.Collections.singletonList;
@@ -515,43 +516,6 @@ public class GroupPermissionDaoIT {
       .isEmpty();
   }
 
-  @Test
-  public void selectAllPermissionsByGroupUuid_on_public_project() {
-    GroupDto group1 = db.users().insertGroup("group1");
-    ComponentDto project1 = db.components().insertPublicProject().getMainBranchComponent();
-    ComponentDto project2 = db.components().insertPublicProject().getMainBranchComponent();
-    db.users().insertPermissionOnAnyone("perm1");
-    db.users().insertPermissionOnGroup(group1, "perm2");
-    db.users().insertProjectPermissionOnGroup(group1, "perm3", project1);
-    db.users().insertProjectPermissionOnGroup(group1, "perm4", project1);
-    db.users().insertProjectPermissionOnGroup(group1, "perm5", project2);
-    db.users().insertProjectPermissionOnAnyone("perm6", project1);
-
-    List<GroupPermissionDto> result = new ArrayList<>();
-    underTest.selectAllPermissionsByGroupUuid(dbSession, group1.getUuid(), context -> result.add(context.getResultObject()));
-    assertThat(result).extracting(GroupPermissionDto::getEntityUuid, GroupPermissionDto::getRole).containsOnly(
-      tuple(null, "perm2"),
-      tuple(project1.uuid(), "perm3"), tuple(project1.uuid(), "perm4"), tuple(project2.uuid(), "perm5"));
-  }
-
-  @Test
-  public void selectAllPermissionsByGroupUuid_on_private_project() {
-    GroupDto group1 = db.users().insertGroup("group1");
-    ComponentDto project1 = db.components().insertPrivateProject().getMainBranchComponent();
-    ComponentDto project2 = db.components().insertPrivateProject().getMainBranchComponent();
-    db.users().insertPermissionOnAnyone("perm1");
-    db.users().insertPermissionOnGroup(group1, "perm2");
-    db.users().insertProjectPermissionOnGroup(group1, "perm3", project1);
-    db.users().insertProjectPermissionOnGroup(group1, "perm4", project1);
-    db.users().insertProjectPermissionOnGroup(group1, "perm5", project2);
-
-    List<GroupPermissionDto> result = new ArrayList<>();
-    underTest.selectAllPermissionsByGroupUuid(dbSession, group1.getUuid(), context -> result.add(context.getResultObject()));
-    assertThat(result).extracting(GroupPermissionDto::getEntityUuid, GroupPermissionDto::getRole).containsOnly(
-      tuple(null, "perm2"),
-      tuple(project1.uuid(), "perm3"), tuple(project1.uuid(), "perm4"), tuple(project2.uuid(), "perm5"));
-  }
-
   @Test
   public void selectGroupUuidsWithPermissionOnEntityBut_returns_empty_if_project_does_not_exist() {
     ProjectData project = randomPublicOrPrivateProject();
@@ -827,7 +791,7 @@ public class GroupPermissionDaoIT {
     GroupDto group = db.users().insertGroup();
     ProjectDto projectDto = new ProjectDto().setUuid("1234");
 
-    assertThat(underTest.deleteByEntityAndGroupUuid(dbSession,  null, projectDto)).isZero();
+    assertThat(underTest.deleteByEntityAndGroupUuid(dbSession, null, projectDto)).isZero();
     assertThat(underTest.deleteByEntityAndGroupUuid(dbSession, group.getUuid(), projectDto)).isZero();
   }
 
@@ -836,7 +800,7 @@ public class GroupPermissionDaoIT {
     ProjectData project = randomPublicOrPrivateProject();
     GroupDto group = db.users().insertGroup();
 
-    assertThat(underTest.deleteByEntityAndGroupUuid(dbSession,  null, project.getProjectDto())).isZero();
+    assertThat(underTest.deleteByEntityAndGroupUuid(dbSession, null, project.getProjectDto())).isZero();
     assertThat(underTest.deleteByEntityAndGroupUuid(dbSession, group.getUuid(), project.getProjectDto())).isZero();
   }
 
@@ -917,7 +881,7 @@ public class GroupPermissionDaoIT {
     assertThat(getProjectPermissionsForAnyOne(project.getUuid())).containsOnly("p2");
     assertThat(getProjectPermissionsForGroup(project.getUuid(), group)).containsOnly("p2");
 
-    deletedRows = underTest.deleteByEntityAndPermission(dbSession,  "p2", project);
+    deletedRows = underTest.deleteByEntityAndPermission(dbSession, "p2", project);
 
     assertThat(deletedRows).isEqualTo(2);
     assertThat(getGlobalPermissionsForAnyone()).containsOnly("p1", "p2");
@@ -987,6 +951,41 @@ public class GroupPermissionDaoIT {
     assertThat(results).containsOnly(group1.getUuid());
   }
 
+  @Test
+  public void selectGroupPermissionsOnEntity_whenPermissionsExist_returnsGroupPermissions() {
+    GroupDto group1 = db.users().insertGroup();
+    GroupDto group2 = db.users().insertGroup();
+    GroupDto group3 = db.users().insertGroup();
+    UserDto user = db.users().insertUser();
+    ProjectDto project = db.components().insertPrivateProject().getProjectDto();
+    ProjectDto otherProject = db.components().insertPrivateProject().getProjectDto();
+    String permission1 = "permission_1";
+    String permission2 = "permission_2";
+    db.users().insertEntityPermissionOnGroup(group1, permission1, project);
+    db.users().insertEntityPermissionOnGroup(group1, permission2, project);
+    db.users().insertEntityPermissionOnGroup(group2, permission1, project);
+    db.users().insertEntityPermissionOnGroup(group3, permission2, otherProject);
+    db.users().insertProjectPermissionOnUser(user, permission1, project);
+
+    List<GroupPermissionDto> results = underTest.selectGroupPermissionsOnEntity(dbSession, project.getUuid());
+
+    assertThat(results)
+      .extracting(
+        GroupPermissionDto::getGroupUuid, GroupPermissionDto::getEntityUuid, GroupPermissionDto::getRole)
+      .containsExactlyInAnyOrder(
+        tuple(group1.getUuid(), project.getUuid(), permission1),
+        tuple(group1.getUuid(), project.getUuid(), permission2),
+        tuple(group2.getUuid(), project.getUuid(), permission1));
+  }
+
+  @Test
+  public void selectGroupPermissionsOnEntity_whenPermissionsDontExist_returnEmptyList() {
+    ProjectDto project = db.components().insertPrivateProject().getProjectDto();
+
+    assertThat(underTest.selectGroupPermissionsOnEntity(dbSession, project.getUuid()))
+      .isEmpty();
+  }
+
   private Collection<String> getGlobalPermissionsForAnyone() {
     return getPermissions("group_uuid is null and entity_uuid is null");
   }
index f9fd9265632a1c6b89bb079db5055e04678cf273..39d0d8cfb22a0d6b8da6b2e14d7b1fef608ae548 100644 (file)
@@ -81,14 +81,6 @@ public class GroupPermissionDao implements Dao {
     return mapper(dbSession).countEntitiesWithAnyonePermissions();
   }
 
-  /**
-   * Select global and project permissions of a given group (Anyone group is NOT supported)
-   * Each row returns a {@link GroupPermissionDto}
-   */
-  public void selectAllPermissionsByGroupUuid(DbSession dbSession, String groupUuid, ResultHandler<GroupPermissionDto> resultHandler) {
-    mapper(dbSession).selectAllPermissionsByGroupUuid(groupUuid, resultHandler);
-  }
-
   /**
    * Each row returns a {@link CountPerEntityPermission}
    */
@@ -136,6 +128,10 @@ public class GroupPermissionDao implements Dao {
     return mapper(session).selectGroupUuidsWithPermissionOnEntity(entityUuid, permission);
   }
 
+  public List<GroupPermissionDto> selectGroupPermissionsOnEntity(DbSession session, String entityUuid) {
+    return mapper(session).selectGroupPermissionsOnEntity(entityUuid);
+  }
+
   public void insert(DbSession dbSession, GroupPermissionDto groupPermissionDto, @Nullable EntityDto entityDto, @Nullable PermissionTemplateDto permissionTemplateDto) {
     mapper(dbSession).insert(groupPermissionDto);
 
index 9305b3a7ecd4c89f2b62bf660b2607dd86c8c4ee..f3d2934b39fa7d8d8ad168f76cd2e133bc859443 100644 (file)
@@ -49,8 +49,6 @@ public interface GroupPermissionMapper {
 
   List<String> selectEntityPermissionsOfGroup(@Nullable @Param("groupUuid") String groupUuid, @Param("entityUuid") String entityUuid);
 
-  void selectAllPermissionsByGroupUuid(@Param("groupUuid") String groupUuid, ResultHandler<GroupPermissionDto> resultHandler);
-
   /**
    * Lists uuid of groups with at least one permission on the specified entity but which do not have the specified
    * permission, <strong>excluding group "AnyOne"</strong> (which implies the returned {@code Set} can't contain
@@ -60,6 +58,8 @@ public interface GroupPermissionMapper {
 
   Set<String> selectGroupUuidsWithPermissionOnEntity(@Param("entityUuid") String entityUuid, @Param("role") String permission);
 
+  List<GroupPermissionDto> selectGroupPermissionsOnEntity(@Param("entityUuid") String entityUuid);
+
   int deleteByEntityUuid(@Param("entityUuid") String entityUuid);
 
   int deleteByEntityUuidAndGroupUuid(@Param("entityUuid") String entityUuid, @Nullable @Param("groupUuid") String groupUuid);
index f6cef3a74a746c9aae5bbcdfde942ba03e4001b8..78d5f251ecdd927ff58f4bf6377de771df670065 100644 (file)
     </choose>
   </select>
 
-  <select id="selectAllPermissionsByGroupUuid" parameterType="map" resultType="GroupPermission">
-    select gr.group_uuid as groupUuid, gr.entity_uuid as entityUuid, gr.role as role
-    from group_roles gr
-    where gr.group_uuid = #{groupUuid,jdbcType=VARCHAR}
-  </select>
-
   <select id="selectGroupUuidsWithPermissionOnEntityBut" resultType="string">
     select
       distinct gr1.group_uuid
       and gr1.role = #{role,jdbcType=VARCHAR}
   </select>
 
+ <select id="selectGroupPermissionsOnEntity" resultType="GroupPermission">
+    select gr.group_uuid as groupUuid, gr.entity_uuid as entityUuid, gr.role as role
+    from group_roles gr
+    where gr.entity_uuid = #{entityUuid,jdbcType=VARCHAR}
+  </select>
+
   <insert id="insert" parameterType="GroupPermission">
     insert into group_roles (
     uuid,