[java-identity-provider] branch master updated: IDP-1301 - Expose Entity Attributes by default to Velocity Templates

Scott Cantor cantor.2 at osu.edu
Mon Dec 16 20:34:18 EST 2019


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

scantor 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=bd581f56fa3d57534a75ca32273b61dbd61b0b07

The following commit(s) were added to refs/heads/master by this push:
       new  bd581f5   IDP-1301 - Expose Entity Attributes by default to Velocity Templates
bd581f5 is described below

commit bd581f56fa3d57534a75ca32273b61dbd61b0b07
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Mon Dec 16 19:34:14 2019 -0600

    IDP-1301 - Expose Entity Attributes by default to Velocity Templates
    
    https://issues.shibboleth.net/jira/browse/IDP-1301
---
 .../idp/attribute/AttributesMapContainer.java      | 46 ++++++++++++++++++++--
 .../spring/AttributeMappingNodeProcessorTest.java  |  4 ++
 .../idp/ui/context/RelyingPartyUIContext.java      | 35 ++++++++++++++++
 3 files changed, 81 insertions(+), 4 deletions(-)

diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java
index b39c52f..aac2996 100644
--- a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java
@@ -17,9 +17,22 @@
 
 package net.shibboleth.idp.attribute;
 
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
 import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import com.google.common.collect.Multimap;
 
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotLive;
+import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
+
 /**
  * Container for decoded attributes. This gives us a distinguished class to look for in the
  * {@link org.opensaml.core.xml.XMLObject#getObjectMetadata()}.
@@ -27,20 +40,45 @@ import com.google.common.collect.Multimap;
 public final class AttributesMapContainer implements Supplier<Multimap<String,IdPAttribute>> {
 
     /** The map we are encapsulating.*/
-    private final Multimap<String,IdPAttribute> providedValue;
+    @Nullable @NonnullElements private final Multimap<String,IdPAttribute> providedValue;
 
     /**
      * Constructor.
      * 
      * @param value the value to return.
      */
-    public AttributesMapContainer(final Multimap<String,IdPAttribute> value) {
+    public AttributesMapContainer(@Nullable @NonnullElements final Multimap<String,IdPAttribute> value) {
         providedValue = value;
     }
 
     /** {@inheritDoc} */
-    @Override public Multimap<String,IdPAttribute> get() {
+    @Override
+    @Nullable @NonnullElements public Multimap<String,IdPAttribute> get() {
         return providedValue;
     }
 
-}
+    /**
+     * Shorthand method that returns a collapsed copy of the String values of a given
+     * IdPAttribute in the container, or an empty collection. 
+     * 
+     * @param id    attribute ID
+     * 
+     * @return unmodifiable collection of string values
+     */
+    @Nonnull @NonnullElements @NotLive @Unmodifiable public Collection<String> getStringValues(
+            @Nonnull @NotEmpty final String id) {
+        
+        if (providedValue != null) {
+            return providedValue.get(id)
+                    .stream()
+                    .map(IdPAttribute::getValues)
+                    .flatMap(List::stream)
+                    .filter(StringAttributeValue.class::isInstance)
+                    .map(StringAttributeValue.class::cast)
+                    .map(StringAttributeValue::getValue)
+                    .collect(Collectors.toUnmodifiableList());
+        }
+        return Collections.emptyList();
+    }
+    
+}
\ No newline at end of file
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java
index 063703d..d50f1ac 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java
@@ -21,6 +21,7 @@ import static org.testng.Assert.*;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 
 import org.opensaml.core.xml.XMLObjectBaseTestCase;
@@ -122,6 +123,9 @@ public class AttributeMappingNodeProcessorTest extends XMLObjectBaseTestCase {
         StringAttributeValue sav = (StringAttributeValue) attr.getValues().iterator().next();
 
         assertEquals(sav.getValue(), "http://id.incommon.org/category/research-and-scholarship");
+        
+        assertEquals(container.getStringValues("http://macedir.org/entity-category"),
+                Collections.singletonList("http://id.incommon.org/category/research-and-scholarship"));
     }
 
     @Test public void requiredAttributes() throws FilterException {
diff --git a/idp-ui/src/main/java/net/shibboleth/idp/ui/context/RelyingPartyUIContext.java b/idp-ui/src/main/java/net/shibboleth/idp/ui/context/RelyingPartyUIContext.java
index 9853893..6fa6bf9 100644
--- a/idp-ui/src/main/java/net/shibboleth/idp/ui/context/RelyingPartyUIContext.java
+++ b/idp-ui/src/main/java/net/shibboleth/idp/ui/context/RelyingPartyUIContext.java
@@ -19,7 +19,9 @@ package net.shibboleth.idp.ui.context;
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
@@ -30,6 +32,7 @@ import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import org.opensaml.core.xml.XMLObject;
 import org.opensaml.messaging.context.BaseContext;
 import org.opensaml.saml.ext.saml2mdui.Logo;
 import org.opensaml.saml.ext.saml2mdui.UIInfo;
@@ -42,11 +45,14 @@ import org.opensaml.saml.saml2.metadata.SPSSODescriptor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import net.shibboleth.idp.attribute.AttributesMapContainer;
 import net.shibboleth.idp.saml.metadata.ACSUIInfo;
 import net.shibboleth.idp.saml.metadata.IdPUIInfo;
 import net.shibboleth.idp.saml.metadata.OrganizationUIInfo;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotLive;
+import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 import net.shibboleth.utilities.java.support.primitive.DeprecationSupport;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
@@ -127,6 +133,35 @@ public final class RelyingPartyUIContext extends BaseContext {
     }
 
     /**
+     * Shorthand method that returns a collapsed copy of the String values of a given
+     * mapped Entity Attribute in the metadata, or an empty collection. 
+     * 
+     * @param id    attribute ID
+     * 
+     * @return unmodifiable collection of string values
+     * 
+     * @since 4.0.0
+     */
+    @Nonnull @NonnullElements @NotLive @Unmodifiable public Collection<String> getEntityAttributeStringValues(
+            @Nonnull @NotEmpty final String id) {
+        
+        XMLObject object = getRPEntityDescriptor(); 
+        if (object == null) {
+            return Collections.emptyList();
+        }
+        
+        final List<String> accumulator = new ArrayList<>();
+        
+        while (object != null) {
+            object.getObjectMetadata().get(AttributesMapContainer.class).forEach(
+                    c -> accumulator.addAll(c.getStringValues(id)));
+            object = object.getParent();
+        }
+
+        return List.copyOf(accumulator);
+    }
+    
+    /**
      * Get the {@link ACSUIInfo} for the request.
      * 
      * @return Returns the RP's {@link ACSUIInfo}.

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


More information about the commits mailing list