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); + } } }