]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5175 When deleting a group, rows related to this group in perm_templates_groups...
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Mon, 11 Aug 2014 09:50:20 +0000 (11:50 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Mon, 11 Aug 2014 09:50:28 +0000 (11:50 +0200)
server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionTemplateService.java
server/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionTemplateServiceTest.java
server/sonar-web/src/main/webapp/WEB-INF/app/controllers/groups_controller.rb
sonar-core/src/main/java/org/sonar/core/permission/PermissionTemplateDao.java
sonar-core/src/main/java/org/sonar/core/permission/PermissionTemplateMapper.java
sonar-core/src/main/resources/org/sonar/core/permission/PermissionTemplateMapper.xml
sonar-core/src/test/java/org/sonar/core/permission/PermissionTemplateDaoTest.java
sonar-core/src/test/resources/org/sonar/core/permission/PermissionTemplateDaoTest/remove_by_group-result.xml [new file with mode: 0644]
sonar-core/src/test/resources/org/sonar/core/permission/PermissionTemplateDaoTest/remove_by_group.xml [new file with mode: 0644]

index b6e2538ae0cb56f9ab006e13d01ed8d37f1f80b3..97b1798ada7db32a65cdbf2665d933039c33f5e9 100644 (file)
@@ -23,13 +23,20 @@ package org.sonar.server.permission;
 import com.google.common.collect.Lists;
 import org.apache.commons.lang.StringUtils;
 import org.sonar.api.ServerComponent;
+import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.core.permission.PermissionTemplateDao;
 import org.sonar.core.permission.PermissionTemplateDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.core.user.GroupDto;
 import org.sonar.core.user.UserDao;
 import org.sonar.server.exceptions.BadRequestException;
+import org.sonar.server.exceptions.NotFoundException;
+import org.sonar.server.user.UserSession;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
+
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
@@ -40,11 +47,13 @@ import java.util.regex.PatternSyntaxException;
  */
 public class InternalPermissionTemplateService implements ServerComponent {
 
+  private final MyBatis myBatis;
   private final PermissionTemplateDao permissionTemplateDao;
   private final UserDao userDao;
   private final PermissionFinder finder;
 
-  public InternalPermissionTemplateService(PermissionTemplateDao permissionTemplateDao, UserDao userDao, PermissionFinder finder) {
+  public InternalPermissionTemplateService(MyBatis myBatis, PermissionTemplateDao permissionTemplateDao, UserDao userDao, PermissionFinder finder) {
+    this.myBatis = myBatis;
     this.permissionTemplateDao = permissionTemplateDao;
     this.userDao = userDao;
     this.finder = finder;
@@ -145,6 +154,21 @@ public class InternalPermissionTemplateService implements ServerComponent {
     updater.executeUpdate();
   }
 
+  public void removeGroupFromTemplates(String groupName) {
+    UserSession.get().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    DbSession session = myBatis.openSession(false);
+    try {
+      GroupDto group = userDao.selectGroupByName(groupName, session);
+      if (group == null) {
+        throw new NotFoundException("Group does not exists : " + groupName);
+      }
+      permissionTemplateDao.removeByGroup(group.getId(), session);
+      session.commit();
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
   private void validateTemplateName(@Nullable Long templateId, String templateName) {
     if (StringUtils.isEmpty(templateName)) {
       String errorMsg = "Name can't be blank";
index 276f056b0897eb11747447e2bf9dcbd9e8a6a769..c50acc616048d7cc3f4e1a7b3f7e7fcbe3863ea3 100644 (file)
@@ -31,6 +31,8 @@ import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.permission.*;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.MyBatis;
 import org.sonar.core.user.GroupDto;
 import org.sonar.core.user.UserDao;
 import org.sonar.core.user.UserDto;
@@ -61,6 +63,9 @@ public class InternalPermissionTemplateServiceTest {
   @Mock
   PermissionFinder finder;
 
+  @Mock
+  DbSession session;
+
   InternalPermissionTemplateService service;
 
   @Rule
@@ -69,7 +74,10 @@ public class InternalPermissionTemplateServiceTest {
   @Before
   public void setUp() {
     MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
-    service = new InternalPermissionTemplateService(permissionTemplateDao, userDao, finder);
+
+    MyBatis myBatis = mock(MyBatis.class);
+    when(myBatis.openSession(false)).thenReturn(session);
+    service = new InternalPermissionTemplateService(myBatis, permissionTemplateDao, userDao, finder);
   }
 
   @Test
@@ -339,6 +347,16 @@ public class InternalPermissionTemplateServiceTest {
     verifyZeroInteractions(userDao);
   }
 
+  @Test
+  public void should_remove_group_from_templates() throws Exception {
+    GroupDto groupDto = new GroupDto().setId(1L).setName("group");
+    when(userDao.selectGroupByName("group", session)).thenReturn(groupDto);
+
+    service.removeGroupFromTemplates("group");
+
+    verify(permissionTemplateDao).removeByGroup(eq(1L), eq(session));
+  }
+
   private PermissionTemplateUserDto buildUserPermission(String userName, String permission) {
     return new PermissionTemplateUserDto().setUserName(userName).setPermission(permission);
   }
index 4322e4876f0662fd0997513257333998a36c15eb..51a6a8063baebb4ae83618867aedafa54335fa9e 100644 (file)
@@ -75,8 +75,11 @@ class GroupsController < ApplicationController
     verify_post_request
     require_parameters :id
     group = Group.find(params[:id])
-    if group.destroy
-      flash[:notice] = 'Group is deleted.'
+    call_backend do
+      Internal.permission_templates.removeGroupFromTemplates(group.name)
+      if group.destroy
+        flash[:notice] = 'Group is deleted.'
+      end
     end
     to_index(group.errors, nil)
   end
index 9ec979bc2835be6ea21ccf68f76bb252ea5d53b6..c28804d6d9bef558cd493690b04ce531d0910482 100644 (file)
@@ -32,6 +32,7 @@ import org.sonar.core.persistence.MyBatis;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
+
 import java.text.Normalizer;
 import java.util.Date;
 import java.util.List;
@@ -244,6 +245,13 @@ public class PermissionTemplateDao implements TaskComponent, ServerComponent {
     }
   }
 
+  /**
+   * Remove a group from all templates (used when removing a group)
+   */
+  public void removeByGroup(Long groupId, SqlSession session) {
+      session.getMapper(PermissionTemplateMapper.class).deleteByGroupId(groupId);
+  }
+
   private String generateTemplateKee(String name, Date timeStamp) {
     if (PermissionTemplateDto.DEFAULT.getName().equals(name)) {
       return PermissionTemplateDto.DEFAULT.getKee();
index 63c2b7b9ff5567bcac67d503ce39447a7b150ea3..79e50415ffd5a85eb6a988c28c1045a60dc270c3 100644 (file)
@@ -48,4 +48,6 @@ public interface PermissionTemplateMapper {
   void insertGroupPermission(PermissionTemplateGroupDto permissionTemplateGroup);
 
   void deleteGroupPermission(PermissionTemplateGroupDto permissionTemplateGroup);
+
+  void deleteByGroupId(long groupId);
 }
index 7791fb0aa8998e5322d6bbc21b0ad0f8412eedfd..2ec027daa8908b68345da5b6be81c8965d71d314 100644 (file)
     </choose>
   </delete>
 
+  <delete id="deleteByGroupId" parameterType="long">
+    DELETE FROM perm_templates_groups
+    WHERE group_id = #{groupId}
+  </delete>
+
   <select id="selectUsers" parameterType="map" resultType="UserWithPermission">
     SELECT u.login as login, u.name as name, ptu.permission_reference as permission
     FROM users u
index 5a71651c35eaf53047fbc792f826e4c4288217c2..0bb6f825edd4c51cc73389d9fde352e9cb155a41 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.sonar.core.permission;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.sonar.api.utils.System2;
@@ -33,23 +34,28 @@ import java.util.Date;
 import java.util.List;
 
 import static org.fest.assertions.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.*;
 
 public class PermissionTemplateDaoTest extends AbstractDaoTestCase {
 
   Date now;
   PermissionTemplateDao permissionTemplateDao;
+  DbSession session;
   System2 system = mock(System2.class);
 
   @Before
   public void setUpDao() throws ParseException {
+    session = getMyBatis().openSession(false);
     now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2013-01-02 01:04:05");
     when(system.now()).thenReturn(now.getTime());
     permissionTemplateDao = new PermissionTemplateDao(getMyBatis(), system);
   }
 
+  @After
+  public void after() {
+    this.session.close();
+  }
+
   @Test
   public void should_create_permission_template() throws Exception {
     setupData("createPermissionTemplate");
@@ -206,6 +212,15 @@ public class PermissionTemplateDaoTest extends AbstractDaoTestCase {
     checkTable("removeGroupPermissionFromTemplate", "perm_templates_groups", "id", "template_id", "group_id", "permission_reference");
   }
 
+  @Test
+  public void remove_by_group() throws Exception {
+    setupData("remove_by_group");
+    permissionTemplateDao.removeByGroup(2L, session);
+    session.commit();
+
+    checkTable("remove_by_group", "perm_templates_groups", "id", "template_id", "group_id", "permission_reference");
+  }
+
   @Test
   public void should_add_group_permission_with_null_name() throws Exception {
     setupData("addNullGroupPermissionToTemplate");
diff --git a/sonar-core/src/test/resources/org/sonar/core/permission/PermissionTemplateDaoTest/remove_by_group-result.xml b/sonar-core/src/test/resources/org/sonar/core/permission/PermissionTemplateDaoTest/remove_by_group-result.xml
new file mode 100644 (file)
index 0000000..94ab2fd
--- /dev/null
@@ -0,0 +1,5 @@
+<dataset>
+  <permission_templates id="1" name="my template" kee="my_template_20130102_030405" description="my description"/>
+  <perm_templates_users/>
+  <perm_templates_groups id="1" template_id="1" group_id="1" permission_reference="remaining_permission_other_group"/>
+</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/permission/PermissionTemplateDaoTest/remove_by_group.xml b/sonar-core/src/test/resources/org/sonar/core/permission/PermissionTemplateDaoTest/remove_by_group.xml
new file mode 100644 (file)
index 0000000..2ff5815
--- /dev/null
@@ -0,0 +1,7 @@
+<dataset>
+  <permission_templates id="1" name="my template" kee="my_template_20130102_030405" description="my description"/>
+  <perm_templates_users/>
+  <perm_templates_groups id="1" template_id="1" group_id="1" permission_reference="remaining_permission_other_group"/>
+  <perm_templates_groups id="2" template_id="1" group_id="2" permission_reference="permission_to_remove"/>
+  <perm_templates_groups id="3" template_id="1" group_id="2" permission_reference="permission_to_remove2"/>
+</dataset>