[java-identity-provider] branch maint-4 updated: JSATTR-4 Remove springResources from data connector

Rod Widdowson rdw at steadingsoftware.com
Tue Oct 25 13:59:05 UTC 2022


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

rdw pushed a commit to branch maint-4
in repository java-identity-provider.

View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=0af0470f2f1d305722e5ac4d56be7f96395f0898

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

commit 0af0470f2f1d305722e5ac4d56be7f96395f0898
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 'searchExecutorRef="bean"'
    to the LDAP data connector.
---
 .../dc/ldap/impl/LDAPDataConnectorParser.java      | 78 +++++++++++++++++-----
 .../dc/ldap/LDAPDataConnectorParserTest.java       | 17 ++++-
 .../ldap/resolver/ldap-attribute-resolver-ref.xml  | 20 ++++++
 .../spring/dc/ldap/resolver/ldap-ref-beans.xml     | 66 ++++++++++++++++++
 .../schema/shibboleth-attribute-resolver.xsd       | 20 ++++--
 5 files changed, 181 insertions(+), 20 deletions(-)

diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
index 691e4af1d..9dc500f24 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
@@ -147,10 +147,6 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
         
         final V2Parser v2Parser = new V2Parser(config, getLogPrefix());
 
-        final BeanDefinitionBuilder connectionFactory =
-                BeanDefinitionBuilder.genericBeanDefinition(DefaultConnectionFactory.class);
-        connectionFactory.addConstructorArgValue(v2Parser.createConnectionConfig(parserContext));
-
         final String searchBuilderID = v2Parser.getBeanSearchBuilderID();
         if (searchBuilderID != null) {
             builder.addPropertyReference("executableSearchBuilder", searchBuilderID);
@@ -161,19 +157,34 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
             }
         }
 
-        final BeanDefinition connectionPool = v2Parser.createConnectionPool(connectionFactory.getBeanDefinition());
+        final String connectionFactoryID = v2Parser.getBeanConnectionFactoryID();
         BeanDefinitionBuilder pooledConnectionFactory = null;
-        if (connectionPool != null) {
-            pooledConnectionFactory = BeanDefinitionBuilder.genericBeanDefinition(PooledConnectionFactory.class);
-            pooledConnectionFactory.addConstructorArgValue(connectionPool);
-            builder.addPropertyValue("connectionFactory", pooledConnectionFactory.getBeanDefinition());
+        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));
+
+            final BeanDefinition connectionPool = v2Parser.createConnectionPool(connectionFactory.getBeanDefinition());
+            if (connectionPool != null) {
+                pooledConnectionFactory = BeanDefinitionBuilder.genericBeanDefinition(PooledConnectionFactory.class);
+                pooledConnectionFactory.addConstructorArgValue(connectionPool);
+                builder.addPropertyValue("connectionFactory", pooledConnectionFactory.getBeanDefinition());
+            } else {
+                builder.addPropertyValue("connectionFactory", connectionFactory.getBeanDefinition());
+            }
         }
 
-        final BeanDefinition searchExecutor = v2Parser.createSearchExecutor();
-        builder.addPropertyValue("searchExecutor", searchExecutor);
-
+        final String searchExecutorID = v2Parser.getBeanSearchExecutorID();
+        if (searchExecutorID!= null) {
+            builder.addPropertyReference("searchExecutor", searchExecutorID);
+        } else {
+            final BeanDefinition searchExecutor = v2Parser.createSearchExecutor();
+            builder.addPropertyValue("searchExecutor", searchExecutor);
+        }
+        
         final String mappingStrategyID = AttributeSupport.getAttributeValue(config, new QName("mappingStrategyRef"));
         if (mappingStrategyID != null) {
             builder.addPropertyReference("mappingStrategy", mappingStrategyID);
@@ -188,7 +199,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.getBeanDefinition()));
             } else {
@@ -436,13 +450,31 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
 
         /**
          * Get the bean ID of an externally defined search builder.
-         * 
+         *
          * @return search builder bean ID
          */
         @Nullable public String getBeanSearchBuilderID() {
             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 Executor
+         *
+         * @return Search Executor bean ID
+         */
+        @Nullable public String getBeanSearchExecutorID() {
+            return AttributeSupport.getAttributeValue(configElement, null, "searchExecutorRef");
+        }
+
         /**
          * Construct the definition of the template driven search builder.
          * 
@@ -816,6 +848,22 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
             return validator.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 a results cache bean definition. See {@link CacheConfigParser}.
          * 
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java
index 15fdba39c..a078ffe45 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java
@@ -38,7 +38,6 @@ import org.ldaptive.BindConnectionInitializer;
 import org.ldaptive.ConnectionConfig;
 import org.ldaptive.DefaultConnectionFactory;
 import org.ldaptive.RandomConnectionStrategy;
-import org.ldaptive.RoundRobinConnectionStrategy;
 import org.ldaptive.SearchExecutor;
 import org.ldaptive.pool.BlockingConnectionPool;
 import org.ldaptive.pool.IdlePruneStrategy;
@@ -485,6 +484,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/resolver/ldap-ref-beans.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/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-attribute-resolver-ref.xml b/idp-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..f88097249
--- /dev/null
+++ b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-attribute-resolver-ref.xml
@@ -0,0 +1,20 @@
+<?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="LDAPTSearchBuilder"
+        noRetryDelay="PT5M"
+        mappingStrategyRef="LDAPTESTmappings"
+        connectionFactoryRef="LDAPTESTconnectionFactory"
+        searchExecutorRef="LDAPTESTsearchExecutor"
+        validatorRef="LDAPTESTvalidator">
+        
+        <FailoverDataConnector ref="2123"/>
+                
+        <ResultCache cacheManagerRef="LDAPTESTcache"/>
+        
+    </DataConnector>
+    
+</AttributeResolver>
diff --git a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-ref-beans.xml b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-ref-beans.xml
new file mode 100644
index 000000000..00af4a8eb
--- /dev/null
+++ b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-ref-beans.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:p="http://www.springframework.org/schema/p"
+    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
+    <bean id="LDAPTESTconnectionFactory" class="org.ldaptive.pool.PooledConnectionFactory">
+        <property name="connectionPool">
+            <bean class="org.ldaptive.pool.BlockingConnectionPool" init-method="initialize" p:blockWaitTime="PT5S" p:failFastInitialize="false" p:name="resolver-pool">
+                <constructor-arg index="0">
+                    <bean class="org.ldaptive.pool.PoolConfig" p:minPoolSize="5" p:maxPoolSize="10"
+                        p:validatePeriodically="true" p:validatePeriod="PT15M" />
+                </constructor-arg>
+                <constructor-arg index="1">
+                    <bean class="org.ldaptive.DefaultConnectionFactory">
+                        <property name="connectionConfig">
+                            <bean class="org.ldaptive.ConnectionConfig" p:ldapUrl="ldap://localhost:10389"
+                                p:useStartTLS="true" p:connectTimeout="PT2S" p:responseTimeout="PT4S">
+                                <property name="connectionInitializer">
+                                    <bean class="org.ldaptive.BindConnectionInitializer" p:bindDn="cn=Directory Manager"
+                                        p:bindCredential="password" />
+                                </property>
+                                <property name="sslConfig">
+                                    <bean class="org.ldaptive.ssl.SslConfig">
+                                        <property name="credentialConfig">
+                                            <bean class="org.ldaptive.ssl.X509CredentialConfig"
+                                                p:trustCertificates="file:src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/server.crt"
+                                                p:authenticationCertificate="file:src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/client.crt"
+                                                p:authenticationKey="file:src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/client.pkcs8" />
+                                        </property>
+                                    </bean>
+                                </property>
+                            </bean>
+                        </property>
+                    </bean>
+                </constructor-arg>
+                <property name="validator">
+                    <bean class="org.ldaptive.pool.SearchValidator">
+                        <property name="searchRequest">
+                            <bean class="org.ldaptive.SearchRequest">
+                                <constructor-arg value="dc=shibboleth,dc=net" />
+                                <constructor-arg value="(ou=people)" />
+                            </bean>
+                        </property>
+                    </bean>
+                </property>
+                <property name="pruneStrategy">
+                    <bean class="org.ldaptive.pool.IdlePruneStrategy" p:prunePeriod="PT5M" p:idleTime="PT10M" />
+                </property>
+            </bean>
+        </property>
+    </bean>
+    <bean id="LDAPTESTsearchExecutor" class="org.ldaptive.SearchExecutor" p:baseDn="ou=people,dc=shibboleth,dc=net" p:returnAttributes="uid,homephone,mail" p:timeLimit="PT7S" />
+    <bean id="LDAPTESTcache" class="com.google.common.cache.Cache" factory-bean="cacheBuilderExternal" factory-method="build" />
+    <bean id="LDAPTSearchBuilder" class="net.shibboleth.idp.attribute.resolver.dc.ldap.TemplatedExecutableSearchFilterBuilder"
+        p:templateText="(uid=${resolutionContext.principal})" p:velocityEngine-ref="shibboleth.VelocityEngine"
+        init-method="initialize" />
+    <bean id="LDAPTESTmappings" class="net.shibboleth.idp.attribute.resolver.dc.ldap.StringAttributeValueMappingStrategy"
+        p:noResultAnError="true" p:multipleResultsAnError="true">
+        <property name="resultRenamingMap">
+            <map>
+                <entry key="homephone" value="phonenumber" />
+            </map>
+        </property>
+    </bean>
+    <bean id="LDAPTESTvalidator" class="net.shibboleth.idp.attribute.resolver.dc.ldap.impl.ConnectionFactoryValidator"
+      p:connectionFactory-ref="LDAPTESTconnectionFactory" p:throwValidateError="true" />
+</beans>
\ No newline at end of file
diff --git a/idp-schema/src/main/resources/schema/shibboleth-attribute-resolver.xsd b/idp-schema/src/main/resources/schema/shibboleth-attribute-resolver.xsd
index 5341fd526..7a83c8e3b 100644
--- a/idp-schema/src/main/resources/schema/shibboleth-attribute-resolver.xsd
+++ b/idp-schema/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="searchExecutorRef" type="resolver:string">
+                    <annotation>
+                        <documentation>
+                            Reference to a Spring bean providing the Search Executor implementation to use.
+                        </documentation>
+                    </annotation>
+                </attribute>
                 <attribute name="validatorRef" type="resolver:string">
                     <annotation>
                         <documentation>

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


More information about the commits mailing list