diff options
author | Aurelien Poscia <aurelien.poscia@sonarsource.com> | 2023-03-14 16:00:25 +0100 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2023-03-22 20:04:07 +0000 |
commit | 41d49880bc552d4bdaf1f2ea5c65c22f6d12d7b2 (patch) | |
tree | e89cf8d77f872185f6a78a5104b7fbd3328b7230 | |
parent | c2607c6af4c068c3bb4acbb5b6d200a3f4908a30 (diff) | |
download | sonarqube-41d49880bc552d4bdaf1f2ea5c65c22f6d12d7b2.tar.gz sonarqube-41d49880bc552d4bdaf1f2ea5c65c22f6d12d7b2.zip |
SONAR-18534 Support excludedAttributes=members for SCIM groups requests
4 files changed, 74 insertions, 10 deletions
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/scim/ScimUserDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/scim/ScimUserDaoIT.java index 701f99684ef..2fae3b3e518 100644 --- a/server/sonar-db-dao/src/it/java/org/sonar/db/scim/ScimUserDaoIT.java +++ b/server/sonar-db-dao/src/it/java/org/sonar/db/scim/ScimUserDaoIT.java @@ -22,11 +22,13 @@ package org.sonar.db.scim; import com.tngtech.java.junit.dataprovider.DataProvider; import com.tngtech.java.junit.dataprovider.DataProviderRunner; import com.tngtech.java.junit.dataprovider.UseDataProvider; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.junit.Rule; @@ -34,6 +36,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.sonar.db.DbSession; import org.sonar.db.DbTester; +import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserDto; import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric; @@ -199,6 +202,36 @@ public class ScimUserDaoIT { } @Test + public void findScimUsers_whenFilteringByGroupUuid_shouldReturnTheExpectedScimUsers() { + List<ScimUserTestData> scimUsersTestData = insertScimUsersWithUsers(List.of("userAInGroupA", "userBInGroupA", "userAInGroupB", "userNotInGroup")); + Map<String, ScimUserTestData> users = scimUsersTestData.stream() + .collect(Collectors.toMap(testData -> testData.getUserDto().getExternalId(), Function.identity())); + + GroupDto group1dto = createGroupWithUsers(users.get("userAInGroupA"), users.get("userBInGroupA")); + createGroupWithUsers(users.get("userAInGroupB")); + + ScimUserQuery query = ScimUserQuery.builder().groupUuid(group1dto.getUuid()).build(); + + List<ScimUserDto> scimUsers = scimUserDao.findScimUsers(dbSession, query, 0, 100); + + List<String> scimUsersUuids = toScimUsersUuids(scimUsers); + assertThat(scimUsersUuids).containsExactlyInAnyOrder( + users.get("userAInGroupA").getScimUserUuid(), + users.get("userBInGroupA").getScimUserUuid() + ); + } + + private GroupDto createGroupWithUsers(ScimUserTestData... testUsers) { + GroupDto group = db.users().insertGroup(); + + UserDto[] userDtos = Arrays.stream(testUsers) + .map(ScimUserTestData::getUserDto) + .toArray(UserDto[]::new); + db.users().insertMembers(group, userDtos); + return group; + } + + @Test public void findScimUsers_whenFilteringByScimUuidsWithLongRange_shouldReturnTheExpectedScimUsers() { generateScimUsers(3000); Set<String> expectedScimUserUuids = generateStrings(1, 2050); @@ -310,7 +343,9 @@ public class ScimUserDaoIT { private ScimUserTestData insertScimUserWithUser(String userLogin, String scimUuid) { UserDto userDto = db.users().insertUser(u -> u.setExternalId(userLogin)); - return insertScimUser(scimUuid, userDto.getUuid()); + ScimUserTestData scimUserTestData = insertScimUser(scimUuid, userDto.getUuid()); + scimUserTestData.setUserDto(userDto); + return scimUserTestData; } private ScimUserTestData insertScimUser(String scimUserUuid) { @@ -350,6 +385,7 @@ public class ScimUserDaoIT { private final String scimUserUuid; private final String userUuid; + private UserDto userDto; private ScimUserTestData(String scimUserUuid, String userUuid) { this.scimUserUuid = scimUserUuid; @@ -364,6 +400,14 @@ public class ScimUserDaoIT { return userUuid; } + private UserDto getUserDto() { + return userDto; + } + + private void setUserDto(UserDto userDto) { + this.userDto = userDto; + } + @Override public boolean equals(Object o) { if (this == o) diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/scim/ScimUserDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/scim/ScimUserDao.java index f428a625902..43827e664c2 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/scim/ScimUserDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/scim/ScimUserDao.java @@ -28,7 +28,7 @@ import org.sonar.core.util.UuidFactory; import org.sonar.db.Dao; import org.sonar.db.DbSession; -import static com.google.common.base.Preconditions.checkState; +import static org.sonar.api.utils.Preconditions.checkState; import static org.sonar.db.DatabaseUtils.executeLargeInputs; public class ScimUserDao implements Dao { diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/scim/ScimUserQuery.java b/server/sonar-db-dao/src/main/java/org/sonar/db/scim/ScimUserQuery.java index 99ba5e05211..62cac3ea5dd 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/scim/ScimUserQuery.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/scim/ScimUserQuery.java @@ -36,11 +36,14 @@ public class ScimUserQuery { private final String userName; private final Set<String> scimUserUuids; private final Set<String> userUuids; + private final String groupUuid; - private ScimUserQuery(@Nullable String userName, @Nullable Set<String> scimUserUuids, @Nullable Set<String> userUuids) { + private ScimUserQuery(@Nullable String userName, @Nullable Set<String> scimUserUuids, + @Nullable Set<String> userUuids, @Nullable String groupUuid) { this.userName = userName; this.scimUserUuids = scimUserUuids; this.userUuids = userUuids; + this.groupUuid = groupUuid; } @CheckForNull @@ -58,6 +61,11 @@ public class ScimUserQuery { return userUuids; } + @CheckForNull + public String getGroupUuid() { + return groupUuid; + } + public static ScimUserQuery empty() { return builder().build(); } @@ -89,6 +97,7 @@ public class ScimUserQuery { private String userName; private Set<String> scimUserUuids; private Set<String> userUuids; + private String groupUuid; private ScimUserQueryBuilder() { } @@ -109,8 +118,13 @@ public class ScimUserQuery { return this; } + public ScimUserQueryBuilder groupUuid(String groupUuid) { + this.groupUuid = groupUuid; + return this; + } + public ScimUserQuery build() { - return new ScimUserQuery(userName, scimUserUuids, userUuids); + return new ScimUserQuery(userName, scimUserUuids, userUuids, groupUuid); } } } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/scim/ScimUserMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/scim/ScimUserMapper.xml index a973a535c6b..44965cb925d 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/scim/ScimUserMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/scim/ScimUserMapper.xml @@ -4,20 +4,20 @@ <mapper namespace="org.sonar.db.scim.ScimUserMapper"> <sql id="scimUsersColumns"> - scim_uuid as scimUserUuid, - user_uuid as userUuid + s.scim_uuid as scimUserUuid, + s.user_uuid as userUuid </sql> <select id="findAll" resultType="org.sonar.db.scim.ScimUserDto"> select <include refid="scimUsersColumns"/> - from scim_users + from scim_users s </select> <select id="findByScimUuid" parameterType="String" resultType="org.sonar.db.scim.ScimUserDto"> select <include refid="scimUsersColumns"/> - from scim_users + from scim_users s where scim_uuid = #{scimUserUuid,jdbcType=VARCHAR} </select> @@ -25,7 +25,7 @@ <select id="selectByLogins" parameterType="string" resultType="User"> select <include refid="scimUsersColumns"/> - from scim_users + from scim_users s where scim_uuid in <foreach collection="list" open="(" close=")" item="login" separator=","> @@ -36,7 +36,7 @@ <select id="findByUserUuid" parameterType="String" resultType="org.sonar.db.scim.ScimUserDto"> select <include refid="scimUsersColumns"/> - from scim_users + from scim_users s where user_uuid = #{userUuid,jdbcType=VARCHAR} </select> @@ -66,6 +66,9 @@ <sql id="sqlSelectByQuery"> from scim_users s inner join users u on u.uuid=s.user_uuid + <if test="query.groupUuid != null"> + left join groups_users gu on gu.user_uuid = u.uuid + </if> where 1=1 <if test="query.userName != null"> and lower(u.external_id) like lower(#{query.userName,jdbcType=VARCHAR}) escape '/' @@ -82,6 +85,9 @@ #{userUuid, jdbcType=VARCHAR} </foreach> </if> + <if test="query.groupUuid != null"> + and gu.group_uuid = #{query.groupUuid, jdbcType=VARCHAR} + </if> </sql> <delete id="deleteByUserUuid" parameterType="String"> |