[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