]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8957 Remove permission templates when deactivating a user
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 19 Apr 2017 09:37:24 +0000 (11:37 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 20 Apr 2017 09:11:05 +0000 (11:11 +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/user/ws/DeactivateAction.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/DeactivateActionTest.java

index a09a9b6d96f9eed8038407b1823019dfd6fcf5f5..67c0b009b5ac6fafd3589e8c80a48bf721ab4778 100644 (file)
@@ -105,7 +105,6 @@ public class PermissionTemplateDao implements Dao {
   private static String toUppercaseSqlQuery(String nameMatch) {
     String wildcard = "%";
     return format("%s%s%s", wildcard, nameMatch.toUpperCase(Locale.ENGLISH), wildcard);
-
   }
 
   public PermissionTemplateDto insert(DbSession session, PermissionTemplateDto dto) {
@@ -184,6 +183,10 @@ public class PermissionTemplateDao implements Dao {
     mapper(dbSession).deleteUserPermissionsByOrganization(organizationUuid, userId);
   }
 
+  public void deleteUserPermissionsByUserId(DbSession dbSession, int userId) {
+    mapper(dbSession).deleteUserPermissionsByUserId(userId);
+  }
+
   public void insertGroupPermission(DbSession session, long templateId, @Nullable Integer groupId, String permission) {
     PermissionTemplateGroupDto permissionTemplateGroup = new PermissionTemplateGroupDto()
       .setTemplateId(templateId)
index 7cb00625d4c030445b50a9bdb46d68de770c7398..4c2735b377e4e2be52311da1966f3aea2259e5ba 100644 (file)
@@ -46,6 +46,8 @@ public interface PermissionTemplateMapper {
 
   void deleteUserPermissionsByOrganization(@Param("organizationUuid") String organizationUuid, @Param("userId") int userId);
 
+  void deleteUserPermissionsByUserId(@Param("userId") int userId);
+
   void deleteUserPermission(PermissionTemplateUserDto permissionTemplateUser);
 
   void deleteGroupPermissionsByTemplateId(long templateId);
index 90efe932bdae2b7975723bb3c90da2e2f7025672..76ab1fa9de3f9fada9bc287a163b67ce7696affa 100644 (file)
     and template_id in (select id from permission_templates where organization_uuid=#{organizationUuid,jdbcType=VARCHAR})
   </delete>
 
+  <delete id="deleteUserPermissionsByUserId" parameterType="integer">
+    delete from perm_templates_users
+    where
+    user_id = #{userId,jdbcType=INTEGER}
+  </delete>
+
   <delete id="deleteGroupPermissionsByTemplateId" parameterType="long">
     delete from
       perm_templates_groups
index b2b07613a9352aae5d1231df4f0f72fd1c540bdb..878c6160d2f1eb502504c237a2f23c553c550cd5 100644 (file)
@@ -443,6 +443,27 @@ public class PermissionTemplateDaoTest {
     assertThat(underTest.selectUserPermissionsByTemplateId(dbSession, anotherTemplate.getId())).extracting(PermissionTemplateUserDto::getUserId).containsOnly(user.getId());
   }
 
+  @Test
+  public void delete_user_permissions_by_user_id() {
+    OrganizationDto organization = db.organizations().insert();
+    OrganizationDto anotherOrganization = db.organizations().insert();
+    UserDto user = db.users().insertUser();
+    UserDto anotherUser = db.users().insertUser();
+    PermissionTemplateDto template = db.permissionTemplates().insertTemplate(organization);
+    PermissionTemplateDto anotherTemplate = db.permissionTemplates().insertTemplate(anotherOrganization);
+    String permission = "PERMISSION";
+    db.permissionTemplates().addUserToTemplate(template.getId(), user.getId(), permission);
+    db.permissionTemplates().addUserToTemplate(template.getId(), anotherUser.getId(), permission);
+    db.permissionTemplates().addUserToTemplate(anotherTemplate.getId(), user.getId(), permission);
+
+    underTest.deleteUserPermissionsByUserId(dbSession, user.getId());
+    db.commit();
+
+    assertThat(db.select("select template_id as \"templateId\", user_id as \"userId\", permission_reference as \"permission\" from perm_templates_users"))
+      .extracting((row) -> row.get("templateId"), (row) -> row.get("userId"), (row) -> row.get("permission"))
+      .containsOnly(tuple(template.getId(), anotherUser.getId().longValue(), permission));
+  }
+
   private PermissionTemplateDto createTemplate(OrganizationDto organization) {
     UserDto user = db.users().insertUser();
     GroupDto group = db.users().insertGroup();
index 24365f287a41f22cd6bdb645f1da23b38487b94d..1419e4abebc74a6890935ed391b0aead2e394dee 100644 (file)
@@ -93,13 +93,15 @@ public class DeactivateAction implements UsersWsAction {
 
       ensureNotLastAdministrator(dbSession, user);
 
+      Integer userId = user.getId();
       dbClient.userTokenDao().deleteByLogin(dbSession, login);
-      dbClient.userGroupDao().deleteByUserId(dbSession, user.getId());
-      dbClient.propertiesDao().deleteByQuery(dbSession, PropertyQuery.builder().setUserId(user.getId()).build());
-      dbClient.userPermissionDao().deleteByUserId(dbSession, user.getId());
       dbClient.propertiesDao().deleteByKeyAndValue(dbSession, DEFAULT_ISSUE_ASSIGNEE, user.getLogin());
-      dbClient.organizationMemberDao().deleteByUserId(dbSession, user.getId());
-      dbClient.userDao().deactivateUserById(dbSession, user.getId());
+      dbClient.propertiesDao().deleteByQuery(dbSession, PropertyQuery.builder().setUserId(userId).build());
+      dbClient.userGroupDao().deleteByUserId(dbSession, userId);
+      dbClient.userPermissionDao().deleteByUserId(dbSession, userId);
+      dbClient.permissionTemplateDao().deleteUserPermissionsByUserId(dbSession, userId);
+      dbClient.organizationMemberDao().deleteByUserId(dbSession, userId);
+      dbClient.userDao().deactivateUserById(dbSession, userId);
       dbSession.commit();
     }
 
index 96849a24f4bd015f604a392e205567ac84aa2ce8..22db1956cc96c9c5fa724cdab7137b842d0f9f9b 100644 (file)
@@ -31,6 +31,8 @@ import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
 import org.sonar.db.component.ComponentDto;
 import org.sonar.db.organization.OrganizationDto;
+import org.sonar.db.permission.template.PermissionTemplateDto;
+import org.sonar.db.permission.template.PermissionTemplateUserDto;
 import org.sonar.db.property.PropertyDto;
 import org.sonar.db.property.PropertyQuery;
 import org.sonar.db.user.GroupDto;
@@ -153,7 +155,6 @@ public class DeactivateActionTest {
     db.users().insertPermissionOnUser(user, ADMINISTER_QUALITY_PROFILES);
     db.users().insertProjectPermissionOnUser(user, USER, project);
     db.users().insertProjectPermissionOnUser(user, CODEVIEWER, project);
-    db.commit();
 
     deactivate(user.getLogin()).getInput();
 
@@ -161,6 +162,21 @@ public class DeactivateActionTest {
     assertThat(db.getDbClient().userPermissionDao().selectProjectPermissionsOfUser(dbSession, user.getId(), project.getId())).isEmpty();
   }
 
+  @Test
+  public void deactivate_user_deletes_his_permission_templates() {
+    logInAsSystemAdministrator();
+    UserDto user = insertUser(newUserDto());
+    PermissionTemplateDto template = db.permissionTemplates().insertTemplate();
+    PermissionTemplateDto anotherTemplate = db.permissionTemplates().insertTemplate();
+    db.permissionTemplates().addUserToTemplate(template.getId(), user.getId(), USER);
+    db.permissionTemplates().addUserToTemplate(anotherTemplate.getId(), user.getId(), CODEVIEWER);
+
+    deactivate(user.getLogin()).getInput();
+
+    assertThat(db.getDbClient().permissionTemplateDao().selectUserPermissionsByTemplateId(dbSession, template.getId())).extracting(PermissionTemplateUserDto::getUserId).isEmpty();
+    assertThat(db.getDbClient().permissionTemplateDao().selectUserPermissionsByTemplateId(dbSession, anotherTemplate.getId())).extracting(PermissionTemplateUserDto::getUserId).isEmpty();
+  }
+
   @Test
   public void deactivate_user_deletes_his_default_assignee_settings() {
     logInAsSystemAdministrator();
@@ -170,7 +186,6 @@ public class DeactivateActionTest {
     db.properties().insertProperty(new PropertyDto().setKey("sonar.issues.defaultAssigneeLogin").setValue(user.getLogin()).setResourceId(project.getId()));
     db.properties().insertProperty(new PropertyDto().setKey("sonar.issues.defaultAssigneeLogin").setValue(user.getLogin()).setResourceId(anotherProject.getId()));
     db.properties().insertProperty(new PropertyDto().setKey("other").setValue(user.getLogin()).setResourceId(anotherProject.getId()));
-    db.commit();
 
     deactivate(user.getLogin()).getInput();