Not all encrypted elements are extracted by 
org.apache.rampart.ValidatorData:extractEncryptedPartInformation()
--------------------------------------------------------------------------------------------------------------

                 Key: RAMPART-47
                 URL: https://issues.apache.org/jira/browse/RAMPART-47
             Project: Rampart
          Issue Type: Bug
          Components: rampart-core
    Affects Versions: 1.2
            Reporter: Aaron Gourley


Not all encrypted elements are being extracted properly in Rampart 1.2, and an 
exception was incorrectly thrown because Rampart thought that the body element 
was not encrypted.  I noticed this when the server was processing a message 
that had the UsernameToken and the Body encrypted.  I used the Rampart 1.0 
configuration on the client side to encrypt the UsernameToken element, and the 
policy.xml file that I used is included at the end of this JIRA for the server 
side.  I used the EncryptedElements assertion in the policy.xml (which I am 
aware is not supported yet).  Since I think I found a way to fix it I am 
reporting the problem with a proposed solution.

This was the server-side exception:
org.apache.axis2.AxisFault: Missing encryption result for id : null
        at 
org.apache.rampart.handler.RampartReceiver.invoke(RampartReceiver.java:81)
        at org.apache.axis2.engine.Phase.invoke(Phase.java:383)
        at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:203)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:131)
        at 
org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:279)
        at 
org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:116)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at 
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at 
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at 
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at 
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)
Caused by: org.apache.rampart.RampartException: Missing encryption result for 
id : null
        at 
org.apache.rampart.PolicyBasedResultsValidator.validateEncryptedParts(PolicyBasedResultsValidator.java:317)
        at 
org.apache.rampart.PolicyBasedResultsValidator.validate(PolicyBasedResultsValidator.java:84)
        at org.apache.rampart.RampartEngine.process(RampartEngine.java:88)
        at 
org.apache.rampart.handler.RampartReceiver.invoke(RampartReceiver.java:71)
        ... 22 more

This is the code change that I made to fix the problem (in 
org.apache.rampart.ValidatorData):
    
    private void extractEncryptedPartInformation() {
        Node start = rmd.getDocument().getDocumentElement();
        while(start != null) {
            Element elem = (Element) WSSecurityUtil.findElement(start, 
                    EncryptionConstants._TAG_ENCRYPTEDDATA, WSConstants.ENC_NS);
            if(elem != null) {
                Element parentElem = (Element)elem.getParentNode();
                if(parentElem != null && 
parentElem.getLocalName().equals(SOAP11Constants.BODY_LOCAL_NAME) &&
                        
parentElem.getNamespaceURI().equals(rmd.getSoapConstants().getEnvelopeURI())) {
                    this.bodyEncrDataId = elem.getAttribute("Id");
                } else {
                    encryptedDataRefIds.add(elem.getAttribute("Id"));
                } 
                start = elem;
            }
            
            // Find new starting point by traversing up the nodes to:
            // Case 1: The root
            // Case 2: The nearest ancestor with a next sibling 
            while( start != null && start.getNextSibling() == null )
            {
                start = start.getParentNode();
            }
            start = start != null ? start.getNextSibling() : null;            
        }
    }


An example of a message that caused this failure is attached.  The only element 
processed by the extractEncryptedPartInformation() method was 
/soapenv:Envelope/soapenv:Header/soapenv:Security/xenc:EncryptedData.  The body 
was not processed later because 'start' was prematurely set to null.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to