[java-plugin-shibd-saml] branch main updated: Unit tests for logout initiator flow.

Codeberg noreply at shibboleth.net
Wed Apr 8 15:29:34 UTC 2026


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

codeberg pushed a commit to branch main
in repository java-plugin-shibd-saml.

View the commit online:
https://codeberg.org/Shibboleth/java-plugin-shibd-saml/commit/001af5eefce12e53a3ab0bd423044f431e9283f4

The following commit(s) were added to refs/heads/main by this push:
     new 001af5e  Unit tests for logout initiator flow.
001af5e is described below

commit 001af5eefce12e53a3ab0bd423044f431e9283f4
Author: Scott Cantor <scott at restingparrotsoftware.com>
AuthorDate: Wed Apr 8 11:29:17 2026 -0400

    Unit tests for logout initiator flow.
---
 .../flows/sp/logout/initiator/saml2/saml2-flow.xml |   2 +-
 .../shibboleth/idp/module/conf/sp/saml.properties  |   2 +
 .../flows/saml2/SAML2LogoutInitiatorFlowTest.java  | 433 +++++++++++++++++++++
 .../idp/module/conf/metadata-providers.xml         |   6 +
 .../idp/module/conf/sp/saml-test-agents.xml        |  11 +-
 5 files changed, 451 insertions(+), 3 deletions(-)

diff --git a/sp-saml-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/logout/initiator/saml2/saml2-flow.xml b/sp-saml-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/logout/initiator/saml2/saml2-flow.xml
index 18f438f..ec8dfb3 100644
--- a/sp-saml-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/logout/initiator/saml2/saml2-flow.xml
+++ b/sp-saml-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/logout/initiator/saml2/saml2-flow.xml
@@ -33,6 +33,6 @@
     </action-state>
     
     <!-- The file really exists in this directory, but it's referenced from extending flow-directories -->
-    <bean-import resource="classpath:/META-INF/net/shibboleth/idp/flows/sp/initiator/saml2/saml2-beans.xml" />
+    <bean-import resource="classpath:/META-INF/net/shibboleth/idp/flows/sp/logout/initiator/saml2/saml2-beans.xml" />
 
 </flow>
diff --git a/sp-saml-conf-impl/src/main/resources/net/shibboleth/idp/module/conf/sp/saml.properties b/sp-saml-conf-impl/src/main/resources/net/shibboleth/idp/module/conf/sp/saml.properties
index 2e6aeec..c4e252f 100644
--- a/sp-saml-conf-impl/src/main/resources/net/shibboleth/idp/module/conf/sp/saml.properties
+++ b/sp-saml-conf-impl/src/main/resources/net/shibboleth/idp/module/conf/sp/saml.properties
@@ -24,6 +24,8 @@ sp.saml.encryption.cert = %{idp.home}/credentials/sp/sp-encryption.crt
 #sp.saml.checkInResponseTo = true
 # Set to non-zero duration to limit time since authentication
 #sp.saml.maxTimeSinceAuthn = 0
+# Turn off to disable Asynchronous logout extension
+#sp.saml.logout.asynchronous = true
 
 # Default security configuration for SAML
 #sp.saml.security.config = shibboleth.sp.DefaultXMLSecurityConfiguration
diff --git a/sp-saml-conf-impl/src/test/java/net/shibboleth/sp/saml/flows/saml2/SAML2LogoutInitiatorFlowTest.java b/sp-saml-conf-impl/src/test/java/net/shibboleth/sp/saml/flows/saml2/SAML2LogoutInitiatorFlowTest.java
new file mode 100644
index 0000000..d65f684
--- /dev/null
+++ b/sp-saml-conf-impl/src/test/java/net/shibboleth/sp/saml/flows/saml2/SAML2LogoutInitiatorFlowTest.java
@@ -0,0 +1,433 @@
+/*
+ * 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.sp.saml.flows.saml2;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.time.Instant;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.opensaml.messaging.context.MessageContext;
+import org.opensaml.messaging.decoder.MessageDecodingException;
+import org.opensaml.profile.context.ProfileRequestContext;
+import org.opensaml.saml.common.SAMLObject;
+import org.opensaml.saml.common.binding.SAMLBindingSupport;
+import org.opensaml.saml.ext.saml2aslo.Asynchronous;
+import org.opensaml.saml.saml2.binding.decoding.impl.HTTPRedirectDeflateDecoder;
+import org.opensaml.saml.saml2.core.Extensions;
+import org.opensaml.saml.saml2.core.Issuer;
+import org.opensaml.saml.saml2.core.LogoutRequest;
+import org.opensaml.saml.saml2.core.NameID;
+import org.opensaml.saml.saml2.core.SessionIndex;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.webflow.executor.FlowExecutionResult;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import net.shibboleth.idp.authn.AuthnEventIds;
+import net.shibboleth.idp.spring.IdPPropertiesApplicationContextInitializer;
+import net.shibboleth.idp.test.PreferFileSystemApplicationContextInitializer;
+import net.shibboleth.shared.collection.Pair;
+import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.net.URISupport;
+import net.shibboleth.shared.primitive.NonnullSupplier;
+import net.shibboleth.sp.context.AgentRequestContext;
+import net.shibboleth.sp.ddf.DDF;
+import net.shibboleth.sp.flows.AbstractSPFlowTest;
+import net.shibboleth.sp.messaging.RemotedHttpServletRequest;
+import net.shibboleth.sp.messaging.RemotedHttpServletResponse;
+import net.shibboleth.sp.profile.ConsumerConstants;
+import net.shibboleth.sp.profile.SPConstants;
+import net.shibboleth.sp.saml.saml2.profile.impl.PrepareAgentResponse;
+
+/**
+ * Unit test for the SP session-initiator flow.
+ */
+ at ContextConfiguration(
+        locations = {
+                "classpath:/net/shibboleth/sp/saml-test-beans.xml",
+                },
+        initializers = {
+                TestSPSAMLEnvironmentApplicationContextInitializer.class,
+                PreferFileSystemApplicationContextInitializer.class,
+                IdPPropertiesApplicationContextInitializer.class
+                },
+        inheritInitializers = false
+        )
+ at WebAppConfiguration
+public class SAML2LogoutInitiatorFlowTest extends AbstractSPFlowTest {
+    
+    /** Flow ID. */
+    @Nonnull public static final String FLOW_ID = "sp/logout-initiator";
+
+    /** Issuer value. */
+    @Nonnull public static final String ISSUER = "https://testsp.example.org";
+    
+    /** Resource URL. */
+    @Nonnull public static final byte[] RESOURCE_URL = "https://sp.example.org/secure".getBytes(StandardCharsets.UTF_8);
+
+    /** Opaque session blob with index. */
+    @Nonnull public static final String SESSION_DATA =
+            "<NameID xmlns='urn:oasis:names:tc:SAML:2.0:assertion' Format='bar' SPProvidedID='https://idp.example.org!!12345'>foo</NameID>";
+
+    /** Opaque session blob. */
+    @Nonnull public static final String SESSION_DATA_NO_INDEX =
+            "<NameID xmlns='urn:oasis:names:tc:SAML:2.0:assertion' Format='bar' SPProvidedID='https://idp.example.org'>foo</NameID>";
+    
+    /** Opaque session blob for no-endpoint IdP. */
+    @Nonnull public static final String SESSION_DATA_NO_ENDPOINT =
+            "<NameID xmlns='urn:oasis:names:tc:SAML:2.0:assertion' Format='bar' SPProvidedID='https://noendpoint.example.org!!12345'>foo</NameID>";
+
+    /** Opaque session blob for no-metadata IdP. */
+    @Nonnull public static final String SESSION_DATA_NO_METADATA =
+            "<NameID xmlns='urn:oasis:names:tc:SAML:2.0:assertion' Format='bar' SPProvidedID='https://unknown.example.org!!12345'>foo</NameID>";
+    
+    /** Constructor. */
+    protected SAML2LogoutInitiatorFlowTest() {
+        super(FLOW_ID);
+    }
+
+    /**
+     * Test flow with unverified (no metadata) IdP specified.
+     * 
+     * @throws IOException 
+     */
+    @Test
+    public void testUnverified() throws IOException {
+        setDefaultAuth();
+        
+        final DDF input = new DDF(null).structure();
+        input.addmember(ConsumerConstants.SESSION_OPAQUE).addmember(PrepareAgentResponse.NAMEID_PARAM).string(SESSION_DATA_NO_METADATA);
+        input.addmember(RemotedHttpServletRequest.STRUCTURE_NAME).structure();
+        input.addmember(SPConstants.TARGET).unsafe_string(RESOURCE_URL);
+        setApplicationRequest("no-metadata", input);
+
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        assertFlowExecutionResult(result, FLOW_ID);
+        assertFlowExecutionOutcome(result.getOutcome());
+        assertOutputMessageEvent(result, AuthnEventIds.NO_POTENTIAL_FLOW);
+    }
+
+    /**
+     * Test flow with profile disallowed.
+     * 
+     * @throws IOException 
+     */
+    @Test
+    public void testProfileDisabled() throws IOException {
+        setDefaultAuth();
+        
+        final DDF input = new DDF(null).structure();
+        input.addmember(ConsumerConstants.SESSION_OPAQUE).addmember(PrepareAgentResponse.NAMEID_PARAM).string(SESSION_DATA);
+        input.addmember(RemotedHttpServletRequest.STRUCTURE_NAME).structure();
+        input.addmember(SPConstants.TARGET).unsafe_string(RESOURCE_URL);
+        setApplicationRequest("no-profile", input);
+
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        assertFlowExecutionResult(result, FLOW_ID);
+        assertFlowExecutionOutcome(result.getOutcome());
+        assertOutputMessageEvent(result, AuthnEventIds.NO_POTENTIAL_FLOW);
+    }
+
+    /**
+     * Test flow with no valid endpoint
+     * 
+     * @throws IOException 
+     */
+    @Test
+    public void testNoEndpoint() throws IOException {
+        setDefaultAuth();
+
+        final DDF input = new DDF(null).structure();
+        input.addmember(ConsumerConstants.SESSION_OPAQUE).addmember(PrepareAgentResponse.NAMEID_PARAM).string(SESSION_DATA_NO_ENDPOINT);
+        input.addmember(RemotedHttpServletRequest.STRUCTURE_NAME).structure();
+        input.addmember(SPConstants.TARGET).unsafe_string(RESOURCE_URL);
+        setApplicationRequest("no-endpoint", input);
+
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        assertFlowExecutionResult(result, FLOW_ID);
+        assertFlowExecutionOutcome(result.getOutcome());
+        assertOutputMessageEvent(result, AuthnEventIds.NO_POTENTIAL_FLOW);
+    }
+
+    /**
+     * Test flow without session data.
+     * 
+     * @throws IOException 
+     * @throws MessageDecodingException 
+     */
+    @Test
+    public void testNoSessionData() throws IOException, MessageDecodingException {
+        setDefaultAuth();
+
+        final DDF input = new DDF(null).structure();
+        input.addmember(RemotedHttpServletRequest.STRUCTURE_NAME).structure();
+        input.addmember(SPConstants.TARGET).unsafe_string(RESOURCE_URL);
+        setApplicationRequest(APPLICATION_ID, input);
+
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        assertFlowExecutionResult(result, FLOW_ID);
+        assertFlowExecutionOutcome(result.getOutcome());
+        assertOutputMessageEvent(result, AuthnEventIds.NO_POTENTIAL_FLOW);
+    }
+
+    /**
+     * Test flow without session data.
+     * 
+     * @throws IOException 
+     * @throws MessageDecodingException 
+     */
+    @Test
+    public void testInvalidSessionData() throws IOException, MessageDecodingException {
+        setDefaultAuth();
+
+        final DDF input = new DDF(null).structure();
+        input.addmember(ConsumerConstants.SESSION_OPAQUE).addmember(PrepareAgentResponse.NAMEID_PARAM).string("foo");
+        input.addmember(RemotedHttpServletRequest.STRUCTURE_NAME).structure();
+        input.addmember(SPConstants.TARGET).unsafe_string(RESOURCE_URL);
+        setApplicationRequest(APPLICATION_ID, input);
+
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        assertFlowExecutionResult(result, FLOW_ID);
+        assertFlowExecutionOutcome(result.getOutcome());
+        assertOutputMessageEvent(result, AuthnEventIds.NO_POTENTIAL_FLOW);
+    }    
+    
+    /**
+     * Test simple success case with preset relay state.
+     * 
+     * @throws IOException 
+     * @throws MessageDecodingException 
+     */
+    @Test
+    public void testSimpleWithState() throws IOException, MessageDecodingException {
+        setDefaultAuth();
+        
+        final DDF input = new DDF(null).structure();
+        input.addmember(ConsumerConstants.SESSION_OPAQUE).addmember(PrepareAgentResponse.NAMEID_PARAM).string(SESSION_DATA);
+        input.addmember(RemotedHttpServletRequest.STRUCTURE_NAME).structure();
+        input.addmember(SPConstants.STATE).string("foostate");
+        setApplicationRequest(APPLICATION_ID, input);
+
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        assertFlowExecutionResult(result, FLOW_ID);
+        assertFlowExecutionOutcome(result.getOutcome());
+        
+        assertOutputMessageSuccess(result);
+        validateOutputMessage(result, "12345", false);
+    }
+
+    /**
+     * Test simple success case with encryption enabled.
+     * 
+     * @throws IOException 
+     * @throws MessageDecodingException 
+     */
+    @Test
+    public void testSimpleWithEncryption() throws IOException, MessageDecodingException {
+        setDefaultAuth();
+        
+        final DDF input = new DDF(null).structure();
+        input.addmember(ConsumerConstants.SESSION_OPAQUE).addmember(PrepareAgentResponse.NAMEID_PARAM).string(SESSION_DATA);
+        input.addmember(RemotedHttpServletRequest.STRUCTURE_NAME).structure();
+        input.addmember(SPConstants.STATE).string("foostate");
+        setApplicationRequest("logout-encryption", input);
+
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        assertFlowExecutionResult(result, FLOW_ID);
+        assertFlowExecutionOutcome(result.getOutcome());
+        
+        assertOutputMessageSuccess(result);
+        validateOutputMessage(result, "12345", true);
+    }
+    
+    /**
+     * Test simple success case with preset relay state.
+     * 
+     * @throws IOException 
+     * @throws MessageDecodingException 
+     */
+    @Test
+    public void testSimpleWithStateNoIndex() throws IOException, MessageDecodingException {
+        setDefaultAuth();
+        
+        final DDF input = new DDF(null).structure();
+        input.addmember(ConsumerConstants.SESSION_OPAQUE).addmember(PrepareAgentResponse.NAMEID_PARAM).string(SESSION_DATA_NO_INDEX);
+        input.addmember(RemotedHttpServletRequest.STRUCTURE_NAME).structure();
+        input.addmember(SPConstants.STATE).string("foostate");
+        setApplicationRequest(APPLICATION_ID, input);
+
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        assertFlowExecutionResult(result, FLOW_ID);
+        assertFlowExecutionOutcome(result.getOutcome());
+        
+        assertOutputMessageSuccess(result);
+        validateOutputMessage(result, null, false);
+    }
+    
+
+    /**
+     * Test simple success case with computed relay state.
+     * 
+     * @throws IOException 
+     * @throws MessageDecodingException 
+     */
+    @Test
+    public void testSimpleWithoutState() throws IOException, MessageDecodingException {
+        setDefaultAuth();
+        
+        final DDF input = new DDF(null).structure();
+        input.addmember(ConsumerConstants.SESSION_OPAQUE).addmember(PrepareAgentResponse.NAMEID_PARAM).string(SESSION_DATA);
+        input.addmember(RemotedHttpServletRequest.STRUCTURE_NAME).structure();
+        input.addmember(SPConstants.TARGET).unsafe_string("https://sp.example.org/cgi-bin/test.cgi?foo=bar%20baz&frobnitz=zorkmid".getBytes(StandardCharsets.UTF_8));
+        
+        setApplicationRequest(APPLICATION_ID, input);
+
+        final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+        assertFlowExecutionResult(result, FLOW_ID);
+        assertFlowExecutionOutcome(result.getOutcome());
+        
+        assertOutputMessageSuccess(result);
+        validateOutputMessage(result, "12345", false);
+    }
+
+    /**
+     * Decode an encoded response and run sanity checks against it.
+     * 
+     * @param result flow execution result
+     * @param index Session Index, if any
+     * @param encrypted whether the NameID should be encrypted
+     * 
+     * @return the request object
+     * 
+     * @throws MessageDecodingException
+     */
+    @Nonnull private LogoutRequest validateOutputMessage(@Nonnull final FlowExecutionResult result, @Nullable final String index, final boolean encrypted)
+            throws MessageDecodingException {
+        final ProfileRequestContext prc = retrieveProfileRequestContext(result);
+        assert prc != null;
+        final AgentRequestContext arc = prc.ensureSubcontext(AgentRequestContext.class);
+        final DDF input = arc.getInput();
+        final DDF output = arc.getOutput();
+
+        assert output != null;
+        Assert.assertTrue(output.isstruct());
+        final DDF http = output.getmember(RemotedHttpServletResponse.STRUCTURE_NAME);
+        Assert.assertTrue(http.isstruct());
+        
+        final LogoutRequest logoutRequest;
+        final byte[] redirect = http.getmember(RemotedHttpServletResponse.REDIRECT).unsafe_string();
+        if (redirect != null) {
+            final String redirectURL = new String(redirect, StandardCharsets.UTF_8);
+            final SAMLObject saml = decodeRedirect(redirectURL,
+                    input != null ? input.getmember(SPConstants.STATE).string() : null);
+            assert saml instanceof LogoutRequest;
+            logoutRequest = (LogoutRequest) saml;
+            Assert.assertTrue(redirectURL.startsWith(logoutRequest.getDestination()));
+        } else {
+            final byte[] body = http.getmember("response.data").unsafe_string();
+            Assert.assertNotNull(body);
+            // Not trivial to consider parsing the form, so just bypass that step.
+            final Object saml = prc.ensureOutboundMessageContext().ensureMessage();
+            assert saml instanceof LogoutRequest;
+            logoutRequest = (LogoutRequest) saml;
+            Assert.assertEquals(SAMLBindingSupport.getRelayState(prc.ensureOutboundMessageContext()),
+                    input != null ? input.getmember(SPConstants.STATE).string() : null);
+        }
+        
+        assert logoutRequest != null;
+        Assert.assertNotNull(logoutRequest.getID());
+        Assert.assertTrue(Instant.now().isAfter(logoutRequest.getIssueInstant()));
+        final Issuer issuer = logoutRequest.getIssuer();
+        assert issuer != null;
+        Assert.assertEquals(issuer.getValue(), ISSUER);
+                
+        if (encrypted) {
+            Assert.assertNotNull(logoutRequest.getEncryptedID());
+        } else {
+            final NameID n = logoutRequest.getNameID();
+            assert n != null;
+            Assert.assertEquals(n.getValue(), "foo");
+            Assert.assertEquals(n.getFormat(), "bar");
+        }
+        
+        final List<SessionIndex> indexes = logoutRequest.getSessionIndexes();
+        if (index != null) {
+            Assert.assertEquals(indexes.size(), 1);
+            Assert.assertEquals(indexes.get(0).getValue(), index);
+        } else {
+            Assert.assertTrue(indexes.isEmpty());
+        }
+        
+        final Extensions exts = logoutRequest.getExtensions();
+        assert exts != null;
+        Assert.assertEquals(exts.getUnknownXMLObjects(Asynchronous.DEFAULT_ELEMENT_NAME).size(), 1);
+        
+        return logoutRequest;
+    }
+
+    
+    /**
+     * Decodes a SAML message encoded via HTTP-Redirect binding.
+     * 
+     * @param url the encoded redirect
+     * @param relayState RelayState to check for
+     * 
+     * @return decoded message
+     * @throws MessageDecodingException 
+     */
+    @Nonnull protected SAMLObject decodeRedirect(@Nullable final String url, @Nullable final String relayState)
+            throws MessageDecodingException {
+        final MockHttpServletRequest mock = new MockHttpServletRequest("GET", url);
+        final int index = url != null ? url.indexOf('?') : -1;
+        if (url == null || index < 0) {
+            throw new MessageDecodingException("No query string");
+        }
+        final List<Pair<String,String>> params = URISupport.parseQueryString(url.substring(index + 1));
+        for (final var param : params) {
+            final String name = param.getFirst();
+            if (name != null) {
+                mock.addParameter(name, param.getSecond());
+            }
+        }
+        
+        final HTTPRedirectDeflateDecoder decoder = new HTTPRedirectDeflateDecoder();
+        decoder.setHttpServletRequestSupplier(NonnullSupplier.of(mock));
+        decoder.setParserPool(parserPool);
+        
+        try {
+            decoder.initialize();
+        } catch (final ComponentInitializationException e) {
+            throw new MessageDecodingException(e);
+        }
+        
+        decoder.decode();
+        
+        final MessageContext mc = decoder.getMessageContext();
+        decoder.destroy();
+        
+        if (mc != null && mc.getMessage() instanceof SAMLObject saml) {
+            Assert.assertEquals(SAMLBindingSupport.getRelayState(mc), relayState);
+            return saml;
+        }
+        throw new MessageDecodingException("No message, or incorrect type.");
+    }
+
+}
\ No newline at end of file
diff --git a/sp-saml-conf-impl/src/test/resources/net/shibboleth/idp/module/conf/metadata-providers.xml b/sp-saml-conf-impl/src/test/resources/net/shibboleth/idp/module/conf/metadata-providers.xml
index b78c87a..ea3603c 100644
--- a/sp-saml-conf-impl/src/test/resources/net/shibboleth/idp/module/conf/metadata-providers.xml
+++ b/sp-saml-conf-impl/src/test/resources/net/shibboleth/idp/module/conf/metadata-providers.xml
@@ -62,6 +62,12 @@ i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
                             </ds:X509Data>
                         </ds:KeyInfo>
                     </md:KeyDescriptor>
+                    <md:SingleLogoutService
+                        Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
+                        Location="https://idp.example.org/idp/profile/SAML2/Redirect/SLO" />
+                    <md:SingleLogoutService
+                        Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
+                        Location="https://idp.example.org/idp/profile/SAML2/POST/SLO" />
                     <md:SingleSignOnService
                         Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
                         Location="https://idp.example.org/idp/profile/SAML2/Redirect/SSO" />
diff --git a/sp-saml-conf-impl/src/test/resources/net/shibboleth/idp/module/conf/sp/saml-test-agents.xml b/sp-saml-conf-impl/src/test/resources/net/shibboleth/idp/module/conf/sp/saml-test-agents.xml
index 50dc396..efeaa7c 100644
--- a/sp-saml-conf-impl/src/test/resources/net/shibboleth/idp/module/conf/sp/saml-test-agents.xml
+++ b/sp-saml-conf-impl/src/test/resources/net/shibboleth/idp/module/conf/sp/saml-test-agents.xml
@@ -28,6 +28,9 @@
                 <bean p:id="response-binding" parent="shibboleth.sp.Application"
                     p:profileConfigurations-ref="test.responseBindingProfileConfigurations" />
 
+                <bean p:id="logout-encryption" parent="shibboleth.sp.Application"
+                    p:profileConfigurations-ref="test.ProfileConfigurations" />
+
                 <bean p:id="no-metadata" parent="shibboleth.sp.Application"
                     p:authenticatingAuthority="https://unknown.example.org"
                     p:profileConfigurations-ref="test.ProfileConfigurations" />
@@ -52,7 +55,7 @@
     <util:list id="test.ProfileConfigurations">
         <ref bean="SAML2.SSO" />
         <ref bean="SAML2.ECP" />
-        <ref bean="SAML2.Logout" />
+        <ref bean="SAML2.Logout"/>
     </util:list>
 
     <util:list id="test.responseBindingProfileConfigurations">
@@ -102,10 +105,14 @@
     this way, usually to expose public information about the system.
     -->
     
-    <!--
     <util:list id="shibboleth.sp.DefaultProfileConfigurations">
+        <ref bean="SAML2.SSO" />
+        <ref bean="SAML2.ECP" />
+        <!-- Turn off encryption so tests are easier to validate. -->
+        <bean parent="SAML2.Logout" p:encryptNameIDs="false" />
     </util:list>
 
+    <!--
     <util:list id="shibboleth.sp.UnverifiedProfileConfigurations">
     </util:list>
     -->

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


More information about the commits mailing list