[java-shib-attribute] 01/02: JSATTR-6: SAML AttributeQuery DataConnector

Codeberg noreply at shibboleth.net
Fri Jan 16 01:01:21 UTC 2026


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

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

View the commit online:
https://codeberg.org/Shibboleth/java-shib-attribute/commit/499bb60a17e5142726b1794af6572c6b503b09d0

commit 499bb60a17e5142726b1794af6572c6b503b09d0
Author: Brent Putman <putmanb at georgetown.edu>
AuthorDate: Thu Jan 15 19:50:36 2026 -0500

    JSATTR-6: SAML AttributeQuery DataConnector
    
    Dependency attributes configured on SimpleAggregation- connector must be
    mirrored onto the wrapped SAMLDataConnector instance in custom parser.
    
    Add some TRACE logging about dependencies.
---
 .../resolver/dc/saml/impl/ExecutableQueryBuilder.java    |  2 ++
 .../resolver/dc/saml/impl/SAMLDataConnector.java         |  3 +++
 .../dc/saml/impl/SimpleAggregationSAMLDataConnector.java |  3 +++
 .../dc/saml/impl/AbstractSAMLDataConnectorParser.java    | 12 ++++++++++++
 .../SimpleAggregationSAMLDataConnectorParserTest.java    |  6 ++++++
 .../dc/saml/resolver/saml-attribute-resolver-v2.xml      | 16 ++++++++++++++++
 6 files changed, 42 insertions(+)

diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/saml/impl/ExecutableQueryBuilder.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/saml/impl/ExecutableQueryBuilder.java
index 9be2efd0d..b702bd865 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/saml/impl/ExecutableQueryBuilder.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/saml/impl/ExecutableQueryBuilder.java
@@ -334,6 +334,8 @@ public class ExecutableQueryBuilder extends AbstractInitializableComponent
         
         checkComponentActive();
         
+        log.trace("Saw dependency attributes: {}", dependencyAttributes.keySet());
+        
         final String authorityEntityID = resolveAttributeAuthorityEntityID(resolutionContext, dependencyAttributes);
         final AttributeAuthorityDescriptor authorityRoleDescriptor = resolveAuthorityRoleDescriptor(authorityEntityID);
         final String authorityEndpoint = resolveAuthorityEndpoint(authorityEntityID, authorityRoleDescriptor);
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/saml/impl/SAMLDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/saml/impl/SAMLDataConnector.java
index cae1753c5..dded0425e 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/saml/impl/SAMLDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/saml/impl/SAMLDataConnector.java
@@ -192,6 +192,9 @@ public class SAMLDataConnector extends AbstractSearchDataConnector<ExecutableQue
         if (getSubjectMatchProcessor() == null) {
             throw new ComponentInitializationException("SubjectMatchProcessor was null");
         }
+        
+        log.trace("Attribute dependencies: {}", getAttributeDependencies());
+        log.trace("Data Connector dependencies: {}", getDataConnectorDependencies());
     }
 
     /** {@inheritDoc} */
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/saml/impl/SimpleAggregationSAMLDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/saml/impl/SimpleAggregationSAMLDataConnector.java
index 587fad3ad..8ae00ed62 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/saml/impl/SimpleAggregationSAMLDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/saml/impl/SimpleAggregationSAMLDataConnector.java
@@ -118,6 +118,9 @@ public class SimpleAggregationSAMLDataConnector extends AbstractDataConnector {
         if  (getEntityIDSources().isEmpty()) {
             throw new ComponentInitializationException("EntityID sources list was empty");
         }
+        
+        log.trace("Attribute dependencies: {}", getAttributeDependencies());
+        log.trace("Data Connector dependencies: {}", getDataConnectorDependencies());
     }
 
     /** {@inheritDoc} */
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/saml/impl/AbstractSAMLDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/saml/impl/AbstractSAMLDataConnectorParser.java
index e3b51b972..b65750737 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/saml/impl/AbstractSAMLDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/saml/impl/AbstractSAMLDataConnectorParser.java
@@ -47,9 +47,12 @@ import net.shibboleth.idp.attribute.resolver.dc.saml.util.impl.SubjectMatchProce
 import net.shibboleth.idp.attribute.resolver.spring.dc.AbstractDataConnectorParser;
 import net.shibboleth.idp.attribute.resolver.spring.dc.impl.CacheConfigParser;
 import net.shibboleth.idp.attribute.resolver.spring.impl.AttributeResolverNamespaceHandler;
+import net.shibboleth.idp.attribute.resolver.spring.impl.InputAttributeDefinitionParser;
+import net.shibboleth.idp.attribute.resolver.spring.impl.InputDataConnectorParser;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
+import net.shibboleth.shared.spring.util.SpringSupport;
 import net.shibboleth.shared.xml.ElementSupport;
 
 /**
@@ -197,6 +200,15 @@ public abstract class AbstractSAMLDataConnectorParser extends AbstractDataConnec
             samlBuilder.addPropertyValue("subjectMatch", false);
         }
         
+        final List<Element> attributeDependencyElements =
+                ElementSupport.getChildElements(config, InputAttributeDefinitionParser.ELEMENT_NAME);
+        final List<Element> dataConnectorDependencyElements =
+                ElementSupport.getChildElements(config, InputDataConnectorParser.ELEMENT_NAME);
+        samlBuilder.addPropertyValue("attributeDependencies", 
+                SpringSupport.parseCustomElements(attributeDependencyElements, parserContext, samlBuilder));
+        samlBuilder.addPropertyValue("dataConnectorDependencies", 
+                SpringSupport.parseCustomElements(dataConnectorDependencyElements, parserContext, samlBuilder));
+        
         samlBuilder.setInitMethodName("initialize");
         samlBuilder.setDestroyMethodName("destroy");
         
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/saml/impl/SimpleAggregationSAMLDataConnectorParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/saml/impl/SimpleAggregationSAMLDataConnectorParserTest.java
index 5ef3df08f..eead3f941 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/saml/impl/SimpleAggregationSAMLDataConnectorParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/saml/impl/SimpleAggregationSAMLDataConnectorParserTest.java
@@ -77,6 +77,9 @@ public class SimpleAggregationSAMLDataConnectorParserTest extends XMLObjectBaseT
                 getDataConnector(propSource,
                         "net/shibboleth/idp/attribute/resolver/spring/dc/saml/resolver/saml-attribute-resolver-v2.xml");
         assertNotNull(connector);
+
+        Assert.assertEquals(connector.getAttributeDependencies().size(), 1);
+        Assert.assertEquals(connector.getDataConnectorDependencies().size(), 1);
         
         final List<AttributeAuthorityEntityIDSource> sources = connector.getEntityIDSources();
         Assert.assertNotNull(sources);
@@ -114,6 +117,9 @@ public class SimpleAggregationSAMLDataConnectorParserTest extends XMLObjectBaseT
         Assert.assertTrue(queryConnector.isSubjectMatch());
         Assert.assertNotNull(queryConnector.getSubjectMatchProcessor());
         Assert.assertNotNull(queryConnector.getValidator());
+        
+        Assert.assertEquals(queryConnector.getAttributeDependencies().size(), 1);
+        Assert.assertEquals(queryConnector.getDataConnectorDependencies().size(), 1);
 
         final ExecutableSearchBuilder<ExecutableQuery> queryBuilder = queryConnector.getExecutableSearchBuilder();
         Assert.assertNotNull(queryBuilder);
diff --git a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/saml/resolver/saml-attribute-resolver-v2.xml b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/saml/resolver/saml-attribute-resolver-v2.xml
index 1ba635383..3a30c2764 100644
--- a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/saml/resolver/saml-attribute-resolver-v2.xml
+++ b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/saml/resolver/saml-attribute-resolver-v2.xml
@@ -2,6 +2,19 @@
 <AttributeResolver 
             xmlns="urn:mace:shibboleth:2.0:resolver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="urn:mace:shibboleth:2.0:resolver http://shibboleth.net/schema/idp/shibboleth-attribute-resolver.xsd">
+            
+    <DataConnector id="staticAttributes" xsi:type="Static" exportAttributes="schacHomeOrganization">
+        <Attribute id="schacHomeOrganization">
+            <Value>example.org</Value>
+        </Attribute>
+        <Attribute id="affiliation">
+            <Value>member</Value>
+        </Attribute>
+    </DataConnector>
+    
+    <AttributeDefinition id="eduPersonScopedAffiliation" xsi:type="Scoped" scope="example.org">
+        <InputDataConnector ref="staticAttributes" attributeNames="affiliation" />
+    </AttributeDefinition>
 
     <DataConnector id="mySAML" xsi:type="SimpleAggregationSAML"
         subjectMatch="true"
@@ -10,6 +23,9 @@
         subjectDefaultNameIDFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
     >
     
+        <InputAttributeDefinition ref="eduPersonScopedAffiliation" />
+        <InputDataConnector ref="staticAttributes" attributeNames="schacHomeOrganization" />
+    
         <ResultCache expireAfterAccess="PT10S" maximumCachedElements="25"/>
 
         <RequestedAttributes xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">

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


More information about the commits mailing list