[java-idp-testbed] branch main updated: Add artifact resolution endpoint to testbed SP.

Codeberg noreply at shibboleth.net
Mon Oct 12 17:00:44 UTC 2026


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

codeberg pushed a commit to branch main
in repository java-idp-testbed.

View the commit online:
https://codeberg.org/Shibboleth/java-idp-testbed/commit/7ff214e4a2bbb4ffd0a6079861585895ea8e50cd

The following commit(s) were added to refs/heads/main by this push:
     new 7ff214e  Add artifact resolution endpoint to testbed SP.
7ff214e is described below

commit 7ff214e4a2bbb4ffd0a6079861585895ea8e50cd
Author: Scott Cantor <scott at restingparrotsoftware.com>
AuthorDate: Mon Oct 12 13:00:01 2026 -0400

    Add artifact resolution endpoint to testbed SP.
---
 src/main/java/sp/SAML2Controller.java | 67 +++++++++++++++++++++++++++++++++++
 1 file changed, 67 insertions(+)

diff --git a/src/main/java/sp/SAML2Controller.java b/src/main/java/sp/SAML2Controller.java
index a9bc8a6..f78a011 100644
--- a/src/main/java/sp/SAML2Controller.java
+++ b/src/main/java/sp/SAML2Controller.java
@@ -40,6 +40,7 @@ import org.opensaml.saml.common.SAMLObject;
 import org.opensaml.saml.common.SAMLObjectBuilder;
 import org.opensaml.saml.common.SAMLVersion;
 import org.opensaml.saml.common.binding.SAMLBindingSupport;
+import org.opensaml.saml.common.binding.artifact.SAMLArtifactMap.SAMLArtifactMapEntry;
 import org.opensaml.saml.common.messaging.SAMLMessageSecuritySupport;
 import org.opensaml.saml.common.messaging.context.SAMLArtifactContext;
 import org.opensaml.saml.common.messaging.context.SAMLEndpointContext;
@@ -55,6 +56,8 @@ 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.ArtifactResolve;
+import org.opensaml.saml.saml2.core.ArtifactResponse;
 import org.opensaml.saml.saml2.core.AttributeQuery;
 import org.opensaml.saml.saml2.core.AuthnContextClassRef;
 import org.opensaml.saml.saml2.core.AuthnContextDeclRef;
@@ -419,6 +422,41 @@ public class SAML2Controller extends BaseSAMLController {
         return new ResponseEntity<>(formattedMessage, headers, HttpStatus.OK);
     }
 
+    @RequestMapping(value="/SOAP/ArtifactResolution", method=RequestMethod.POST)
+    public ResponseEntity<String> handleArtifactResolutionSOAP(final @Nonnull HttpServletRequest servletRequest,
+            final @Nonnull HttpServletResponse servletResponse) throws Exception {
+        final MessageContext messageContext = decodeInboundMessageContextSOAP(servletRequest);
+        
+        if (messageContext.getMessage() instanceof ArtifactResolve artreq) {
+            
+            final SAMLArtifactMapEntry entry = artifactMap.get(artreq.getArtifact().getValue());
+            
+            final ArtifactResponse response = buildArtifactResponse(servletRequest, entry != null ? entry.getSamlMessage() : null);
+            response.setInResponseTo(artreq.getID());
+            final String spEntityID = getSpEntityId(servletRequest);
+            final String idpEntityID = getIdpEntityId(servletRequest);
+            final MessageContext mc = buildOutboundMessageContext(response, null, spEntityID, idpEntityID);
+            assert mc != null;
+            SAMLMessageSecuritySupport.signMessage(mc);
+            encodeOutboundMessageContextSOAP(mc, servletResponse);
+            
+            return null;
+        }
+        
+        final XMLObject msg = (XMLObject) messageContext.getMessage();
+        assert msg!= null;
+        final Element responseElement = msg.getDOM();
+        assert responseElement != null;
+        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 buildOutboundMessageContext(final SAMLObject message, final Endpoint endpoint,
             final String spEntityId, final String idpEntityId) {
         return buildOutboundMessageContext(message, endpoint, spEntityId, idpEntityId, null);
@@ -750,6 +788,35 @@ public class SAML2Controller extends BaseSAMLController {
         
         return logoutResponse;
     }
+
+    private ArtifactResponse buildArtifactResponse(final HttpServletRequest servletRequest, final SAMLObject content) {
+        final ArtifactResponse response = (ArtifactResponse) builderFactory.ensureBuilder(
+                ArtifactResponse.DEFAULT_ELEMENT_NAME).buildObject(ArtifactResponse.DEFAULT_ELEMENT_NAME);
+        
+        response.setID(idGenerator.generateIdentifier());
+        response.setIssueInstant(Instant.now());
+        
+        final Issuer issuer = (Issuer) builderFactory.ensureBuilder(Issuer.DEFAULT_ELEMENT_NAME).buildObject(
+                Issuer.DEFAULT_ELEMENT_NAME);
+        issuer.setValue(getSpEntityId(servletRequest));
+        response.setIssuer(issuer);
+        
+        if (content != null) {
+            response.setMessage(content);
+        }
+        
+        final Status status = (Status) builderFactory.ensureBuilder(Status.DEFAULT_ELEMENT_NAME).buildObject(
+                Status.DEFAULT_ELEMENT_NAME);
+        response.setStatus(status);
+        
+        final StatusCode code = (StatusCode) builderFactory.ensureBuilder(StatusCode.DEFAULT_ELEMENT_NAME).buildObject(
+                StatusCode.DEFAULT_ELEMENT_NAME);
+        status.setStatusCode(code);
+        
+        code.setValue(StatusCode.SUCCESS);
+        
+        return response;
+    }
     
 	@Nonnull private String getDestinationRedirect(final @Nonnull HttpServletRequest servletRequest, final @Nonnull String profile) {
 		//TODO servlet context

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


More information about the commits mailing list