You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by co...@apache.org on 2017/01/20 15:41:28 UTC

[3/3] cxf git commit: CXF-7220 - WS-Security StaX processing fails on whitespace after the SOAP Body opening tag

CXF-7220 - WS-Security StaX processing fails on whitespace after the SOAP Body opening tag


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/3f350f15
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/3f350f15
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/3f350f15

Branch: refs/heads/master
Commit: 3f350f1559f31526e3fe18eb8e600c74b480fd96
Parents: b680ab1
Author: Colm O hEigeartaigh <co...@apache.org>
Authored: Fri Jan 20 15:41:03 2017 +0000
Committer: Colm O hEigeartaigh <co...@apache.org>
Committed: Fri Jan 20 15:41:03 2017 +0000

----------------------------------------------------------------------
 .../security/wss4j/WSS4JStaxInInterceptor.java  | 44 ++++++++++++++++++++
 .../ws/action/SignatureWhitespaceTest.java      | 37 +++++++++-------
 2 files changed, 67 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/3f350f15/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JStaxInInterceptor.java
----------------------------------------------------------------------
diff --git a/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JStaxInInterceptor.java b/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JStaxInInterceptor.java
index 26376f2..fd52bb6 100644
--- a/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JStaxInInterceptor.java
+++ b/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JStaxInInterceptor.java
@@ -32,6 +32,8 @@ import javax.xml.stream.util.StreamReaderDelegate;
 
 import org.apache.cxf.binding.soap.SoapFault;
 import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
+import org.apache.cxf.binding.soap.interceptor.StartBodyInterceptor;
 import org.apache.cxf.common.classloader.ClassLoaderUtils;
 import org.apache.cxf.common.i18n.Message;
 import org.apache.cxf.common.logging.LogUtils;
@@ -96,6 +98,8 @@ public class WSS4JStaxInInterceptor extends AbstractWSS4JStaxInterceptor {
         if (soapMessage.containsKey(SECURITY_PROCESSED) || isGET(soapMessage)) {
             return;
         }
+        
+        soapMessage.getInterceptorChain().add(new StaxStartBodyInterceptor());
 
         XMLStreamReader originalXmlStreamReader = soapMessage.getContent(XMLStreamReader.class);
         XMLStreamReader newXmlStreamReader;
@@ -403,5 +407,45 @@ public class WSS4JStaxInInterceptor extends AbstractWSS4JStaxInterceptor {
             throw new WSSecurityException(WSSecurityException.ErrorCode.FAILURE, ex);
         }
     }
+    
+    /**
+     * This interceptor runs after the StartBodyInterceptor. It skips any white space after the SOAP:Body start tag, 
+     * to make sure that the WSS4J OperationInputProcessor is triggered by the first SOAP Body child (if it is not, 
+     * then WS-Security processing does not happen correctly).
+     */
+    private class StaxStartBodyInterceptor extends AbstractSoapInterceptor {
+        
+        StaxStartBodyInterceptor() {
+            super(Phase.READ);
+            super.addAfter(StartBodyInterceptor.class.getName());
+        }
+        
+        StaxStartBodyInterceptor(String phase) {
+            super(phase);
+        }
+
+        /** {@inheritDoc}*/
+        public void handleMessage(SoapMessage message) throws Fault {
+            if (isGET(message)) {
+                LOG.fine("StartBodyInterceptor skipped in HTTP GET method");
+                return;
+            }
+            XMLStreamReader xmlReader = message.getContent(XMLStreamReader.class);
+            try {
+                int i = xmlReader.getEventType();
+                while (i == XMLStreamReader.NAMESPACE
+                    || i == XMLStreamReader.ATTRIBUTE
+                    || i == XMLStreamReader.CHARACTERS) {
+                    i = xmlReader.next();
+                }
+            } catch (XMLStreamException e) {
+                throw new SoapFault(new Message("XML_STREAM_EXC", LOG, e.getMessage()), e, 
+                                    message.getVersion().getSender());
+            }
+
+        }
+
+    }
+
 
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/3f350f15/systests/ws-security/src/test/java/org/apache/cxf/systest/ws/action/SignatureWhitespaceTest.java
----------------------------------------------------------------------
diff --git a/systests/ws-security/src/test/java/org/apache/cxf/systest/ws/action/SignatureWhitespaceTest.java b/systests/ws-security/src/test/java/org/apache/cxf/systest/ws/action/SignatureWhitespaceTest.java
index 2f3cc43..bf768f4 100644
--- a/systests/ws-security/src/test/java/org/apache/cxf/systest/ws/action/SignatureWhitespaceTest.java
+++ b/systests/ws-security/src/test/java/org/apache/cxf/systest/ws/action/SignatureWhitespaceTest.java
@@ -31,9 +31,13 @@ import javax.xml.ws.Service;
 
 import org.apache.cxf.Bus;
 import org.apache.cxf.bus.spring.SpringBusFactory;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.jaxws.DispatchImpl;
 import org.apache.cxf.systest.ws.common.SecurityTestUtil;
 import org.apache.cxf.systest.ws.common.TestParam;
 import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
+import org.apache.cxf.transport.http.HTTPConduit;
+import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
 import org.example.contract.doubleit.DoubleItPortType;
 import org.junit.BeforeClass;
 import org.junit.runner.RunWith;
@@ -49,6 +53,12 @@ public class SignatureWhitespaceTest extends AbstractBusClientServerTestBase {
 
     private static final String NAMESPACE = "http://www.example.org/contract/DoubleIt";
     private static final QName SERVICE_QNAME = new QName(NAMESPACE, "DoubleItService");
+
+    final TestParam test;
+
+    public SignatureWhitespaceTest(TestParam type) {
+        this.test = type;
+    }
     
     @BeforeClass
     public static void startServers() throws Exception {
@@ -66,12 +76,6 @@ public class SignatureWhitespaceTest extends AbstractBusClientServerTestBase {
         );
     }
     
-    final TestParam test;
-    
-    public SignatureWhitespaceTest(TestParam type) {
-        this.test = type;
-    }
-    
     @org.junit.AfterClass
     public static void cleanup() throws Exception {
         SecurityTestUtil.cleanup();
@@ -111,10 +115,7 @@ public class SignatureWhitespaceTest extends AbstractBusClientServerTestBase {
     
     @org.junit.Test
     public void testTrailingWhitespaceInSOAPBody() throws Exception {
-        // TODO Bug
-        if (STAX_PORT.equals(test.getPort())) {
-            return;
-        }
+
         SpringBusFactory bf = new SpringBusFactory();
         URL busFile = SignatureWhitespaceTest.class.getResource("client.xml");
 
@@ -129,6 +130,16 @@ public class SignatureWhitespaceTest extends AbstractBusClientServerTestBase {
         Dispatch<StreamSource> dispatch = 
             service.createDispatch(portQName, StreamSource.class, Service.Mode.MESSAGE);
         
+        Client client = ((DispatchImpl<StreamSource>) dispatch).getClient();
+
+        HTTPConduit http = (HTTPConduit) client.getConduit();
+
+        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
+        httpClientPolicy.setConnectionTimeout(0);
+        httpClientPolicy.setReceiveTimeout(0);
+        http.setClient(httpClientPolicy);
+
+        
         // Creating a DOMSource Object for the request
         
         URL requestFile = 
@@ -145,10 +156,7 @@ public class SignatureWhitespaceTest extends AbstractBusClientServerTestBase {
     
     @org.junit.Test
     public void testAddedCommentsInSOAPBody() throws Exception {
-        // TODO Bug
-        if (STAX_PORT.equals(test.getPort())) {
-            return;
-        }
+
         SpringBusFactory bf = new SpringBusFactory();
         URL busFile = SignatureWhitespaceTest.class.getResource("client.xml");
 
@@ -176,4 +184,5 @@ public class SignatureWhitespaceTest extends AbstractBusClientServerTestBase {
         StreamSource response = dispatch.invoke(request);
         assertNotNull(response);
     }
+    
 }