[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