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.