[java-shib-attribute] branch main updated: JSATTR-4 Remove springResources from data connector

Rod Widdowson rdw at steadingsoftware.com
Wed Oct 26 13:18:16 UTC 2022


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

rdw 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=2c02143bc38e1f419b97be70aa9050a6509529c8

The following commit(s) were added to refs/heads/main by this push:
     new 2c02143bc JSATTR-4 Remove springResources from data connector
2c02143bc is described below

commit 2c02143bc38e1f419b97be70aa9050a6509529c8
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Tue Oct 25 14:57:17 2022 +0100

    JSATTR-4 Remove springResources from data connector
    
    https://shibboleth.atlassian.net/browse/JSATTR-4
    
    Add 'connectionFactoryRef="bean"' and 'searchOperatorRef="bean"'
    to the LDAP data connector.
---
 .../dc/ldap/impl/LDAPDataConnectorParser.java      | 70 ++++++++++++++++++----
 .../schema/shibboleth-attribute-resolver.xsd       | 20 +++++--
 .../dc/ldap/impl/LDAPDataConnectorParserTest.java  | 21 ++++++-
 .../ldap-attribute-resolver-spring-context.xml     |  2 +-
 .../ldap/resolver/ldap-attribute-resolver-ref.xml  | 14 +++++
 5 files changed, 108 insertions(+), 19 deletions(-)

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 16a0da0fd..3e29202e5 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
@@ -154,19 +154,30 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
             }
         }
 
-        final BeanDefinitionBuilder connectionFactory =
-            BeanDefinitionBuilder.genericBeanDefinition(DefaultConnectionFactory.class);
-        connectionFactory.addConstructorArgValue(v2Parser.createConnectionConfig(parserContext));
-
-        final BeanDefinition pooledConnectionFactory = v2Parser.createPooledConnectionFactory(parserContext);
-        if (pooledConnectionFactory != null) {
-            builder.addPropertyValue("connectionFactory", pooledConnectionFactory);
+        final String connectionFactoryID = v2Parser.getBeanConnectionFactoryID();
+        BeanDefinition pooledConnectionFactory = null;
+        BeanDefinitionBuilder connectionFactory = null;
+        if (connectionFactoryID != null) {
+            builder.addPropertyReference("connectionFactory", connectionFactoryID);
         } else {
-            builder.addPropertyValue("connectionFactory", connectionFactory.getBeanDefinition());
+            connectionFactory =
+                    BeanDefinitionBuilder.genericBeanDefinition(DefaultConnectionFactory.class);
+            connectionFactory.addConstructorArgValue(v2Parser.createConnectionConfig(parserContext));
+            pooledConnectionFactory = v2Parser.createPooledConnectionFactory(parserContext);
+            if (pooledConnectionFactory != null) {
+                builder.addPropertyValue("connectionFactory", pooledConnectionFactory);
+            } else {
+                builder.addPropertyValue("connectionFactory", connectionFactory.getBeanDefinition());
+            }
         }
 
-        final BeanDefinition searchOperation = v2Parser.createSearchOperation();
-        builder.addPropertyValue("searchOperation", searchOperation);
+        final String searchOperationID = v2Parser.getBeanSearchOperationID();
+        if (searchOperationID!= null) {
+            builder.addPropertyReference("searchOperation", searchOperationID);
+        } else {
+            final BeanDefinition searchOperation = v2Parser.createSearchOperation();
+            builder.addPropertyValue("searchOperation", searchOperation);
+        }
 
         final String mappingStrategyID = AttributeSupport.getAttributeValue(config, new QName("mappingStrategyRef"));
         if (mappingStrategyID != null) {
@@ -182,7 +193,10 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
         if (validatorID != null) {
             builder.addPropertyReference("validator", validatorID);
         } else {
-            if (pooledConnectionFactory != null) {
+            if (connectionFactoryID != null) {
+                builder.addPropertyValue("validator", v2Parser.createValidator(connectionFactoryID));
+            }
+            else if (pooledConnectionFactory != null) {
                 builder.addPropertyValue("validator", v2Parser.createValidator(pooledConnectionFactory));
             } else {
                 builder.addPropertyValue("validator", v2Parser.createValidator(connectionFactory.getBeanDefinition()));
@@ -436,6 +450,24 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
             return AttributeSupport.getAttributeValue(configElement, null, "executableSearchBuilderRef");
         }
         
+        /**
+         * Get the bean ID of an externally defined Connection Factory
+         *
+         * @return Connection Factory bean ID
+         */
+        @Nullable public String getBeanConnectionFactoryID() {
+            return AttributeSupport.getAttributeValue(configElement, null, "connectionFactoryRef");
+        }
+
+        /**
+         * Get the bean ID of an externally defined Search Operation
+         *
+         * @return Search Operation bean ID
+         */
+        @Nullable public String getBeanSearchOperationID() {
+            return AttributeSupport.getAttributeValue(configElement, null, "searchOperatorRef");
+        }
+
         /**
          * Construct the definition of the template driven search builder.
          * 
@@ -771,6 +803,22 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
             return mapper.getBeanDefinition();
         }
 
+        /**
+         * Create the validator. See {@link net.shibboleth.idp.attribute.resolver.dc.Validator}.
+         *
+         * @param connectionFactoryId reference to provide to the validator
+         *
+         * @return validator
+         */
+        @Nullable public BeanDefinition createValidator(final String connectionFactoryId) {
+
+            final BeanDefinitionBuilder validator =
+                    BeanDefinitionBuilder.genericBeanDefinition(ConnectionFactoryValidator.class);
+
+            validator.addPropertyReference("connectionFactory", connectionFactoryId);
+            return validator.getBeanDefinition();
+        }
+
         /**
          * Create the validator. See {@link net.shibboleth.idp.attribute.resolver.dc.Validator}.
          * 
diff --git a/shib-attribute-resolver-spring/src/main/resources/schema/shibboleth-attribute-resolver.xsd b/shib-attribute-resolver-spring/src/main/resources/schema/shibboleth-attribute-resolver.xsd
index 5341fd526..efcda8f00 100644
--- a/shib-attribute-resolver-spring/src/main/resources/schema/shibboleth-attribute-resolver.xsd
+++ b/shib-attribute-resolver-spring/src/main/resources/schema/shibboleth-attribute-resolver.xsd
@@ -1,8 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<schema xmlns="http://www.w3.org/2001/XMLSchema"
-    xmlns:resolver="urn:mace:shibboleth:2.0:resolver"
-    xmlns:sec="urn:mace:shibboleth:2.0:security"
-    targetNamespace="urn:mace:shibboleth:2.0:resolver"
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:resolver="urn:mace:shibboleth:2.0:resolver"
+    xmlns:sec="urn:mace:shibboleth:2.0:security" targetNamespace="urn:mace:shibboleth:2.0:resolver"
     elementFormDefault="qualified" version="4.3">
 
     <import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
@@ -1060,6 +1058,20 @@
                         </documentation>
                     </annotation>
                 </attribute>
+                <attribute name="connectionFactoryRef" type="resolver:string">
+                    <annotation>
+                        <documentation>
+                            Reference to a Spring bean providing the Connection Factory implementation to use.
+                        </documentation>
+                    </annotation>
+                </attribute>
+                <attribute name="searchOperatorRef" type="resolver:string">
+                    <annotation>
+                        <documentation>
+                            Reference to a Spring bean providing the Search Operator implementation to use.
+                        </documentation>
+                    </annotation>
+                </attribute>
                 <attribute name="validatorRef" type="resolver:string">
                     <annotation>
                         <documentation>
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 b7fbc9081..9cfa500e7 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
@@ -38,15 +38,14 @@ import org.ldaptive.BindConnectionInitializer;
 import org.ldaptive.BindResponse;
 import org.ldaptive.ConnectionConfig;
 import org.ldaptive.DefaultConnectionFactory;
-import org.ldaptive.RandomConnectionStrategy;
 import org.ldaptive.PooledConnectionFactory;
+import org.ldaptive.RandomConnectionStrategy;
+import org.ldaptive.SearchConnectionValidator;
 import org.ldaptive.SearchOperation;
 import org.ldaptive.filter.EqualityFilter;
-import org.ldaptive.SearchConnectionValidator;
 import org.ldaptive.pool.IdlePruneStrategy;
 import org.ldaptive.referral.FollowSearchReferralHandler;
 import org.ldaptive.sasl.DefaultSaslClientRequest;
-import org.ldaptive.sasl.DigestMD5BindRequest;
 import org.ldaptive.sasl.Mechanism;
 import org.ldaptive.sasl.QualityOfProtection;
 import org.ldaptive.sasl.SaslClient;
@@ -497,6 +496,22 @@ public class LDAPDataConnectorParserTest {
         assertNotNull(attrs);
     }
 
+    @Test public void refConfig() throws Exception {
+        final LDAPDataConnector dataConnector =
+                getLdapDataConnector(new String[] {"net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-attribute-resolver-ref.xml",
+                        "net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml"});
+        assertNotNull(dataConnector);
+        doTest(dataConnector);
+
+        dataConnector.initialize();
+        final AttributeResolutionContext context =
+                TestSources.createResolutionContext(TestSources.PRINCIPAL_ID, TestSources.IDP_ENTITY_ID,
+                        TestSources.SP_ENTITY_ID);
+        final Map<String, IdPAttribute> attrs = dataConnector.resolve(context);
+        assertNotNull(attrs);
+    }
+
+
     @Test public void springPropsConfig() throws Exception,
             ResolutionException {
         final Resource props = new ClassPathResource("net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-v3.properties");
diff --git a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml
index e156f4a73..f49b24598 100644
--- a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml
+++ b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml
@@ -44,7 +44,7 @@
                   p:idleTime="PT10M" />
         </property>
     </bean>
-    <bean class="org.ldaptive.SearchOperation">
+    <bean id="searchOperation" class="org.ldaptive.SearchOperation">
         <property name="request">
             <bean class="org.ldaptive.SearchRequest" p:baseDn="ou=people,dc=shibboleth,dc=net" p:returnAttributes="uid,homephone,mail" p:timeLimit="PT7S" />
         </property>
diff --git a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-attribute-resolver-ref.xml b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-attribute-resolver-ref.xml
new file mode 100644
index 000000000..1341d70da
--- /dev/null
+++ b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-attribute-resolver-ref.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<AttributeResolver xmlns="urn:mace:shibboleth:2.0:resolver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sec="urn:mace:shibboleth:2.0:security"
+        xsi:schemaLocation="urn:mace:shibboleth:2.0:resolver http://shibboleth.net/schema/idp/shibboleth-attribute-resolver.xsd
+                            urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+    <DataConnector id="myLDAP" xsi:type="LDAPDirectory"
+        executableSearchBuilderRef="filter"
+        noRetryDelay="PT5M"
+        mappingStrategyRef="mappings"
+        connectionFactoryRef="connectionFactory"
+        searchOperatorRef="searchOperation"
+        validatorRef="validator">
+        <ResultCache cacheManagerRef="cache"/>
+    </DataConnector>
+</AttributeResolver>

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


More information about the commits mailing list