]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-18525 delete group, even if some local users are left inside
authorAurelien <100427063+aurelien-poscia-sonarsource@users.noreply.github.com>
Mon, 6 Mar 2023 13:11:19 +0000 (14:11 +0100)
committersonartech <sonartech@sonarsource.com>
Wed, 22 Mar 2023 20:04:06 +0000 (20:04 +0000)
SONAR-18525 delete group, even if some local users are left inside

server/sonar-db-dao/src/it/java/org/sonar/db/user/UserGroupDaoIT.java
server/sonar-db-dao/src/main/java/org/sonar/db/user/UserGroupDao.java
server/sonar-db-dao/src/main/java/org/sonar/db/user/UserGroupMapper.java
server/sonar-db-dao/src/main/resources/org/sonar/db/user/UserGroupMapper.xml
server/sonar-webserver-webapi/src/main/java/org/sonar/server/usergroups/ws/GroupService.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/usergroups/ws/GroupServiceTest.java

index dcca13431143b5ec1d4668489ef07cf7fbeac872..79e5f6b45e8cfd9f08182b7f631f41dcb1df04e4 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.db.user;
 
-import java.util.List;
 import java.util.Set;
 import org.junit.Rule;
 import org.junit.Test;
@@ -119,46 +118,4 @@ public class UserGroupDaoIT {
     assertThat(dbTester.getDbClient().groupMembershipDao().selectGroupUuidsByUserUuid(dbTester.getSession(), user2.getUuid())).containsOnly(group1.getUuid(), group2.getUuid());
   }
 
-  @Test
-  public void deleteFromGroupByUserUuids_shouldOnlyRemoveSpecificUsersFromOneGroup() {
-    GroupDto group1 = dbTester.users().insertGroup();
-    GroupDto group2 = dbTester.users().insertGroup();
-
-    UserDto user1 = dbTester.users().insertUser();
-    UserDto user2 = dbTester.users().insertUser();
-    UserDto user3 = dbTester.users().insertUser();
-
-    dbTester.users().insertMembers(group1, user1, user2, user3);
-    dbTester.users().insertMembers(group2, user1, user2, user3);
-
-    underTest.deleteFromGroupByUserUuids(dbSession, group1, Set.of(user1, user2));
-
-    assertThat(dbTester.getDbClient().groupMembershipDao().selectGroupUuidsByUserUuid(dbTester.getSession(), user1.getUuid())).containsOnly(group2.getUuid());
-    assertThat(dbTester.getDbClient().groupMembershipDao().selectGroupUuidsByUserUuid(dbTester.getSession(), user2.getUuid())).containsOnly(group2.getUuid());
-    assertThat(dbTester.getDbClient().groupMembershipDao().selectGroupUuidsByUserUuid(dbTester.getSession(), user3.getUuid())).containsAll(List.of(group1.getUuid(), group2.getUuid()));
-  }
-
-  @Test
-  public void selectAllScimUsersByGroupUuid_shouldOnlySelectScimUsersFromOneSpecificGroup() {
-    GroupDto scimGroup = dbTester.users().insertGroup();
-    dbTester.users().insertScimGroup(scimGroup);
-    GroupDto nonScimGroup = dbTester.users().insertGroup();
-
-    UserDto scimUser1 = dbTester.users().insertUser();
-    dbTester.users().insertScimUser(scimUser1);
-    UserDto scimUser2 = dbTester.users().insertUser();
-    dbTester.users().insertScimUser(scimUser2);
-    UserDto scimUser3 = dbTester.users().insertUser();
-    dbTester.users().insertScimUser(scimUser3);
-    UserDto nonScimUser = dbTester.users().insertUser();
-
-    dbTester.users().insertMembers(scimGroup, scimUser1, scimUser2, nonScimUser);
-    dbTester.users().insertMembers(nonScimGroup, scimUser3, nonScimUser);
-
-    Set<UserDto> scimUserDtos = underTest.selectScimMembersByGroupUuid(dbSession, scimGroup);
-    assertThat(scimUserDtos.stream().map(UserDto::getUuid).toList()).containsOnly(scimUser1.getUuid(), scimUser2.getUuid());
-
-    Set<UserDto> nonScimUserDtos = underTest.selectScimMembersByGroupUuid(dbSession, nonScimGroup);
-    assertThat(nonScimUserDtos.stream().map(UserDto::getUuid).toList()).containsOnly(scimUser3.getUuid());
-  }
 }
index 520a695c310afc1497fb9c4bf3066f8ce398bf1b..68ca217b4ea0491604f8900789f06912c6c244fd 100644 (file)
@@ -66,20 +66,6 @@ public class UserGroupDao implements Dao {
     }
   }
 
-  public void deleteFromGroupByUserUuids(DbSession dbSession, GroupDto groupDto, Set<UserDto> userDtos) {
-    int deletedRows = mapper(dbSession).deleteFromGroupByUserUuids(groupDto.getUuid(), userDtos.stream()
-      .map(UserDto::getUuid)
-      .toList());
-
-    if (deletedRows > 0) {
-      userDtos.forEach(userDto -> auditPersister.deleteUserFromGroup(dbSession, new UserGroupNewValue(userDto)));
-    }
-  }
-
-  public Set<UserDto> selectScimMembersByGroupUuid(DbSession dbSession, GroupDto groupDto) {
-    return mapper(dbSession).selectScimMembersByGroupUuid(groupDto.getUuid());
-  }
-
   private static UserGroupMapper mapper(DbSession session) {
     return session.getMapper(UserGroupMapper.class);
   }
index 190db7fa5cbd5ccdf01718888f9f732c299a2e54..ed89e480477c56ba26f310f636a2277237631104 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.db.user;
 
-import java.util.List;
 import java.util.Set;
 import org.apache.ibatis.annotations.Param;
 
@@ -35,7 +34,4 @@ public interface UserGroupMapper {
 
   int deleteByUserUuid(@Param("userUuid") String userUuid);
 
-  int deleteFromGroupByUserUuids(@Param("groupUuid") String groupUuid, @Param("userUuids") List<String> userUuids);
-
-  Set<UserDto> selectScimMembersByGroupUuid(@Param("groupUuid") String groupUuid);
 }
index 30a0c99e3146abd554eb7c3b30722c1d06c428c8..8151f29ea8360bfc6841d501b0fec5bfcb787809 100644 (file)
@@ -3,29 +3,6 @@
 
 <mapper namespace="org.sonar.db.user.UserGroupMapper">
 
-    <sql id="userColumns">
-      u.uuid as uuid,
-      u.login as login,
-      u.name as name,
-      u.email as email,
-      u.active as "active",
-      u.scm_accounts as "scmAccounts",
-      u.salt as "salt",
-      u.crypted_password as "cryptedPassword",
-      u.hash_method as "hashMethod",
-      u.external_id as "externalId",
-      u.external_login as "externalLogin",
-      u.external_identity_provider as "externalIdentityProvider",
-      u.user_local as "local",
-      u.reset_password as "resetPassword",
-      u.homepage_type as "homepageType",
-      u.homepage_parameter as "homepageParameter",
-      u.last_connection_date as "lastConnectionDate",
-      u.last_sonarlint_connection as "lastSonarlintConnectionDate",
-      u.created_at as "createdAt",
-      u.updated_at as "updatedAt"
-    </sql>
-
   <insert id="insert" parameterType="UserGroup" useGeneratedKeys="false">
     insert into groups_users (
     user_uuid,
     where gu.group_uuid=#{groupUuid,jdbcType=VARCHAR}
   </select>
 
-  <select id="selectScimMembersByGroupUuid" parameterType="string" resultType="User">
-    select
-    <include refid="userColumns"/>
-    from users u
-    inner join scim_users su on su.user_uuid = u.uuid
-    inner join groups_users gu on gu.user_uuid = u.uuid
-    where gu.group_uuid = #{groupUuid,jdbcType=VARCHAR}
-  </select>
-
   <delete id="delete" parameterType="map">
     delete from groups_users
     where user_uuid = #{userUuid,jdbcType=VARCHAR} and
     DELETE FROM groups_users WHERE user_uuid=#{userUuid,jdbcType=VARCHAR}
   </delete>
 
-  <delete id="deleteFromGroupByUserUuids" parameterType="string">
-    delete
-    from
-      groups_users
-    where
-      group_uuid = #{groupUuid, jdbcType=VARCHAR}
-    and user_uuid in
-    <foreach collection="userUuids" open="(" close=")" item="uuid" separator=",">
-      #{uuid, jdbcType=VARCHAR}
-    </foreach>
-  </delete>
 </mapper>
index d1369a2029110e9cfdc22ffb1c5f6b6dd99402eb..2f72646455944daf69f29766a8f2c8fe9362b0f1 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.server.usergroups.ws;
 
-import java.util.Set;
 import javax.annotation.Nullable;
 import org.sonar.api.security.DefaultGroups;
 import org.sonar.api.server.ServerSide;
@@ -29,7 +28,6 @@ import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.permission.GlobalPermission;
 import org.sonar.db.user.GroupDto;
-import org.sonar.db.user.UserDto;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.NotFoundException;
 
@@ -168,8 +166,4 @@ public class GroupService {
     dbClient.groupDao().deleteByUuid(dbSession, group.getUuid(), group.getName());
   }
 
-  public void deleteScimMembersByGroup(DbSession dbSession, GroupDto groupDto) {
-    Set<UserDto> scimUsers = dbClient.userGroupDao().selectScimMembersByGroupUuid(dbSession, groupDto);
-    dbClient.userGroupDao().deleteFromGroupByUserUuids(dbSession, groupDto, scimUsers);
-  }
 }
index 0efaf7178adbc75c4c8a27dc8c77d20d38b0042c..f35b424a6979ffd7d0725bd5eaed336722d0f1ba 100644 (file)
@@ -23,7 +23,6 @@ import com.tngtech.java.junit.dataprovider.DataProvider;
 import com.tngtech.java.junit.dataprovider.DataProviderRunner;
 import com.tngtech.java.junit.dataprovider.UseDataProvider;
 import java.util.Optional;
-import java.util.Set;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -46,7 +45,6 @@ import org.sonar.db.scim.ScimGroupDao;
 import org.sonar.db.user.GroupDao;
 import org.sonar.db.user.GroupDto;
 import org.sonar.db.user.RoleDao;
-import org.sonar.db.user.UserDto;
 import org.sonar.db.user.UserGroupDao;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.NotFoundException;
@@ -87,6 +85,17 @@ public class GroupServiceTest {
     mockNeededDaos();
   }
 
+  private void mockNeededDaos() {
+    when(dbClient.authorizationDao()).thenReturn(mock(AuthorizationDao.class));
+    when(dbClient.roleDao()).thenReturn(mock(RoleDao.class));
+    when(dbClient.permissionTemplateDao()).thenReturn(mock(PermissionTemplateDao.class));
+    when(dbClient.userGroupDao()).thenReturn(mock(UserGroupDao.class));
+    when(dbClient.qProfileEditGroupsDao()).thenReturn(mock(QProfileEditGroupsDao.class));
+    when(dbClient.qualityGateGroupPermissionsDao()).thenReturn(mock(QualityGateGroupPermissionsDao.class));
+    when(dbClient.scimGroupDao()).thenReturn(mock(ScimGroupDao.class));
+    when(dbClient.groupDao()).thenReturn(mock(GroupDao.class));
+  }
+
   @Test
   public void findGroupDtoOrThrow_whenGroupExists_returnsIt() {
     GroupDto groupDto = mockGroupDto();
@@ -152,19 +161,6 @@ public class GroupServiceTest {
     verifyNoGroupDelete(dbSession, groupDto);
   }
 
-  @Test
-  public void deleteAllScimUsersByGroup_() {
-    GroupDto groupDto = mockGroupDto();
-    Set<UserDto> userDtos = Set.of(new UserDto(), new UserDto());
-
-    when(dbClient.userGroupDao().selectScimMembersByGroupUuid(dbSession, groupDto))
-      .thenReturn(userDtos);
-
-    groupService.deleteScimMembersByGroup(dbSession, groupDto);
-
-    verify(dbClient.userGroupDao()).deleteFromGroupByUserUuids(dbSession, groupDto, userDtos);
-  }
-
   @Test
   public void updateGroup_updatesGroupNameAndDescription() {
     GroupDto group = mockGroupDto();
@@ -303,17 +299,6 @@ public class GroupServiceTest {
     };
   }
 
-  private void mockNeededDaos() {
-    when(dbClient.authorizationDao()).thenReturn(mock(AuthorizationDao.class));
-    when(dbClient.roleDao()).thenReturn(mock(RoleDao.class));
-    when(dbClient.permissionTemplateDao()).thenReturn(mock(PermissionTemplateDao.class));
-    when(dbClient.userGroupDao()).thenReturn(mock(UserGroupDao.class));
-    when(dbClient.qProfileEditGroupsDao()).thenReturn(mock(QProfileEditGroupsDao.class));
-    when(dbClient.qualityGateGroupPermissionsDao()).thenReturn(mock(QualityGateGroupPermissionsDao.class));
-    when(dbClient.scimGroupDao()).thenReturn(mock(ScimGroupDao.class));
-    when(dbClient.groupDao()).thenReturn(mock(GroupDao.class));
-  }
-
   private static GroupDto mockGroupDto() {
     GroupDto groupDto = mock(GroupDto.class);
     when(groupDto.getName()).thenReturn(GROUP_NAME);