[java-shib-metadata] branch main updated: JSMD-6 - Metadata filter wiring should support an EntityRegex condition

Scott Cantor cantor.2 at osu.edu
Mon Jan 29 20:43:45 UTC 2024


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

scantor pushed a commit to branch main
in repository java-shib-metadata.

View the commit online:
http://git.shibboleth.net/view/?p=java-shib-metadata.git;a=commit;h=b82e71424e9e5d1a244c7341147b9b296eefdb70

The following commit(s) were added to refs/heads/main by this push:
     new b82e7142 JSMD-6 - Metadata filter wiring should support an EntityRegex condition
b82e7142 is described below

commit b82e71424e9e5d1a244c7341147b9b296eefdb70
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Mon Jan 29 15:43:38 2024 -0500

    JSMD-6 - Metadata filter wiring should support an EntityRegex condition
    
    https://shibboleth.atlassian.net/browse/JSMD-6
    
    Added to 4 extant filters that support the Entity condition syntax.
---
 .../metadata/filter/AlgorithmFilterParser.java     |  9 +++
 .../filter/EntityAttributesFilterParser.java       |  9 +++
 .../metadata/filter/NameIDFormatFilterParser.java  |  9 +++
 .../metadata/filter/PredicateFilterParser.java     | 48 ++++++++++++++-
 .../main/resources/schema/shibboleth-metadata.xsd  | 52 +++++++++++++----
 .../metadata/filter/AlgorithmFilterParserTest.java |  7 ++-
 .../filter/EntityAttributesFilterParserTest.java   |  5 ++
 .../filter/NameIDFormatFilterParserTest.java       |  5 ++
 .../metadata/filter/PredicateFilterParserTest.java | 10 ++++
 .../spring/metadata/filter/algorithmBeans.xml      | 14 -----
 .../spring/metadata/filter/algorithmRegex.xml      | 68 ++++++++++++++++++++++
 .../metadata/filter/entityAttributesRegex.xml      | 21 +++++++
 .../spring/metadata/filter/nameIDFormatRegex.xml   | 44 ++++++++++++++
 .../metadata/filter/predicateEntityRegex.xml       | 10 ++++
 14 files changed, 284 insertions(+), 27 deletions(-)

diff --git a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/AlgorithmFilterParser.java b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/AlgorithmFilterParser.java
index 05380099..76d62d06 100644
--- a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/AlgorithmFilterParser.java
+++ b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/AlgorithmFilterParser.java
@@ -25,6 +25,7 @@ import org.opensaml.core.xml.io.Unmarshaller;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
 import org.opensaml.saml.common.profile.logic.EntityIdPredicate;
+import org.opensaml.saml.common.profile.logic.EntityRegexPredicate;
 import org.opensaml.saml.ext.saml2alg.DigestMethod;
 import org.opensaml.saml.ext.saml2alg.SigningMethod;
 import org.opensaml.saml.metadata.resolver.filter.impl.AlgorithmFilter;
@@ -131,6 +132,14 @@ public class AlgorithmFilterParser extends AbstractMetadataFilterParser {
                 } catch (final UnmarshallingException e) {
                     log.error("Error unmarshalling EncryptionMethod element", e);
                 }
+            } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
+                    "EntityRegex")) {
+                final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
+                forRule.addAll(accumulator);
+                final BeanDefinitionBuilder expBuilder =
+                        BeanDefinitionBuilder.genericBeanDefinition(EntityRegexPredicate.class);
+                expBuilder.addConstructorArgValue(ElementSupport.getElementContentAsString(child));
+                ruleMap.put(expBuilder.getBeanDefinition(), forRule);
             } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
                     "ConditionRef")) {
                 final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
diff --git a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/EntityAttributesFilterParser.java b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/EntityAttributesFilterParser.java
index b992c61c..da17d25c 100644
--- a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/EntityAttributesFilterParser.java
+++ b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/EntityAttributesFilterParser.java
@@ -25,6 +25,7 @@ import org.opensaml.core.xml.io.Unmarshaller;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
 import org.opensaml.saml.common.profile.logic.EntityIdPredicate;
+import org.opensaml.saml.common.profile.logic.EntityRegexPredicate;
 import org.opensaml.saml.metadata.resolver.filter.impl.EntityAttributesFilter;
 import org.opensaml.saml.saml2.core.Attribute;
 import org.slf4j.Logger;
@@ -139,6 +140,14 @@ public class EntityAttributesFilterParser extends AbstractMetadataFilterParser {
                 forRule.addAll(accumulator);
                 ruleMap.put(ScriptTypeBeanParser.parseScriptType(ScriptedPredicate.class, child).getBeanDefinition(),
                         forRule);
+            } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
+                    "EntityRegex")) {
+                final ManagedList<Attribute> forRule = new ManagedList<>(accumulator.size());
+                forRule.addAll(accumulator);
+                final BeanDefinitionBuilder regexBuilder =
+                        BeanDefinitionBuilder.genericBeanDefinition(EntityRegexPredicate.class);
+                regexBuilder.addConstructorArgValue(ElementSupport.getElementContentAsString(child));
+                ruleMap.put(regexBuilder.getBeanDefinition(), forRule);
             }
             child = ElementSupport.getNextSiblingElement(child);
         }
diff --git a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/NameIDFormatFilterParser.java b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/NameIDFormatFilterParser.java
index ab4803a9..84b47730 100644
--- a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/NameIDFormatFilterParser.java
+++ b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/NameIDFormatFilterParser.java
@@ -21,6 +21,7 @@ import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.saml.common.profile.logic.EntityIdPredicate;
+import org.opensaml.saml.common.profile.logic.EntityRegexPredicate;
 import org.opensaml.saml.metadata.resolver.filter.impl.NameIDFormatFilter;
 import org.springframework.beans.factory.config.RuntimeBeanReference;
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
@@ -105,6 +106,14 @@ public class NameIDFormatFilterParser extends AbstractMetadataFilterParser {
                 forRule.addAll(accumulator);
                 ruleMap.put(ScriptTypeBeanParser.parseScriptType(ScriptedPredicate.class, child).getBeanDefinition(),
                         forRule);
+            } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
+                    "EntityRegex")) {
+                final ManagedList<String> forRule = new ManagedList<>(accumulator.size());
+                forRule.addAll(accumulator);
+                final BeanDefinitionBuilder regexBuilder =
+                        BeanDefinitionBuilder.genericBeanDefinition(EntityRegexPredicate.class);
+                regexBuilder.addConstructorArgValue(ElementSupport.getElementContentAsString(child));
+                ruleMap.put(regexBuilder.getBeanDefinition(), forRule);
             }
             
             child = ElementSupport.getNextSiblingElement(child);
diff --git a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/PredicateFilterParser.java b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/PredicateFilterParser.java
index d4443020..265a6cf5 100644
--- a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/PredicateFilterParser.java
+++ b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/PredicateFilterParser.java
@@ -25,6 +25,7 @@ import org.opensaml.saml.common.profile.logic.EntityAttributesPredicate;
 import org.opensaml.saml.common.profile.logic.EntityAttributesPredicate.Candidate;
 import org.opensaml.saml.common.profile.logic.EntityGroupNamePredicate;
 import org.opensaml.saml.common.profile.logic.EntityIdPredicate;
+import org.opensaml.saml.common.profile.logic.EntityRegexPredicate;
 import org.opensaml.saml.metadata.resolver.filter.impl.PredicateFilter;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.BeanCreationException;
@@ -115,6 +116,7 @@ public class PredicateFilterParser extends AbstractMetadataFilterParser {
 
         // Track which predicates have to be built.
         final BeanDefinitionBuilder entityIdPredicateBuilder = parseEntityPredicate(element);
+        final BeanDefinitionBuilder entityRegexPredicateBuilder = parseEntityRegexPredicate(element);
         final BeanDefinitionBuilder groupPredicateBuilder = parseGroupPredicate(element);
         final BeanDefinitionBuilder tagPredicateBuilder = parseTagPredicate(element);
         final BeanDefinitionBuilder mappedTagPredicateBuilder = parseMappedTagPredicate(element);
@@ -124,6 +126,9 @@ public class PredicateFilterParser extends AbstractMetadataFilterParser {
         if (entityIdPredicateBuilder != null) {
             count++;
         }
+        if (entityRegexPredicateBuilder != null) {
+            count++;
+        }
         if (groupPredicateBuilder != null) {
             count++;
         }
@@ -138,10 +143,12 @@ public class PredicateFilterParser extends AbstractMetadataFilterParser {
         }
 
         if (count == 0) {
-            throw new BeanCreationException("No Entity, Group, Tag, or ConditionScript element found");
+            throw new BeanCreationException("No Entity, EntityRegex, Group, Tag, or ConditionScript element found");
         } else if (count == 1) {
             if (entityIdPredicateBuilder != null) {
                 return entityIdPredicateBuilder.getBeanDefinition();
+            } else if (entityRegexPredicateBuilder != null) {
+                return entityRegexPredicateBuilder.getBeanDefinition();
             } else if (groupPredicateBuilder != null) {
                 return groupPredicateBuilder.getBeanDefinition();
             } else if (tagPredicateBuilder != null) {
@@ -151,7 +158,7 @@ public class PredicateFilterParser extends AbstractMetadataFilterParser {
             } else if (scriptPredicateBuilder != null) {
                 return scriptPredicateBuilder.getBeanDefinition();
             } else {
-                throw new BeanCreationException("No Entity, Group, Tag, or ConditionScript element found");
+                throw new BeanCreationException("No Entity, EntityRegex, Group, Tag, or ConditionScript element found");
             }
         } else {
             final BeanDefinitionBuilder orBuilder =
@@ -160,6 +167,9 @@ public class PredicateFilterParser extends AbstractMetadataFilterParser {
             if (entityIdPredicateBuilder != null) {
                 managedList.add(entityIdPredicateBuilder.getBeanDefinition());
             }
+            if (entityRegexPredicateBuilder != null) {
+                managedList.add(entityRegexPredicateBuilder.getBeanDefinition());
+            }
             if (groupPredicateBuilder != null) {
                 managedList.add(groupPredicateBuilder.getBeanDefinition());
             }
@@ -200,6 +210,40 @@ public class PredicateFilterParser extends AbstractMetadataFilterParser {
         return null;
     }
 
+    /**
+     * Parse EntityRegex elements into a builder for an {@link EntityRegexPredicate}.
+     * 
+     * @param element root element to parse under
+     * 
+     * @return builder for the predicate, or null if none needed
+     */
+    @Nullable public BeanDefinitionBuilder parseEntityRegexPredicate(@Nonnull final Element element) {
+        final List<Element> expList =
+                ElementSupport.getChildElementsByTagNameNS(element, AbstractMetadataProviderParser.METADATA_NAMESPACE,
+                        "EntityRegex");
+        if (expList.isEmpty()) {
+            return null;
+        } else if (expList.size() == 1) {
+            final BeanDefinitionBuilder builder =
+                    BeanDefinitionBuilder.genericBeanDefinition(EntityRegexPredicate.class);
+            builder.addConstructorArgValue(ElementSupport.getElementContentAsString(expList.get(0)));
+            return builder;
+        } else {
+            final BeanDefinitionBuilder orBuilder =
+                    BeanDefinitionBuilder.rootBeanDefinition(PredicateSupport.class, "or");
+            final ManagedList<BeanDefinition> managedList = new ManagedList<>(expList.size());
+            for (final Element e : expList) {
+                assert e != null;
+                final BeanDefinitionBuilder builder =
+                        BeanDefinitionBuilder.genericBeanDefinition(EntityRegexPredicate.class);
+                builder.addConstructorArgValue(ElementSupport.getElementContentAsString(e));
+                managedList.add(builder.getBeanDefinition());
+            }
+            orBuilder.addConstructorArgValue(managedList);
+            return orBuilder;
+        }
+    }
+    
     /**
      * Parse Group elements into a builder for an {@link EntityGroupNamePredicate}.
      * 
diff --git a/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd b/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd
index 83bd4c1d..7798f3ba 100644
--- a/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd
+++ b/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd
@@ -1082,7 +1082,15 @@
                             <annotation>
                                 <documentation>
                                     An entityID to identify an EntityDescriptor to add all the preceding
-                                    Attribute elements to. 
+                                    Attribute elements to.
+                                </documentation>
+                            </annotation>
+                        </element>
+                        <element name="EntityRegex" type="shibmd:string">
+                            <annotation>
+                                <documentation>
+                                    A regular expression to apply to EntityDescriptor's entityID to add all the preceding
+                                    Attribute elements to.
                                 </documentation>
                             </annotation>
                         </element>
@@ -1090,7 +1098,7 @@
                             <annotation>
                                 <documentation>
                                     The ID of a Spring bean to inject as a condition Predicate to identify one
-                                    or more EntityDescriptors to add all the preceding Attribute elements to. 
+                                    or more EntityDescriptors to add all the preceding Attribute elements to.
                                 </documentation>
                             </annotation>
                         </element>
@@ -1098,7 +1106,7 @@
                             <annotation>
                                 <documentation>
                                     A script implementing Predicate<EntityDescriptor> to identify one
-                                    or more EntityDescriptors to add all the preceding Attribute elements to. 
+                                    or more EntityDescriptors to add all the preceding Attribute elements to.
                                 </documentation>
                             </annotation>
                         </element>
@@ -1135,11 +1143,19 @@
                             </documentation>
                         </annotation>
                     </element>
+                    <element name="EntityRegex" type="shibmd:string">
+                        <annotation>
+                            <documentation>
+                                A regular expression to apply to EntityDescriptor's entityID to add all the preceding
+                                Attribute elements to.
+                            </documentation>
+                        </annotation>
+                    </element>
                     <element name="ConditionRef" type="shibmd:string">
                         <annotation>
                             <documentation>
                                 The ID of a Spring bean to inject as a condition Predicate to identify one
-                                or more EntityDescriptors to add all the preceding NameIDFormat elements to. 
+                                or more EntityDescriptors to add all the preceding NameIDFormat elements to.
                             </documentation>
                         </annotation>
                     </element>
@@ -1147,7 +1163,7 @@
                         <annotation>
                             <documentation>
                                 A script implementing Predicate<EntityDescriptor> to identify one
-                                or more EntityDescriptors to add all the preceding Attribute elements to. 
+                                or more EntityDescriptors to add all the preceding Attribute elements to.
                             </documentation>
                         </annotation>
                     </element>
@@ -1181,14 +1197,22 @@
                     <element name="Entity" type="shibmd:string">
                         <annotation>
                             <documentation>
-                                An entityID to use in a predicate that matches on entityID. 
+                                An entityID to use in a predicate that matches on entityID.
+                            </documentation>
+                        </annotation>
+                    </element>
+                    <element name="EntityRegex" type="shibmd:string">
+                        <annotation>
+                            <documentation>
+                                A regular expression to apply to EntityDescriptor's entityID to add all the preceding
+                                Attribute elements to.
                             </documentation>
                         </annotation>
                     </element>
                     <element name="Group" type="shibmd:string">
                         <annotation>
                             <documentation>
-                                A name to use in a predicate that matches on EntitiesDescriptor group/containment. 
+                                A name to use in a predicate that matches on EntitiesDescriptor group/containment.
                             </documentation>
                         </annotation>
                     </element>
@@ -1282,7 +1306,15 @@
                             <annotation>
                                 <documentation>
                                     An entityID to identify an EntityDescriptor to add all the preceding
-                                    extension elements to. 
+                                    extension elements to.
+                                </documentation>
+                            </annotation>
+                        </element>
+                        <element name="EntityRegex" type="shibmd:string">
+                            <annotation>
+                                <documentation>
+                                    A regular expression to apply to EntityDescriptor's entityID to add all the preceding
+                                    Attribute elements to.
                                 </documentation>
                             </annotation>
                         </element>
@@ -1290,7 +1322,7 @@
                             <annotation>
                                 <documentation>
                                     The ID of a Spring bean to inject as a condition Predicate to identify one
-                                    or more EntityDescriptors to add all the preceding extension elements to. 
+                                    or more EntityDescriptors to add all the preceding extension elements to.
                                 </documentation>
                             </annotation>
                         </element>
@@ -1298,7 +1330,7 @@
                             <annotation>
                                 <documentation>
                                     A script implementing Predicate<EntityDescriptor> to identify one
-                                    or more EntityDescriptors to add all the preceding extension elements to. 
+                                    or more EntityDescriptors to add all the preceding extension elements to.
                                 </documentation>
                             </annotation>
                         </element>
diff --git a/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/AlgorithmFilterParserTest.java b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/AlgorithmFilterParserTest.java
index 0327f8bc..04043d7c 100644
--- a/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/AlgorithmFilterParserTest.java
+++ b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/AlgorithmFilterParserTest.java
@@ -46,7 +46,12 @@ public class AlgorithmFilterParserTest extends AbstractMetadataParserTest {
     
     @Test
     public void test() throws ResolverException, IOException {
-        doTest("filter/algorithm.xml", "filter/algorithmBeans.xml");
+        doTest("filter/algorithm.xml");
+    }
+
+    @Test
+    public void testRegex() throws ResolverException, IOException {
+        doTest("filter/algorithmRegex.xml");
     }
 
     @Test
diff --git a/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/EntityAttributesFilterParserTest.java b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/EntityAttributesFilterParserTest.java
index f7b70464..84504b94 100644
--- a/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/EntityAttributesFilterParserTest.java
+++ b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/EntityAttributesFilterParserTest.java
@@ -39,6 +39,11 @@ public class EntityAttributesFilterParserTest extends AbstractMetadataParserTest
         doTest("filter/entityAttributes.xml", "filter/entityAttributesBeans.xml");
     }
 
+    @Test
+    public void testRegex() throws ResolverException, IOException {
+        doTest("filter/entityAttributesRegex.xml", "filter/entityAttributesBeans.xml");
+    }
+
     @Test
     public void testFilterScript() throws ResolverException, IOException {
         doTest("filter/entityAttributesWithScript.xml", "filter/entityAttributesBeans.xml");
diff --git a/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/NameIDFormatFilterParserTest.java b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/NameIDFormatFilterParserTest.java
index 8d65518c..7dece2a7 100644
--- a/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/NameIDFormatFilterParserTest.java
+++ b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/NameIDFormatFilterParserTest.java
@@ -40,6 +40,11 @@ public class NameIDFormatFilterParserTest extends AbstractMetadataParserTest {
         doTest("filter/nameIDFormat.xml");
     }
 
+    @Test
+    public void testRegex() throws ResolverException, IOException {
+        doTest("filter/nameIDFormatRegex.xml");
+    }
+
     @Test
     public void testWithScript() throws ResolverException, IOException {
         doTest("filter/nameIDFormatWithScript.xml");
diff --git a/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/PredicateFilterParserTest.java b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/PredicateFilterParserTest.java
index e1e7a0be..95c0c5c2 100644
--- a/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/PredicateFilterParserTest.java
+++ b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/PredicateFilterParserTest.java
@@ -21,6 +21,7 @@ import org.opensaml.saml.common.profile.logic.EntityAttributesPredicate;
 import org.opensaml.saml.common.profile.logic.EntityAttributesPredicate.Candidate;
 import org.opensaml.saml.common.profile.logic.EntityGroupNamePredicate;
 import org.opensaml.saml.common.profile.logic.EntityIdPredicate;
+import org.opensaml.saml.common.profile.logic.EntityRegexPredicate;
 import org.opensaml.saml.metadata.resolver.MetadataResolver;
 import org.opensaml.saml.metadata.resolver.filter.impl.PredicateFilter;
 import org.opensaml.saml.metadata.resolver.filter.impl.PredicateFilter.Direction;
@@ -62,6 +63,15 @@ public class PredicateFilterParserTest extends AbstractMetadataParserTest {
         Assert.assertTrue(condition.getEntityIds().contains("urn:bar"));
     }
 
+    @Test
+    public void entityRegex() throws IOException {
+        final PredicateFilter filter = getBean(PredicateFilter.class, "filter/predicateEntityRegex.xml");
+        Assert.assertNotNull(filter);
+        Assert.assertEquals(filter.getDirection(), Direction.INCLUDE);
+        
+        final EntityRegexPredicate condition = (EntityRegexPredicate) filter.getCondition();
+    }
+
     @Test
     public void group() throws IOException {
         final PredicateFilter filter = getBean(PredicateFilter.class, "filter/predicateGroup.xml");
diff --git a/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/algorithmBeans.xml b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/algorithmBeans.xml
deleted file mode 100644
index 0fcb592f..00000000
--- a/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/algorithmBeans.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-    xmlns:context="http://www.springframework.org/schema/context"
-    xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"
-    xmlns:c="http://www.springframework.org/schema/c" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-
-    default-init-method="initialize" default-lazy-init="true">
-    
-    <bean id="predicate.AlwaysFalse" class="net.shibboleth.shared.logic.PredicateSupport" factory-method="alwaysFalse" />
-            
-</beans>
\ No newline at end of file
diff --git a/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/algorithmRegex.xml b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/algorithmRegex.xml
new file mode 100644
index 00000000..eea92426
--- /dev/null
+++ b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/algorithmRegex.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata:MetadataProvider xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
+	xmlns:metadata="urn:mace:shibboleth:2.0:metadata"
+    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
+    xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport"
+    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:assertion http://docs.oasis-open.org/security/saml/v2.0/saml-schema-assertion-2.0.xsd
+                       urn:oasis:names:tc:SAML:2.0:metadata http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd
+                       urn:oasis:names:tc:SAML:metadata:algsupport http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-metadata-algsupport-v1.0.xsd
+                       http://www.w3.org/2009/xmlenc11# http://www.w3.org/TR/2013/REC-xmlenc-core1-20130411/xenc-schema-11.xsd"
+    
+	failFastInitialization="false" requireValidMetadata="false"
+
+	id="algorithms" xsi:type="metadata:InlineMetadataProvider">
+    
+	<metadata:MetadataFilter xsi:type="metadata:Algorithm">
+	    <alg:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
+        <alg:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512" />
+	    <alg:SigningMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
+        <alg:SigningMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512" />
+        <EncryptionMethod Algorithm="http://www.w3.org/2009/xmlenc11#rsa-oaep">
+            <MGF xmlns="http://www.w3.org/2009/xmlenc11#"
+                Algorithm="http://www.w3.org/2009/xmlenc11#mgf1sha256" />
+            <DigestMethod xmlns="http://www.w3.org/2000/09/xmldsig#"
+                Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
+        </EncryptionMethod>
+        <metadata:EntityRegex>^https://sp(3|4)?\.example\.org/sp/shibboleth$</metadata:EntityRegex>
+    </metadata:MetadataFilter>
+
+    <EntitiesDescriptor Name="ukgroup">
+    	<EntityDescriptor
+    		entityID="https://sp.example.org/sp/shibboleth">
+    		<SPSSODescriptor
+    			protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
+    
+    			<AssertionConsumerService
+    				Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"
+    				Location="https://sp.example.org/Shibboleth.sso/SAML2/POST-SimpleSign"
+    				index="5" />
+    		</SPSSODescriptor>
+    	</EntityDescriptor>
+
+        <EntityDescriptor
+            entityID="https://sp2.example.org/sp/shibboleth">
+            <SPSSODescriptor
+                protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
+    
+                <AssertionConsumerService
+                    Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"
+                    Location="https://sp2.example.org/Shibboleth.sso/SAML2/POST-SimpleSign"
+                    index="5" />
+            </SPSSODescriptor>
+        </EntityDescriptor>
+
+        <EntityDescriptor
+            entityID="https://sp4.example.org/sp/shibboleth">
+            <SPSSODescriptor
+                protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
+    
+                <AssertionConsumerService
+                    Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"
+                    Location="https://sp4.example.org/Shibboleth.sso/SAML2/POST-SimpleSign"
+                    index="5" />
+            </SPSSODescriptor>
+        </EntityDescriptor>
+    </EntitiesDescriptor>
+</metadata:MetadataProvider>
diff --git a/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/entityAttributesRegex.xml b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/entityAttributesRegex.xml
new file mode 100644
index 00000000..4fd0baeb
--- /dev/null
+++ b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/entityAttributesRegex.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata:MetadataProvider xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
+	xmlns:metadata="urn:mace:shibboleth:2.0:metadata"
+    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
+    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:assertion http://docs.oasis-open.org/security/saml/v2.0/saml-schema-assertion-2.0.xsd"
+	failFastInitialization="false" requireValidMetadata="false"
+	id="entityAttributes" xsi:type="metadata:ResourceBackedMetadataProvider" resourceRef="MetadataResource">
+    
+	<metadata:MetadataFilter xsi:type="metadata:EntityAttributes">
+        <metadata:AttributeFilterRef>predicate.NotRandS</metadata:AttributeFilterRef>
+        <saml:Attribute Name="foo">
+            <saml:AttributeValue>fooValue</saml:AttributeValue>        
+        </saml:Attribute>
+        <saml:Attribute Name="bar">
+            <saml:AttributeValue>barValue</saml:AttributeValue>        
+        </saml:Attribute>
+        <metadata:EntityRegex>^https://sp(3|4)?\.example\.org/sp/shibboleth$</metadata:EntityRegex>
+    </metadata:MetadataFilter>
+</metadata:MetadataProvider>
diff --git a/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/nameIDFormatRegex.xml b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/nameIDFormatRegex.xml
new file mode 100644
index 00000000..d2f9e85c
--- /dev/null
+++ b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/nameIDFormatRegex.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata:MetadataProvider 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"
+
+	failFastInitialization="false" requireValidMetadata="false"
+
+	id="nameIDFormat" xsi:type="metadata:InlineMetadataProvider">
+	<metadata:MetadataFilter xsi:type="metadata:NameIDFormat" removeExistingFormats="true">
+        <metadata:Format>foo</metadata:Format>
+        <metadata:EntityRegex>^https://sp(4)?\.example\.org/sp/shibboleth$</metadata:EntityRegex>
+        <metadata:Format>bar</metadata:Format>
+        <metadata:EntityRegex>^https://sp2\.example\.org/sp/shibboleth$</metadata:EntityRegex>
+    </metadata:MetadataFilter>
+
+    <EntitiesDescriptor Name="ukgroup">
+    	<EntityDescriptor ID="uk001502"
+    		entityID="https://sp.example.org/sp/shibboleth">
+    
+    		<SPSSODescriptor
+    			protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
+    
+    			<AssertionConsumerService
+    				Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"
+    				Location="https://sp.example.org/Shibboleth.sso/SAML2/POST-SimpleSign"
+    				index="5" />
+    		</SPSSODescriptor>
+    	</EntityDescriptor>
+
+        <EntityDescriptor ID="uk001503"
+            entityID="https://sp2.example.org/sp/shibboleth">
+    
+            <SPSSODescriptor
+                protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
+                <NameIDFormat>baz</NameIDFormat>
+                <AssertionConsumerService
+                    Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"
+                    Location="https://sp2.example.org/Shibboleth.sso/SAML2/POST-SimpleSign"
+                    index="5" />
+            </SPSSODescriptor>
+        </EntityDescriptor>
+    </EntitiesDescriptor>
+</metadata:MetadataProvider>
diff --git a/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/predicateEntityRegex.xml b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/predicateEntityRegex.xml
new file mode 100644
index 00000000..14880043
--- /dev/null
+++ b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/predicateEntityRegex.xml
@@ -0,0 +1,10 @@
+<?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:EntityRegex>^urn:(.)+$</metadata:EntityRegex>
+</metadata:MetadataFilter>

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


More information about the commits mailing list