[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