Author: coheigea
Date: Fri Jun  3 16:31:09 2011
New Revision: 1131099

URL: http://svn.apache.org/viewvc?rev=1131099&view=rev
Log:
Changed the way tokens are stored in WSDocInfo, deprecated a couple of methods.

Modified:
    webservices/wss4j/trunk/src/main/java/org/apache/ws/security/WSDocInfo.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/EnvelopeIdResolver.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecDKSign.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecSignature.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/EncryptedDataProcessor.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/EncryptedKeyProcessor.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/SignatureConfirmationProcessor.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/SignatureProcessor.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/saml/WSSecSignatureSAML.java
    
webservices/wss4j/trunk/src/main/resources/org/apache/ws/security/errors.properties

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/WSDocInfo.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/WSDocInfo.java?rev=1131099&r1=1131098&r2=1131099&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/main/java/org/apache/ws/security/WSDocInfo.java 
(original)
+++ webservices/wss4j/trunk/src/main/java/org/apache/ws/security/WSDocInfo.java 
Fri Jun  3 16:31:09 2011
@@ -45,7 +45,6 @@ public class WSDocInfo {
     private Document doc = null;
     private Crypto crypto = null;
     private List<Element> tokenList = null;
-    private List<Element> elementList = null;
     private List<WSSecurityEngineResult> resultsList = null;
     private CallbackLookup callbackLookup = null;
 
@@ -66,40 +65,77 @@ public class WSDocInfo {
         if (tokenList != null && tokenList.size() > 0) {
             tokenList.clear();
         }
-        if (elementList != null && elementList.size() > 0) {
-            elementList.clear();
-        }
         if (resultsList != null && resultsList.size() > 0) {
             resultsList.clear();
         }
         
         tokenList = null;
-        elementList = null;
         resultsList = null;
     }
     
     /**
-     * Store a token element for later retrieval. The token element is one of:
-     *  - SecurityTokenReference element
-     *  - BinarySecurityToken element
-     *  - SAML Assertion element
-     *  - SecurityContextToken element
-     *  - UsernameToken element
-     *  - DerivedKeyToken element
-     *  - Timestamp element
-     * @param elem is the token element to store
+     * Store a token element for later retrieval. Before storing the token, we 
check for a 
+     * previously processed token with the same (wsu/SAML) Id.
+     * @param element is the token element to store
+     * @deprecated
+     */
+    public void addTokenElement(Element element) throws WSSecurityException {
+        addTokenElement(element, true);
+    }
+    
+    /**
+     * Store a token element for later retrieval. Before storing the token, we 
check for a 
+     * previously processed token with the same (wsu/SAML) Id.
+     * @param element is the token element to store
+     * @param checkMultipleElements check for a previously stored element with 
the same Id.
      */
-    public void addTokenElement(Element elem) {
+    public void addTokenElement(Element element, boolean 
checkMultipleElements) throws WSSecurityException {
         if (tokenList == null) {
             tokenList = new ArrayList<Element>();
         }
-        tokenList.add(elem);
+        
+        if (checkMultipleElements) {
+            for (Element elem : tokenList) {
+                if (compareElementsById(element, elem)) {
+                    throw new WSSecurityException(
+                        WSSecurityException.INVALID_SECURITY_TOKEN, 
"duplicateError"
+                    );
+                }
+            }
+        }
+        tokenList.add(element);
+    }
+    
+    private boolean compareElementsById(Element firstElement, Element 
secondElement) {
+        if (firstElement.hasAttributeNS(WSConstants.WSU_NS, "Id")
+            && secondElement.hasAttributeNS(WSConstants.WSU_NS, "Id")) {
+            String id = firstElement.getAttributeNS(WSConstants.WSU_NS, "Id");
+            String id2 = secondElement.getAttributeNS(WSConstants.WSU_NS, 
"Id");
+            if (id.equals(id2)) {
+                return true;
+            }
+        }
+        if (firstElement.hasAttribute("AssertionID")
+            && secondElement.hasAttribute("AssertionID")) {
+            String id = firstElement.getAttribute("AssertionID");
+            String id2 = secondElement.getAttribute("AssertionID");
+            if (id.equals(id2)) {
+                return true;
+            }
+        }
+        if (firstElement.hasAttribute("ID") && 
secondElement.hasAttribute("ID")) {
+            String id = firstElement.getAttribute("ID");
+            String id2 = secondElement.getAttribute("ID");
+            if (id.equals(id2)) {
+                return true;
+            }
+        }
+        return false;
     }
     
     /**
      * Get a token Element for the given Id. The Id can be either a wsu:Id or 
a 
-     * SAML AssertionID/ID.
-     * TODO think about if it is better to restrict the default Id to wsu:Id?
+     * SAML AssertionID/ID. 
      * @param uri is the (relative) uri of the id
      * @return the token element or null if nothing found
      */
@@ -115,7 +151,9 @@ public class WSDocInfo {
                 String cId = elem.getAttributeNS(WSConstants.WSU_NS, "Id");
                 String samlId = elem.getAttribute("AssertionID");
                 String samlId2 = elem.getAttribute("ID");
-                if (id.equals(cId) || id.equals(samlId) || id.equals(samlId2)) 
{
+                if ((elem.hasAttributeNS(WSConstants.WSU_NS, "Id") && 
id.equals(cId)) 
+                    || (elem.hasAttribute("AssertionID") && id.equals(samlId))
+                    || (elem.hasAttribute("ID") && id.equals(samlId2))) {
                     return elem;
                 }
             }
@@ -124,39 +162,26 @@ public class WSDocInfo {
     }
     
     /**
-     * Store a protection element for later retrieval. 
+     * Store a protection element for later retrieval. This is only used for 
the 
+     * creation/outbound case.
      * @param element is the protection element to store
+     * @deprecated
      */
     public void addProtectionElement(Element element) {
-        if (elementList == null) {
-            elementList = new ArrayList<Element>();
+        if (tokenList == null) {
+            tokenList = new ArrayList<Element>();
         }
-        elementList.add(element);
+        tokenList.add(element);
     }
     
     /**
-     * Get a protection element for the given (wsu) Id.
+     * Get a protection element for the given (wsu/SAML) Id.
      * @param uri is the (relative) uri of the id
      * @return the protection element or null if nothing found
+     * @deprecated
      */
     public Element getProtectionElement(String uri) {
-        String id = uri;
-        if (id == null) {
-            return null;
-        } else if (id.charAt(0) == '#') {
-            id = id.substring(1);
-        }
-        if (elementList != null) {
-            for (Element element : elementList) {
-                if (element != null) {
-                    String cId = element.getAttributeNS(WSConstants.WSU_NS, 
"Id");
-                    if (id.equals(cId)) {
-                        return element;
-                    }
-                }
-            }
-        }
-        return null;
+        return getTokenElement(uri); 
     }
     
     /**

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/EnvelopeIdResolver.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/EnvelopeIdResolver.java?rev=1131099&r1=1131098&r2=1131099&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/EnvelopeIdResolver.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/EnvelopeIdResolver.java
 Fri Jun  3 16:31:09 2011
@@ -69,18 +69,11 @@ public class EnvelopeIdResolver extends 
         }
 
         //
-        // First check to see if the element that we require is stored in as a 
-        // protection element in WSDocInfo
-        //
-        String id = uriNodeValue.substring(1);
-        Element selectedElem = null;
-        if (wsDocInfo != null) {
-            selectedElem = wsDocInfo.getProtectionElement(id);
-        }
-        //
-        // Next check to see if the element that we require is a previously 
processed 
+        // First check to see if the element that we require is a previously 
processed 
         // Security Token that is stored in WSDocInfo.
         //
+        Element selectedElem = null;
+        String id = uriNodeValue.substring(1);
         if (selectedElem == null && wsDocInfo != null) {
             selectedElem = wsDocInfo.getTokenElement(id);
         }

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecDKSign.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecDKSign.java?rev=1131099&r1=1131098&r2=1131099&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecDKSign.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecDKSign.java
 Fri Jun  3 16:31:09 2011
@@ -156,7 +156,7 @@ public class WSSecDKSign extends WSSecDe
         secRef.setReference(refUt);
         
         XMLStructure structure = new DOMStructure(secRef.getElement());
-        wsDocInfo.addTokenElement(secRef.getElement());
+        wsDocInfo.addTokenElement(secRef.getElement(), false);
         keyInfo = 
             keyInfoFactory.newKeyInfo(
                 java.util.Collections.singletonList(structure), keyInfoUri

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecSignature.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecSignature.java?rev=1131099&r1=1131098&r2=1131099&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecSignature.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecSignature.java
 Fri Jun  3 16:31:09 2011
@@ -192,7 +192,7 @@ public class WSSecSignature extends WSSe
                 ref.setValueType(bstToken.getValueType());
                 secRef.setReference(ref);
                 bstToken.setID(certUri);
-                wsDocInfo.addTokenElement(bstToken.getElement());
+                wsDocInfo.addTokenElement(bstToken.getElement(), false);
                 break;
     
             case WSConstants.ISSUER_SERIAL:
@@ -296,7 +296,7 @@ public class WSSecSignature extends WSSe
         
         if (keyIdentifierType != WSConstants.KEY_VALUE) {
             XMLStructure structure = new DOMStructure(secRef.getElement());
-            wsDocInfo.addTokenElement(secRef.getElement());
+            wsDocInfo.addTokenElement(secRef.getElement(), false);
             keyInfo = 
                 keyInfoFactory.newKeyInfo(
                     java.util.Collections.singletonList(structure), keyInfoUri

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/EncryptedDataProcessor.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/EncryptedDataProcessor.java?rev=1131099&r1=1131098&r2=1131099&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/EncryptedDataProcessor.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/EncryptedDataProcessor.java
 Fri Jun  3 16:31:09 2011
@@ -101,6 +101,7 @@ public class EncryptedDataProcessor impl
             );
         }
         
+        wsDocInfo.addTokenElement(elem);
         WSSConfig wssConfig = request.getWssConfig();
         if (wssConfig != null) {
             // Get hold of the plain text element

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/EncryptedKeyProcessor.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/EncryptedKeyProcessor.java?rev=1131099&r1=1131098&r2=1131099&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/EncryptedKeyProcessor.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/EncryptedKeyProcessor.java
 Fri Jun  3 16:31:09 2011
@@ -137,6 +137,7 @@ public class EncryptedKeyProcessor imple
         );
         result.put(WSSecurityEngineResult.TAG_ID, elem.getAttribute("Id"));
         wsDocInfo.addResult(result);
+        wsDocInfo.addTokenElement(elem);
         return java.util.Collections.singletonList(result);
     }
     

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/SignatureConfirmationProcessor.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/SignatureConfirmationProcessor.java?rev=1131099&r1=1131098&r2=1131099&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/SignatureConfirmationProcessor.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/SignatureConfirmationProcessor.java
 Fri Jun  3 16:31:09 2011
@@ -59,6 +59,7 @@ public class SignatureConfirmationProces
             new WSSecurityEngineResult(WSConstants.SC, sigConf);
         result.put(WSSecurityEngineResult.TAG_ID, id);
         wsDocInfo.addResult(result);
+        wsDocInfo.addTokenElement(elem);
         return java.util.Collections.singletonList(result);
     }
     

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/SignatureProcessor.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/SignatureProcessor.java?rev=1131099&r1=1131098&r2=1131099&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/SignatureProcessor.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/processor/SignatureProcessor.java
 Fri Jun  3 16:31:09 2011
@@ -207,6 +207,7 @@ public class SignatureProcessor implemen
             result.put(WSSecurityEngineResult.TAG_VALIDATED_TOKEN, 
Boolean.TRUE);
         }
         wsDocInfo.addResult(result);
+        wsDocInfo.addTokenElement(elem);
         return java.util.Collections.singletonList(result);
     }
     

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/saml/WSSecSignatureSAML.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/saml/WSSecSignatureSAML.java?rev=1131099&r1=1131098&r2=1131099&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/saml/WSSecSignatureSAML.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/saml/WSSecSignatureSAML.java
 Fri Jun  3 16:31:09 2011
@@ -373,7 +373,7 @@ public class WSSecSignatureSAML extends 
                     Element elem = secRefSaml.getElement();
                     elem.appendChild(keyId);
                 }
-                wsDocInfo.addTokenElement(secRefSaml.getElement());
+                wsDocInfo.addTokenElement(secRefSaml.getElement(), false);
             }
         } catch (Exception ex) {
             throw new WSSecurityException(
@@ -389,7 +389,7 @@ public class WSSecSignatureSAML extends 
                 bstToken = new X509Security(doc);
                 ((X509Security) bstToken).setX509Certificate(certs[0]);
                 bstToken.setID(certUri);
-                wsDocInfo.addTokenElement(bstToken.getElement());
+                wsDocInfo.addTokenElement(bstToken.getElement(), false);
                 ref.setValueType(bstToken.getValueType());
                 secRef.setReference(ref);
                 break;
@@ -429,14 +429,14 @@ public class WSSecSignatureSAML extends 
             elem.appendChild(keyId);
         }
         XMLStructure structure = new DOMStructure(secRef.getElement());
-        wsDocInfo.addTokenElement(secRef.getElement());
+        wsDocInfo.addTokenElement(secRef.getElement(), false);
 
         keyInfo = 
             keyInfoFactory.newKeyInfo(
                 java.util.Collections.singletonList(structure), keyInfoUri
             );
 
-        wsDocInfo.addTokenElement(samlToken);
+        wsDocInfo.addTokenElement(samlToken, false);
     }
 
     /**

Modified: 
webservices/wss4j/trunk/src/main/resources/org/apache/ws/security/errors.properties
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/resources/org/apache/ws/security/errors.properties?rev=1131099&r1=1131098&r2=1131099&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/resources/org/apache/ws/security/errors.properties
 (original)
+++ 
webservices/wss4j/trunk/src/main/resources/org/apache/ws/security/errors.properties
 Fri Jun  3 16:31:09 2011
@@ -57,6 +57,7 @@ noXMLSig = Cannot setup signature data s
 noSKIHandling = Problem with SKI information: {0}
 keystore = Cannot access/read keystore data
 noCert = No certificate provided
+duplicateError = Multiple security tokens with the same Id have been detected
 ##
 noSigCryptoFile=WSSecurityEngine: No crypto property file supplied to verify 
signature
 noDecCryptoFile=WSSecurityEngine: No crypto property file supplied for 
decryption


Reply via email to