[java-identity-provider] 02/02: IDP-1181 add failFast to LDAP/RDBMS/HTTP data connectors

Rod Widdowson rdw at steadingsoftware.com
Fri Sep 13 04:52:10 EDT 2019


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

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

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

commit 77674f1de830f432f09984ef24ebd0efe603c27c
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Thu Sep 12 15:15:56 2019 +0100

    IDP-1181 add failFast to LDAP/RDBMS/HTTP data connectors
    
    https://issues.shibboleth.net/jira/browse/IDP-1181
---
 .../resolver/dc/NonFailFastValidator.java          | 19 +++++++++++++++++++
 .../idp/attribute/resolver/dc/Validator.java       | 18 ++++++++++++++++--
 .../resolver/dc/http/impl/HTTPDataConnector.java   |  7 +++++++
 .../dc/impl/AbstractSearchDataConnector.java       | 18 +++++++++++++++++-
 .../dc/ldap/impl/ConnectionFactoryValidator.java   | 18 +++++-------------
 .../resolver/dc/ldap/impl/LDAPDataConnector.java   |  6 +++++-
 .../dc/rdbms/impl/DataSourceValidator.java         | 18 +++++-------------
 .../resolver/dc/rdbms/impl/RDBMSDataConnector.java |  5 ++++-
 .../spring/dc/AbstractDataConnectorParser.java     | 12 ++++++++++++
 .../resolver/failfast/attributeResolverLDAP.xml    |  1 +
 .../resolver/failfast/attributeResolverRDBMS.xml   |  1 +
 .../schema/shibboleth-attribute-resolver.xsd       | 22 +++++++++++++++++++++-
 12 files changed, 113 insertions(+), 32 deletions(-)

diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/NonFailFastValidator.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/NonFailFastValidator.java
index 2eaf6a0..2874b51 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/NonFailFastValidator.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/NonFailFastValidator.java
@@ -21,6 +21,9 @@ import javax.annotation.Nullable;
 
 import org.slf4j.LoggerFactory;
 
+import net.shibboleth.utilities.java.support.primitive.DeprecationSupport;
+import net.shibboleth.utilities.java.support.primitive.DeprecationSupport.ObjectType;
+
 /** Used to determine whether a Data Connector initialized properly and continues to be fit for use. */
 public class NonFailFastValidator implements Validator {
 
@@ -38,7 +41,13 @@ public class NonFailFastValidator implements Validator {
      * @param validator validator to run but trap exceptions from
      */
     public NonFailFastValidator(@Nullable final Validator validator) {
+        // V4 deprecation.  Remove the class in V5
+        DeprecationSupport.warnOnce(ObjectType.CLASS, "NonFailFastValidator", null, 
+                "failFast on the dataConnector or p:throwValidateError on the contained Validator");
         embeddedValidator = validator;
+        if (embeddedValidator != null) {
+            embeddedValidator.setThrowValidateError(false);
+        }
     }
     
     /** {@inheritDoc} */
@@ -53,5 +62,15 @@ public class NonFailFastValidator implements Validator {
             }
         }
     }
+
+    /** {@inheritDoc} */
+    public void setThrowValidateError(final boolean what) {
+        LoggerFactory.getLogger(NonFailFastValidator.class).error("setThrowValidateError ignored");
+    }
+
+    /** {@inheritDoc} */
+    public boolean isThrowValidateError() {
+        return false;
+    }
     
 }
\ No newline at end of file
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/Validator.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/Validator.java
index 1c7c30a..edfdc79 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/Validator.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/Validator.java
@@ -21,9 +21,23 @@ package net.shibboleth.idp.attribute.resolver.dc;
 public interface Validator {
 
     /**
-     * Determines whether a data connector is valid and ready for use.
+     * Probe the data connector and conditionally fails if it is not valid and ready for use.
      * 
-     * @throws ValidationException thrown if validation fails
+     * @throws ValidationException thrown if validation fails and {@link #isThrowValidateError()} is true
      */
     void validate() throws ValidationException;
+    
+    /**
+     * Sets whether {@link #validate()} should throw or log errors.
+     *
+     * @param what whether {@link #validate()} should throw or log errors
+     */
+    public void setThrowValidateError(final boolean what);
+
+    /**
+     * Returns whether {@link #validate()} should throw or log errors.
+     *
+     * @return whether {@link #validate()} should throw or log errors
+     */
+    public boolean isThrowValidateError();
 }
\ No newline at end of file
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
index 3666ffd..927f8b4 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
@@ -61,6 +61,13 @@ public class HTTPDataConnector extends AbstractSearchDataConnector<HTTPSearch,HT
         setValidator(new Validator() {
             public void validate() throws ValidationException {
             }
+
+            public void setThrowValidateError(final boolean what) {
+            }
+
+            public boolean isThrowValidateError() {
+                return false;
+            }
         });
     }
 
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
index 717d89a..644f852 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
@@ -67,6 +67,9 @@ public abstract class AbstractSearchDataConnector<T1 extends ExecutableSearch,T2
 
     /** Query result cache. */
     @Nullable private Cache<String,Map<String,IdPAttribute>> resultsCache;
+    
+    /** Does DataConnector fail fast.*/
+    private boolean failFast;
 
     /**
      * Gets the builder used to create executable searches.
@@ -218,5 +221,18 @@ public abstract class AbstractSearchDataConnector<T1 extends ExecutableSearch,T2
             throw new ComponentInitializationException(getLogPrefix() + " No mapping strategy was configured");
         }
     }
-    
+
+    /** Does the data connector fails fast.
+     * @return Returns whether the data connector fails fast.
+     */
+    public boolean isFailFast() {
+        return failFast;
+    }
+
+    /** Whether the data connector fails fast.
+     * @param what what to set
+     */
+    public void setFailFast(final boolean what) {
+        failFast = what;
+    }
 }
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java
index ed6ec6b..f0123d6 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java
@@ -45,7 +45,7 @@ public class ConnectionFactoryValidator extends AbstractInitializableComponent i
     @Nonnull private ConnectionFactory connectionFactory;
     
     /** Whether validate should throw, default value is <code>true</code>. */
-    private boolean throwOnValidateError = true;
+    private boolean throwOnValidateError;
        
     /**
      * Constructor.  
@@ -81,21 +81,13 @@ public class ConnectionFactoryValidator extends AbstractInitializableComponent i
         return connectionFactory;
     }
 
-    /**
-     * Sets whether {@link #validate()} should throw or log errors.
-     *
-     * @param what whether {@link #validate()} should throw or log errors
-     */
+    /** {@inheritDoc} */
     public void setThrowValidateError(final boolean what) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         throwOnValidateError = what;
     }
 
-    /**
-     * Returns whether {@link #validate()} should throw or log errors.
-     *
-     * @return whether {@link #validate()} should throw or log errors
-     */
+    /** {@inheritDoc} */
     public boolean isThrowValidateError() {
         return throwOnValidateError;
     }
@@ -107,14 +99,14 @@ public class ConnectionFactoryValidator extends AbstractInitializableComponent i
             connection = connectionFactory.getConnection();
             if (connection == null) {
                 log.error("Unable to retrieve connections from configured connection factory");
-                if (throwOnValidateError) {
+                if (isThrowValidateError()) {
                     throw new LdapException("Unable to retrieve connection from connection factory");
                 }
             }
             connection.open();
         } catch (final LdapException e) {
             log.error("Connection factory validation failed", e);
-            if (throwOnValidateError) {
+            if (isThrowValidateError()) {
                 throw new ValidationException(e);
             }
         } finally {
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java
index 7d71e9a..46b7a64 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java
@@ -139,6 +139,7 @@ public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSea
             validator.setConnectionFactory(connectionFactory);
             super.setValidator(validator);
         }
+        getValidator().setThrowValidateError(isFailFast());
         if (defaultMappingStrategy) {
             super.setMappingStrategy(new StringAttributeValueMappingStrategy());
         }
@@ -148,7 +149,10 @@ public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSea
             getValidator().validate();
         } catch (final ValidationException e) {
             log.error("{} Invalid connector configuration", getLogPrefix(), e);
-            throw new ComponentInitializationException(getLogPrefix() + " Invalid connector configuration", e);
+            if (isFailFast()) {
+                // Should always follow this leg.
+                throw new ComponentInitializationException(getLogPrefix() + " Invalid connector configuration", e);
+            }
         }
         policeForJVMTrust();
     }
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java
index 2562ce9..1ecdfbf 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java
@@ -47,7 +47,7 @@ public class DataSourceValidator extends AbstractInitializableComponent implemen
     @NonnullAfterInit private DataSource dataSource;
 
     /** Whether validate should throw, default value is <code>true</code>. */
-    private boolean throwOnValidateError = true;
+    private boolean throwOnValidateError;
 
     /**
      * Constructor.
@@ -86,22 +86,14 @@ public class DataSourceValidator extends AbstractInitializableComponent implemen
         return dataSource;
     }
 
-    /**
-     * Sets whether {@link #validate()} should throw or log errors.
-     *
-     * @param value whether {@link #validate()} should throw or log errors
-     */
+    /** {@inheritDoc} */
     public void setThrowValidateError(final boolean value) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         throwOnValidateError = value;
     }
 
 
-    /**
-     * Returns whether {@link #validate()} should throw or log errors.
-     *
-     * @return whether {@link #validate()} should throw or log errors
-     */
+    /** {@inheritDoc} */
     public boolean isThrowValidateError() {
         return throwOnValidateError;
     }
@@ -115,7 +107,7 @@ public class DataSourceValidator extends AbstractInitializableComponent implemen
             connection = dataSource.getConnection();
             if (connection == null) {
                 log.error("Unable to retrieve connections from configured data source");
-                if (throwOnValidateError) {
+                if (isThrowValidateError()) {
                     throw new ValidationException("Unable to retrieve connections from configured data source");
                 }
             }
@@ -126,7 +118,7 @@ public class DataSourceValidator extends AbstractInitializableComponent implemen
             } else {
                 log.error("Datasource validation failed", e);
             }
-            if (throwOnValidateError) {
+            if (isThrowValidateError()) {
                 throw new ValidationException("Invalid connector configuration", e);
             }
         } finally {
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
index be13dd6..50ccefa 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
@@ -104,6 +104,7 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
         if (defaultValidator) {
             final DataSourceValidator validator = new DataSourceValidator();
             validator.setDataSource(dataSource);
+            validator.setThrowValidateError(isFailFast());
             validator.initialize();
             super.setValidator(validator);
         }
@@ -116,7 +117,9 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
             getValidator().validate();
         } catch (final ValidationException e) {
             log.error("{} Invalid connector configuration", getLogPrefix(), e);
-            throw new ComponentInitializationException(getLogPrefix() + " Invalid connector configuration", e);
+            if (isFailFast()) {
+                throw new ComponentInitializationException(getLogPrefix() + " Invalid connector configuration", e);
+            }
         }
     }
 
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/AbstractDataConnectorParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/AbstractDataConnectorParser.java
index 4933d27..d9874b7 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/AbstractDataConnectorParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/AbstractDataConnectorParser.java
@@ -83,6 +83,11 @@ public abstract class AbstractDataConnectorParser extends BaseResolverPluginPars
      * Which attributes to export.
      */
     @Nonnull @NotEmpty public static final String ATTR_EXPORT_NAMES = "exportAttributes";
+    
+    /**
+     * Failfast LDAP, Realtional, Stored.
+     */
+    @Nonnull @NotEmpty public static final String ATTR_FAIL_FAST = "failFast";
 
     /** Failover data connector attribute name. */
     @Nonnull public static final QName FAILOVER_DATA_CONNECTOR_ELEMENT_NAME = new QName(
@@ -152,6 +157,13 @@ public abstract class AbstractDataConnectorParser extends BaseResolverPluginPars
                     SpringSupport.getAttributeValueAsList(config.getAttributeNodeNS(null, ATTR_EXPORT_NAMES)));
         }
 
+        if (config.hasAttributeNS(null, ATTR_FAIL_FAST)) {
+            // LDAP, Relational & HTTP only, limited in the schema
+            builder.addPropertyValue("failFast", 
+                    StringSupport.trimOrNull(config.getAttributeNS(null, ATTR_FAIL_FAST)));
+        }
+
+
         if (isNative(config)) {
             // parse the configuration into a beanfactory and inject the resources as well
             builder.addPropertyValue("objectType", getNativeBeanClass());
diff --git a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/failfast/attributeResolverLDAP.xml b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/failfast/attributeResolverLDAP.xml
index 23c002e..2326c36 100644
--- a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/failfast/attributeResolverLDAP.xml
+++ b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/failfast/attributeResolverLDAP.xml
@@ -10,6 +10,7 @@
     
     <DataConnector id="dataConnector" xsi:type="LDAPDirectory"
         ldapURL="ldap://localhost:%{port:20389}"
+        failFast="true"
         principal="cn=Directory Manager"
         principalCredential="password">
         <FilterTemplate>
diff --git a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/failfast/attributeResolverRDBMS.xml b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/failfast/attributeResolverRDBMS.xml
index b5696a7..0084b96 100644
--- a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/failfast/attributeResolverRDBMS.xml
+++ b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/failfast/attributeResolverRDBMS.xml
@@ -11,6 +11,7 @@
     <DataConnector id="dataConnector" xsi:type="RelationalDatabase"
         noResultIsError="true"
         multipleResultsIsError="true"
+        failFast="true"
         readOnlyConnection="false"
         noRetryDelay="PT5M">
       <SimpleManagedConnection
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 177361c..28df94b 100644
--- a/idp-schema/src/main/resources/schema/shibboleth-attribute-resolver.xsd
+++ b/idp-schema/src/main/resources/schema/shibboleth-attribute-resolver.xsd
@@ -971,7 +971,13 @@
                         </documentation>
                     </annotation>
                 </attribute>
-
+                <attribute name="failFast" type="resolver:string">
+                    <annotation>
+                        <documentation>
+                            Whether to fail if the store cannot be verified at startup (defaults to false).
+                        </documentation>
+                    </annotation>
+                </attribute>
             </extension>
         </complexContent>
     </complexType>
@@ -1117,6 +1123,13 @@
                         </documentation>
                     </annotation>
                 </attribute>
+                <attribute name="failFast" type="resolver:string">
+                    <annotation>
+                        <documentation>
+                            Whether to fail if the store cannot be verified at startup (defaults to false).
+                        </documentation>
+                    </annotation>
+                </attribute>
             </extension>
         </complexContent>
     </complexType>
@@ -1284,6 +1297,13 @@
                         </documentation>
                     </annotation>
                 </attribute>
+                <attribute name="failFast" type="resolver:string">
+                    <annotation>
+                        <documentation>
+                            Whether to fail if the store cannot be verified at startup (defaults to false).
+                        </documentation>
+                    </annotation>
+                </attribute>
             </extension>
         </complexContent>
     </complexType>

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


More information about the commits mailing list