Author: stillalex Date: Wed Mar 27 15:03:57 2019 New Revision: 1856414 URL: http://svn.apache.org/viewvc?rev=1856414&view=rev Log: OAK-8175 ExternalGroupPrincipalProvider support for full text search
Modified: jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProviderTest.java Modified: jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java?rev=1856414&r1=1856413&r2=1856414&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java (original) +++ jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java Wed Mar 27 15:03:57 2019 @@ -20,12 +20,18 @@ import java.security.Principal; import java.text.ParseException; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.Enumeration; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.Spliterator; +import java.util.Spliterators; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Value; @@ -173,6 +179,27 @@ class ExternalGroupPrincipalProvider imp return findPrincipals(null, searchType); } + @NotNull + @Override + public Iterator<? extends Principal> findPrincipals(@Nullable String nameHint, boolean fullText, int searchType, + long offset, long limit) { + Iterator<? extends Principal> principals = findPrincipals(nameHint, searchType); + if (!principals.hasNext()) { + return Collections.emptyIterator(); + } + + Spliterator<? extends Principal> spliterator = Spliterators.spliteratorUnknownSize(principals, 0); + Stream<? extends Principal> stream = StreamSupport.stream(spliterator, false); + stream = stream.sorted(Comparator.comparing(Principal::getName)); + if (offset > 0) { + stream = stream.skip(offset); + } + if (limit >= 0) { + stream = stream.limit(limit); + } + return stream.iterator(); + } + //------------------------------------------------------------< private >--- @Nullable private String getIdpName(@NotNull Tree userTree) { Modified: jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProviderTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProviderTest.java?rev=1856414&r1=1856413&r2=1856414&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProviderTest.java (original) +++ jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProviderTest.java Wed Mar 27 15:03:57 2019 @@ -17,11 +17,16 @@ package org.apache.jackrabbit.oak.spi.security.authentication.external.impl.principal; import java.security.Principal; +import java.util.Arrays; import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Set; import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; @@ -32,6 +37,7 @@ import org.apache.jackrabbit.api.securit import org.apache.jackrabbit.api.security.user.User; import org.apache.jackrabbit.api.security.user.UserManager; import org.apache.jackrabbit.oak.api.Root; +import org.apache.jackrabbit.oak.namepath.NamePathMapper; import org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalGroup; import org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentity; import org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityException; @@ -40,6 +46,7 @@ import org.apache.jackrabbit.oak.spi.sec import org.apache.jackrabbit.oak.spi.security.authentication.external.TestIdentityProvider; import org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DynamicSyncContext; import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl; +import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.junit.Test; @@ -310,24 +317,37 @@ public class ExternalGroupPrincipalProvi @Test public void testFindPrincipalsByHintTypeNotGroup() { - Iterator<? extends Principal> iter = principalProvider.findPrincipals("a", PrincipalManager.SEARCH_TYPE_NOT_GROUP); + Iterator<? extends Principal> iter = principalProvider.findPrincipals("a", + PrincipalManager.SEARCH_TYPE_NOT_GROUP); assertSame(Collections.emptyIterator(), iter); + + Iterator<? extends Principal> iter2 = principalProvider.findPrincipals("a", false, + PrincipalManager.SEARCH_TYPE_NOT_GROUP, 0, -1); + assertSame(Collections.emptyIterator(), iter2); } @Test public void testFindPrincipalsByHintTypeGroup() { Set<? extends Principal> expected = ImmutableSet.of(new PrincipalImpl("a")); - Set<? extends Principal> res = ImmutableSet.copyOf(principalProvider.findPrincipals("a", PrincipalManager.SEARCH_TYPE_GROUP)); - + Set<? extends Principal> res = ImmutableSet + .copyOf(principalProvider.findPrincipals("a", PrincipalManager.SEARCH_TYPE_GROUP)); assertEquals(expected, res); + + Set<? extends Principal> res2 = ImmutableSet + .copyOf(principalProvider.findPrincipals("a", false, PrincipalManager.SEARCH_TYPE_GROUP, 0, -1)); + assertEquals(expected, res2); } @Test public void testFindPrincipalsByHintTypeAll() { Set<? extends Principal> expected = ImmutableSet.of(new PrincipalImpl("a")); - Set<? extends Principal> res = ImmutableSet.copyOf(principalProvider.findPrincipals("a", PrincipalManager.SEARCH_TYPE_ALL)); - + Set<? extends Principal> res = ImmutableSet + .copyOf(principalProvider.findPrincipals("a", PrincipalManager.SEARCH_TYPE_ALL)); assertEquals(expected, res); + + Set<? extends Principal> res2 = ImmutableSet + .copyOf(principalProvider.findPrincipals("a", false, PrincipalManager.SEARCH_TYPE_ALL, 0, -1)); + assertEquals(expected, res2); } @Test @@ -335,11 +355,13 @@ public class ExternalGroupPrincipalProvi ExternalUser externalUser = idp.getUser(TestIdentityProvider.ID_WILDCARD_USER); sync(externalUser); - Set<? extends Principal> expected = ImmutableSet.of( - new PrincipalImpl("_gr_u_")); - Set<? extends Principal> res = ImmutableSet.copyOf(principalProvider.findPrincipals("_", PrincipalManager.SEARCH_TYPE_ALL)); - + Set<? extends Principal> expected = ImmutableSet.of(new PrincipalImpl("_gr_u_")); + Set<? extends Principal> res = ImmutableSet + .copyOf(principalProvider.findPrincipals("_", PrincipalManager.SEARCH_TYPE_ALL)); assertEquals(expected, res); + Set<? extends Principal> res2 = ImmutableSet + .copyOf(principalProvider.findPrincipals("_", false, PrincipalManager.SEARCH_TYPE_ALL, 0, -1)); + assertEquals(expected, res2); } @Test @@ -350,9 +372,11 @@ public class ExternalGroupPrincipalProvi Set<? extends Principal> expected = ImmutableSet.of( new PrincipalImpl("g%r%")); Set<? extends Principal> res = ImmutableSet.copyOf(principalProvider.findPrincipals("%", PrincipalManager.SEARCH_TYPE_ALL)); - assertEquals(expected, res); - } + Set<? extends Principal> res2 = ImmutableSet + .copyOf(principalProvider.findPrincipals("%", false, PrincipalManager.SEARCH_TYPE_ALL, 0, -1)); + assertEquals(expected, res2); +} @Test public void testFindPrincipalsByTypeNotGroup() { @@ -364,6 +388,9 @@ public class ExternalGroupPrincipalProvi public void testFindPrincipalsByTypeGroup() throws Exception { Set<? extends Principal> res = ImmutableSet.copyOf(principalProvider.findPrincipals(PrincipalManager.SEARCH_TYPE_GROUP)); assertEquals(getExpectedGroupPrincipals(USER_ID), res); + + Set<? extends Principal> res2 = ImmutableSet.copyOf(principalProvider.findPrincipals(null, false, PrincipalManager.SEARCH_TYPE_GROUP, 0, -1)); + assertEquals(getExpectedGroupPrincipals(USER_ID), res2); } @Test @@ -387,8 +414,27 @@ public class ExternalGroupPrincipalProvi Iterator<? extends Principal> res = principalProvider.findPrincipals("a", PrincipalManager.SEARCH_TYPE_ALL); assertTrue(res.hasNext()); - assertEquals(expected, ImmutableSet.copyOf(res)); + Iterator<? extends Principal> res2 = principalProvider.findPrincipals("a", false, + PrincipalManager.SEARCH_TYPE_ALL, 0, -1); + assertTrue(res2.hasNext()); + assertEquals(expected, ImmutableSet.copyOf(res2)); + } + + @Test + public void testFindPrincipalsSorted() throws Exception { + List<Principal> in = Arrays.asList(new PrincipalImpl("p3"), new PrincipalImpl("p1"), new PrincipalImpl("p2")); + ExternalGroupPrincipalProvider p = new ExternalGroupPrincipalProvider(root, + getSecurityProvider().getConfiguration(UserConfiguration.class), NamePathMapper.DEFAULT, + ImmutableMap.of(idp.getName(), new String[0])) { + @Override + public Iterator<? extends Principal> findPrincipals(@Nullable String nameHint, int searchType) { + return in.iterator(); + } + }; + List<Principal> out = ImmutableList.copyOf(p.findPrincipals(null, false, PrincipalManager.SEARCH_TYPE_ALL, 0, -1)); + Collections.sort(in, Comparator.comparing(Principal::getName)); + assertEquals(in, out); } private static final class TestUser extends TestIdentityProvider.TestIdentity implements ExternalUser {