[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