*/
package org.sonar.db.user;
-import java.util.List;
import java.util.Set;
import org.junit.Rule;
import org.junit.Test;
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());
- }
}
}
}
- 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);
}
*/
package org.sonar.db.user;
-import java.util.List;
import java.util.Set;
import org.apache.ibatis.annotations.Param;
int deleteByUserUuid(@Param("userUuid") String userUuid);
- int deleteFromGroupByUserUuids(@Param("groupUuid") String groupUuid, @Param("userUuids") List<String> userUuids);
-
- Set<UserDto> selectScimMembersByGroupUuid(@Param("groupUuid") String groupUuid);
}
<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>
*/
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;
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;
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);
- }
}
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;
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;
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();
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();
};
}
- 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);