From 1f6fa0501caf42ae275cd997a8f47bcdebaba767 Mon Sep 17 00:00:00 2001 From: "sui.jieqiang" Date: Thu, 23 Jun 2022 12:07:22 +0800 Subject: [PATCH] Fix search user groups without limit Closes #12649 --- .../admin/client/resource/UserResource.java | 7 +++- .../resources/admin/UserResource.java | 6 +-- .../keycloak/testsuite/admin/UserTest.java | 37 +++++++++++++++++++ 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UserResource.java b/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UserResource.java index ab1ddd4a5aa..15cb0bed6b5 100755 --- a/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UserResource.java +++ b/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UserResource.java @@ -74,7 +74,12 @@ public interface UserResource { List groups(@QueryParam("first") Integer firstResult, @QueryParam("max") Integer maxResults, @QueryParam("briefRepresentation") @DefaultValue("true") boolean briefRepresentation); - + + @Path("groups") + @GET + List groups(@QueryParam("search") String search, + @QueryParam("briefRepresentation") @DefaultValue("true") boolean briefRepresentation); + @Path("groups") @GET List groups(@QueryParam("search") String search, diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UserResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UserResource.java index 4b4ad8b8ef9..6e0ba707843 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/UserResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/UserResource.java @@ -885,12 +885,10 @@ public class UserResource { @QueryParam("briefRepresentation") @DefaultValue("true") boolean briefRepresentation) { auth.users().requireView(user); - if (Objects.nonNull(search) && Objects.nonNull(firstResult) && Objects.nonNull(maxResults)) { + if (Objects.nonNull(search)) { return ModelToRepresentation.searchForGroupByName(user, !briefRepresentation, search.trim(), firstResult, maxResults); - } else if(Objects.nonNull(firstResult) && Objects.nonNull(maxResults)) { - return ModelToRepresentation.toGroupHierarchy(user, !briefRepresentation, firstResult, maxResults); } else { - return ModelToRepresentation.toGroupHierarchy(user, !briefRepresentation); + return ModelToRepresentation.toGroupHierarchy(user, !briefRepresentation, firstResult, maxResults); } } diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserTest.java index 34ed550f6f8..fcdb24799ab 100755 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserTest.java @@ -105,6 +105,7 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; import java.util.stream.Collectors; import static org.hamcrest.MatcherAssert.assertThat; @@ -2917,6 +2918,42 @@ public class UserTest extends AbstractAdminTest { } } + @Test + public void testGetSearchedGroupsForUserFullRepresentation() { + RealmResource realm = adminClient.realms().realm("test"); + + String userName = "averagejoe"; + String groupName1 = "group1WithAttribute"; + String groupName2 = "group2WithAttribute"; + Map> attributes1 = new HashMap>(); + attributes1.put("attribute1", Arrays.asList("attribute1")); + Map> attributes2 = new HashMap>(); + attributes2.put("attribute2", Arrays.asList("attribute2")); + + UserRepresentation userRepresentation = UserBuilder + .edit(createUserRepresentation(userName, "joe@average.com", "average", "joe", true)) + .addPassword("password") + .build(); + + try (Creator u = Creator.create(realm, userRepresentation); + Creator g1 = Creator.create(realm, GroupBuilder.create().name(groupName1).attributes(attributes1).build()); + Creator g2 = Creator.create(realm, GroupBuilder.create().name(groupName2).attributes(attributes2).build())) { + + String group1Id = g1.id(); + String group2Id = g2.id(); + UserResource user = u.resource(); + user.joinGroup(group1Id); + user.joinGroup(group2Id); + + List userGroups = user.groups("group2", false); + assertFalse(userGroups.isEmpty()); + assertTrue(userGroups.stream().collect(Collectors.toMap(GroupRepresentation::getName, Function.identity())).get(groupName2).getAttributes().containsKey("attribute2")); + + userGroups = user.groups("group3", false); + assertTrue(userGroups.isEmpty()); + } + } + @Test public void groupMembershipPaginated() { String userId = createUser(UserBuilder.create().username("user-a").build());