[java-identity-provider] branch master updated: Add inline scripting to PredicateFilter.

Scott Cantor cantor.2 at osu.edu
Wed May 10 13:44:17 EDT 2017


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=c77539f119c5e05a8b7264ecc07e54f64f84ee38

The following commit(s) were added to refs/heads/master by this push:
       new  c77539f   Add inline scripting to PredicateFilter.
c77539f is described below

commit c77539f119c5e05a8b7264ecc07e54f64f84ee38
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed May 10 13:44:15 2017 -0400

    Add inline scripting to PredicateFilter.
---
 .../filter/impl/PredicateFilterParser.java         | 47 ++++++++++++++++++++--
 .../metadata/filter/PredicateFilterParserTest.java | 26 ++++++++++--
 .../metadata/filter/predicateScript.xml            | 12 ++++++
 .../metadata/filter/predicateScriptOr.xml          | 15 +++++++
 .../main/resources/schema/shibboleth-metadata.xsd  |  8 ++++
 5 files changed, 101 insertions(+), 7 deletions(-)

diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/PredicateFilterParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/PredicateFilterParser.java
index 896dc66..4eeddd0 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/PredicateFilterParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/PredicateFilterParser.java
@@ -25,6 +25,8 @@ import javax.xml.namespace.QName;
 
 import net.shibboleth.ext.spring.util.SpringSupport;
 import net.shibboleth.idp.profile.spring.relyingparty.metadata.AbstractMetadataProviderParser;
+import net.shibboleth.idp.profile.spring.relyingparty.metadata.ScriptTypeBeanParser;
+import net.shibboleth.utilities.java.support.logic.ScriptedPredicate;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
 import net.shibboleth.utilities.java.support.xml.ElementSupport;
 
@@ -84,7 +86,7 @@ public class PredicateFilterParser extends AbstractSingleBeanDefinitionParser {
         }
     }
 
-    // Checkstyle: CyclomaticComplexity OFF
+// Checkstyle: CyclomaticComplexity OFF
     /**
      * Parser custom element content into a {@link com.google.common.base.Predicate} to pass to the filter constructor.
      * 
@@ -98,6 +100,7 @@ public class PredicateFilterParser extends AbstractSingleBeanDefinitionParser {
         final BeanDefinitionBuilder entityIdPredicateBuilder = parseEntityPredicate(element);
         final BeanDefinitionBuilder groupPredicateBuilder = parseGroupPredicate(element);
         final BeanDefinitionBuilder tagPredicateBuilder = parseTagPredicate(element);
+        final BeanDefinitionBuilder scriptPredicateBuilder = parseScripts(element);
 
         int count = 0;
         if (entityIdPredicateBuilder != null) {
@@ -109,16 +112,21 @@ public class PredicateFilterParser extends AbstractSingleBeanDefinitionParser {
         if (tagPredicateBuilder != null) {
             count++;
         }
+        if (scriptPredicateBuilder != null) {
+            count++;
+        }
 
         if (count == 0) {
-            throw new BeanCreationException("No Entity, Group, or Tag element found");
+            throw new BeanCreationException("No Entity, Group, Tag, or ConditionScript element found");
         } else if (count == 1) {
             if (entityIdPredicateBuilder != null) {
                 return entityIdPredicateBuilder.getBeanDefinition();
             } else if (groupPredicateBuilder != null) {
                 return groupPredicateBuilder.getBeanDefinition();
-            } else {
+            } else if (tagPredicateBuilder != null) {
                 return tagPredicateBuilder.getBeanDefinition();
+            } else {
+                return scriptPredicateBuilder.getBeanDefinition();
             }
         } else {
             final BeanDefinitionBuilder orBuilder = BeanDefinitionBuilder.rootBeanDefinition(Predicates.class, "or");
@@ -132,12 +140,15 @@ public class PredicateFilterParser extends AbstractSingleBeanDefinitionParser {
             if (tagPredicateBuilder != null) {
                 managedList.add(tagPredicateBuilder.getBeanDefinition());
             }
+            if (scriptPredicateBuilder != null) {
+                managedList.add(scriptPredicateBuilder.getBeanDefinition());
+            }
             orBuilder.addConstructorArgValue(managedList);
             return orBuilder.getBeanDefinition();
         }
     }
 
-    // Checkstyle: CyclomaticComplexity ON
+// Checkstyle: CyclomaticComplexity ON
 
     /**
      * Parse Entity elements into a builder for an {@link EntityIdPredicate}.
@@ -219,9 +230,37 @@ public class PredicateFilterParser extends AbstractSingleBeanDefinitionParser {
 
         return null;
     }
+    
 
+    /**
+     * Parse ConditionScript elements into a builder, wrapped in an OR as necessary.
+     * 
+     * @param element root element to parse under
+     * 
+     * @return builder for the predicate, or null if none needed
+     */
+    @Nullable public BeanDefinitionBuilder parseScripts(@Nonnull final Element element) {
+        final List<Element> scriptList =
+                ElementSupport.getChildElementsByTagNameNS(element, AbstractMetadataProviderParser.METADATA_NAMESPACE,
+                        "ConditionScript");
+        if (scriptList.isEmpty()) {
+            return null;
+        } else if (scriptList.size() == 1) {
+            return ScriptTypeBeanParser.parseScriptType(ScriptedPredicate.class, scriptList.get(0));
+        } else {
+            final BeanDefinitionBuilder orBuilder = BeanDefinitionBuilder.rootBeanDefinition(Predicates.class, "or");
+            final ManagedList<BeanDefinition> managedList = new ManagedList<>(scriptList.size());
+            for (final Element e : scriptList) {
+                managedList.add(ScriptTypeBeanParser.parseScriptType(ScriptedPredicate.class, e).getBeanDefinition());
+            }
+            orBuilder.addConstructorArgValue(managedList);
+            return orBuilder;
+        }
+    }
+    
     /** {@inheritDoc} */
     @Override protected boolean shouldGenerateId() {
         return true;
     }
+    
 }
\ No newline at end of file
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/PredicateFilterParserTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/PredicateFilterParserTest.java
index 8a1b2fb..5f72790 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/PredicateFilterParserTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/PredicateFilterParserTest.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.profile.spring.relyingparty.metadata.filter;
 import java.io.IOException;
 
 import net.shibboleth.idp.profile.spring.relyingparty.metadata.AbstractMetadataParserTest;
+import net.shibboleth.utilities.java.support.logic.ScriptedPredicate;
 
 import org.opensaml.saml.common.profile.logic.EntityAttributesPredicate;
 import org.opensaml.saml.common.profile.logic.EntityAttributesPredicate.Candidate;
@@ -32,6 +33,8 @@ import org.springframework.beans.factory.BeanDefinitionStoreException;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import com.google.common.base.Predicates;
+
 /**
  * Test for parser for PredicateFilter filter.
  */
@@ -93,14 +96,31 @@ public class PredicateFilterParserTest extends AbstractMetadataParserTest {
     }
 
     @Test
+    public void script() throws IOException {
+        final PredicateFilter filter = getBean(PredicateFilter.class, "filter/predicateScript.xml");
+        Assert.assertNotNull(filter);
+        Assert.assertEquals(filter.getDirection(), Direction.INCLUDE);
+        
+        Assert.assertTrue(filter.getCondition() instanceof ScriptedPredicate);
+        Assert.assertTrue(filter.getCondition().apply(null));
+    }
+
+    @Test
+    public void script2() throws IOException {
+        final PredicateFilter filter = getBean(PredicateFilter.class, "filter/predicateScriptOr.xml");
+        Assert.assertNotNull(filter);
+        Assert.assertEquals(filter.getDirection(), Direction.INCLUDE);
+        Assert.assertSame(filter.getCondition().getClass(), Predicates.or(Predicates.alwaysTrue()).getClass());
+        Assert.assertTrue(filter.getCondition().apply(null));
+    }
+
+    @Test
     public void or() throws IOException {
         final PredicateFilter filter = getBean(PredicateFilter.class, "filter/predicateOr.xml");
         Assert.assertNotNull(filter);
         Assert.assertEquals(filter.getDirection(), Direction.EXCLUDE);
         Assert.assertNotNull(filter.getCondition());
-        Assert.assertFalse(filter.getCondition() instanceof EntityIdPredicate);
-        Assert.assertFalse(filter.getCondition() instanceof EntityGroupNamePredicate);
-        Assert.assertFalse(filter.getCondition() instanceof EntityAttributesPredicate);
+        Assert.assertSame(filter.getCondition().getClass(), Predicates.or(Predicates.alwaysTrue()).getClass());
     }
 
 }
\ No newline at end of file
diff --git a/idp-profile-spring/src/test/resources/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/predicateScript.xml b/idp-profile-spring/src/test/resources/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/predicateScript.xml
new file mode 100644
index 0000000..14713e6
--- /dev/null
+++ b/idp-profile-spring/src/test/resources/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/predicateScript.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata:MetadataFilter xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
+	xmlns:metadata="urn:mace:shibboleth:2.0:metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd
+                       urn:oasis:names:tc:SAML:2.0:metadata http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd"
+
+	xsi:type="metadata:Predicate" direction="include" removeEmptyEntitiesDescriptors="false">
+    
+    <metadata:ConditionScript>
+        <metadata:Script>true</metadata:Script>
+    </metadata:ConditionScript>
+</metadata:MetadataFilter>
diff --git a/idp-profile-spring/src/test/resources/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/predicateScriptOr.xml b/idp-profile-spring/src/test/resources/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/predicateScriptOr.xml
new file mode 100644
index 0000000..de6d0a3
--- /dev/null
+++ b/idp-profile-spring/src/test/resources/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/predicateScriptOr.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata:MetadataFilter xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
+	xmlns:metadata="urn:mace:shibboleth:2.0:metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd
+                       urn:oasis:names:tc:SAML:2.0:metadata http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd"
+
+	xsi:type="metadata:Predicate" direction="include" removeEmptyEntitiesDescriptors="false">
+    
+    <metadata:ConditionScript>
+        <metadata:Script>false</metadata:Script>
+    </metadata:ConditionScript>
+    <metadata:ConditionScript>
+        <metadata:Script>true</metadata:Script>
+    </metadata:ConditionScript>
+</metadata:MetadataFilter>
diff --git a/idp-schema/src/main/resources/schema/shibboleth-metadata.xsd b/idp-schema/src/main/resources/schema/shibboleth-metadata.xsd
index f1ec60e..7a9b96d 100644
--- a/idp-schema/src/main/resources/schema/shibboleth-metadata.xsd
+++ b/idp-schema/src/main/resources/schema/shibboleth-metadata.xsd
@@ -1277,6 +1277,14 @@
                             <attribute name="nameFormat" type="string"/>
                         </complexType>
                     </element>
+                    <element name="ConditionScript" type="shibmd:ScriptType">
+                        <annotation>
+                            <documentation>
+                                A script implementing Predicate<EntityDescriptor> to identify one
+                                or more EntityDescriptors to which to apply the filter.
+                            </documentation>
+                        </annotation>
+                    </element>
                 </choice>
                 <attribute name="direction" type="string" use="required">
                     <annotation>

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


More information about the commits mailing list