From b7f05a7b569bd29eb43b906eafec0019ce4f9dd3 Mon Sep 17 00:00:00 2001 From: Wojtek Wajerowicz <115081248+wojciech-wajerowicz-sonarsource@users.noreply.github.com> Date: Thu, 6 Jul 2023 11:19:05 +0200 Subject: [PATCH] SONAR-19785 Fetch all group permissions for a project from the database. --- .../db/permission/GroupPermissionDaoIT.java | 79 +++++++++---------- .../db/permission/GroupPermissionDao.java | 12 +-- .../db/permission/GroupPermissionMapper.java | 4 +- .../db/permission/GroupPermissionMapper.xml | 12 +-- 4 files changed, 51 insertions(+), 56 deletions(-) diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoIT.java index 61bdc90987a..3fff15626da 100644 --- a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoIT.java +++ b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoIT.java @@ -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 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 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 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 getGlobalPermissionsForAnyone() { return getPermissions("group_uuid is null and entity_uuid is null"); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDao.java index f9fd9265632..39d0d8cfb22 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDao.java @@ -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 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 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); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionMapper.java index 9305b3a7ecd..f3d2934b39f 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionMapper.java @@ -49,8 +49,6 @@ public interface GroupPermissionMapper { List selectEntityPermissionsOfGroup(@Nullable @Param("groupUuid") String groupUuid, @Param("entityUuid") String entityUuid); - void selectAllPermissionsByGroupUuid(@Param("groupUuid") String groupUuid, ResultHandler resultHandler); - /** * Lists uuid of groups with at least one permission on the specified entity but which do not have the specified * permission, excluding group "AnyOne" (which implies the returned {@code Set} can't contain @@ -60,6 +58,8 @@ public interface GroupPermissionMapper { Set selectGroupUuidsWithPermissionOnEntity(@Param("entityUuid") String entityUuid, @Param("role") String permission); + List selectGroupPermissionsOnEntity(@Param("entityUuid") String entityUuid); + int deleteByEntityUuid(@Param("entityUuid") String entityUuid); int deleteByEntityUuidAndGroupUuid(@Param("entityUuid") String entityUuid, @Nullable @Param("groupUuid") String groupUuid); diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/GroupPermissionMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/GroupPermissionMapper.xml index f6cef3a74a7..78d5f251ecd 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/GroupPermissionMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/GroupPermissionMapper.xml @@ -193,12 +193,6 @@ - - + + insert into group_roles ( uuid, -- 2.39.5