You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by co...@apache.org on 2013/01/04 12:39:20 UTC

svn commit: r1428801 - in /webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/ws/security/dom: message/token/SecurityContextToken.java util/WSSecurityUtil.java

Author: coheigea
Date: Fri Jan  4 11:39:19 2013
New Revision: 1428801

URL: http://svn.apache.org/viewvc?rev=1428801&view=rev
Log:
Some minor optimisations

Modified:
    webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/ws/security/dom/message/token/SecurityContextToken.java
    webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/ws/security/dom/util/WSSecurityUtil.java

Modified: webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/ws/security/dom/message/token/SecurityContextToken.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/ws/security/dom/message/token/SecurityContextToken.java?rev=1428801&r1=1428800&r2=1428801&view=diff
==============================================================================
--- webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/ws/security/dom/message/token/SecurityContextToken.java (original)
+++ webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/ws/security/dom/message/token/SecurityContextToken.java Fri Jan  4 11:39:19 2013
@@ -50,7 +50,7 @@ public class SecurityContextToken {
      */
     private Element elementIdentifier = null;
     
-    private WSSConfig wssConfig = WSSConfig.getNewInstance();
+    private WSSConfig wssConfig = null;
     
     private String tokenType = WSConstants.WSC_SCT;
     
@@ -95,7 +95,7 @@ public class SecurityContextToken {
         
         elementIdentifier.appendChild(doc.createTextNode(uuid));
         
-        setID(wssConfig.getIdAllocator().createSecureId("sctId-", element));
+        setID(getWSSConfig().getIdAllocator().createSecureId("sctId-", element));
     }
 
     /**
@@ -274,4 +274,10 @@ public class SecurityContextToken {
         return true;
     }
 
+    private WSSConfig getWSSConfig() {
+        if (wssConfig == null) {
+            wssConfig = WSSConfig.getNewInstance();
+        }
+        return wssConfig;
+    }
 }

Modified: webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/ws/security/dom/util/WSSecurityUtil.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/ws/security/dom/util/WSSecurityUtil.java?rev=1428801&r1=1428800&r2=1428801&view=diff
==============================================================================
--- webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/ws/security/dom/util/WSSecurityUtil.java (original)
+++ webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/ws/security/dom/util/WSSecurityUtil.java Fri Jan  4 11:39:19 2013
@@ -707,20 +707,63 @@ public final class WSSecurityUtil {
         String actor, 
         boolean doCreate
     ) throws WSSecurityException {
-        Element wsseSecurity = getSecurityHeader(doc, actor);
-        if (wsseSecurity != null) {
-            return wsseSecurity;
-        } else if (doCreate) {
-            String soapNamespace = WSSecurityUtil.getSOAPNamespace(envelope);
-            Element header = 
-                getDirectChildElement(envelope, WSConstants.ELEM_HEADER, soapNamespace);
-            if (header == null) {
+        String soapNamespace = WSSecurityUtil.getSOAPNamespace(doc.getDocumentElement());
+        Element header = 
+            getDirectChildElement(
+                doc.getDocumentElement(), 
+                WSConstants.ELEM_HEADER, 
+                soapNamespace
+            );
+        if (header == null) { // no SOAP header at all
+            if (doCreate) {
                 header = createElementInSameNamespace(envelope, WSConstants.ELEM_HEADER);
                 header = prependChildElement(envelope, header);
+            } else {
+                return null;
+            }
+        }
+        
+        String actorLocal = WSConstants.ATTR_ACTOR;
+        if (WSConstants.URI_SOAP12_ENV.equals(soapNamespace)) {
+            actorLocal = WSConstants.ATTR_ROLE;
+        }
+        
+        //
+        // Iterate through the security headers
+        //
+        Element foundSecurityHeader = null;
+        for (
+            Node currentChild = header.getFirstChild(); 
+            currentChild != null; 
+            currentChild = currentChild.getNextSibling()
+        ) {
+            if (Node.ELEMENT_NODE == currentChild.getNodeType()
+                && WSConstants.WSSE_LN.equals(currentChild.getLocalName())
+                && WSConstants.WSSE_NS.equals(currentChild.getNamespaceURI())) {
+                
+                Element elem = (Element)currentChild;
+                Attr attr = elem.getAttributeNodeNS(soapNamespace, actorLocal);
+                String hActor = (attr != null) ? attr.getValue() : null;
+
+                if (WSSecurityUtil.isActorEqual(actor, hActor)) {
+                    if (foundSecurityHeader != null) {
+                        if (log.isDebugEnabled()) {
+                            log.debug(
+                                "Two or more security headers have the same actor name: " + actor
+                            );
+                        }
+                        throw new WSSecurityException(WSSecurityException.INVALID_SECURITY);
+                    }
+                    foundSecurityHeader = elem;
+                }
             }
-            wsseSecurity = doc.createElementNS(WSConstants.WSSE_NS, "wsse:Security");
-            wsseSecurity.setAttributeNS(WSConstants.XMLNS_NS, "xmlns:wsse", WSConstants.WSSE_NS);
-            return prependChildElement(header, wsseSecurity);
+        }
+        if (foundSecurityHeader != null) {
+            return foundSecurityHeader;
+        } else if (doCreate) {
+            foundSecurityHeader = doc.createElementNS(WSConstants.WSSE_NS, "wsse:Security");
+            foundSecurityHeader.setAttributeNS(WSConstants.XMLNS_NS, "xmlns:wsse", WSConstants.WSSE_NS);
+            return prependChildElement(header, foundSecurityHeader);
         }
         return null;
     }