Author: nandana
Date: Tue Jul  7 10:43:31 2009
New Revision: 791787

URL: http://svn.apache.org/viewvc?rev=791787&view=rev
Log:
RAMPART-232 Applying the patch from Stefan with some minor modifications. Some 
of the fixes in the patch are already available on the trunk

Modified:
    
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/PolicyBasedResultsValidator.java
    
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/util/RampartUtil.java

Modified: 
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/PolicyBasedResultsValidator.java
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/PolicyBasedResultsValidator.java?rev=791787&r1=791786&r2=791787&view=diff
==============================================================================
--- 
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/PolicyBasedResultsValidator.java
 (original)
+++ 
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/PolicyBasedResultsValidator.java
 Tue Jul  7 10:43:31 2009
@@ -17,6 +17,8 @@
 package org.apache.rampart;
 
 import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.om.xpath.AXIOMXPath;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.rampart.policy.RampartPolicyData;
@@ -28,6 +30,8 @@
 import org.apache.ws.security.util.WSSecurityUtil;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
+import org.jaxen.XPath;
+import org.jaxen.JaxenException;
 
 import javax.xml.namespace.QName;
 import java.math.BigInteger;
@@ -390,6 +394,45 @@
         ArrayList encrRefs = getEncryptedReferences(results);
         
         RampartPolicyData rpd = rmd.getPolicyData();
+
+        // build the list of encrypted nodes based on the dataRefs xpath 
expressions
+        SOAPEnvelope envelope = rmd.getMsgContext().getEnvelope();
+        Set namespaces = RampartUtil.findAllPrefixNamespaces(envelope,
+                                                             
rpd.getDeclaredNamespaces());
+
+        Map decryptedElements = new HashMap();
+        for (int i = 0; i < encrRefs.size() ; i++) {
+            WSDataRef dataRef = (WSDataRef)encrRefs.get(i);
+
+            if(dataRef == null || dataRef.getXpath() == null) {
+                continue;
+            }
+
+            try {
+                XPath xp = new AXIOMXPath(dataRef.getXpath());
+
+                Iterator nsIter = namespaces.iterator();
+
+                while (nsIter.hasNext())
+                {
+                    OMNamespace tmpNs = (OMNamespace)nsIter.next();
+                    xp.addNamespace(tmpNs.getPrefix(), 
tmpNs.getNamespaceURI());
+                }
+
+                Iterator nodesIterator = xp.selectNodes(envelope).iterator();
+
+                while (nodesIterator.hasNext()) {
+                    decryptedElements.put(nodesIterator.next(), 
Boolean.valueOf(dataRef.isContent()));
+                }
+
+
+            } catch (JaxenException e) {
+                // This has to be changed to propagate an instance of a 
RampartException up
+                throw new RampartException("An error occurred while searching 
for decrypted elements.", e);
+            }
+
+        }
+
         
         //Check for encrypted body
         if(rpd.isEncryptBody()) {
@@ -418,14 +461,41 @@
                 }
                 continue;
             }
-            
-            if (encPart.getEncId() == null) {
-                throw new RampartException("encryptedPartMissing", 
-                        new 
String[]{encPart.getNamespace()+":"+encPart.getName()});
-            } else if (!isRefIdPresent(encrRefs, encPart.getEncId())) {
-                throw new RampartException("encryptedPartMissing", 
-                        new 
String[]{encPart.getNamespace()+":"+encPart.getName()});                
-            }
+
+            // it is not a header or body part... verify encrypted xpath 
elements
+            String xpath = encPart.getXpath();
+            boolean found = false;
+            try {
+                XPath xp = new AXIOMXPath(xpath);
+                Iterator nsIter = namespaces.iterator();
+
+                while (nsIter.hasNext()) {
+                    OMNamespace tmpNs = (OMNamespace) nsIter.next();
+                    xp.addNamespace(tmpNs.getPrefix(), 
tmpNs.getNamespaceURI());
+                }
+
+                Iterator nodesIterator = xp.selectNodes(envelope).iterator();
+
+                while (nodesIterator.hasNext()) {
+                    Object result = 
decryptedElements.get(nodesIterator.next());
+                    if (result != null &&
+                            ("Element".equals(encPart.getEncModifier())
+                                    ^ ((Boolean) result).booleanValue())) {
+                        found = true;
+                        break;
+                    }
+                }
+
+                if (!found) {
+                    throw new RampartException("encryptedPartMissing",
+                            new String[]{xpath});
+                }
+
+
+            } catch (JaxenException e) {
+                // This has to be changed to propagate an instance of a 
RampartException up
+                throw new RampartException("An error occurred while searching 
for decrypted elements.", e);
+            }           
             
         }
         

Modified: 
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/util/RampartUtil.java
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/util/RampartUtil.java?rev=791787&r1=791786&r2=791787&view=diff
==============================================================================
--- 
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/util/RampartUtil.java
 (original)
+++ 
webservices/rampart/trunk/java/modules/rampart-core/src/main/java/org/apache/rampart/util/RampartUtil.java
 Tue Jul  7 10:43:31 2009
@@ -810,7 +810,7 @@
         return getPartsAndElements(true, envelope, rpd.isSignBody(), 
rpd.getSignedParts(), rpd.getSignedElements(), rpd.getDeclaredNamespaces());
     }
     
-    private static Set findAllPrefixNamespaces(OMElement currentElement, 
HashMap decNamespacess)
+    public static Set findAllPrefixNamespaces(OMElement currentElement, 
HashMap decNamespacess)
     {
        Set results = new HashSet();
        
@@ -896,7 +896,12 @@
                             {
                                 OMElement e = (OMElement)nodesIter.next();
                               
-                                WSEncryptionPart encryptedElem = new 
WSEncryptionPart(e.getLocalName(), e.getNamespace().getNamespaceURI(), 
"Content");
+                                WSEncryptionPart encryptedElem = new 
WSEncryptionPart(e.getLocalName(), 
+                                                                               
       e.getNamespace().getNamespaceURI(), 
+                                                                               
       "Content",
+                                                                               
       WSConstants.PART_TYPE_ELEMENT);
+                                
+                                encryptedElem.setXpath(expression);
                                 OMAttribute wsuId = e.getAttribute(new 
QName(WSConstants.WSU_NS, "Id"));
                                 
                                 if ( wsuId != null ) {
@@ -1015,10 +1020,15 @@
                                OMElement e = (OMElement)nodesIter.next();
                                
                                if (sign) {
-                                       result.add(new 
WSEncryptionPart(e.getLocalName(), e.getNamespace().getNamespaceURI(), 
"Content", WSConstants.PART_TYPE_ELEMENT));
-                               } else {
-                                       
-                                       WSEncryptionPart encryptedElem = new 
WSEncryptionPart(e.getLocalName(), e.getNamespace().getNamespaceURI(), 
"Element",WSConstants.PART_TYPE_ELEMENT);
+                        WSEncryptionPart encryptedElem = new 
WSEncryptionPart(e.getLocalName(), e.getNamespace().getNamespaceURI(), 
"Content", WSConstants.PART_TYPE_ELEMENT);
+                        encryptedElem.setXpath(expression);
+                        result.add(encryptedElem);
+
+                    } else {
+
+                        WSEncryptionPart encryptedElem = new 
WSEncryptionPart(e.getLocalName(), e.getNamespace().getNamespaceURI(), 
"Element", WSConstants.PART_TYPE_ELEMENT);
+                        encryptedElem.setXpath(expression);
+
                                        OMAttribute wsuId = e.getAttribute(new 
QName(WSConstants.WSU_NS, "Id"));
                                        
                                        if ( wsuId != null ) {
@@ -1400,13 +1410,13 @@
         } 
         
         // Checking for signed parts and elements
-        if (rpd.isSignBody() || rpd.getSignedParts().size() != 0 && 
+        if (rpd.isSignBody() || rpd.getSignedParts().size() != 0 || 
                                     rpd.getSignedElements().size() != 0) {
             return true;
         }
         
         // Checking for encrypted parts and elements
-        if (rpd.isEncryptBody() || rpd.getEncryptedParts().size() != 0 && 
+        if (rpd.isEncryptBody() || rpd.getEncryptedParts().size() != 0 || 
                                     rpd.getEncryptedElements().size() != 0 ) {
             return true;
         }   
@@ -1470,9 +1480,13 @@
                         Element encHeader = 
(Element)encDataElem.getParentNode();
                         String encHeaderId = 
encHeader.getAttributeNS(WSConstants.WSU_NS, "Id");
                         
-                        signedParts.remove(signedPart);
-                        WSEncryptionPart encHeaderToSign = new 
WSEncryptionPart(encHeaderId);
-                        signedParts.add(encHeaderToSign);
+                        //For some reason the id might not be available
+                        // so the part/element with empty/null id won't be 
recognized afterwards. 
+                        if (encHeaderId != null && 
!"".equals(encHeaderId.trim())) {
+                            signedParts.remove(signedPart);
+                            WSEncryptionPart encHeaderToSign = new 
WSEncryptionPart(encHeaderId);
+                            signedParts.add(encHeaderToSign);
+                        }
                         
                     }
                 }


Reply via email to