[java-shib-metadata] branch main updated: JSMD-14 - Filter to add/remove Scope extension

Codeberg noreply at shibboleth.net
Tue Jan 20 23:29:17 UTC 2026


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

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

View the commit online:
https://codeberg.org/Shibboleth/java-shib-metadata/commit/32b05736004bb7619f2cae0a0337af6c7a431650

The following commit(s) were added to refs/heads/main by this push:
     new 32b05736 JSMD-14 - Filter to add/remove Scope extension
32b05736 is described below

commit 32b05736004bb7619f2cae0a0337af6c7a431650
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Tue Jan 20 18:29:03 2026 -0500

    JSMD-14 - Filter to add/remove Scope extension
    
    https://shibboleth.atlassian.net/browse/JSMD-14
    
    Spring parser and initial test.
    Added schema mapping pointing to schema in API module.
---
 .../spring/metadata/MetadataNamespaceHandler.java  |   2 +
 .../spring/metadata/filter/ScopeFilterParser.java  | 167 +++++++++++++++++++++
 .../src/main/resources/META-INF/spring.schemas     |   1 +
 .../main/resources/schema/shibboleth-metadata.xsd  |  71 ++++++++-
 .../metadata/filter/ScopeFilterParserTest.java     | 108 +++++++++++++
 .../shibboleth/spring/metadata/filter/scope.xml    |  66 ++++++++
 6 files changed, 411 insertions(+), 4 deletions(-)

diff --git a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/MetadataNamespaceHandler.java b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/MetadataNamespaceHandler.java
index de87918a..2c9bb348 100644
--- a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/MetadataNamespaceHandler.java
+++ b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/MetadataNamespaceHandler.java
@@ -29,6 +29,7 @@ import net.shibboleth.spring.metadata.filter.NodeProcessingParser;
 import net.shibboleth.spring.metadata.filter.PredicateFilterParser;
 import net.shibboleth.spring.metadata.filter.RequiredValidUntilParser;
 import net.shibboleth.spring.metadata.filter.SchemaValidationParser;
+import net.shibboleth.spring.metadata.filter.ScopeFilterParser;
 import net.shibboleth.spring.metadata.filter.SignatureValidationParser;
 
 /** Namespace handler for <code>urn:mace:shibboleth:2.0:metadata</code>. */
@@ -63,6 +64,7 @@ public class MetadataNamespaceHandler extends BaseSpringNamespaceHandler {
         registerBeanDefinitionParser(PredicateFilterParser.TYPE_NAME, new PredicateFilterParser());
         registerBeanDefinitionParser(RequiredValidUntilParser.TYPE_NAME, new RequiredValidUntilParser());
         registerBeanDefinitionParser(AlgorithmFilterParser.TYPE_NAME, new AlgorithmFilterParser());
+        registerBeanDefinitionParser(ScopeFilterParser.TYPE_NAME, new ScopeFilterParser());
         registerBeanDefinitionParser(EntityAttributesFilterParser.TYPE_NAME, new EntityAttributesFilterParser());
         registerBeanDefinitionParser(NameIDFormatFilterParser.TYPE_NAME, new NameIDFormatFilterParser());
         registerBeanDefinitionParser(EntityRoleFilterParser.TYPE_NAME, new EntityRoleFilterParser());
diff --git a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/ScopeFilterParser.java b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/ScopeFilterParser.java
new file mode 100644
index 00000000..f1a67e06
--- /dev/null
+++ b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/ScopeFilterParser.java
@@ -0,0 +1,167 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.shibboleth.spring.metadata.filter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.XMLObject;
+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.slf4j.Logger;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.beans.factory.config.RuntimeBeanReference;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.ManagedList;
+import org.springframework.beans.factory.support.ManagedMap;
+import org.springframework.beans.factory.support.ManagedSet;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+import net.shibboleth.idp.saml.metadata.impl.ScopeFilter;
+import net.shibboleth.idp.saml.xmlobject.Scope;
+import net.shibboleth.shared.logic.ScriptedPredicate;
+import net.shibboleth.shared.primitive.LoggerFactory;
+import net.shibboleth.shared.spring.util.SpringSupport;
+import net.shibboleth.shared.xml.ElementSupport;
+import net.shibboleth.spring.ScriptTypeBeanParser;
+import net.shibboleth.spring.metadata.AbstractMetadataProviderParser;
+
+/** 
+ * Parser for Algorithm filter.
+ * 
+ * @since 4.0.0
+ */
+public class ScopeFilterParser extends AbstractMetadataFilterParser {
+
+    /** Element name. */
+    @Nonnull public static final QName TYPE_NAME = new QName(AbstractMetadataProviderParser.METADATA_NAMESPACE,
+            "Scope");
+
+    /** Class logger. */
+    @Nonnull private final Logger log = LoggerFactory.getLogger(ScopeFilterParser.class);
+
+    /** {@inheritDoc} */
+    @Override
+    @Nonnull protected Class<?> getBeanClass(@Nonnull final Element element) {
+        return ScopeFilter.class;
+    }
+
+// Checkstyle: CyclomaticComplexity|MethodLength OFF
+    /** {@inheritDoc} */
+    @Override protected void doParse(@Nonnull final Element element, @Nonnull final ParserContext parserContext,
+            @Nonnull final BeanDefinitionBuilder builder) {
+
+        super.doParse(element, parserContext, builder);
+        
+        if (element.hasAttributeNS(null, "removeExistingScopes")) {
+            builder.addPropertyValue("removeExistingScopes", 
+                    SpringSupport.getStringValueAsBoolean(element.getAttributeNS(null, "removeExistingScopes")));
+        }
+        
+        final Unmarshaller scopeUnmarshaller = XMLObjectSupport.getUnmarshaller(Scope.DEFAULT_ELEMENT_NAME);
+        if (scopeUnmarshaller == null) {
+            throw new BeanCreationException("Unable to obtain Scope Unmarshaller");
+        }
+
+        // Accumulate objects to attach as rule values.
+        final List<XMLObject> accumulator = new ArrayList<>();
+
+        // Accumulated map of predicates to objects to attach to inject into filter.
+        final ManagedMap<Object, ManagedList<XMLObject>> ruleMap = new ManagedMap<>();
+
+        // Acumulation of entityIDs to use in the next automated Predicate.
+        // Interrupting a sequence of <Entity> elements will end the accumulation.
+        ManagedSet<String> entitySet = new ManagedSet<>();
+        
+        Element child = ElementSupport.getFirstChildElement(element);
+
+        while (child != null) {
+            
+            if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE, "Entity")) {
+                // Add to the active entity set.
+                entitySet.add(ElementSupport.getElementContentAsString(child));
+                child = ElementSupport.getNextSiblingElement(child);
+                continue;
+                
+            } else if (!entitySet.isEmpty()) {
+                // "Commit" the current entity set as a single condition against the current accumulator.
+                // Then reset the entity set. Use a new object rather than clearing to ensure no cross-contamination.
+                final BeanDefinitionBuilder entityIdBuilder =
+                        BeanDefinitionBuilder.genericBeanDefinition(EntityIdPredicate.class);
+                entityIdBuilder.addConstructorArgValue(entitySet);
+                final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
+                forRule.addAll(accumulator);
+                ruleMap.put(entityIdBuilder.getBeanDefinition(), forRule);
+                
+                entitySet = new ManagedSet<>();
+            }
+            
+            if (ElementSupport.isElementNamed(child, Scope.DEFAULT_ELEMENT_NAME)) {
+                try {
+                    accumulator.add(scopeUnmarshaller.unmarshall(child));
+                } catch (final UnmarshallingException e) {
+                    log.error("Error unmarshalling DigestMethod 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());
+                forRule.addAll(accumulator);
+                ruleMap.put(new RuntimeBeanReference(ElementSupport.getElementContentAsString(child)), forRule);
+            } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
+                    "ConditionScript")) {
+                final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
+                forRule.addAll(accumulator);
+                ruleMap.put(ScriptTypeBeanParser.parseScriptType(ScriptedPredicate.class, child).getBeanDefinition(),
+                        forRule);
+            }
+            
+            child = ElementSupport.getNextSiblingElement(child);
+        }
+
+        // Do a final check and commit for a non-empty entity set.
+        if (!entitySet.isEmpty()) {
+            final BeanDefinitionBuilder entityIdBuilder =
+                    BeanDefinitionBuilder.genericBeanDefinition(EntityIdPredicate.class);
+            entityIdBuilder.addConstructorArgValue(entitySet);
+            final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
+            forRule.addAll(accumulator);
+            ruleMap.put(entityIdBuilder.getBeanDefinition(), forRule);
+        }
+        
+        builder.addPropertyValue("rules", ruleMap);
+    }
+// Checkstyle: CyclomaticComplexity|MethodLength ON
+
+    /** {@inheritDoc} */
+    @Override protected boolean shouldGenerateId() {
+        return true;
+    }
+
+}
\ No newline at end of file
diff --git a/shib-metadata-spring/src/main/resources/META-INF/spring.schemas b/shib-metadata-spring/src/main/resources/META-INF/spring.schemas
index 11cc37a8..b57c64f5 100644
--- a/shib-metadata-spring/src/main/resources/META-INF/spring.schemas
+++ b/shib-metadata-spring/src/main/resources/META-INF/spring.schemas
@@ -1,6 +1,7 @@
 # Current Metadata
 http\://shibboleth.net/schema/idp/shibboleth-security.xsd = schema/shibboleth-security.xsd
 http\://shibboleth.net/schema/idp/shibboleth-metadata.xsd = schema/shibboleth-metadata.xsd
+http\://shibboleth.net/schema/idp/shibboleth-metadata-1.0.xsd = schema/shibboleth-metadata-1.0.xsd
 
 # Legacy Metadata
 classpath\:/schema/shibboleth-2.0-security.xsd = schema/shibboleth-security.xsd
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 45c77ce2..cbee4b70 100644
--- a/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd
+++ b/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd
@@ -1,10 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:mace:shibboleth:2.0:metadata"
-    xmlns:shibmd="urn:mace:shibboleth:2.0:metadata" xmlns:security="urn:mace:shibboleth:2.0:security"
-    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
+    xmlns:shibmd="urn:mace:shibboleth:2.0:metadata"
+    xmlns:security="urn:mace:shibboleth:2.0:security"
+    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
+    xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
     xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport"
+    xmlns:shibmdext="urn:mace:shibboleth:metadata:1.0"
     elementFormDefault="qualified"
-    version="5.0.0">
+    version="5.2.0">
 
     <annotation>
         <documentation>Schema describing metadata providers and filters.</documentation>
@@ -18,6 +21,8 @@
         schemaLocation="http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-metadata-algsupport-v1.0.xsd"/>
     <import namespace="urn:mace:shibboleth:2.0:security"
         schemaLocation="http://shibboleth.net/schema/idp/shibboleth-security.xsd"/>
+    <import namespace="urn:mace:shibboleth:metadata:1.0"
+        schemaLocation="http://shibboleth.net/schema/idp/shibboleth-metadata-1.0.xsd"/>
 
     <element name="MetadataProvider" type="shibmd:MetadataProviderType">
         <annotation>
@@ -1372,7 +1377,58 @@
                             <annotation>
                                 <documentation>
                                     A regular expression to apply to EntityDescriptor's entityID to add all the preceding
-                                    Attribute elements to.
+                                    extension 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 extension elements to.
+                                </documentation>
+                            </annotation>
+                        </element>
+                        <element name="ConditionScript" type="shibmd:ScriptType">
+                            <annotation>
+                                <documentation>
+                                    A script implementing Predicate<EntityDescriptor> to identify one
+                                    or more EntityDescriptors to add all the preceding extension elements to.
+                                </documentation>
+                            </annotation>
+                        </element>
+                    </choice>
+                </sequence>
+            </extension>
+        </complexContent>
+    </complexType>
+
+        <complexType name="Scope">
+        <annotation>
+            <documentation>
+                A filter that adjusts Scope extension content in metadata in order to drive software
+                behavior based on them. Sequences of Scope elements are supplied, and when an Entity or
+                ConditionRef is encountered, the preceding elements are applied to the corresponding entities.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="shibmd:MetadataFilterType">
+                <sequence>
+                    <choice minOccurs="0" maxOccurs="unbounded">
+                        <element ref="shibmdext:Scope" />
+                        <element name="Entity" type="shibmd:string">
+                            <annotation>
+                                <documentation>
+                                    An entityID to identify an EntityDescriptor to add all the preceding
+                                    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
+                                    extension elements to.
                                 </documentation>
                             </annotation>
                         </element>
@@ -1394,6 +1450,13 @@
                         </element>
                     </choice>
                 </sequence>
+                <attribute name="removeExistingScopes" type="boolean">
+                    <annotation>
+                        <documentation>
+                            Whether to remove any existing Scopes when adding new ones (default is false).
+                        </documentation>
+                    </annotation>
+                </attribute>
             </extension>
         </complexContent>
     </complexType>
diff --git a/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/ScopeFilterParserTest.java b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/ScopeFilterParserTest.java
new file mode 100644
index 00000000..a066c5ff
--- /dev/null
+++ b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/ScopeFilterParserTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.shibboleth.spring.metadata.filter;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.List;
+
+import net.shibboleth.idp.saml.metadata.impl.ScopeFilter;
+import net.shibboleth.idp.saml.xmlobject.Scope;
+import net.shibboleth.shared.resolver.CriteriaSet;
+import net.shibboleth.shared.resolver.ResolverException;
+import net.shibboleth.spring.metadata.AbstractMetadataParserTest;
+
+import org.opensaml.core.criterion.EntityIdCriterion;
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.saml.metadata.resolver.MetadataResolver;
+import org.opensaml.saml.saml2.metadata.EntityDescriptor;
+import org.opensaml.saml.saml2.metadata.Extensions;
+import org.opensaml.saml.saml2.metadata.RoleDescriptor;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+ at SuppressWarnings("javadoc")
+public class ScopeFilterParserTest extends AbstractMetadataParserTest {
+    
+    @Test
+    public void test() throws ResolverException, IOException {
+        doTest("filter/scope.xml");
+    }
+
+    /*
+    @Test
+    public void testRegex() throws ResolverException, IOException {
+        doTest("filter/algorithmRegex.xml");
+    }
+
+    @Test
+    public void testFilterScript() throws ResolverException, IOException {
+        doTest("filter/algorithmWithScript.xml");
+    }
+
+    @Test
+    public void testFilterScriptResource() throws ResolverException, IOException {
+        doTest("filter/algorithmWithScriptResource.xml");
+    }
+    */
+
+    private void doTest(final String... files) throws ResolverException, IOException {
+
+        final MetadataResolver resolver = getBean(MetadataResolver.class, files);
+
+        final ScopeFilter filter = (ScopeFilter) resolver.getMetadataFilter();
+        Assert.assertNotNull(filter);
+        
+        EntityIdCriterion crit = new EntityIdCriterion("https://sp.example.org/sp/shibboleth");
+        EntityDescriptor entity = resolver.resolveSingle(new CriteriaSet(crit));
+        validate(entity);
+
+        crit = new EntityIdCriterion("https://sp4.example.org/sp/shibboleth");
+        entity = resolver.resolveSingle(new CriteriaSet(crit));
+        if (entity != null) {
+            validate(entity);
+        }
+
+        crit = new EntityIdCriterion("https://sp2.example.org/sp/shibboleth");
+        entity = resolver.resolveSingle(new CriteriaSet(crit));
+        Assert.assertNotNull(entity);
+        assert entity != null;
+        final Extensions exts = entity.getExtensions();
+        if (exts != null) {
+            Assert.assertTrue(exts.getUnknownXMLObjects(Scope.DEFAULT_ELEMENT_NAME).isEmpty());
+        }
+    }
+    
+    private void validate(final EntityDescriptor entity) {
+        for (final RoleDescriptor role : entity.getRoleDescriptors()) {
+            final Extensions exts = role.getExtensions();
+            assert exts != null;
+            
+            final List<XMLObject> scopes = exts.getUnknownXMLObjects(Scope.DEFAULT_ELEMENT_NAME);
+            
+            assertEquals(scopes.size(), 2);
+            
+            final Scope scope1 = (Scope) scopes.get(0);
+            Assert.assertEquals(scope1.getValue(), "example.org");
+            Assert.assertEquals(scope1.getRegexp(), false);
+
+            final Scope scope2 = (Scope) scopes.get(1);
+            Assert.assertEquals(scope2.getValue(), "sub.example.org");
+            Assert.assertEquals(scope2.getRegexp(), true);
+        }        
+    }
+
+}
\ No newline at end of file
diff --git a/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/scope.xml b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/scope.xml
new file mode 100644
index 00000000..a0ed803d
--- /dev/null
+++ b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/scope.xml
@@ -0,0 +1,66 @@
+<?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:shibmdext="urn:mace:shibboleth:metadata:1.0"
+    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:mace:shibboleth:metadata:1.0 http://shibboleth.net/schema/idp/shibboleth-metadata-1.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="scopes" xsi:type="metadata:InlineMetadataProvider">
+    
+	<metadata:MetadataFilter xsi:type="metadata:Scope">
+	    <shibmdext:Scope regexp="false">example.org</shibmdext:Scope>
+        <shibmdext:Scope regexp="true">sub.example.org</shibmdext:Scope>
+
+        <metadata:Entity>https://sp.example.org/sp/shibboleth</metadata:Entity>
+        <metadata:Entity>https://sp3.example.org/sp/shibboleth</metadata:Entity>
+        <metadata:Entity>https://sp4.example.org/sp/shibboleth</metadata:Entity>
+        <metadata:ConditionScript language="javascript">
+            <metadata:Script>input.getEntityID().equals("https://sp3.example.org/sp/shibboleth");</metadata:Script>
+        </metadata:ConditionScript>
+    </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>

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


More information about the commits mailing list