Author: coheigea
Date: Tue Jun  7 15:06:20 2011
New Revision: 1133038

URL: http://svn.apache.org/viewvc?rev=1133038&view=rev
Log:
Add support for the case of specifying an IssuedToken as a 
SignedSupportingToken.
 - This is for the use-case of getting a Bearer SAML Assertion from an STS, and 
signing it before sending it to the service provider.

Modified:
    
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/policyhandlers/AbstractBindingBuilder.java

Modified: 
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/policyhandlers/AbstractBindingBuilder.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/policyhandlers/AbstractBindingBuilder.java?rev=1133038&r1=1133037&r2=1133038&view=diff
==============================================================================
--- 
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/policyhandlers/AbstractBindingBuilder.java
 (original)
+++ 
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/policyhandlers/AbstractBindingBuilder.java
 Tue Jun  7 15:06:20 2011
@@ -496,8 +496,7 @@ public abstract class AbstractBindingBui
                     this.encryptedTokensIdList.add(secToken.getId());
                 }
         
-                if (secToken.getX509Certificate() == null) {   
-                    //Add the extracted token
+                if (secToken.getX509Certificate() == null) {  
                     ret.put(token, new WSSecurityTokenHolder(wssConfig, 
secToken));
                 } else {
                     WSSecSignature sig = new WSSecSignature(wssConfig);        
            
@@ -627,14 +626,41 @@ public abstract class AbstractBindingBui
                 if (!selfSignAssertion) {
                     AssertionWrapper assertionWrapper = 
(AssertionWrapper)tempTok;
                     
+                    Document doc = 
assertionWrapper.getElement().getOwnerDocument();
+                    boolean saml1 = assertionWrapper.getSaml1() != null;
                     // TODO We only support using a KeyIdentifier for the 
moment
                     SecurityTokenReference secRef = 
-                        createSTRForSamlAssertion(assertionWrapper, false);
+                        createSTRForSamlAssertion(doc, 
assertionWrapper.getId(), saml1, false);
                     addSupportingElement(secRef.getElement());
                     part = new WSEncryptionPart("STRTransform", null, 
"Element");
                     part.setId(secRef.getID());
                     part.setElement(secRef.getElement());
                 }
+            } else if (tempTok instanceof WSSecurityTokenHolder) {
+                SecurityToken token = 
((WSSecurityTokenHolder)tempTok).getToken();
+                String tokenType = token.getTokenType();
+                if (WSConstants.WSS_SAML_TOKEN_TYPE.equals(tokenType)
+                    || WSConstants.SAML_NS.equals(tokenType)
+                    || WSConstants.WSS_SAML2_TOKEN_TYPE.equals(tokenType)
+                    || WSConstants.SAML2_NS.equals(tokenType)) {
+                    Document doc = token.getToken().getOwnerDocument();
+                    boolean saml1 = 
WSConstants.WSS_SAML_TOKEN_TYPE.equals(tokenType)
+                        || WSConstants.SAML_NS.equals(tokenType);
+                    String id = null;
+                    if (saml1) {
+                        id = token.getToken().getAttributeNS(null, 
"AssertionID");
+                    } else {
+                        id = token.getToken().getAttributeNS(null, "ID");
+                    }
+                    SecurityTokenReference secRef = 
+                        createSTRForSamlAssertion(doc, id, saml1, false);
+                    addSupportingElement(cloneElement(secRef.getElement()));
+                    part = new WSEncryptionPart("STRTransform", null, 
"Element");
+                    part.setId(secRef.getID());
+                    part.setElement(secRef.getElement());
+                } else {
+                    policyNotAsserted(entry.getKey(), 
"UnsupportedTokenInSupportingToken: " + tempTok);  
+                }
             } else {
                 policyNotAsserted(entry.getKey(), 
"UnsupportedTokenInSupportingToken: " + tempTok);  
             }
@@ -646,44 +672,47 @@ public abstract class AbstractBindingBui
     
     /**
      * Create a SecurityTokenReference to point to a SAML Assertion
-     * @param assertion the SAML AssertionWrapper
+     * @param doc The owner Document instance
+     * @param id The Assertion ID
+     * @param saml1 Whether the Assertion is a SAML1 or SAML2 Assertion
      * @param useDirectReferenceToAssertion whether to refer directly to the 
assertion or not
      * @return a SecurityTokenReference to a SAML Assertion
      */
     private SecurityTokenReference createSTRForSamlAssertion(
-        AssertionWrapper assertion,
+        Document doc,
+        String id,
+        boolean saml1,
         boolean useDirectReferenceToAssertion
     ) {
-        Document doc = assertion.getElement().getOwnerDocument();
         SecurityTokenReference secRefSaml = new SecurityTokenReference(doc);
-        String secRefID = 
wssConfig.getIdAllocator().createSecureId("STRSAMLId-", secRefSaml);
+        String secRefID = wssConfig.getIdAllocator().createSecureId("STR-", 
secRefSaml);
         secRefSaml.setID(secRefID);
 
         if (useDirectReferenceToAssertion) {
             org.apache.ws.security.message.token.Reference ref = 
                 new org.apache.ws.security.message.token.Reference(doc);
-            ref.setURI("#" + assertion.getId());
-            if (assertion.getSaml1() != null) {
+            ref.setURI("#" + id);
+            if (saml1) {
                 ref.setValueType(WSConstants.WSS_SAML_KI_VALUE_TYPE);
                 secRefSaml.addTokenType(WSConstants.WSS_SAML_TOKEN_TYPE);
-            } else if (assertion.getSaml2() != null) {
+            } else {
                 secRefSaml.addTokenType(WSConstants.WSS_SAML2_TOKEN_TYPE);
             }
             secRefSaml.setReference(ref);
         } else {
             Element keyId = doc.createElementNS(WSConstants.WSSE_NS, 
"wsse:KeyIdentifier");
             String valueType = null;
-            if (assertion.getSaml1() != null) {
+            if (saml1) {
                 valueType = WSConstants.WSS_SAML_KI_VALUE_TYPE;
                 secRefSaml.addTokenType(WSConstants.WSS_SAML_TOKEN_TYPE);
-            } else if (assertion.getSaml2() != null) {
+            } else {
                 valueType = WSConstants.WSS_SAML2_KI_VALUE_TYPE;
                 secRefSaml.addTokenType(WSConstants.WSS_SAML2_TOKEN_TYPE);
             }
             keyId.setAttributeNS(
                 null, "ValueType", valueType
             );
-            keyId.appendChild(doc.createTextNode(assertion.getId()));
+            keyId.appendChild(doc.createTextNode(id));
             Element elem = secRefSaml.getElement();
             elem.appendChild(keyId);
         }
@@ -1573,7 +1602,7 @@ public abstract class AbstractBindingBui
                                         boolean isSigProtect) {
         
         for (Map.Entry<Token, Object> ent : tokenMap.entrySet()) {
-            WSSecBase tempTok = (WSSecBase)ent.getValue();
+            Object tempTok = ent.getValue();
             
             List<WSEncryptionPart> sigParts = new 
ArrayList<WSEncryptionPart>();
             WSEncryptionPart sigPart = new WSEncryptionPart(mainSigId);


Reply via email to