[java-shib-attribute] branch main updated: JSATTR-35 chase LDAP search references

Daniel Fisher dfisher at vt.edu
Thu Aug 29 03:27:17 UTC 2024


This is an automated email from the git hooks/post-receive script.

dfisher pushed a commit to branch main
in repository java-shib-attribute.

View the commit online:
http://git.shibboleth.net/view/?p=java-shib-attribute.git;a=commit;h=8ac06bc1cc81ed45180b41f23aaf708b64251fa4

The following commit(s) were added to refs/heads/main by this push:
     new 8ac06bc1c JSATTR-35 chase LDAP search references
8ac06bc1c is described below

commit 8ac06bc1cc81ed45180b41f23aaf708b64251fa4
Author: Daniel Fisher <dfisher at vt.edu>
AuthorDate: Wed Aug 28 21:30:42 2024 -0400

    JSATTR-35 chase LDAP search references
    
    Add FollowSearchReferenceHandler to LDAPDataConnectorParser.
    Add search reference unit tests.
    
    https://shibboleth.atlassian.net/browse/JSATTR-35
---
 .../AbstractExecutableSearchFilterBuilder.java     |  4 ++++
 .../dc/ldap/impl/LDAPDataConnectorTest.java        | 26 +++++++++++++++++-----
 .../impl/dc/ldap/ldapDataConnectorTest.ldif        | 16 +++++++++++++
 .../dc/ldap/impl/LDAPDataConnectorParser.java      |  4 +++-
 .../dc/ldap/impl/LDAPDataConnectorParserTest.java  |  4 ++++
 5 files changed, 47 insertions(+), 7 deletions(-)

diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/AbstractExecutableSearchFilterBuilder.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/AbstractExecutableSearchFilterBuilder.java
index dded12137..ee467c22c 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/AbstractExecutableSearchFilterBuilder.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/AbstractExecutableSearchFilterBuilder.java
@@ -28,6 +28,7 @@ import org.ldaptive.SearchResponse;
 import org.ldaptive.handler.SearchResultHandler;
 import org.ldaptive.referral.DefaultReferralConnectionFactory;
 import org.ldaptive.referral.FollowSearchReferralHandler;
+import org.ldaptive.referral.FollowSearchResultReferenceHandler;
 import org.slf4j.Logger;
 
 import net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder;
@@ -70,6 +71,9 @@ public abstract class AbstractExecutableSearchFilterBuilder extends AbstractInit
                             if (h instanceof FollowSearchReferralHandler) {
                                 return new FollowSearchReferralHandler(
                                     new DefaultReferralConnectionFactory(factory.getConnectionConfig()));
+                            } else if (h instanceof FollowSearchResultReferenceHandler) {
+                                return new FollowSearchResultReferenceHandler(
+                                    new DefaultReferralConnectionFactory(factory.getConnectionConfig()));
                             } else {
                                 return h;
                             }
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java
index d1540e010..63a5a9f90 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java
@@ -33,6 +33,7 @@ import org.ldaptive.SearchOperation;
 import org.ldaptive.SearchRequest;
 import org.ldaptive.handler.SearchResultHandler;
 import org.ldaptive.referral.FollowSearchReferralHandler;
+import org.ldaptive.referral.FollowSearchResultReferenceHandler;
 import org.springframework.core.io.ClassPathResource;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -105,6 +106,15 @@ public class LDAPDataConnectorTest {
             "objectClass: extensibleObject",
             "ou: referral",
             "ref: " + "ldap://localhost:" + directoryServer.getListenPort() + "/ou=people,dc=shibboleth,dc=net");
+
+        // add a referral entry to the server to produce search references.
+        directoryServer.add(
+            "dn: ou=reference,ou=people,dc=shibboleth,dc=net",
+            "objectClass: top",
+            "objectClass: referral",
+            "objectClass: extensibleObject",
+            "ou: referral",
+            "ref: " + "ldap://localhost:" + directoryServer.getListenPort() + "/ou=robots,dc=shibboleth,dc=net");
     }
 
     /**
@@ -394,7 +404,7 @@ public class LDAPDataConnectorTest {
         final LDAPDataConnector connector = createLdapDataConnector(
             builder,
             new StringAttributeValueMappingStrategy(),
-            new SearchResultHandler[] {new FollowSearchReferralHandler()},
+            new SearchResultHandler[] {new FollowSearchReferralHandler(), new FollowSearchResultReferenceHandler()},
             baseDN,
             TEST_RETURN_ATTRIBUTES);
         connector.initialize();
@@ -430,7 +440,7 @@ public class LDAPDataConnectorTest {
         final LDAPDataConnector connector = createLdapDataConnector(
             builder,
             new StringAttributeValueMappingStrategy(),
-            new SearchResultHandler[] {new FollowSearchReferralHandler()},
+            new SearchResultHandler[] {new FollowSearchReferralHandler(), new FollowSearchResultReferenceHandler()},
             baseDN,
             TEST_RETURN_ATTRIBUTES);
         connector.initialize();
@@ -444,22 +454,24 @@ public class LDAPDataConnectorTest {
         // check total attributes: uid, cn, sn, mail
         assertEquals(attrs.size(), 4);
         // check uid
-        assertEquals(attrs.get("uid").getValues().size(), 3);
+        assertEquals(attrs.get("uid").getValues().size(), 4);
         assertTrue(attrs.get("uid").getValues().contains(new StringAttributeValue(TestSources.PRINCIPAL_ID)));
         assertTrue(attrs.get("uid").getValues().contains(new StringAttributeValue("PAUL_THE_PRINCIPAL")));
         assertTrue(attrs.get("uid").getValues().contains(new StringAttributeValue("PHILIP_THE_PRINCIPAL")));
+        assertTrue(attrs.get("uid").getValues().contains(new StringAttributeValue("PRIME_THE_PRINCIPAL")));
         // check cn
-        assertEquals(attrs.get("cn").getValues().size(), 5);
+        assertEquals(attrs.get("cn").getValues().size(), 6);
         assertTrue(attrs.get("cn").getValues().contains(new StringAttributeValue("Peter Principal")));
         assertTrue(attrs.get("cn").getValues().contains(new StringAttributeValue("Peter J Principal")));
         assertTrue(attrs.get("cn").getValues().contains(new StringAttributeValue("pete principal")));
         assertTrue(attrs.get("cn").getValues().contains(new StringAttributeValue("Paul Principal")));
         assertTrue(attrs.get("cn").getValues().contains(new StringAttributeValue("Philip Principal")));
+        assertTrue(attrs.get("cn").getValues().contains(new StringAttributeValue("Prime Principal")));
         // check sn
-        assertEquals(attrs.get("sn").getValues().size(), 3);
+        assertEquals(attrs.get("sn").getValues().size(), 4);
         assertTrue(attrs.get("sn").getValues().contains(new StringAttributeValue("Principal")));
         // check mail
-        assertEquals(attrs.get("mail").getValues().size(), 8);
+        assertEquals(attrs.get("mail").getValues().size(), 10);
         assertTrue(attrs.get("mail").getValues().contains(new StringAttributeValue("peter.principal at shibboleth.net")));
         assertTrue(attrs.get("mail").getValues().contains(new StringAttributeValue("peterprincipal at shibboleth.net")));
         assertTrue(attrs.get("mail").getValues().contains(new StringAttributeValue("paul.principal at shibboleth.net")));
@@ -468,6 +480,8 @@ public class LDAPDataConnectorTest {
         assertTrue(attrs.get("mail").getValues().contains(new StringAttributeValue("\"\"")));
         assertTrue(attrs.get("mail").getValues().contains(new StringAttributeValue("  ")));
         assertTrue(attrs.get("mail").getValues().contains(new StringAttributeValue(" philip.principal at shibboleth.net ")));
+        assertTrue(attrs.get("mail").getValues().contains(new StringAttributeValue("prime.principal at shibboleth.net")));
+        assertTrue(attrs.get("mail").getValues().contains(new StringAttributeValue("primeprincipal at shibboleth.net")));
     }
 
     @Test(expectedExceptions = ResolutionException.class) public void resolveNoResultIsError()
diff --git a/shib-attribute-resolver-impl/src/test/resources/net/shibboleth/idp/attribute/resolver/impl/dc/ldap/ldapDataConnectorTest.ldif b/shib-attribute-resolver-impl/src/test/resources/net/shibboleth/idp/attribute/resolver/impl/dc/ldap/ldapDataConnectorTest.ldif
index 73683a9d4..26daf243b 100644
--- a/shib-attribute-resolver-impl/src/test/resources/net/shibboleth/idp/attribute/resolver/impl/dc/ldap/ldapDataConnectorTest.ldif
+++ b/shib-attribute-resolver-impl/src/test/resources/net/shibboleth/idp/attribute/resolver/impl/dc/ldap/ldapDataConnectorTest.ldif
@@ -9,6 +9,11 @@ ou: people
 description: All people in organization
 objectclass: organizationalunit
 
+dn: ou=robots,dc=shibboleth,dc=net
+ou: robots
+description: All robots in organization
+objectclass: organizationalunit
+
 dn: cn=Peter Principal,ou=people,dc=shibboleth,dc=net
 objectclass: inetOrgPerson
 cn: Peter Principal
@@ -47,6 +52,17 @@ mail:: ICA=
 # philip.principal at shibboleth.net with leading and trailing space
 mail:: IHBoaWxpcC5wcmluY2lwYWxAc2hpYmJvbGV0aC5uZXQg
 
+dn: cn=Prime Principal,ou=robots,dc=shibboleth,dc=net
+objectclass: inetOrgPerson
+cn: Prime Principal
+sn: Principal
+uid: PRIME_THE_PRINCIPAL
+userpassword: changeit
+homephone: 555-111-4444
+mail: prime.principal at shibboleth.net
+mail: primeprincipal at shibboleth.net
+description: test principal
+
 dn: cn=Collision 1,ou=people,dc=shibboleth,dc=net
 objectclass: inetOrgPerson
 cn: Collision Principal
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
index 01e23d7c6..60e7f45aa 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
@@ -45,6 +45,7 @@ import org.ldaptive.handler.LdapEntryHandler;
 import org.ldaptive.handler.SearchResultHandler;
 import org.ldaptive.pool.IdlePruneStrategy;
 import org.ldaptive.referral.FollowSearchReferralHandler;
+import org.ldaptive.referral.FollowSearchResultReferenceHandler;
 import org.ldaptive.sasl.Mechanism;
 import org.ldaptive.sasl.SaslConfig;
 import org.ldaptive.ssl.AllowAnyHostnameVerifier;
@@ -912,7 +913,8 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
         @Nullable public static List<SearchResultHandler> buildReferralHandlers(
                 @Nullable final String followReferrals) {
             if (followReferrals != null && Boolean.valueOf(followReferrals)) {
-                return CollectionSupport.singletonList(new FollowSearchReferralHandler());
+                return CollectionSupport.listOf(
+                    new FollowSearchReferralHandler(), new FollowSearchResultReferenceHandler());
             }
             return null;
         }
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParserTest.java
index d2b52b285..2c47949aa 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParserTest.java
@@ -40,6 +40,7 @@ import org.ldaptive.SearchOperation;
 import org.ldaptive.filter.EqualityFilter;
 import org.ldaptive.pool.IdlePruneStrategy;
 import org.ldaptive.referral.FollowSearchReferralHandler;
+import org.ldaptive.referral.FollowSearchResultReferenceHandler;
 import org.ldaptive.sasl.DefaultSaslClientRequest;
 import org.ldaptive.sasl.Mechanism;
 import org.ldaptive.sasl.QualityOfProtection;
@@ -389,8 +390,11 @@ public class LDAPDataConnectorParserTest {
         assertEquals(searchOperation.getRequest().getBaseDn(), "");
         assertNull(searchOperation.getRequest().getFilter());
         assertEquals(searchOperation.getRequest().getTimeLimit(), Duration.ofSeconds(3));
+        assertEquals(searchOperation.getSearchResultHandlers().length, 2);
         final FollowSearchReferralHandler referralHandler = (FollowSearchReferralHandler) searchOperation.getSearchResultHandlers()[0];
         assertNotNull(referralHandler);
+        final FollowSearchResultReferenceHandler referenceHandler = (FollowSearchResultReferenceHandler) searchOperation.getSearchResultHandlers()[1];
+        assertNotNull(referenceHandler);
     }
 
     @Test public void v2SaslExternalConfig() throws Exception {

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list