From 4d3ae88b0085febcee687bd27405a0c06761f348 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Fri, 14 Apr 2017 11:49:24 +0200 Subject: [PATCH] SONAR-9105 add UserPermissionDao#deleteProjectPermissionOfAnyUser --- .../db/permission/UserPermissionDao.java | 7 ++ .../db/permission/UserPermissionMapper.java | 2 + .../db/permission/UserPermissionMapper.xml | 8 ++ .../db/permission/GroupPermissionDaoTest.java | 4 +- .../db/permission/UserPermissionDaoTest.java | 77 +++++++++++++++++++ 5 files changed, 96 insertions(+), 2 deletions(-) diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/UserPermissionDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/UserPermissionDao.java index 96a54261b58..31f276e1595 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/UserPermissionDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/UserPermissionDao.java @@ -136,6 +136,13 @@ public class UserPermissionDao implements Dao { mapper(dbSession).deleteProjectPermissions(projectId); } + /** + * Deletes the specified permission on the specified project for any user. + */ + public int deleteProjectPermissionOfAnyUser(DbSession dbSession, long projectId, String permission) { + return mapper(dbSession).deleteProjectPermissionOfAnyUser(projectId, permission); + } + public void deleteByOrganization(DbSession dbSession, String organizationUuid) { mapper(dbSession).deleteByOrganization(organizationUuid); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/UserPermissionMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/UserPermissionMapper.java index 31b724c97b1..4007e221b0c 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/UserPermissionMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/UserPermissionMapper.java @@ -55,6 +55,8 @@ public interface UserPermissionMapper { void deleteProjectPermissions(@Param("projectId") long projectId); + int deleteProjectPermissionOfAnyUser(@Param("projectId") long projectId, @Param("permission") String permission); + List selectGlobalPermissionsOfUser(@Param("userId") int userId, @Param("organizationUuid") String organizationUuid); List selectProjectPermissionsOfUser(@Param("userId") int userId, @Param("projectId") long projectId); diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/UserPermissionMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/UserPermissionMapper.xml index 57f826b7317..7e9e3d4b68b 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/UserPermissionMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/UserPermissionMapper.xml @@ -118,6 +118,14 @@ resource_id = #{projectId,jdbcType=BIGINT} + + delete from + user_roles + where + resource_id = #{projectId,jdbcType=BIGINT} + and role = #{permission,jdbcType=VARCHAR} + + delete from user_roles 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 29dac03f989..1097e8190c5 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 @@ -878,14 +878,14 @@ public class GroupPermissionDaoTest { @Test public void deleteByRootComponentIdAndPermission_has_no_effect_if_component_does_not_exist() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = randomPublicOrPrivateProject(organization); + ComponentDto project = db.components().insertPublicProject(organization); GroupDto group = db.users().insertGroup(organization); db.users().insertPermissionOnAnyone(organization, "p1"); db.users().insertPermissionOnGroup(group, "p1"); db.users().insertProjectPermissionOnGroup(group, "p1", project); db.users().insertProjectPermissionOnAnyone("p1", project); - assertThat(underTest.deleteByRootComponentIdAndPermission(dbSession, project.getId(), "p2")).isEqualTo(0); + assertThat(underTest.deleteByRootComponentIdAndPermission(dbSession, 1324, "p1")).isEqualTo(0); assertThat(getGlobalPermissionsForAnyone(organization)).containsOnly("p1"); assertThat(getGlobalPermissionsForGroup(group)).containsOnly("p1"); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/permission/UserPermissionDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/permission/UserPermissionDaoTest.java index e02068b90b4..64762e5eed4 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/permission/UserPermissionDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/permission/UserPermissionDaoTest.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Random; import javax.annotation.Nullable; import org.junit.Before; import org.junit.Rule; @@ -46,6 +47,7 @@ import static org.sonar.core.permission.GlobalPermissions.PROVISIONING; import static org.sonar.core.permission.GlobalPermissions.SYSTEM_ADMIN; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_GATES; +import static org.sonar.db.permission.OrganizationPermission.PROVISION_PROJECTS; import static org.sonar.db.permission.OrganizationPermission.SCAN; import static org.sonar.db.user.UserTesting.newUserDto; @@ -457,6 +459,81 @@ public class UserPermissionDaoTest { .containsOnly(tuple(user2.getId().longValue(), null, SCAN.getKey()), tuple(user2.getId().longValue(), project.getId(), ADMINISTER_QUALITY_GATES.getKey())); } + @Test + public void deleteProjectPermissionOfAnyUser_has_no_effect_if_specified_component_does_not_exist() { + OrganizationDto organization = dbTester.organizations().insert(); + dbTester.users().insertPermissionOnUser(organization, user1, SCAN); + + int deletedCount = underTest.deleteProjectPermissionOfAnyUser(dbSession, 124L, SCAN.getKey()); + + assertThat(deletedCount).isEqualTo(0); + assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user1.getId(), organization.getUuid())).containsOnly(SCAN.getKey()); + } + + @Test + public void deleteProjectPermissionOfAnyUser_has_no_effect_if_specified_component_has_no_permission_at_all() { + OrganizationDto organization = dbTester.organizations().insert(); + dbTester.users().insertPermissionOnUser(organization, user1, SCAN); + ComponentDto project = randomPublicOrPrivateProject(organization); + + int deletedCount = underTest.deleteProjectPermissionOfAnyUser(dbSession, project.getId(), SCAN.getKey()); + + assertThat(deletedCount).isEqualTo(0); + assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user1.getId(), organization.getUuid())).containsOnly(SCAN.getKey()); + } + + @Test + public void deleteProjectPermissionOfAnyUser_has_no_effect_if_specified_component_does_not_have_specified_permission() { + OrganizationDto organization = dbTester.organizations().insert(); + dbTester.users().insertPermissionOnUser(organization, user1, SCAN); + ComponentDto project = randomPublicOrPrivateProject(organization); + dbTester.users().insertProjectPermissionOnUser(user1, SCAN.getKey(), project); + + int deletedCount = underTest.deleteProjectPermissionOfAnyUser(dbSession, project.getId(), "p1"); + + assertThat(deletedCount).isEqualTo(0); + assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user1.getId(), organization.getUuid())).containsOnly(SCAN.getKey()); + assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user1.getId(), project.getId())).containsOnly(SCAN.getKey()); + } + + @Test + public void deleteProjectPermissionOfAnyUser_deletes_specified_permission_for_any_user_on_the_specified_component() { + OrganizationDto organization = dbTester.organizations().insert(); + dbTester.users().insertPermissionOnUser(organization, user1, SCAN); + dbTester.users().insertPermissionOnUser(organization, user2, SCAN); + ComponentDto project1 = randomPublicOrPrivateProject(organization); + ComponentDto project2 = randomPublicOrPrivateProject(organization); + dbTester.users().insertProjectPermissionOnUser(user1, SCAN.getKey(), project1); + dbTester.users().insertProjectPermissionOnUser(user2, SCAN.getKey(), project1); + dbTester.users().insertProjectPermissionOnUser(user1, SCAN.getKey(), project2); + dbTester.users().insertProjectPermissionOnUser(user2, SCAN.getKey(), project2); + dbTester.users().insertProjectPermissionOnUser(user2, PROVISION_PROJECTS.getKey(), project2); + + int deletedCount = underTest.deleteProjectPermissionOfAnyUser(dbSession, project1.getId(), SCAN.getKey()); + + assertThat(deletedCount).isEqualTo(2); + assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user1.getId(), organization.getUuid())).containsOnly(SCAN.getKey()); + assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user2.getId(), organization.getUuid())).containsOnly(SCAN.getKey()); + assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user1.getId(), project1.getId())).isEmpty(); + assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user2.getId(), project1.getId())).isEmpty(); + assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user1.getId(), project2.getId())).containsOnly(SCAN.getKey()); + assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user2.getId(), project2.getId())).containsOnly(SCAN.getKey(), PROVISION_PROJECTS.getKey()); + + deletedCount = underTest.deleteProjectPermissionOfAnyUser(dbSession, project2.getId(), SCAN.getKey()); + + assertThat(deletedCount).isEqualTo(2); + assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user1.getId(), organization.getUuid())).containsOnly(SCAN.getKey()); + assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user2.getId(), organization.getUuid())).containsOnly(SCAN.getKey()); + assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user1.getId(), project1.getId())).isEmpty(); + assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user2.getId(), project1.getId())).isEmpty(); + assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user1.getId(), project2.getId())).containsOnly(); + assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user2.getId(), project2.getId())).containsOnly(PROVISION_PROJECTS.getKey()); + } + + private ComponentDto randomPublicOrPrivateProject(OrganizationDto organization) { + return new Random().nextBoolean() ? dbTester.components().insertPrivateProject(organization) : dbTester.components().insertPublicProject(organization); + } + private void verifyOrganizationUuidsInTable(String... organizationUuids) { assertThat(dbTester.select("select organization_uuid as \"organizationUuid\" from user_roles")) .extracting((row) -> (String) row.get("organizationUuid")) -- 2.39.5