[java-metadata-aggregator] 01/02: Add StringElementValidationStage

Ian Young ian at iay.org.uk
Tue Sep 8 15:32:51 UTC 2020


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

iay pushed a commit to branch main
in repository java-metadata-aggregator.

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

commit 4476512292d900b91106da966bf8d12a7635cde4
Author: Ian Young <ian at iay.org.uk>
AuthorDate: Tue Sep 8 16:30:24 2020 +0100

    Add StringElementValidationStage
    
    https://issues.shibboleth.net/jira/browse/MDA-229
---
 .../dom/AbstractElementValidationStage.java        | 124 +++++++++++++++++++
 .../metadata/dom/StringElementValidationStage.java |  38 ++++++
 .../resources/net/shibboleth/metadata/beans.xml    |   3 +
 .../dom/StringElementValidationStageTest.java      | 115 ++++++++++++++++++
 .../StringElementValidationStage-two-bad-addrs.xml | 135 +++++++++++++++++++++
 5 files changed, 415 insertions(+)

diff --git a/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/AbstractElementValidationStage.java b/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/AbstractElementValidationStage.java
new file mode 100644
index 0000000..1e93b56
--- /dev/null
+++ b/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/AbstractElementValidationStage.java
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You 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.metadata.dom;
+
+import java.util.Collection;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+import javax.annotation.concurrent.GuardedBy;
+import javax.annotation.concurrent.ThreadSafe;
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Element;
+
+import net.shibboleth.metadata.Item;
+import net.shibboleth.metadata.pipeline.StageProcessingException;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
+import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+
+/**
+ * Abstract base class allowing a selected subset of {@link Element}s in a DOM document
+ * to be validated as a given type.
+ *
+ * @param <T> type to convert each {@link Element} to for validation
+ */
+ at ThreadSafe
+public abstract class AbstractElementValidationStage<T> extends AbstractDOMValidationStage<T, DOMTraversalContext> {
+
+    /** Collection of element names for those elements we will be visiting. */
+    @Nonnull @NonnullElements @Unmodifiable @GuardedBy("this")
+    private Set<QName> elementNames = Set.of();
+
+    /**
+     * Gets the collection of element names to visit.
+     * 
+     * @return collection of element names to visit.
+     */
+    @Nonnull public final synchronized Collection<QName> getElementNames() {
+        return elementNames;
+    }
+
+    /**
+     * Sets the collection of element names to visit.
+     * 
+     * @param names collection of element names to visit.
+     */
+    public void setElementNames(@Nonnull final Collection<QName> names) {
+        throwSetterPreconditionExceptions();
+        Constraint.isNotNull(names, "elementNames may not be null");
+        elementNames = Set.copyOf(names);
+    }
+    
+    /**
+     * Sets a single element name to be visited.
+     * 
+     * Shorthand for {@link #setElementNames} with a singleton set.
+     * 
+     * @param name {@link QName} for the element to be visited.
+     */
+    public final synchronized void setElementName(@Nonnull final QName name) {
+        throwSetterPreconditionExceptions();
+        Constraint.isNotNull(name, "elementName may not be null");
+        elementNames = Set.of(name);
+    }
+    
+    @Override
+    protected boolean applicable(@Nonnull final Element e, @Nonnull final DOMTraversalContext context) {
+        final QName q = new QName(e.getNamespaceURI(), e.getLocalName());
+        return getElementNames().contains(q);
+    }
+
+    /**
+     * Convert the visited {@link Element} to the type to be validated.
+     *
+     * @param element {@link Element} being validated
+     * @return converted value
+     */
+    protected abstract T convert(@Nonnull final Element element);
+
+    @Override
+    protected void visit(@Nonnull final Element element, @Nonnull final DOMTraversalContext context)
+            throws StageProcessingException {
+        applyValidators(convert(element), context);
+    }
+    
+    @Override
+    protected DOMTraversalContext buildContext(@Nonnull final Item<Element> item) {
+        return new SimpleDOMTraversalContext(item);
+    }
+
+    @Override
+    protected void doInitialize() throws ComponentInitializationException {
+        super.doInitialize();
+
+        if (elementNames.isEmpty()) {
+            throw new ComponentInitializationException("elementNames may not be empty");
+        }
+    }
+
+    @Override
+    protected void doDestroy() {
+        elementNames = null;
+
+        super.doDestroy();
+    }
+
+}
diff --git a/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/StringElementValidationStage.java b/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/StringElementValidationStage.java
new file mode 100644
index 0000000..b2f79ad
--- /dev/null
+++ b/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/StringElementValidationStage.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You 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.metadata.dom;
+
+import javax.annotation.Nonnull;
+import javax.annotation.concurrent.ThreadSafe;
+
+import org.w3c.dom.Element;
+
+import net.shibboleth.metadata.pipeline.Stage;
+
+/**
+ * A {@link Stage} allowing validation of DOM {@link Element}s treated as {@link String}s.
+ */
+ at ThreadSafe
+public class StringElementValidationStage extends AbstractElementValidationStage<String> implements Stage<Element> {
+
+    @Override
+    protected String convert(@Nonnull final Element element) {
+        return element.getTextContent();
+    }
+
+}
diff --git a/aggregator-pipeline/src/main/resources/net/shibboleth/metadata/beans.xml b/aggregator-pipeline/src/main/resources/net/shibboleth/metadata/beans.xml
index 8f25643..500db11 100644
--- a/aggregator-pipeline/src/main/resources/net/shibboleth/metadata/beans.xml
+++ b/aggregator-pipeline/src/main/resources/net/shibboleth/metadata/beans.xml
@@ -82,6 +82,9 @@
     <bean id="mda.NamespaceStrippingStage" abstract="true" parent="mda.stage_parent"
         class="net.shibboleth.metadata.dom.NamespaceStrippingStage"/>
 
+    <bean id="mda.StringElementValidationStage" abstract="true" parent="mda.stage_parent"
+        class="net.shibboleth.metadata.dom.StringElementValidationStage"/>
+
     <bean id="mda.XMLSchemaValidationStage" abstract="true" parent="mda.stage_parent"
         class="net.shibboleth.metadata.dom.XMLSchemaValidationStage"/>
 
diff --git a/aggregator-pipeline/src/test/java/net/shibboleth/metadata/dom/StringElementValidationStageTest.java b/aggregator-pipeline/src/test/java/net/shibboleth/metadata/dom/StringElementValidationStageTest.java
new file mode 100644
index 0000000..9d43ddd
--- /dev/null
+++ b/aggregator-pipeline/src/test/java/net/shibboleth/metadata/dom/StringElementValidationStageTest.java
@@ -0,0 +1,115 @@
+
+package net.shibboleth.metadata.dom;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.testng.Assert;
+import org.testng.Assert.ThrowingRunnable;
+import org.testng.annotations.Test;
+import org.w3c.dom.Element;
+
+import net.shibboleth.metadata.ErrorStatus;
+import net.shibboleth.metadata.Item;
+import net.shibboleth.metadata.dom.saml.SAMLMetadataSupport;
+import net.shibboleth.metadata.validate.RejectAllValidator;
+import net.shibboleth.metadata.validate.Validator;
+import net.shibboleth.metadata.validate.string.AcceptStringRegexValidator;
+import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+
+public class StringElementValidationStageTest extends BaseDOMTest {
+
+
+    protected StringElementValidationStageTest() {
+        super(StringElementValidationStage.class);
+    }
+
+    @Test
+    public void testNoElementNames() throws Exception {
+        final StringElementValidationStage stage = new StringElementValidationStage();
+        stage.setId("test");
+        Assert.assertThrows(ComponentInitializationException.class,
+                new ThrowingRunnable() {
+                    @Override
+                    public void run() throws Throwable {
+                        stage.initialize();
+                    }
+                }
+        );
+    }
+    
+    @Test
+    public void testNoValidators() throws Exception {
+        final Item<Element> item = readDOMItem("two-bad-addrs.xml");
+        final List<Item<Element>> items = new ArrayList<>();
+
+        final StringElementValidationStage stage = new StringElementValidationStage();
+        stage.setId("test");
+        stage.setElementName(new QName(SAMLMetadataSupport.MD_NS, "EmailAddress"));
+        // don't set any validators
+        stage.initialize();
+        
+        stage.execute(items);
+        stage.destroy();
+        
+        final List<ErrorStatus> errors = item.getItemMetadata().get(ErrorStatus.class);
+        Assert.assertTrue(errors.isEmpty());
+    }
+
+    @Test
+    public void testEmail() throws Exception {
+        final Item<Element> item = readDOMItem("two-bad-addrs.xml");
+        final List<Item<Element>> items = new ArrayList<>();
+        items.add(item);
+    
+        final var val = new AcceptStringRegexValidator();
+        val.setId("email");
+        val.setRegex("mailto:[0-9a-zA-Z]+\\@[0-9a-zA-Z.]+");
+        val.initialize();
+
+        final var stop = new RejectAllValidator<String>();
+        stop.setId("stop");
+        stop.initialize();
+        
+        final List<Validator<String>> validators = List.of(val, stop);
+      
+        final StringElementValidationStage stage = new StringElementValidationStage();
+        stage.setId("test");
+        stage.setElementName(new QName(SAMLMetadataSupport.MD_NS, "EmailAddress"));
+        stage.setValidators(validators);
+        stage.initialize();
+      
+        stage.execute(items);
+        stage.destroy();
+
+        final List<ErrorStatus> errors = item.getItemMetadata().get(ErrorStatus.class);
+        Assert.assertEquals(errors.size(), 2);
+    }
+
+    @Test
+    public void testTwoNames() throws Exception {
+        final Item<Element> item = readDOMItem("two-bad-addrs.xml");
+        final List<Item<Element>> items = new ArrayList<>();
+        items.add(item);
+
+        final var stop = new RejectAllValidator<String>();
+        stop.setId("stop");
+        stop.initialize();
+        
+        final StringElementValidationStage stage = new StringElementValidationStage();
+        stage.setId("test");
+        stage.setElementNames(List.of(SAMLMetadataSupport.ORGANIZATIONNAME_NAME,
+                SAMLMetadataSupport.ORGANIZATIONDISPLAYNAME_NAME));
+        stage.setValidators(List.of(stop)); // reject everything
+        stage.initialize();
+      
+        stage.execute(items);
+        stage.destroy();
+
+        final List<ErrorStatus> errors = item.getItemMetadata().get(ErrorStatus.class);
+        Assert.assertEquals(errors.size(), 2 /* each */ * 3 /* entities */);
+    }
+
+}
diff --git a/aggregator-pipeline/src/test/resources/net/shibboleth/metadata/dom/StringElementValidationStage-two-bad-addrs.xml b/aggregator-pipeline/src/test/resources/net/shibboleth/metadata/dom/StringElementValidationStage-two-bad-addrs.xml
new file mode 100644
index 0000000..063e15e
--- /dev/null
+++ b/aggregator-pipeline/src/test/resources/net/shibboleth/metadata/dom/StringElementValidationStage-two-bad-addrs.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    This example contains exactly two bad md:EmailAddress elements, and six good ones.
+-->
+<EntitiesDescriptor Name="urn:example.org:test" cacheDuration="PT4H" validUntil="2050-01-01T00:00:00Z"
+                    xmlns="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+    
+    <EntityDescriptor entityID="https://idp.shibboleth.net/idp/shibboleth" cacheDuration="PT3H" validUntil="2049-01-01T00:00:00Z"> 
+    
+        <IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+            
+            <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat>
+            
+            <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://idp.shibboleth.net/idp/profile/SAML2/POST/SSO"/>
+            
+            <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" Location="https://idp.shibboleth.net/idp/profile/SAML2/POST-SimpleSign/SSO"/>
+            
+            <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://idp.shibboleth.net/idp/profile/SAML2/Redirect/SSO"/>
+
+        </IDPSSODescriptor>
+        
+        <Organization>
+            <OrganizationName xml:lang="en">Shibboleth.net</OrganizationName>
+            <OrganizationDisplayName xml:lang="en">Shibboleth.net</OrganizationDisplayName>
+            <OrganizationURL xml:lang="en">http://www.shibboleth.net</OrganizationURL>
+        </Organization>
+        
+        <ContactPerson contactType="support">
+            <GivenName>Shibboleth.Net Technical Support</GivenName>
+            <EmailAddress>mailto:contact at shibboleth.net</EmailAddress><!--good-->
+        </ContactPerson>
+        
+        <ContactPerson contactType="bogus">
+            <GivenName>Shibboleth.Net Technical Support</GivenName>
+            <EmailAddress>contact at shibboleth.net</EmailAddress><!-- bad -->
+        </ContactPerson>
+        
+    </EntityDescriptor>
+    
+    <EntityDescriptor entityID="https://issues.shibboleth.net/shibboleth" cacheDuration="PT2H" validUntil="2048-01-01T00:00:00Z">
+        
+        <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:1.0:protocol urn:oasis:names:tc:SAML:2.0:protocol">
+                        
+            <ArtifactResolutionService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://issues.shibboleth.net/jira/Shibboleth.sso/Artifact/SOAP" index="0"/>
+            <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://issues.shibboleth.net/jira/Shibboleth.sso/SLO/Artifact"/>
+            <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://issues.shibboleth.net/jira/Shibboleth.sso/SLO/POST"/>
+            <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://issues.shibboleth.net/jira/Shibboleth.sso/SLO/Redirect"/>
+            <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://issues.shibboleth.net/jira/Shibboleth.sso/SLO/SOAP"/>
+            <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" Location="https://issues.shibboleth.net/jira/Shibboleth.sso/SAML/Artifact" index="0"/>
+
+            <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:browser-post" Location="https://issues.shibboleth.net/jira/Shibboleth.sso/SAML/POST" index="1"/>
+            <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://issues.shibboleth.net/jira/Shibboleth.sso/SAML2/Artifact" index="2"/>
+            <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:PAOS" Location="https://issues.shibboleth.net/jira/Shibboleth.sso/SAML2/ECP" index="3"/>
+            <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://issues.shibboleth.net/jira/Shibboleth.sso/SAML2/POST" index="4"/>
+            <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" Location="https://issues.shibboleth.net/jira/Shibboleth.sso/SAML2/POST-SimpleSign" index="5"/>
+            
+            <AttributeConsumingService index="1">
+                <ServiceName xml:lang="en">Shibboleth Federated Issue Tracking</ServiceName>
+                <ServiceDescription xml:lang="en"> An issue (bugs, feature requests, tasks) tracking 
+                    service with automatic registration for users who can supply a supported identifier, 
+                    such as eduPersonPrincipalName or swissEduPersonUniqueID. </ServiceDescription>
+
+                <RequestedAttribute FriendlyName="eduPersonPrincipalName" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
+                <RequestedAttribute FriendlyName="mail" Name="urn:oid:0.9.2342.19200300.100.1.3" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+                <RequestedAttribute FriendlyName="displayName" Name="urn:oid:2.16.840.1.113730.3.1.241" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+            </AttributeConsumingService>
+        </SPSSODescriptor>
+        
+        <Organization>
+            <OrganizationName xml:lang="en">Shibboleth Consortium</OrganizationName>
+            <OrganizationDisplayName xml:lang="en">Shibboleth Consortium</OrganizationDisplayName>
+            <OrganizationURL xml:lang="en">http://www.shibboleth.net/</OrganizationURL>
+        </Organization>
+        
+        <ContactPerson contactType="technical">
+            <GivenName>Shibboleth.Net Technical Support</GivenName>
+            <EmailAddress>contact at shibboleth.net</EmailAddress><!-- bad -->
+        </ContactPerson>
+        <ContactPerson contactType="support">
+            <GivenName>Shibboleth.Net Technical Support</GivenName>
+            <EmailAddress>mailto:contact at shibboleth.net</EmailAddress><!-- good -->
+        </ContactPerson>
+        <ContactPerson contactType="administrative">
+            <GivenName>Shibboleth.Net Technical Support</GivenName>
+            <EmailAddress>mailto:contact at shibboleth.net</EmailAddress><!-- good -->
+        </ContactPerson>
+        <ContactPerson contactType="billing">
+            <GivenName>Shibboleth.Net Technical Support</GivenName>
+            <EmailAddress>mailto:contact at shibboleth.net</EmailAddress><!-- good -->
+        </ContactPerson>
+        <ContactPerson contactType="other">
+            <GivenName>Shibboleth.Net Technical Support</GivenName>
+            <EmailAddress>mailto:contact at shibboleth.net</EmailAddress><!-- good -->
+        </ContactPerson>
+        
+    </EntityDescriptor>
+
+    <EntityDescriptor entityID="https://wiki.shibboleth.net/shibboleth" cacheDuration="PT1H" validUntil="2047-01-01T00:00:00Z">
+        
+        <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:1.0:protocol urn:oasis:names:tc:SAML:2.0:protocol">
+            
+            <ArtifactResolutionService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://wiki.shibboleth.net/confluence/Shibboleth.sso/Artifact/SOAP" index="0"/>
+
+            <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://wiki.shibboleth.net/confluence/Shibboleth.sso/SLO/Artifact"/>
+            <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://wiki.shibboleth.net/confluence/Shibboleth.sso/SLO/POST"/>
+            <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://wiki.shibboleth.net/confluence/Shibboleth.sso/SLO/Redirect"/>
+            <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://wiki.shibboleth.net/confluence/Shibboleth.sso/SLO/SOAP"/>
+            <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" Location="https://wiki.shibboleth.net/confluence/Shibboleth.sso/SAML/Artifact" index="0"/>
+            <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:browser-post" Location="https://wiki.shibboleth.net/confluence/Shibboleth.sso/SAML/POST" index="1"/>
+            <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://wiki.shibboleth.net/confluence/Shibboleth.sso/SAML2/Artifact" index="2"/>
+            <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:PAOS" Location="https://wiki.shibboleth.net/confluence/Shibboleth.sso/SAML2/ECP" index="3"/>
+            <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://wiki.shibboleth.net/confluence/Shibboleth.sso/SAML2/POST" index="4"/>
+
+            <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" Location="https://wiki.shibboleth.net/confluence/Shibboleth.sso/SAML2/POST-SimpleSign" index="5"/>
+            
+            <AttributeConsumingService index="1">
+                <ServiceName xml:lang="en">Shibboleth Federated Wiki</ServiceName>
+                <ServiceDescription xml:lang="en"> A shared Wiki service with automatic registration
+                    for users who can supply a supported identifier, such as eduPersonPrincipalName
+                    or swissEduPersonUniqueID. </ServiceDescription>
+                <RequestedAttribute FriendlyName="eduPersonPrincipalName" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
+                <RequestedAttribute FriendlyName="mail" Name="urn:oid:0.9.2342.19200300.100.1.3" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+                <RequestedAttribute FriendlyName="displayName" Name="urn:oid:2.16.840.1.113730.3.1.241" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+
+            </AttributeConsumingService>
+        </SPSSODescriptor>
+        
+        <Organization>
+            <OrganizationName xml:lang="en">Shibboleth Consortium</OrganizationName>
+            <OrganizationDisplayName xml:lang="en">Shibboleth Consortium</OrganizationDisplayName>
+            <OrganizationURL xml:lang="en">http://www.shibboleth.net/</OrganizationURL>
+        </Organization>
+    </EntityDescriptor>
+    
+</EntitiesDescriptor>

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


More information about the commits mailing list