[java-identity-provider] branch maint-3.3 updated: IDP-1111 - Provide a case-insensitive computed persistent ID strategy

Scott Cantor cantor.2 at osu.edu
Thu Sep 28 22:01:28 EDT 2017


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

scantor pushed a commit to branch maint-3.3
in repository java-identity-provider.

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

The following commit(s) were added to refs/heads/maint-3.3 by this push:
       new  ad94623   IDP-1111 - Provide a case-insensitive computed persistent ID strategy
ad94623 is described below

commit ad94623ca0294a900a42e2ff621ba191ed0df0fb
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Thu Sep 28 22:01:25 2017 -0400

    IDP-1111 - Provide a case-insensitive computed persistent ID strategy
    
    https://issues.shibboleth.net/jira/browse/IDP-1111
    
    Extend capability to data connectors for future-proofing.
---
 .../dc/impl/BaseComputedIDDataConnectorParser.java | 19 +++++++++++++++-
 .../dc/ComputedIDDataConnectorParserTest.java      | 15 +++++++++++++
 .../spring/dc/StoredIDDataConnectorParserTest.java | 14 ++++++++++++
 .../resolver/spring/dc/resolver/computedBase32.xml | 12 +++++++++++
 .../resolver/spring/dc/resolver/storedBase32.xml   | 20 +++++++++++++++++
 .../resolver/impl/ComputedIDDataConnector.java     | 25 +++++++++++++++++++++-
 .../ComputedPersistentIdGenerationStrategy.java    |  9 ++++++++
 .../schema/shibboleth-attribute-resolver.xsd       | 19 ++++++++++++++--
 8 files changed, 129 insertions(+), 4 deletions(-)

diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/BaseComputedIDDataConnectorParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/BaseComputedIDDataConnectorParser.java
index 89bb5b3..5c4f05f 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/BaseComputedIDDataConnectorParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/BaseComputedIDDataConnectorParser.java
@@ -26,6 +26,7 @@ import javax.xml.namespace.QName;
 import net.shibboleth.idp.attribute.resolver.spring.BaseResolverPluginParser;
 import net.shibboleth.idp.attribute.resolver.spring.dc.AbstractDataConnectorParser;
 import net.shibboleth.idp.attribute.resolver.spring.impl.AttributeResolverNamespaceHandler;
+import net.shibboleth.idp.saml.nameid.impl.ComputedPersistentIdGenerationStrategy.Encoding;
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
 import net.shibboleth.utilities.java.support.xml.AttributeSupport;
@@ -53,6 +54,7 @@ public abstract class BaseComputedIDDataConnectorParser extends BaseResolverPlug
     /** Class logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(BaseComputedIDDataConnectorParser.class);
 
+// Checkstyle: MethodLength|CyclomaticComplexity OFF    
     /**
      * Parse the common definitions for {@link net.shibboleth.idp.saml.attribute.resolver.impl.ComputedIDDataConnector}
      * and {@link net.shibboleth.idp.saml.nameid.impl.StoredIDDataConnector}.
@@ -77,11 +79,23 @@ public abstract class BaseComputedIDDataConnectorParser extends BaseResolverPlug
             if (log.isDebugEnabled()) {
                 final QName otherQname =
                         new QName(DataConnectorNamespaceHandler.NAMESPACE,suppliedQname.getLocalPart(), "dc:");
-            log.debug("{} Deprecated Namespace element '{}' in {}, consider using' {}'",
+                log.debug("{} Deprecated Namespace element '{}' in {}, consider using' {}'",
                     getLogPrefix(), suppliedQname.toString(),
                     parserContext.getReaderContext().getResource().getDescription(), otherQname.toString());
             }
         }
+        
+        Encoding encoding = Encoding.BASE64;
+        if (config.hasAttributeNS(null, "encoding")) {
+            final String enc = StringSupport.trimOrNull(config.getAttributeNS(null, "encoding"));
+            if (enc != null) {
+                if ("BASE32".equals(enc)) {
+                    encoding = Encoding.BASE32;
+                } else if (!"BASE64".equals(enc)) {
+                    log.warn("{} Ignoring unknown encoding value '{}'", getLogPrefix(), enc);
+                }
+            }
+        }
 
         final String generatedAttribute;
         if (config.hasAttributeNS(null, "generatedAttributeID")) {
@@ -124,7 +138,10 @@ public abstract class BaseComputedIDDataConnectorParser extends BaseResolverPlug
         builder.addPropertyValue("generatedAttributeId", generatedAttribute);
         builder.addPropertyValue("sourceAttributeId", sourceAttribute);
         builder.addPropertyValue("salt", salt);
+        builder.addPropertyValue("encoding", encoding);
     }
+ // Checkstyle: MethodLength|CyclomaticComplexity ON
+    
     /**
      * return a string which is to be prepended to all log messages.
      * 
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ComputedIDDataConnectorParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ComputedIDDataConnectorParserTest.java
index 76e0001..eedf837 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ComputedIDDataConnectorParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ComputedIDDataConnectorParserTest.java
@@ -22,6 +22,7 @@ import net.shibboleth.ext.spring.util.SchemaTypeAwareXMLBeanDefinitionReader;
 import net.shibboleth.idp.attribute.resolver.spring.BaseAttributeDefinitionParserTest;
 import net.shibboleth.idp.attribute.resolver.spring.dc.impl.ComputedIDDataConnectorParser;
 import net.shibboleth.idp.saml.attribute.resolver.impl.ComputedIDDataConnector;
+import net.shibboleth.idp.saml.nameid.impl.ComputedPersistentIdGenerationStrategy.Encoding;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
 import org.springframework.context.support.GenericApplicationContext;
@@ -44,6 +45,7 @@ public class ComputedIDDataConnectorParserTest extends BaseAttributeDefinitionPa
         Assert.assertEquals(connector.getSourceAttributeId(), "theSourceRemainsTheSame");
         Assert.assertEquals(connector.getGeneratedAttributeId(), "jenny");
         Assert.assertEquals(connector.getSalt(), "abcdefghijklmnopqrst ".getBytes());
+        Assert.assertEquals(connector.getEncoding(), Encoding.BASE64);
 
         connector.initialize();
     }
@@ -55,10 +57,23 @@ public class ComputedIDDataConnectorParserTest extends BaseAttributeDefinitionPa
         Assert.assertEquals(connector.getSourceAttributeId(), "theSourceRemainsTheSame");
         Assert.assertEquals(connector.getGeneratedAttributeId(), "jenny");
         Assert.assertEquals(connector.getSalt(), "abcdefghijklmnopqrst ".getBytes());
+        Assert.assertEquals(connector.getEncoding(), Encoding.BASE64);
 
         connector.initialize();
     }
 
+    @Test public void resolverBase32() throws ComponentInitializationException {
+        final ComputedIDDataConnector connector = getDataConnector("resolver/computedBase32.xml", ComputedIDDataConnector.class);
+        
+        Assert.assertEquals(connector.getId(), "computed");
+        Assert.assertEquals(connector.getSourceAttributeId(), "theSourceRemainsTheSame");
+        Assert.assertEquals(connector.getGeneratedAttributeId(), "jenny");
+        Assert.assertEquals(connector.getSalt(), "abcdefghijklmnopqrst ".getBytes());
+        Assert.assertEquals(connector.getEncoding(), Encoding.BASE32);
+
+        connector.initialize();
+    }
+    
     @Test public void propertySalt()  {
         final String salt = "0123456789ABCDEF ";
 
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/StoredIDDataConnectorParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/StoredIDDataConnectorParserTest.java
index ad3521b..bb1aefc 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/StoredIDDataConnectorParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/StoredIDDataConnectorParserTest.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.resolver.spring.dc;
 import net.shibboleth.idp.attribute.resolver.spring.BaseAttributeDefinitionParserTest;
 import net.shibboleth.idp.attribute.resolver.spring.dc.impl.StoredIDDataConnectorParser;
 import net.shibboleth.idp.saml.attribute.resolver.impl.StoredIDDataConnector;
+import net.shibboleth.idp.saml.nameid.impl.ComputedPersistentIdGenerationStrategy.Encoding;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
 import org.bouncycastle.util.Arrays;
@@ -47,17 +48,30 @@ public class StoredIDDataConnectorParserTest extends BaseAttributeDefinitionPars
         final StoredIDDataConnector connector = getDataConnector("stored.xml", StoredIDDataConnector.class);
         
         Assert.assertEquals(connector.getSalt(), "abcdefghijklmnopqrst".getBytes());
+        Assert.assertEquals(connector.getEncoding(), Encoding.BASE64);
         testIt(connector);
     }
 
     @Test public void withOutSalt() throws ComponentInitializationException {
         final StoredIDDataConnector connector = getDataConnector("storedNoSalt.xml", StoredIDDataConnector.class);
+        
+        Assert.assertNull(connector.getEncoding());
         testIt(connector);
     }
 
     @Test public void resolver() throws ComponentInitializationException {
         final StoredIDDataConnector connector = getDataConnector("resolver/stored.xml", StoredIDDataConnector.class);
         
+        Assert.assertNull(connector.getEncoding());
         testIt(connector);
     }
+
+    @Test public void resolverBase32() throws ComponentInitializationException {
+        final StoredIDDataConnector connector = getDataConnector("resolver/storedBase32.xml", StoredIDDataConnector.class);
+        
+        Assert.assertEquals(connector.getEncoding(), Encoding.BASE32);
+        testIt(connector);
+        
+    }
+
 }
\ No newline at end of file
diff --git a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/resolver/computedBase32.xml b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/resolver/computedBase32.xml
new file mode 100644
index 0000000..a5ea132
--- /dev/null
+++ b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/resolver/computedBase32.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<DataConnector id="computed"
+	xsi:type="ComputedId" xmlns="urn:mace:shibboleth:2.0:resolver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	
+	sourceAttributeID="theSourceRemainsTheSame"
+	generatedAttributeID="jenny"
+	salt="abcdefghijklmnopqrst "
+	encoding="BASE32"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:resolver http://shibboleth.net/schema/idp/shibboleth-attribute-resolver.xsd">
+    <FailoverDataConnector ref="2123"/>
+    <Dependency ref="321"/>
+</DataConnector>
diff --git a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/resolver/storedBase32.xml b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/resolver/storedBase32.xml
new file mode 100644
index 0000000..53f6d11
--- /dev/null
+++ b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/resolver/storedBase32.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<DataConnector id="stored" xsi:type="StoredId" 
+    xmlns="urn:mace:shibboleth:2.0:resolver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	
+    failFast="false"
+    queryTimeout="PT5S"
+    transactionRetries="5"
+    retryableErrors="25000 25001"
+	sourceAttributeID="theSourceRemainsTheSame"
+	generatedAttributeID="jenny"
+	salt="abcdefghijklmnopqrst"
+	encoding="BASE32"
+	
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:resolver http://shibboleth.net/schema/idp/shibboleth-attribute-resolver.xsd">
+
+    <ApplicationManagedConnection
+        jdbcDriver="org.hsqldb.jdbc.JDBCDriver"
+        jdbcURL="jdbc:hsqldb:mem:RDBMSDataConnectorStore" />
+        
+</DataConnector>
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/ComputedIDDataConnector.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/ComputedIDDataConnector.java
index 7c9ac0f..ebc8dc7 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/ComputedIDDataConnector.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/ComputedIDDataConnector.java
@@ -28,6 +28,7 @@ import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
 import net.shibboleth.idp.saml.nameid.impl.ComputedPersistentIdGenerationStrategy;
+import net.shibboleth.idp.saml.nameid.impl.ComputedPersistentIdGenerationStrategy.Encoding;
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
@@ -93,7 +94,7 @@ public class ComputedIDDataConnector extends AbstractPersistentIdDataConnector {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         
         if (null != salt) {
-            log.debug("{} Salt set (secret is logged at TRACE)");
+            log.debug("{} Salt set (secret is logged at TRACE)", getLogPrefix());
             log.trace("{} Salt set as bytes to {}", getLogPrefix(), Arrays.toString(salt));
             idStrategy.setSalt(salt);
         } else {
@@ -116,6 +117,28 @@ public class ComputedIDDataConnector extends AbstractPersistentIdDataConnector {
         }
     }
 
+    /**
+     * Get the post-digest encoding to use.
+     * 
+     * @return post-digest encoding
+     */
+    @Nullable public Encoding getEncoding() {
+        if (null == idStrategy) {
+            return null;
+        }
+        return idStrategy.getEncoding();
+    }
+    
+    /**
+     * Set the post-digest encoding to use.
+     * 
+     * @param enc encoding
+     */
+    public void setEncoding(@Nonnull final Encoding enc) {
+        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        
+        idStrategy.setEncoding(enc);
+    }    
 
     /**
      * Set the JCE algorithm name of the digest algorithm to use (default is SHA).
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/ComputedPersistentIdGenerationStrategy.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/ComputedPersistentIdGenerationStrategy.java
index a8b39f9..172dfb4 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/ComputedPersistentIdGenerationStrategy.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/ComputedPersistentIdGenerationStrategy.java
@@ -127,6 +127,15 @@ public class ComputedPersistentIdGenerationStrategy extends AbstractInitializabl
     }
     
     /**
+     * Get the post-digest encoding to use.
+     * 
+     * @return post-digest encoding
+     */
+    @Nonnull public Encoding getEncoding() {
+        return encoding;
+    }
+    
+    /**
      * Set the post-digest encoding to use.
      * 
      * @param enc encoding
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 1891b9e..05cadbf 100644
--- a/idp-schema/src/main/resources/schema/shibboleth-attribute-resolver.xsd
+++ b/idp-schema/src/main/resources/schema/shibboleth-attribute-resolver.xsd
@@ -1,7 +1,7 @@
 <?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" elementFormDefault="qualified"
-    version="3.0">
+    version="3.3.2">
 
     <import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd" />
     <import namespace="urn:mace:shibboleth:2.0:security" schemaLocation="http://shibboleth.net/schema/idp/shibboleth-security.xsd"/>
@@ -827,7 +827,8 @@
     <complexType name="ComputedId">
         <annotation>
             <documentation>
-                An ID created by taking the SHA-1 hash of the requesting entity's ID, an attribute value (usually a user identifier), and a salt.
+                An ID created by taking the SHA-1 hash of the requesting entity's ID,
+                an attribute value (usually a user identifier), and a salt.
             </documentation>
         </annotation>
         <complexContent>
@@ -859,6 +860,13 @@
                         </documentation>
                     </annotation>
                 </attribute>
+                <attribute name="encoding" type="string">
+                    <annotation>
+                        <documentation>
+                            The binary-to-textual encoding used to convert the hash into a usable value.
+                        </documentation>
+                    </annotation>
+                </attribute>
             </extension>
         </complexContent>
     </complexType>
@@ -1351,6 +1359,13 @@
                         </documentation>
                     </annotation>
                 </attribute>
+                <attribute name="encoding" type="string">
+                    <annotation>
+                        <documentation>
+                            The binary-to-textual encoding used to convert the hash into a usable value.
+                        </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