[java-idp-testbed] 03/05: SOAP logout mock support.
Tom Zeller
tzeller at dragonacea.biz
Fri Mar 8 10:37:35 EST 2019
This is an automated email from the git hooks/post-receive script.
tzeller pushed a commit to branch maint-3
in repository java-idp-testbed.
View the commit online:
http://git.shibboleth.net/view/?p=java-idp-testbed.git;a=commit;h=48fd72fcfd4d82c50669a47df224fb457ac6199e
commit 48fd72fcfd4d82c50669a47df224fb457ac6199e
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Thu Nov 15 17:13:57 2018 -0500
SOAP logout mock support.
---
src/main/java/sp/BaseSAMLController.java | 20 +++++++++++
src/main/java/sp/SAML2Controller.java | 60 ++++++++++++++++++++++++++++++--
2 files changed, 77 insertions(+), 3 deletions(-)
diff --git a/src/main/java/sp/BaseSAMLController.java b/src/main/java/sp/BaseSAMLController.java
index 0f5f81d..2a9a236 100644
--- a/src/main/java/sp/BaseSAMLController.java
+++ b/src/main/java/sp/BaseSAMLController.java
@@ -33,6 +33,7 @@ import org.opensaml.saml.common.SAMLObject;
import org.opensaml.saml.common.binding.artifact.SAMLArtifactMap;
import org.opensaml.saml.saml2.binding.decoding.impl.HTTPPostDecoder;
import org.opensaml.saml.saml2.binding.decoding.impl.HTTPRedirectDeflateDecoder;
+import org.opensaml.saml.saml2.binding.decoding.impl.HTTPSOAP11Decoder;
import org.opensaml.security.credential.Credential;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -79,6 +80,25 @@ public abstract class BaseSAMLController {
}
}
+ protected MessageContext<SAMLObject> decodeInboundMessageContextSOAP(HttpServletRequest servletRequest)
+ throws Exception {
+ HTTPSOAP11Decoder decoder = new HTTPSOAP11Decoder();
+ try {
+ decoder.setHttpServletRequest(servletRequest);
+ decoder.setParserPool(parserPool);
+ decoder.initialize();
+
+ decoder.decode();
+
+ return decoder.getMessageContext();
+ } catch (ComponentInitializationException | MessageDecodingException e) {
+ log.error("Error decoding inbound message context", e);
+ throw e;
+ } finally {
+ decoder.destroy();
+ }
+ }
+
protected MessageContext<SAMLObject> decodeInboundMessageContextRedirect(HttpServletRequest servletRequest)
throws Exception {
HTTPRedirectDeflateDecoder decoder = new HTTPRedirectDeflateDecoder();
diff --git a/src/main/java/sp/SAML2Controller.java b/src/main/java/sp/SAML2Controller.java
index 34a9da2..0f19a7e 100644
--- a/src/main/java/sp/SAML2Controller.java
+++ b/src/main/java/sp/SAML2Controller.java
@@ -50,6 +50,7 @@ import org.opensaml.saml.ext.saml2aslo.Asynchronous;
import org.opensaml.saml.saml2.binding.encoding.impl.HTTPArtifactEncoder;
import org.opensaml.saml.saml2.binding.encoding.impl.HTTPPostEncoder;
import org.opensaml.saml.saml2.binding.encoding.impl.HTTPRedirectDeflateEncoder;
+import org.opensaml.saml.saml2.binding.encoding.impl.HTTPSOAP11Encoder;
import org.opensaml.saml.saml2.core.AttributeQuery;
import org.opensaml.saml.saml2.core.AuthnContextClassRef;
import org.opensaml.saml.saml2.core.AuthnRequest;
@@ -59,6 +60,7 @@ import org.opensaml.saml.saml2.core.LogoutRequest;
import org.opensaml.saml.saml2.core.LogoutResponse;
import org.opensaml.saml.saml2.core.NameID;
import org.opensaml.saml.saml2.core.NameIDPolicy;
+import org.opensaml.saml.saml2.core.RequestAbstractType;
import org.opensaml.saml.saml2.core.RequestedAuthnContext;
import org.opensaml.saml.saml2.core.RequesterID;
import org.opensaml.saml.saml2.core.Response;
@@ -262,6 +264,17 @@ public class SAML2Controller extends BaseSAMLController {
SAMLMessageSecuritySupport.signMessage(messageContext);
encodeOutboundMessageContextPost(messageContext, servletResponse);
}
+
+ @RequestMapping(value="/FinishSLO/SOAP", method=RequestMethod.GET)
+ public void finishSLOResponseSOAP(HttpServletRequest servletRequest, HttpServletResponse servletResponse, final String id) throws Exception {
+ final LogoutResponse logoutResponse = buildLogoutResponse(servletRequest);
+ logoutResponse.setInResponseTo(id);
+ final String spEntityID = getSpEntityId(servletRequest);
+ final String idpEntityID = getIdpEntityId(servletRequest);
+ final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(logoutResponse, null, spEntityID, idpEntityID);
+ SAMLMessageSecuritySupport.signMessage(messageContext);
+ encodeOutboundMessageContextSOAP(messageContext, servletResponse);
+ }
@RequestMapping(value="/POST/ACS", method=RequestMethod.POST)
public ResponseEntity<String> handleSSOResponsePOST(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws Exception {
@@ -329,7 +342,29 @@ public class SAML2Controller extends BaseSAMLController {
return new ResponseEntity<>(formattedMessage, headers, HttpStatus.OK);
}
- private MessageContext<SAMLObject> buildOutboundMessageContext(SAMLObject message, Endpoint endpoint, String spEntityId, String idpEntityId) {
+ @RequestMapping(value="/SOAP/SLO", method=RequestMethod.POST)
+ public ResponseEntity<String> handleSLOResponseSOAP(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws Exception {
+ final MessageContext<SAMLObject> messageContext = decodeInboundMessageContextSOAP(servletRequest);
+
+ if (messageContext.getMessage() instanceof LogoutRequest) {
+ servletRequest.setAttribute("success", "1");
+ finishSLOResponseSOAP(servletRequest, servletResponse, ((LogoutRequest) messageContext.getMessage()).getID());
+ return null;
+ }
+
+ final XMLObject msg = messageContext.getMessage();
+ final Element responseElement = msg.getDOM();
+ final String formattedMessage = SerializeSupport.prettyPrintXML(responseElement);
+
+ //TODO instead of returning plain text via a ResponseEntity, add a JSP view that looks good
+
+ final HttpHeaders headers = new HttpHeaders();
+ headers.add("Content-Type", "text/plain");
+
+ return new ResponseEntity<>(formattedMessage, headers, HttpStatus.OK);
+ }
+
+ private MessageContext<SAMLObject> buildOutboundMessageContext(SAMLObject message, Endpoint endpoint, String spEntityId, String idpEntityId) {
MessageContext<SAMLObject> messageContext = new MessageContext<>();
messageContext.setMessage(message);
@@ -339,8 +374,10 @@ public class SAML2Controller extends BaseSAMLController {
SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
peerContext.setEntityId(idpEntityId);
- SAMLEndpointContext endpointContext = peerContext.getSubcontext(SAMLEndpointContext.class, true);
- endpointContext.setEndpoint(endpoint);
+ if (endpoint != null) {
+ SAMLEndpointContext endpointContext = peerContext.getSubcontext(SAMLEndpointContext.class, true);
+ endpointContext.setEndpoint(endpoint);
+ }
SAMLArtifactContext artifactContext = messageContext.getSubcontext(SAMLArtifactContext.class, true);
artifactContext.setSourceArtifactResolutionServiceEndpointIndex(1);
@@ -409,6 +446,23 @@ public class SAML2Controller extends BaseSAMLController {
encoder.destroy();
}
}
+
+ private void encodeOutboundMessageContextSOAP(MessageContext<SAMLObject> messageContext, HttpServletResponse servletResponse) throws Exception {
+ HTTPSOAP11Encoder encoder = new HTTPSOAP11Encoder();
+ try {
+ encoder.setHttpServletResponse(servletResponse);
+ encoder.setMessageContext(messageContext);
+ encoder.initialize();
+
+ encoder.prepareContext();
+ encoder.encode();
+ } catch (final ComponentInitializationException | MessageEncodingException e) {
+ log.error("Error encoding the outbound message context", e);
+ throw e;
+ } finally {
+ encoder.destroy();
+ }
+ }
private SingleSignOnService buildIdpSsoEndpoint(String binding, String destination) {
final SingleSignOnService ssoEndpoint = (SingleSignOnService) builderFactory.getBuilder(
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list