[java-idp-testbed] branch master updated: Add some artifact issuing test code.

Scott Cantor cantor.2 at osu.edu
Mon Oct 1 10:24:12 EDT 2018


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

scantor pushed a commit to branch master
in repository java-idp-testbed.

View the commit online:
http://git.shibboleth.net/view/?p=java-idp-testbed.git;a=commit;h=6c5c89d51fe98edcba326c76c514d60a31082d67

The following commit(s) were added to refs/heads/master by this push:
       new  6c5c89d   Add some artifact issuing test code.
6c5c89d is described below

commit 6c5c89d51fe98edcba326c76c514d60a31082d67
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Mon Oct 1 10:23:55 2018 -0400

    Add some artifact issuing test code.
---
 src/main/java/sp/BaseSAMLController.java           |   3 +
 src/main/java/sp/SAML2Controller.java              | 103 +++++++++++++++++----
 .../resources/system/conf/testbed-opensaml.xml     |   5 +-
 3 files changed, 91 insertions(+), 20 deletions(-)

diff --git a/src/main/java/sp/BaseSAMLController.java b/src/main/java/sp/BaseSAMLController.java
index f0b47d7..0f5f81d 100644
--- a/src/main/java/sp/BaseSAMLController.java
+++ b/src/main/java/sp/BaseSAMLController.java
@@ -30,6 +30,7 @@ import org.opensaml.core.xml.io.MarshallerFactory;
 import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.decoder.MessageDecodingException;
 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.security.credential.Credential;
@@ -50,6 +51,8 @@ public abstract class BaseSAMLController {
     protected IdentifierGenerationStrategy idGenerator = new Type4UUIDIdentifierGenerationStrategy();
 
     @Autowired protected VelocityEngine velocityEngine;
+    
+    @Autowired protected SAMLArtifactMap artifactMap;
 
     @Autowired protected ParserPool parserPool;
 
diff --git a/src/main/java/sp/SAML2Controller.java b/src/main/java/sp/SAML2Controller.java
index f1b6dd0..34a9da2 100644
--- a/src/main/java/sp/SAML2Controller.java
+++ b/src/main/java/sp/SAML2Controller.java
@@ -40,11 +40,14 @@ import org.opensaml.saml.common.SAMLObject;
 import org.opensaml.saml.common.SAMLObjectBuilder;
 import org.opensaml.saml.common.SAMLVersion;
 import org.opensaml.saml.common.messaging.SAMLMessageSecuritySupport;
+import org.opensaml.saml.common.messaging.context.SAMLArtifactContext;
 import org.opensaml.saml.common.messaging.context.SAMLEndpointContext;
 import org.opensaml.saml.common.messaging.context.SAMLPeerEntityContext;
+import org.opensaml.saml.common.messaging.context.SAMLSelfEntityContext;
 import org.opensaml.saml.common.xml.SAMLConstants;
 import org.opensaml.saml.ext.reqattr.RequestedAttributes;
 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.core.AttributeQuery;
@@ -103,8 +106,9 @@ public class SAML2Controller extends BaseSAMLController {
 		final AuthnRequest authnRequest = buildAuthnRequest(servletRequest);
 		authnRequest.setDestination(getDestinationRedirect(servletRequest, "SSO"));
 		final Endpoint endpoint = buildIdpSsoEndpoint(SAMLConstants.SAML2_REDIRECT_BINDING_URI, authnRequest.getDestination());
+        final String spEntityID = getSpEntityId(servletRequest);
 		final String idpEntityID = getIdpEntityId(servletRequest);
-		final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, idpEntityID);
+		final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, spEntityID, idpEntityID);
 		encodeOutboundMessageContextRedirect(messageContext, servletResponse);
 	}
 
@@ -113,20 +117,33 @@ public class SAML2Controller extends BaseSAMLController {
 	    final AuthnRequest authnRequest = buildAuthnRequest(servletRequest);
 		authnRequest.setDestination(getDestinationPost(servletRequest, "SSO"));
 		final Endpoint endpoint = buildIdpSsoEndpoint(SAMLConstants.SAML2_POST_BINDING_URI, authnRequest.getDestination());
-		final String idpEntityID = getIdpEntityId(servletRequest);
-		final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, idpEntityID);
+        final String spEntityID = getSpEntityId(servletRequest);
+        final String idpEntityID = getIdpEntityId(servletRequest);
+        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, spEntityID, idpEntityID);
 		SAMLMessageSecuritySupport.signMessage(messageContext);
 		encodeOutboundMessageContextPost(messageContext, servletResponse);
 	}
-	
+
+   @RequestMapping(value="/InitSSO/Artifact", method=RequestMethod.GET)
+    public void initSSORequestArtifact(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws Exception {
+        final AuthnRequest authnRequest = buildAuthnRequest(servletRequest);
+        authnRequest.setDestination(getDestinationArtifact(servletRequest, "SSO"));
+        final Endpoint endpoint = buildIdpSsoEndpoint(SAMLConstants.SAML2_ARTIFACT_BINDING_URI, authnRequest.getDestination());
+        final String spEntityID = getSpEntityId(servletRequest);
+        final String idpEntityID = getIdpEntityId(servletRequest);
+        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, spEntityID, idpEntityID);
+        encodeOutboundMessageContextArtifact(messageContext, servletResponse);
+    }
+
     @RequestMapping(value="/InitSSO/Passive", method=RequestMethod.GET)
     public void initSSORequestPassive(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws Exception {
         final AuthnRequest authnRequest = buildAuthnRequest(servletRequest);
         authnRequest.setDestination(getDestinationRedirect(servletRequest, "SSO"));
         authnRequest.setIsPassive(true);
         final Endpoint endpoint = buildIdpSsoEndpoint(SAMLConstants.SAML2_REDIRECT_BINDING_URI, authnRequest.getDestination());
+        final String spEntityID = getSpEntityId(servletRequest);
         final String idpEntityID = getIdpEntityId(servletRequest);
-        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, idpEntityID);
+        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, spEntityID, idpEntityID);
         encodeOutboundMessageContextRedirect(messageContext, servletResponse);
     }
 
@@ -136,8 +153,9 @@ public class SAML2Controller extends BaseSAMLController {
         authnRequest.setDestination(getDestinationRedirect(servletRequest, "SSO"));
         authnRequest.setForceAuthn(true);
         final Endpoint endpoint = buildIdpSsoEndpoint(SAMLConstants.SAML2_REDIRECT_BINDING_URI, authnRequest.getDestination());
+        final String spEntityID = getSpEntityId(servletRequest);
         final String idpEntityID = getIdpEntityId(servletRequest);
-        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, idpEntityID);
+        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, spEntityID, idpEntityID);
         encodeOutboundMessageContextRedirect(messageContext, servletResponse);
     }
     
@@ -147,8 +165,9 @@ public class SAML2Controller extends BaseSAMLController {
         authnRequest.setExtensions(buildRequestedAttributesExtensions());
         authnRequest.setDestination(getDestinationRedirect(servletRequest, "SSO"));
         final Endpoint endpoint = buildIdpSsoEndpoint(SAMLConstants.SAML2_REDIRECT_BINDING_URI, authnRequest.getDestination());
+        final String spEntityID = getSpEntityId(servletRequest);
         final String idpEntityID = getIdpEntityId(servletRequest);
-        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, idpEntityID);
+        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, spEntityID, idpEntityID);
         encodeOutboundMessageContextRedirect(messageContext, servletResponse);
     }
 
@@ -158,8 +177,9 @@ public class SAML2Controller extends BaseSAMLController {
         authnRequest.setDestination(getDestinationPost(servletRequest, "SSO"));
         authnRequest.setIsPassive(true);
         final Endpoint endpoint = buildIdpSsoEndpoint(SAMLConstants.SAML2_POST_BINDING_URI, authnRequest.getDestination());
+        final String spEntityID = getSpEntityId(servletRequest);
         final String idpEntityID = getIdpEntityId(servletRequest);
-        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, idpEntityID);
+        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, spEntityID, idpEntityID);
         SAMLMessageSecuritySupport.signMessage(messageContext);
         encodeOutboundMessageContextPost(messageContext, servletResponse);
     }
@@ -171,8 +191,9 @@ public class SAML2Controller extends BaseSAMLController {
         authnRequest.setDestination(getDestinationPost(servletRequest, "SSO"));
         authnRequest.setForceAuthn(true);
         final Endpoint endpoint = buildIdpSsoEndpoint(SAMLConstants.SAML2_POST_BINDING_URI, authnRequest.getDestination());
+        final String spEntityID = getSpEntityId(servletRequest);
         final String idpEntityID = getIdpEntityId(servletRequest);
-        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, idpEntityID);
+        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(authnRequest, endpoint, spEntityID, idpEntityID);
 
         SAMLMessageSecuritySupport.signMessage(messageContext);
         encodeOutboundMessageContextPost(messageContext, servletResponse);
@@ -183,8 +204,9 @@ public class SAML2Controller extends BaseSAMLController {
         final LogoutRequest logoutRequest = buildLogoutRequest(servletRequest);
         logoutRequest.setDestination(getDestinationRedirect(servletRequest, "SLO"));
         final Endpoint endpoint = buildIdpSsoEndpoint(SAMLConstants.SAML2_REDIRECT_BINDING_URI, logoutRequest.getDestination());
+        final String spEntityID = getSpEntityId(servletRequest);
         final String idpEntityID = getIdpEntityId(servletRequest);
-        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(logoutRequest, endpoint, idpEntityID);
+        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(logoutRequest, endpoint, spEntityID, idpEntityID);
         encodeOutboundMessageContextRedirect(messageContext, servletResponse);
     }
 
@@ -200,8 +222,9 @@ public class SAML2Controller extends BaseSAMLController {
                 builderFactory.getBuilder(Asynchronous.DEFAULT_ELEMENT_NAME).buildObject(Asynchronous.DEFAULT_ELEMENT_NAME));
         
         final Endpoint endpoint = buildIdpSloEndpoint(SAMLConstants.SAML2_REDIRECT_BINDING_URI, logoutRequest.getDestination());
+        final String spEntityID = getSpEntityId(servletRequest);
         final String idpEntityID = getIdpEntityId(servletRequest);
-        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(logoutRequest, endpoint, idpEntityID);
+        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(logoutRequest, endpoint, spEntityID, idpEntityID);
         encodeOutboundMessageContextRedirect(messageContext, servletResponse);
     }
     
@@ -210,8 +233,9 @@ public class SAML2Controller extends BaseSAMLController {
         final LogoutRequest logoutRequest = buildLogoutRequest(servletRequest);
         logoutRequest.setDestination(getDestinationPost(servletRequest, "SLO"));
         final Endpoint endpoint = buildIdpSloEndpoint(SAMLConstants.SAML2_POST_BINDING_URI, logoutRequest.getDestination());
+        final String spEntityID = getSpEntityId(servletRequest);
         final String idpEntityID = getIdpEntityId(servletRequest);
-        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(logoutRequest, endpoint, idpEntityID);
+        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(logoutRequest, endpoint, spEntityID, idpEntityID);
         SAMLMessageSecuritySupport.signMessage(messageContext);
         encodeOutboundMessageContextPost(messageContext, servletResponse);
     }
@@ -221,8 +245,9 @@ public class SAML2Controller extends BaseSAMLController {
         final LogoutResponse logoutResponse = buildLogoutResponse(servletRequest);
         logoutResponse.setDestination(getDestinationRedirect(servletRequest, "SLO"));
         final Endpoint endpoint = buildIdpSloEndpoint(SAMLConstants.SAML2_REDIRECT_BINDING_URI, logoutResponse.getDestination());
+        final String spEntityID = getSpEntityId(servletRequest);
         final String idpEntityID = getIdpEntityId(servletRequest);
-        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(logoutResponse, endpoint, idpEntityID);
+        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(logoutResponse, endpoint, spEntityID, idpEntityID);
         encodeOutboundMessageContextRedirect(messageContext, servletResponse);
     }
 
@@ -231,8 +256,9 @@ public class SAML2Controller extends BaseSAMLController {
         final LogoutResponse logoutResponse = buildLogoutResponse(servletRequest);
         logoutResponse.setDestination(getDestinationPost(servletRequest, "SLO"));
         final Endpoint endpoint = buildIdpSloEndpoint(SAMLConstants.SAML2_POST_BINDING_URI, logoutResponse.getDestination());
+        final String spEntityID = getSpEntityId(servletRequest);
         final String idpEntityID = getIdpEntityId(servletRequest);
-        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(logoutResponse, endpoint, idpEntityID);
+        final MessageContext<SAMLObject> messageContext = buildOutboundMessageContext(logoutResponse, endpoint, spEntityID, idpEntityID);
         SAMLMessageSecuritySupport.signMessage(messageContext);
         encodeOutboundMessageContextPost(messageContext, servletResponse);
     }
@@ -303,16 +329,22 @@ public class SAML2Controller extends BaseSAMLController {
         return new ResponseEntity<>(formattedMessage, headers, HttpStatus.OK);
     }
     
-	private MessageContext<SAMLObject> buildOutboundMessageContext(SAMLObject message, Endpoint endpoint, String idpEntityId) {
+	private MessageContext<SAMLObject> buildOutboundMessageContext(SAMLObject message, Endpoint endpoint, String spEntityId, String idpEntityId) {
 		MessageContext<SAMLObject> messageContext = new MessageContext<>();
 		messageContext.setMessage(message);
-		
+
+	    SAMLSelfEntityContext selfContext = messageContext.getSubcontext(SAMLSelfEntityContext.class, true);
+	    selfContext.setEntityId(spEntityId);
+
 		SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
 		peerContext.setEntityId(idpEntityId);
 		
 		SAMLEndpointContext endpointContext = peerContext.getSubcontext(SAMLEndpointContext.class, true);
 		endpointContext.setEndpoint(endpoint);
 		
+		SAMLArtifactContext artifactContext = messageContext.getSubcontext(SAMLArtifactContext.class, true);
+		artifactContext.setSourceArtifactResolutionServiceEndpointIndex(1);
+		
 		SignatureSigningParameters signingParameters = new SignatureSigningParameters();
 		signingParameters.setSigningCredential(spCredential);
 		signingParameters.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA256);
@@ -333,7 +365,7 @@ public class SAML2Controller extends BaseSAMLController {
 			
 			encoder.prepareContext();
 			encoder.encode();
-		} catch (ComponentInitializationException | MessageEncodingException e) {
+		} catch (final ComponentInitializationException | MessageEncodingException e) {
 			log.error("Error encoding the outbound message context", e);
 			throw e;
 		} finally {
@@ -351,14 +383,33 @@ public class SAML2Controller extends BaseSAMLController {
 			
 			encoder.prepareContext();
 			encoder.encode();
-		} catch (ComponentInitializationException | MessageEncodingException e) {
+		} catch (final ComponentInitializationException | MessageEncodingException e) {
 			log.error("Error encoding the outbound message context", e);
 			throw e;
 		} finally {
 			encoder.destroy();
 		}
 	}
-	
+
+   private void encodeOutboundMessageContextArtifact(MessageContext<SAMLObject> messageContext, HttpServletResponse servletResponse) throws Exception {
+        HTTPArtifactEncoder encoder = new HTTPArtifactEncoder();
+        try {
+            encoder.setHttpServletResponse(servletResponse);
+            encoder.setMessageContext(messageContext);
+            encoder.setVelocityEngine(velocityEngine);
+            encoder.setArtifactMap(artifactMap);
+            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(
 		        SingleSignOnService.DEFAULT_ELEMENT_NAME).buildObject(SingleSignOnService.DEFAULT_ELEMENT_NAME);
@@ -520,6 +571,20 @@ public class SAML2Controller extends BaseSAMLController {
 		}
 	}
 
+	private String getDestinationArtifact(HttpServletRequest servletRequest, String profile) {
+        //TODO servlet context
+        String destinationPath = "/idp/profile/SAML2/Artifact/" + profile;
+        String baseUrl = getBaseUrl(servletRequest);
+        try {
+            URLBuilder urlBuilder = new URLBuilder(baseUrl);
+            urlBuilder.setPath(destinationPath);
+            return urlBuilder.buildURL();
+        } catch (MalformedURLException e) {
+            log.error("Couldn't parse base URL, reverting to internal default destination: {}", baseUrl);
+            return "http://localhost:8080" + destinationPath;
+        }
+    }
+
 	private String getAcsUrl(HttpServletRequest servletRequest) {
 		//TODO servlet context
 	    String spId = getSpId(servletRequest);
diff --git a/src/main/resources/system/conf/testbed-opensaml.xml b/src/main/resources/system/conf/testbed-opensaml.xml
index 0432441..9526fc1 100644
--- a/src/main/resources/system/conf/testbed-opensaml.xml
+++ b/src/main/resources/system/conf/testbed-opensaml.xml
@@ -79,5 +79,8 @@
             </props>
         </property>
     </bean>
-    
+        
+    <bean id="shibboleth.SAMLArtifactMap"
+        class="org.opensaml.saml.common.binding.artifact.impl.BasicSAMLArtifactMap" />
+        
 </beans>
\ No newline at end of file

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


More information about the commits mailing list