diff options
author | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2017-04-14 09:57:09 +0200 |
---|---|---|
committer | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2017-04-27 14:25:54 +0200 |
commit | 1e25a6cbef88d51a74690a3c4b11b52c8503a9f7 (patch) | |
tree | 5ff53ace8b860a02789b2b5824b8991a416d49dd | |
parent | 02c43b17a1b311ee6f0d04e196209b5473a491b7 (diff) | |
download | sonarqube-1e25a6cbef88d51a74690a3c4b11b52c8503a9f7.tar.gz sonarqube-1e25a6cbef88d51a74690a3c4b11b52c8503a9f7.zip |
SONAR-9105 add GroupPermissionDao#deleteByRootComponentIdAndGroupId
4 files changed, 193 insertions, 2 deletions
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 4781b473787..97e77962499 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 @@ -139,6 +139,14 @@ public class GroupPermissionDao implements Dao { } /** + * Delete all permissions of the specified group (group "AnyOne" if {@code groupId} is {@code null}) for the specified + * component. + */ + public int deleteByRootComponentIdAndGroupId(DbSession dbSession, long rootComponentId, @Nullable Integer groupId) { + return mapper(dbSession).deleteByRootComponentIdAndGroupId(rootComponentId, groupId); + } + + /** * Delete a single permission. It can be: * <ul> * <li>a global permission granted to a group</li> 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 ec5288e56c8..00e58e1ab20 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 @@ -39,8 +39,6 @@ public interface GroupPermissionMapper { void insert(GroupPermissionDto dto); - void deleteByRootComponentId(@Param("rootComponentId") long componentId); - void delete(@Param("permission") String permission, @Param("organizationUuid") String organizationUuid, @Nullable @Param("groupId") Integer groupId, @Nullable @Param("rootComponentId") Long rootComponentId); @@ -55,4 +53,7 @@ public interface GroupPermissionMapper { void deleteByOrganization(@Param("organizationUuid") String organizationUuid); + void deleteByRootComponentId(@Param("rootComponentId") long componentId); + + int deleteByRootComponentIdAndGroupId(@Param("rootComponentId") long rootComponentId, @Nullable @Param("groupId") Integer groupId); } 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 b2ab5ef4a9e..ccd42f9360c 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 @@ -181,6 +181,21 @@ where resource_id=#{rootComponentId,jdbcType=BIGINT} </delete> + <delete id="deleteByRootComponentIdAndGroupId"> + delete from + group_roles + where + resource_id=#{rootComponentId,jdbcType=BIGINT} + <choose> + <when test="groupId != null"> + and group_id = #{groupId,jdbcType=INTEGER} + </when> + <otherwise> + and group_id is null + </otherwise> + </choose> + </delete> + <delete id="delete" parameterType="map"> delete from group_roles where diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/permission/GroupPermissionDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/permission/GroupPermissionDaoTest.java index dea92218fe0..c2d43e87cc4 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/permission/GroupPermissionDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/permission/GroupPermissionDaoTest.java @@ -22,6 +22,7 @@ package org.sonar.db.permission; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Random; import java.util.stream.IntStream; import org.junit.Before; import org.junit.Rule; @@ -660,6 +661,172 @@ public class GroupPermissionDaoTest { verifyOrganizationUuidsInTable(); } + @Test + public void deleteByRootComponentIdAndGroupId_deletes_all_permissions_of_group_AnyOne_of_specified_component_if_groupId_is_null() { + OrganizationDto organization = db.organizations().insert(); + ComponentDto project = db.components().insertPublicProject(organization); + GroupDto group = db.users().insertGroup(organization); + db.users().insertProjectPermissionOnAnyone("p1", project); + db.users().insertProjectPermissionOnGroup(group, "p2", project); + db.users().insertPermissionOnAnyone(organization, "p3"); + db.users().insertPermissionOnGroup(group, "p4"); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), null, project.getId())) + .containsOnly("p1"); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), group.getId(), project.getId())) + .containsOnly("p2"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), null)) + .containsOnly("p3"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), group.getId())) + .containsOnly("p4"); + + int deletedCount = underTest.deleteByRootComponentIdAndGroupId(dbSession, project.getId(), null); + + assertThat(deletedCount).isEqualTo(1); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), null, project.getId())) + .isEmpty(); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), group.getId(), project.getId())) + .containsOnly("p2"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), null)) + .containsOnly("p3"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), group.getId())) + .containsOnly("p4"); + } + + @Test + public void deleteByRootComponentIdAndGroupId_deletes_all_permissions_of_specified_group_of_specified_component_if_groupId_is_non_null() { + OrganizationDto organization = db.organizations().insert(); + ComponentDto project = db.components().insertPublicProject(organization); + GroupDto group1 = db.users().insertGroup(organization); + GroupDto group2 = db.users().insertGroup(organization); + db.users().insertProjectPermissionOnAnyone("p1", project); + db.users().insertProjectPermissionOnGroup(group1, "p2", project); + db.users().insertProjectPermissionOnGroup(group2, "p3", project); + db.users().insertProjectPermissionOnGroup(group2, "p4", project); + db.users().insertPermissionOnAnyone(organization, "p5"); + db.users().insertPermissionOnGroup(group1, "p6"); + db.users().insertPermissionOnGroup(group2, "p7"); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), null, project.getId())) + .containsOnly("p1"); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), group1.getId(), project.getId())) + .containsOnly("p2"); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), group2.getId(), project.getId())) + .containsOnly("p3", "p4"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), null)) + .containsOnly("p5"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), group1.getId())) + .containsOnly("p6"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), group2.getId())) + .containsOnly("p7"); + + int deletedCount = underTest.deleteByRootComponentIdAndGroupId(dbSession, project.getId(), group1.getId()); + + assertThat(deletedCount).isEqualTo(1); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), null, project.getId())) + .containsOnly("p1"); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), group1.getId(), project.getId())) + .isEmpty(); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), group2.getId(), project.getId())) + .containsOnly("p3", "p4"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), group1.getId())) + .containsOnly("p6"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), group2.getId())) + .containsOnly("p7"); + + deletedCount = underTest.deleteByRootComponentIdAndGroupId(dbSession, project.getId(), group2.getId()); + + assertThat(deletedCount).isEqualTo(2); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), null, project.getId())) + .containsOnly("p1"); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), group1.getId(), project.getId())) + .isEmpty(); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), group2.getId(), project.getId())) + .isEmpty(); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), group1.getId())) + .containsOnly("p6"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), group2.getId())) + .containsOnly("p7"); + } + + @Test + public void deleteByRootComponentIdAndGroupId_has_no_effect_if_component_does_not_exist() { + OrganizationDto organization = db.organizations().insert(); + GroupDto group = db.users().insertGroup(organization); + + assertThat(underTest.deleteByRootComponentIdAndGroupId(dbSession, 1234L, null)).isEqualTo(0); + assertThat(underTest.deleteByRootComponentIdAndGroupId(dbSession, 1234L, group.getId())).isEqualTo(0); + } + + @Test + public void deleteByRootComponentIdAndGroupId_has_no_effect_if_component_has_no_group_permission_at_all() { + OrganizationDto organization = db.organizations().insert(); + ComponentDto project = randomPublicOrPrivateProject(organization); + GroupDto group = db.users().insertGroup(organization); + + assertThat(underTest.deleteByRootComponentIdAndGroupId(dbSession, project.getId(), null)).isEqualTo(0); + assertThat(underTest.deleteByRootComponentIdAndGroupId(dbSession, project.getId(), group.getId())).isEqualTo(0); + } + + @Test + public void deleteByRootComponentIdAndGroupId_has_no_effect_if_group_does_not_exist() { + OrganizationDto organization = db.organizations().insert(); + ComponentDto project = randomPublicOrPrivateProject(organization); + + assertThat(underTest.deleteByRootComponentIdAndGroupId(dbSession, project.getId(), 5678)).isEqualTo(0); + } + + @Test + public void deleteByRootComponentIdAndGroupId_has_no_effect_if_component_has_no_group_permission_for_group_AnyOne() { + OrganizationDto organization = db.organizations().insert(); + ComponentDto project = db.components().insertPrivateProject(organization); + GroupDto group1 = db.users().insertGroup(organization); + db.users().insertProjectPermissionOnGroup(group1, "p1", project); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), null, project.getId())) + .isEmpty(); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), group1.getId(), project.getId())) + .containsOnly("p1"); + db.users().insertPermissionOnAnyone(organization, "p2"); + db.users().insertPermissionOnGroup(group1, "p3"); + + int deletedCount = underTest.deleteByRootComponentIdAndGroupId(dbSession, project.getId(), null); + + assertThat(deletedCount).isEqualTo(0); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), null, project.getId())) + .isEmpty(); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), group1.getId(), project.getId())) + .containsOnly("p1"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), null)) + .containsOnly("p2"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), group1.getId())) + .containsOnly("p3"); + } + + @Test + public void deleteByRootComponentIdAndGroupId_has_no_effect_if_component_has_no_group_permission_for_specified_group() { + OrganizationDto organization = db.organizations().insert(); + ComponentDto project = db.components().insertPrivateProject(organization); + GroupDto group1 = db.users().insertGroup(organization); + GroupDto group2 = db.users().insertGroup(organization); + db.users().insertProjectPermissionOnGroup(group1, "p1", project); + db.users().insertPermissionOnAnyone(organization, "p2"); + db.users().insertPermissionOnGroup(group1, "p3"); + + int deletedCount = underTest.deleteByRootComponentIdAndGroupId(dbSession, project.getId(), group2.getId()); + + assertThat(deletedCount).isEqualTo(0); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), group1.getId(), project.getId())) + .containsOnly("p1"); + assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, organization.getUuid(), group2.getId(), project.getId())) + .isEmpty(); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), null)) + .containsOnly("p2"); + assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, organization.getUuid(), group1.getId())) + .containsOnly("p3"); + } + + private ComponentDto randomPublicOrPrivateProject(OrganizationDto organization) { + return new Random().nextBoolean() ? db.components().insertPublicProject(organization) : db.components().insertPrivateProject(organization); + } + private PermissionQuery.Builder newQuery() { return PermissionQuery.builder().setOrganizationUuid(db.getDefaultOrganization().getUuid()); } |