[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