[java-sp-server] branch main updated: Some refactoring, add XML parsing endpoint for agent configs.

Scott Cantor cantor.2 at osu.edu
Thu May 26 17:55:23 UTC 2022


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

scantor pushed a commit to branch main
in repository java-sp-server.

View the commit online:
http://git.shibboleth.net/view/?p=java-sp-server.git;a=commit;h=acc018227e8aa8d6cf3fa8305d79722579eb98c9

The following commit(s) were added to refs/heads/main by this push:
     new acc0182  Some refactoring, add XML parsing endpoint for agent configs.
acc0182 is described below

commit acc018227e8aa8d6cf3fa8305d79722579eb98c9
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Thu May 26 13:55:20 2022 -0400

    Some refactoring, add XML parsing endpoint for agent configs.
---
 .../net/shibboleth/sp/conf/endpoints-system.xml    |   4 +-
 .../shibboleth/sp/remoting/AbstractEndpoint.java   |  55 ++++++++++
 .../sp/remoting/{ => endpoint}/impl/Echo.java      |  22 ++--
 .../{impl/Echo.java => endpoint/impl/Ping.java}    |  26 +++--
 .../sp/remoting/endpoint/impl/XMLParser.java       | 104 +++++++++++++++++++
 .../Echo.java => endpoint/impl/package-info.java}  |  24 +----
 .../sp/remoting/endpoint/impl/XMLParserTest.java   | 107 +++++++++++++++++++
 .../sp/remoting/endpoint/impl/shibboleth2.xml      | 115 +++++++++++++++++++++
 8 files changed, 418 insertions(+), 39 deletions(-)

diff --git a/sp-conf-impl/src/main/resources/net/shibboleth/sp/conf/endpoints-system.xml b/sp-conf-impl/src/main/resources/net/shibboleth/sp/conf/endpoints-system.xml
index 440cdb9..f93f07a 100644
--- a/sp-conf-impl/src/main/resources/net/shibboleth/sp/conf/endpoints-system.xml
+++ b/sp-conf-impl/src/main/resources/net/shibboleth/sp/conf/endpoints-system.xml
@@ -25,7 +25,9 @@
 
     <!-- Auto-wired remoting endpoints. -->
     
-    <bean class="net.shibboleth.sp.remoting.impl.Echo" />
+    <bean class="net.shibboleth.sp.remoting.endpoint.impl.Echo" />
+    <bean class="net.shibboleth.sp.remoting.endpoint.impl.Ping" />
+    <bean class="net.shibboleth.sp.remoting.endpoint.impl.XMLParser" />
 
     <!-- Wildcard import hook for plugins. -->
     <import resource="classpath*:/META-INF/net/shibboleth/sp/service/provider/postconfig.xml" />
diff --git a/sp-server-api/src/main/java/net/shibboleth/sp/remoting/AbstractEndpoint.java b/sp-server-api/src/main/java/net/shibboleth/sp/remoting/AbstractEndpoint.java
new file mode 100644
index 0000000..2dbe6ef
--- /dev/null
+++ b/sp-server-api/src/main/java/net/shibboleth/sp/remoting/AbstractEndpoint.java
@@ -0,0 +1,55 @@
+/*
+ * 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
+ *
+ *  https://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.sp.remoting;
+
+import javax.annotation.Nonnull;
+
+import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
+import net.shibboleth.utilities.java.support.component.ComponentSupport;
+import net.shibboleth.utilities.java.support.ddf.DDF;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+
+/**
+ * Simple {@link Endpoint} implementation.
+ */
+public abstract class AbstractEndpoint extends AbstractInitializableComponent implements Endpoint {
+
+    /** {@inheritDoc} */
+    @Nonnull public DDF receive(@Nonnull final DDF input) throws RemoteProcessingException {
+        ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
+        Constraint.isTrue(getAddress().equals(input.name()), "Address was invalid");
+        
+        return doReceive(input);
+    }
+    
+    /**
+     * Subclasses should override this method.
+     * 
+     * <p>Implementations of this method should catch any checked exceptions and wrap them
+     * in the {@link RemoteProcessingException} type.</p>
+     * 
+     * <p>Unchecked exceptions MAY be surfaced safely and will be caught by the standard error
+     * handling, so they should be processed internally if that is not the desired behavior.</p>
+     * 
+     * @param input input message
+     * 
+     * @return output message
+     * 
+     * @throws RemoteProcessingException if an exception occurs
+     */
+    @Nonnull abstract public DDF doReceive(@Nonnull final DDF input) throws RemoteProcessingException;
+
+}
\ No newline at end of file
diff --git a/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/impl/Echo.java b/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/endpoint/impl/Echo.java
similarity index 60%
copy from sp-server-impl/src/main/java/net/shibboleth/sp/remoting/impl/Echo.java
copy to sp-server-impl/src/main/java/net/shibboleth/sp/remoting/endpoint/impl/Echo.java
index 1876005..230735a 100644
--- a/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/impl/Echo.java
+++ b/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/endpoint/impl/Echo.java
@@ -13,26 +13,34 @@
  */
 
 
-package net.shibboleth.sp.remoting.impl;
+package net.shibboleth.sp.remoting.endpoint.impl;
 
 import net.shibboleth.sp.remoting.RemoteProcessingException;
-import net.shibboleth.sp.remoting.Endpoint;
+
+import javax.annotation.Nonnull;
+
+import net.shibboleth.sp.remoting.AbstractEndpoint;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 import net.shibboleth.utilities.java.support.ddf.DDF;
 
 /**
  * Echo service endpoint.
  * 
- * <p>This bean just echoes the input as the output for validation/testing.
+ * <p>This bean just echoes the input as the output for validation/testing.</p>
  */
-public class Echo implements Endpoint {
+public class Echo extends AbstractEndpoint {
+
+    /** Address. */
+    @Nonnull @NotEmpty public static final String ADDRESS = "net.shibboleth.sp.Echo";
 
     /** {@inheritDoc} */
-    public String getAddress() {
-        return "echo";
+    @Nonnull @NotEmpty public String getAddress() {
+        return ADDRESS;
     }
 
     /** {@inheritDoc} */
-    public DDF receive(DDF input) throws RemoteProcessingException {
+    @Override
+    @Nonnull public DDF doReceive(@Nonnull final DDF input) throws RemoteProcessingException {
         return input;
     }
 
diff --git a/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/impl/Echo.java b/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/endpoint/impl/Ping.java
similarity index 51%
copy from sp-server-impl/src/main/java/net/shibboleth/sp/remoting/impl/Echo.java
copy to sp-server-impl/src/main/java/net/shibboleth/sp/remoting/endpoint/impl/Ping.java
index 1876005..4321b7b 100644
--- a/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/impl/Echo.java
+++ b/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/endpoint/impl/Ping.java
@@ -13,27 +13,35 @@
  */
 
 
-package net.shibboleth.sp.remoting.impl;
+package net.shibboleth.sp.remoting.endpoint.impl;
 
 import net.shibboleth.sp.remoting.RemoteProcessingException;
-import net.shibboleth.sp.remoting.Endpoint;
+
+import javax.annotation.Nonnull;
+
+import net.shibboleth.sp.remoting.AbstractEndpoint;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 import net.shibboleth.utilities.java.support.ddf.DDF;
 
 /**
- * Echo service endpoint.
+ * Ping service endpoint.
  * 
- * <p>This bean just echoes the input as the output for validation/testing.
+ * <p>This bean just returns the server time.</p>
  */
-public class Echo implements Endpoint {
+public class Ping extends AbstractEndpoint {
+
+    /** Address. */
+    @Nonnull @NotEmpty public static final String ADDRESS = "net.shibboleth.sp.Ping";
 
     /** {@inheritDoc} */
-    public String getAddress() {
-        return "echo";
+    @Nonnull @NotEmpty public String getAddress() {
+        return ADDRESS;
     }
 
     /** {@inheritDoc} */
-    public DDF receive(DDF input) throws RemoteProcessingException {
-        return input;
+    @Override
+    @Nonnull public DDF doReceive(@Nonnull final DDF input) throws RemoteProcessingException {
+        return new DDF("pong").longinteger(System.currentTimeMillis() / 1000);
     }
 
 }
\ No newline at end of file
diff --git a/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/endpoint/impl/XMLParser.java b/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/endpoint/impl/XMLParser.java
new file mode 100644
index 0000000..faae3e2
--- /dev/null
+++ b/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/endpoint/impl/XMLParser.java
@@ -0,0 +1,104 @@
+/*
+ * 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
+ *
+ *  https://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.sp.remoting.endpoint.impl;
+
+import net.shibboleth.sp.remoting.RemoteProcessingException;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.annotation.Nonnull;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+
+import net.shibboleth.sp.remoting.AbstractEndpoint;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.component.ComponentSupport;
+import net.shibboleth.utilities.java.support.ddf.DDF;
+import net.shibboleth.utilities.java.support.ddf.DDFSupport;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.xml.ParserPool;
+import net.shibboleth.utilities.java.support.xml.XMLParserException;
+
+/**
+ * Parses XML into a DDF for agent consumption.
+ * 
+ * <p>The input must be an "unsafe" string.</p>
+ * 
+ * <p>This converter is NOT namespace aware.</p>
+ */
+public class XMLParser extends AbstractEndpoint {
+
+    /** Address. */
+    @Nonnull @NotEmpty public static final String ADDRESS = "net.shibboleth.sp.XMLParser";
+    
+    /** Class logger. */
+    @Nonnull private final Logger log = LoggerFactory.getLogger(XMLParser.class);
+    
+    /** Parser pool. */
+    @NonnullAfterInit private ParserPool parserPool;
+    
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public String getAddress() {
+        return ADDRESS;
+    }
+    
+    /**
+     * Set the {@link ParserPool} instance to use.
+     * 
+     * @param parser parser pool
+     */
+    public void setParserPool(@Nonnull final ParserPool parser) {
+        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        
+        parserPool = Constraint.isNotNull(parser, "ParserPool cannot be null");
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected void doInitialize() throws ComponentInitializationException {
+        super.doInitialize();
+        
+        if (parserPool == null) {
+            throw new ComponentInitializationException("ParserPool cannot be null");
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    @Nonnull public DDF doReceive(@Nonnull final DDF input) throws RemoteProcessingException {
+        
+        if (!input.isunsafestring()) {
+            throw new IllegalArgumentException("Input was not an unsafe string");
+        }
+        
+        try (final InputStream data = new ByteArrayInputStream(input.unsafe_string())) {
+            final Document doc = parserPool.parse(data);
+            final DDF output = new DDF("xml").structure();
+            output.add(DDFSupport.fromElement(doc.getDocumentElement()));
+            return output;
+        } catch (final IOException | XMLParserException e) {
+            log.warn("Unable to parse supplied XML", e);
+            throw new RemoteProcessingException(e);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/impl/Echo.java b/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/endpoint/impl/package-info.java
similarity index 50%
rename from sp-server-impl/src/main/java/net/shibboleth/sp/remoting/impl/Echo.java
rename to sp-server-impl/src/main/java/net/shibboleth/sp/remoting/endpoint/impl/package-info.java
index 1876005..d92a1ce 100644
--- a/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/impl/Echo.java
+++ b/sp-server-impl/src/main/java/net/shibboleth/sp/remoting/endpoint/impl/package-info.java
@@ -12,28 +12,8 @@
  * limitations under the License.
  */
 
-
-package net.shibboleth.sp.remoting.impl;
-
-import net.shibboleth.sp.remoting.RemoteProcessingException;
-import net.shibboleth.sp.remoting.Endpoint;
-import net.shibboleth.utilities.java.support.ddf.DDF;
-
 /**
- * Echo service endpoint.
- * 
- * <p>This bean just echoes the input as the output for validation/testing.
+ * {@link Endpoint} implementations.
  */
-public class Echo implements Endpoint {
-
-    /** {@inheritDoc} */
-    public String getAddress() {
-        return "echo";
-    }
-
-    /** {@inheritDoc} */
-    public DDF receive(DDF input) throws RemoteProcessingException {
-        return input;
-    }
 
-}
\ No newline at end of file
+package net.shibboleth.sp.remoting.endpoint.impl;
\ No newline at end of file
diff --git a/sp-server-impl/src/test/java/net/shibboleth/sp/remoting/endpoint/impl/XMLParserTest.java b/sp-server-impl/src/test/java/net/shibboleth/sp/remoting/endpoint/impl/XMLParserTest.java
new file mode 100644
index 0000000..b73d5e3
--- /dev/null
+++ b/sp-server-impl/src/test/java/net/shibboleth/sp/remoting/endpoint/impl/XMLParserTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.sp.remoting.endpoint.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.annotation.Nullable;
+
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import net.shibboleth.sp.remoting.RemoteProcessingException;
+import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.ddf.DDF;
+import net.shibboleth.utilities.java.support.xml.BasicParserPool;
+import net.shibboleth.utilities.java.support.xml.XMLParserException;
+
+/**
+ * Unit test for {@link XMLParser}.
+ */
+public class XMLParserTest {
+    
+    @Nullable private BasicParserPool parserPool;
+    
+    @Nullable private XMLParser endpoint;
+    
+    /**
+     * Init parser.
+     * 
+     * @throws ComponentInitializationException 
+     */
+    @BeforeClass
+    public void setUp() throws ComponentInitializationException {
+        parserPool = new BasicParserPool();
+        parserPool.initialize();
+        
+        endpoint = new XMLParser();
+        endpoint.setParserPool(parserPool);
+        endpoint.initialize();
+    }
+    
+    /**
+     * Teardown. 
+     */
+    @AfterClass
+    public void tearDown() {
+        endpoint.destroy();
+        parserPool.destroy();
+    }
+    
+    /**
+     * Test bad input type.
+     * 
+     * @throws RemoteProcessingException
+     */
+    @Test(expectedExceptions=IllegalArgumentException.class)
+    public void badInput() throws RemoteProcessingException {
+        endpoint.receive(new DDF(XMLParser.ADDRESS).string("foo"));
+    }
+
+    /**
+     * Test bad XML.
+     * 
+     * @throws RemoteProcessingException
+     */
+    @Test(expectedExceptions=RemoteProcessingException.class)
+    public void badXML() throws RemoteProcessingException {
+        endpoint.receive(new DDF(XMLParser.ADDRESS).unsafe_string("<foo".getBytes()));
+    }
+
+    /**
+     * Test conversion.
+     * 
+     * @throws IOException 
+     * @throws XMLParserException 
+     * @throws RemoteProcessingException 
+     */
+    @Test
+    public void success() throws XMLParserException, IOException, RemoteProcessingException {
+        try (final InputStream source = getClass().getResourceAsStream("shibboleth2.xml")) {
+            final DDF obj = endpoint.receive(new DDF(XMLParser.ADDRESS).unsafe_string(source.readAllBytes()));
+            
+            Assert.assertTrue(obj.isstruct());
+            Assert.assertEquals(obj.name(), "xml");
+            Assert.assertTrue(obj.getmember("SPConfig").isstruct());
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/sp-server-impl/src/test/resources/net/shibboleth/sp/remoting/endpoint/impl/shibboleth2.xml b/sp-server-impl/src/test/resources/net/shibboleth/sp/remoting/endpoint/impl/shibboleth2.xml
new file mode 100644
index 0000000..cbe08c0
--- /dev/null
+++ b/sp-server-impl/src/test/resources/net/shibboleth/sp/remoting/endpoint/impl/shibboleth2.xml
@@ -0,0 +1,115 @@
+<SPConfig xmlns="urn:mace:shibboleth:3.0:native:sp:config"
+    xmlns:conf="urn:mace:shibboleth:3.0:native:sp:config"
+    clockSkew="180">
+
+    <OutOfProcess tranLogFormat="%u|%s|%IDP|%i|%ac|%t|%attr|%n|%b|%E|%S|%SS|%L|%UA|%a" />
+  
+    <!--
+    By default, in-memory StorageService, ReplayCache, ArtifactMap, and SessionCache
+    are used. See example-shibboleth2.xml for samples of explicitly configuring them.
+    -->
+
+    <!-- The ApplicationDefaults element is where most of Shibboleth's SAML bits are defined. -->
+    <ApplicationDefaults entityID="https://sp.example.org/shibboleth"
+        REMOTE_USER="eppn subject-id pairwise-id persistent-id"
+        cipherSuites="DEFAULT:!EXP:!LOW:!aNULL:!eNULL:!DES:!IDEA:!SEED:!RC4:!3DES:!kRSA:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1">
+
+        <!--
+        Controls session lifetimes, address checks, cookie handling, and the protocol handlers.
+        Each Application has an effectively unique handlerURL, which defaults to "/Shibboleth.sso"
+        and should be a relative path, with the SP computing the full value based on the virtual
+        host. Use of TLS is now assumed because browsers are enforcing it due to SameSite
+        restrictions. Note that while we default checkAddress to "false", this makes an assertion
+        stolen in transit easier for attackers to misuse.
+        -->
+       <Sessions lifetime="28800" timeout="3600" relayState="ss:mem"
+                  checkAddress="false" handlerSSL="true" cookieProps="https"
+                  redirectLimit="exact">
+
+            <!--
+            Configures SSO for a default IdP. To properly allow for >1 IdP, remove
+            entityID property and adjust discoveryURL to point to discovery service.
+            You can also override entityID on /Login query string, or in RequestMap/htaccess.
+            -->
+            <SSO entityID="https://idp.example.org/idp/shibboleth"
+                 discoveryProtocol="SAMLDS" discoveryURL="https://ds.example.org/DS/WAYF">
+              SAML2
+            </SSO>
+
+            <!-- SAML and local-only logout. -->
+            <Logout>SAML2 Local</Logout>
+
+            <!-- Administrative logout. -->
+            <LogoutInitiator type="Admin" Location="/Logout/Admin" acl="127.0.0.1 ::1" />
+          
+            <!-- Extension service that generates "approximate" metadata based on SP configuration. -->
+            <Handler type="MetadataGenerator" Location="/Metadata" signing="false"/>
+
+            <!-- Status reporting service. -->
+            <Handler type="Status" Location="/Status" acl="127.0.0.1 ::1"/>
+
+            <!-- Session diagnostic service. -->
+            <Handler type="Session" Location="/Session" showAttributeValues="false"/>
+
+            <!-- JSON feed of discovery information. -->
+            <Handler type="DiscoveryFeed" Location="/DiscoFeed"/>
+        </Sessions>
+
+        <!--
+        Allows overriding of error template information/filenames. You can
+        also add your own attributes with values that can be plugged into the
+        templates, e.g., helpLocation below.
+        -->
+        <Errors supportContact="root at localhost"
+            helpLocation="/about.html"
+            styleSheet="/shibboleth-sp/main.css"/>
+
+        <!-- Example of locally maintained metadata. -->
+        <!--
+        <MetadataProvider type="XML" validate="true" path="partner-metadata.xml"/>
+        -->
+
+        <!-- Example of remotely supplied batch of signed metadata. -->
+        <!--
+        <MetadataProvider type="XML" validate="true"
+	            url="http://federation.org/federation-metadata.xml"
+              backingFilePath="federation-metadata.xml" maxRefreshDelay="7200">
+            <MetadataFilter type="RequireValidUntil" maxValidityInterval="2419200"/>
+            <MetadataFilter type="Signature" certificate="fedsigner.pem" verifyBackup="false"/>
+            <DiscoveryFilter type="Blacklist" matcher="EntityAttributes" trimTags="true" 
+              attributeName="http://macedir.org/entity-category"
+              attributeNameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
+              attributeValue="http://refeds.org/category/hide-from-discovery" />
+        </MetadataProvider>
+        -->
+
+        <!-- Example of remotely supplied "on-demand" signed metadata. -->
+        <!--
+        <MetadataProvider type="MDQ" validate="true" cacheDirectory="mdq"
+	            baseUrl="http://mdq.federation.org" ignoreTransport="true">
+            <MetadataFilter type="RequireValidUntil" maxValidityInterval="2419200"/>
+            <MetadataFilter type="Signature" certificate="mdqsigner.pem" />
+        </MetadataProvider>
+        -->
+
+        <!-- Map to extract attributes from SAML assertions. -->
+        <AttributeExtractor type="XML" validate="true" reloadChanges="false" path="attribute-map.xml"/>
+
+        <!-- Default filtering policy for recognized attributes, lets other data pass. -->
+        <AttributeFilter type="XML" validate="true" path="attribute-policy.xml"/>
+
+        <!-- Simple file-based resolvers for separate signing/encryption keys. -->
+        <CredentialResolver type="File" use="signing"
+            key="sp-signing-key.pem" certificate="sp-signing-cert.pem"/>
+        <CredentialResolver type="File" use="encryption"
+            key="sp-encrypt-key.pem" certificate="sp-encrypt-cert.pem"/>
+        
+    </ApplicationDefaults>
+    
+    <!-- Policies that determine how to process and authenticate runtime messages. -->
+    <SecurityPolicyProvider type="XML" validate="true" path="security-policy.xml"/>
+
+    <!-- Low-level configuration about protocols and bindings available for use. -->
+    <ProtocolProvider type="XML" validate="true" reloadChanges="false" path="protocols.xml"/>
+
+</SPConfig>

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


More information about the commits mailing list