From 0e52cad9c679bda4ba5bd2a1487d441a732d2d7b Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Mon, 11 Aug 2014 11:50:20 +0200 Subject: [PATCH] SONAR-5175 When deleting a group, rows related to this group in perm_templates_groups table should be deleted --- .../InternalPermissionTemplateService.java | 26 ++++++++++++++++++- ...InternalPermissionTemplateServiceTest.java | 20 +++++++++++++- .../app/controllers/groups_controller.rb | 7 +++-- .../permission/PermissionTemplateDao.java | 8 ++++++ .../permission/PermissionTemplateMapper.java | 2 ++ .../permission/PermissionTemplateMapper.xml | 5 ++++ .../permission/PermissionTemplateDaoTest.java | 21 ++++++++++++--- .../remove_by_group-result.xml | 5 ++++ .../remove_by_group.xml | 7 +++++ 9 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 sonar-core/src/test/resources/org/sonar/core/permission/PermissionTemplateDaoTest/remove_by_group-result.xml create mode 100644 sonar-core/src/test/resources/org/sonar/core/permission/PermissionTemplateDaoTest/remove_by_group.xml diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionTemplateService.java b/server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionTemplateService.java index b6e2538ae0c..97b1798ada7 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionTemplateService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionTemplateService.java @@ -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"; diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionTemplateServiceTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionTemplateServiceTest.java index 276f056b089..c50acc61604 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionTemplateServiceTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionTemplateServiceTest.java @@ -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); } diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/groups_controller.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/groups_controller.rb index 4322e4876f0..51a6a8063ba 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/groups_controller.rb +++ b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/groups_controller.rb @@ -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 diff --git a/sonar-core/src/main/java/org/sonar/core/permission/PermissionTemplateDao.java b/sonar-core/src/main/java/org/sonar/core/permission/PermissionTemplateDao.java index 9ec979bc283..c28804d6d9b 100644 --- a/sonar-core/src/main/java/org/sonar/core/permission/PermissionTemplateDao.java +++ b/sonar-core/src/main/java/org/sonar/core/permission/PermissionTemplateDao.java @@ -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(); diff --git a/sonar-core/src/main/java/org/sonar/core/permission/PermissionTemplateMapper.java b/sonar-core/src/main/java/org/sonar/core/permission/PermissionTemplateMapper.java index 63c2b7b9ff5..79e50415ffd 100644 --- a/sonar-core/src/main/java/org/sonar/core/permission/PermissionTemplateMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/permission/PermissionTemplateMapper.java @@ -48,4 +48,6 @@ public interface PermissionTemplateMapper { void insertGroupPermission(PermissionTemplateGroupDto permissionTemplateGroup); void deleteGroupPermission(PermissionTemplateGroupDto permissionTemplateGroup); + + void deleteByGroupId(long groupId); } diff --git a/sonar-core/src/main/resources/org/sonar/core/permission/PermissionTemplateMapper.xml b/sonar-core/src/main/resources/org/sonar/core/permission/PermissionTemplateMapper.xml index 7791fb0aa89..2ec027daa89 100644 --- a/sonar-core/src/main/resources/org/sonar/core/permission/PermissionTemplateMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/permission/PermissionTemplateMapper.xml @@ -61,6 +61,11 @@ + + DELETE FROM perm_templates_groups + WHERE group_id = #{groupId} + +