This is an automated email from the ASF dual-hosted git repository.

coheigea pushed a commit to branch coheigea/saml-refactor-new
in repository https://gitbox.apache.org/repos/asf/ws-wss4j.git

commit 14980fc13c330ca67f14121bb498de334d2691fc
Author: Colm O hEigeartaigh <cohei...@apache.org>
AuthorDate: Thu Jun 19 09:41:15 2025 +0100

    Removing SAML CallbackHandler from ST Signed action
---
 .../wss4j/dom/action/SAMLTokenSignedAction.java    |  8 +----
 .../org/apache/wss4j/dom/handler/RequestData.java  | 19 ++++++++++
 .../org/apache/wss4j/dom/handler/WSHandler.java    | 40 +++++++++++++++-------
 3 files changed, 47 insertions(+), 20 deletions(-)

diff --git 
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenSignedAction.java
 
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenSignedAction.java
index 0e9ae6ef5..2845d9c91 100644
--- 
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenSignedAction.java
+++ 
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenSignedAction.java
@@ -31,7 +31,6 @@ import org.apache.wss4j.common.saml.SAMLUtil;
 import org.apache.wss4j.dom.WSConstants;
 import org.apache.wss4j.dom.handler.RequestData;
 import org.apache.wss4j.dom.handler.WSHandler;
-import org.apache.wss4j.dom.handler.WSHandlerConstants;
 import org.apache.wss4j.dom.saml.WSSecSignatureSAML;
 
 public class SAMLTokenSignedAction implements Action {
@@ -39,12 +38,7 @@ public class SAMLTokenSignedAction implements Action {
     public void execute(WSHandler handler, SecurityActionToken actionToken, 
RequestData reqData)
             throws WSSecurityException {
 
-        CallbackHandler samlCallbackHandler =
-                handler.getCallbackHandler(
-                    WSHandlerConstants.SAML_CALLBACK_CLASS,
-                    WSHandlerConstants.SAML_CALLBACK_REF,
-                    reqData
-                );
+        CallbackHandler samlCallbackHandler = reqData.getSamlCallbackHandler();
         if (samlCallbackHandler == null) {
             throw new WSSecurityException(
                 WSSecurityException.ErrorCode.FAILURE,
diff --git 
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/handler/RequestData.java 
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/handler/RequestData.java
index f1029fa99..f4d923114 100644
--- 
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/handler/RequestData.java
+++ 
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/handler/RequestData.java
@@ -97,6 +97,7 @@ public class RequestData {
     private Serializer encryptionSerializer;
     private WSDocInfo wsDocInfo;
     private Provider signatureProvider;
+    private CallbackHandler samlCallbackHandler;
 
     /**
      * Whether to add an InclusiveNamespaces PrefixList as a 
CanonicalizationMethod
@@ -780,4 +781,22 @@ public class RequestData {
     public void setSignatureProvider(Provider signatureProvider) {
         this.signatureProvider = signatureProvider;
     }
+
+    /**
+     * Get the CallbackHandler used for SAML processing.
+     * This is used to process SAML Assertions, and to sign SAML Assertions.
+     * @return the CallbackHandler used for SAML processing.
+     */
+    public CallbackHandler getSamlCallbackHandler() {
+        return samlCallbackHandler;
+    }
+
+    /**
+     * Set the CallbackHandler used for SAML processing.
+     * @param samlCallbackHandler
+     */
+    public void setSamlCallbackHandler(CallbackHandler samlCallbackHandler) {
+        this.samlCallbackHandler = samlCallbackHandler;
+    }
+
 }
diff --git 
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/handler/WSHandler.java 
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/handler/WSHandler.java
index c90f1d48d..9c441785b 100644
--- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/handler/WSHandler.java
+++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/handler/WSHandler.java
@@ -155,19 +155,8 @@ public abstract class WSHandler {
                              + " The danger here is that the actual encryption 
bytes will not be signed");
                     reqData.setStoreBytesInAttachment(false);
                 }
-            } else if (actionToDo.getAction() == WSConstants.ST_SIGNED
-                && actionToDo.getActionToken() == null) {
-                decodeSignatureParameter(reqData);
-                 // it is possible and legal that we do not have a signature 
crypto here - thus ignore the exception.
-                // This is usually the case for the SAML option "sender 
vouches". In this case no user crypto is
-                // required.
-                try {
-                    SignatureActionToken actionToken = new 
SignatureActionToken();
-                    actionToken.setCrypto(loadSignatureCrypto(reqData));
-                    actionToDo.setActionToken(actionToken);
-                } catch (Exception ex) {
-                    LOG.debug(ex.getMessage(), ex);
-                }
+            } else if (actionToDo.getAction() == WSConstants.ST_SIGNED) {
+                configureSTSignedAction(reqData, actionToDo);
             } else if ((actionToDo.getAction() == WSConstants.ENCR
                 || actionToDo.getAction() == WSConstants.DKT_ENCR)
                 && actionToDo.getActionToken() == null) {
@@ -272,6 +261,31 @@ public abstract class WSHandler {
         }
     }
 
+    private void configureSTSignedAction(RequestData reqData, HandlerAction 
actionToDo) throws WSSecurityException {
+        if (actionToDo.getActionToken() == null) {
+            decodeSignatureParameter(reqData);
+            // it is possible and legal that we do not have a signature crypto 
here - thus ignore the exception.
+            // This is usually the case for the SAML option "sender vouches". 
In this case no user crypto is
+            // required.
+            try {
+                SignatureActionToken actionToken = new SignatureActionToken();
+                actionToken.setCrypto(loadSignatureCrypto(reqData));
+                actionToDo.setActionToken(actionToken);
+            } catch (Exception ex) {
+                LOG.debug(ex.getMessage(), ex);
+            }
+        }
+        if (reqData.getSamlCallbackHandler() == null) {
+            CallbackHandler samlCallbackHandler =
+                getCallbackHandler(
+                    WSHandlerConstants.SAML_CALLBACK_CLASS,
+                    WSHandlerConstants.SAML_CALLBACK_REF,
+                    reqData
+                );
+            reqData.setSamlCallbackHandler(samlCallbackHandler);
+        }
+    }
+
     private HandlerAction getSignatureActionThatSignsATimestamp(
         List<HandlerAction> actions, RequestData reqData
     ) {

Reply via email to