VYPR
Moderate severityNVD Advisory· Published Mar 12, 2013· Updated Apr 29, 2026

CVE-2012-5633

CVE-2012-5633

Description

The URIMappingInterceptor in Apache CXF before 2.5.8, 2.6.x before 2.6.5, and 2.7.x before 2.7.2, when using the WSS4JInInterceptor, bypasses WS-Security processing, which allows remote attackers to obtain access to SOAP services via an HTTP GET request.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
org.apache.cxf:cxfMaven
< 2.5.82.5.8
org.apache.cxf:cxfMaven
>= 2.6.0, < 2.6.52.6.5
org.apache.cxf:cxfMaven
>= 2.7.0, < 2.7.22.7.2

Affected products

15
  • Apache/Cxf15 versions
    cpe:2.3:a:apache:cxf:*:*:*:*:*:*:*:*+ 14 more
    • cpe:2.3:a:apache:cxf:*:*:*:*:*:*:*:*range: <=2.5.7
    • cpe:2.3:a:apache:cxf:2.5.0:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.5.1:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.5.2:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.5.3:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.5.4:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.5.5:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.5.6:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.6.0:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.6.1:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.6.2:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.6.3:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.6.4:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.7.0:*:*:*:*:*:*:*
    • cpe:2.3:a:apache:cxf:2.7.1:*:*:*:*:*:*:*

Patches

7
0cbc56618b60

Merged revisions 1420756 via git cherry-pick from

https://github.com/apache/cxfColm O HeigeartaighDec 12, 2012via ghsa
7 files changed · +551 3
  • rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JInInterceptor.java+7 3 modified
    @@ -186,15 +186,19 @@ public Object getProperty(Object msgContext, String key) {
         }
         public final boolean isGET(SoapMessage message) {
             String method = (String)message.get(SoapMessage.HTTP_REQUEST_METHOD);
    -        return "GET".equals(method) && message.getContent(XMLStreamReader.class) == null;
    +        boolean isGet = 
    +            "GET".equals(method) && message.getContent(XMLStreamReader.class) == null;
    +        if (isGet) {
    +            //make sure we skip the URIMapping as we cannot apply security requirements to that
    +            message.put(URIMappingInterceptor.URIMAPPING_SKIP, Boolean.TRUE);
    +        }
    +        return isGet;
         }
         
         public void handleMessage(SoapMessage msg) throws Fault {
             if (msg.containsKey(SECURITY_PROCESSED) || isGET(msg)) {
                 return;
             }
    -        //make sure we skip the URIMapping as we cannot apply security requirements to that
    -        msg.put(URIMappingInterceptor.URIMAPPING_SKIP, Boolean.TRUE);
             msg.put(SECURITY_PROCESSED, Boolean.TRUE);
             
             boolean utWithCallbacks = 
    
  • systests/ws-security/pom.xml+5 0 modified
    @@ -124,6 +124,11 @@
                 <artifactId>cxf-rt-frontend-jaxws</artifactId>
                 <version>${project.version}</version>
             </dependency>
    +        <dependency>
    +            <groupId>org.apache.cxf</groupId>
    +            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
    +            <version>${project.version}</version>
    +        </dependency>
     
             <dependency>
                 <groupId>org.apache.cxf</groupId>
    
  • systests/ws-security/src/test/java/org/apache/cxf/systest/ws/httpget/HTTPGetTest.java+216 0 added
    @@ -0,0 +1,216 @@
    +/**
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements. See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership. The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License. You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing,
    + * software distributed under the License is distributed on an
    + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + * KIND, either express or implied. See the License for the
    + * specific language governing permissions and limitations
    + * under the License.
    + */
    +
    +package org.apache.cxf.systest.ws.httpget;
    +
    +import java.net.URL;
    +import java.util.HashMap;
    +import java.util.Map;
    +
    +import javax.crypto.Cipher;
    +import javax.crypto.SecretKey;
    +import javax.crypto.spec.SecretKeySpec;
    +import javax.xml.namespace.QName;
    +import javax.xml.ws.Service;
    +
    +import org.apache.cxf.Bus;
    +import org.apache.cxf.bus.spring.SpringBusFactory;
    +import org.apache.cxf.jaxrs.client.WebClient;
    +import org.apache.cxf.jaxrs.ext.xml.XMLSource;
    +import org.apache.cxf.systest.ws.common.SecurityTestUtil;
    +import org.apache.cxf.systest.ws.httpget.server.Server;
    +import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
    +import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
    +import org.example.contract.doubleit.DoubleItPortType;
    +import org.junit.BeforeClass;
    +
    +/**
    + * A set of tests for CXF-4629.
    + */
    +public class HTTPGetTest extends AbstractBusClientServerTestBase {
    +    public static final String PORT = allocatePort(Server.class);
    +
    +    private static final String NAMESPACE = "http://www.example.org/contract/DoubleIt";
    +    private static final QName SERVICE_QNAME = new QName(NAMESPACE, "DoubleItService");
    +
    +    private boolean unrestrictedPoliciesInstalled = checkUnrestrictedPoliciesInstalled();
    +    
    +    @BeforeClass
    +    public static void startServers() throws Exception {
    +        assertTrue(
    +            "Server failed to launch",
    +            // run the server in the same process
    +            // set this to false to fork
    +            launchServer(Server.class, true)
    +        );
    +    }
    +    
    +    @org.junit.AfterClass
    +    public static void cleanup() throws Exception {
    +        SecurityTestUtil.cleanup();
    +        stopAllServers();
    +    }
    +
    +    @org.junit.Test
    +    public void testSOAPClientSecurityPolicy() throws Exception {
    +        if (!unrestrictedPoliciesInstalled) {
    +            return;
    +        }
    +
    +        SpringBusFactory bf = new SpringBusFactory();
    +        URL busFile = HTTPGetTest.class.getResource("client/client.xml");
    +
    +        Bus bus = bf.createBus(busFile.toString());
    +        SpringBusFactory.setDefaultBus(bus);
    +        SpringBusFactory.setThreadDefaultBus(bus);
    +        
    +        URL wsdl = HTTPGetTest.class.getResource("DoubleItHTTPGet.wsdl");
    +        Service service = Service.create(wsdl, SERVICE_QNAME);
    +        QName portQName = new QName(NAMESPACE, "DoubleItKeyIdentifierPort");
    +        DoubleItPortType x509Port = 
    +                service.getPort(portQName, DoubleItPortType.class);
    +        updateAddressPort(x509Port, PORT);
    +        int result = x509Port.doubleIt(25);
    +        assertEquals(result, 50);
    +        
    +        bus.shutdown(true);
    +    }
    +    
    +    @org.junit.Test
    +    public void testHTTPGetClientSecurityPolicy() throws Exception {
    +        if (!unrestrictedPoliciesInstalled) {
    +            return;
    +        }
    +
    +        SpringBusFactory bf = new SpringBusFactory();
    +        URL busFile = HTTPGetTest.class.getResource("client/client.xml");
    +
    +        Bus bus = bf.createBus(busFile.toString());
    +        SpringBusFactory.setDefaultBus(bus);
    +        SpringBusFactory.setThreadDefaultBus(bus);
    +        
    +        String address = "http://localhost:" + PORT + "/DoubleItX509KeyIdentifier/DoubleIt";
    +        WebClient client = WebClient.create(address);
    +        client.query("numberToDouble", "20");
    +        
    +        try {
    +            client.get(XMLSource.class);
    +            fail("Failure expected on security policy failure");
    +        } catch (Exception ex) {
    +            // expected
    +        }
    +        
    +        bus.shutdown(true);
    +    }
    +    
    +    @org.junit.Test
    +    public void testSignedBodyTimestamp() throws Exception {
    +        if (!unrestrictedPoliciesInstalled) {
    +            return;
    +        }
    +
    +        SpringBusFactory bf = new SpringBusFactory();
    +        URL busFile = HTTPGetTest.class.getResource("client/client.xml");
    +
    +        Bus bus = bf.createBus(busFile.toString());
    +        SpringBusFactory.setDefaultBus(bus);
    +        SpringBusFactory.setThreadDefaultBus(bus);
    +        
    +        URL wsdl = HTTPGetTest.class.getResource("DoubleItHTTPGet.wsdl");
    +        Service service = Service.create(wsdl, SERVICE_QNAME);
    +        QName portQName = new QName(NAMESPACE, "DoubleItSignBodyPort");
    +        DoubleItPortType port = 
    +                service.getPort(portQName, DoubleItPortType.class);
    +        updateAddressPort(port, PORT);
    +        
    +        Map<String, Object> outProps = new HashMap<String, Object>();
    +        outProps.put("action", "Timestamp Signature");
    +        outProps.put("signaturePropFile", 
    +                     "org/apache/cxf/systest/ws/wssec10/client/alice.properties");
    +        outProps.put("user", "alice");
    +        outProps.put("passwordCallbackClass", 
    +                     "org.apache.cxf.systest.ws.wssec10.client.KeystorePasswordCallback");
    +        outProps.put("signatureParts",
    +                     "{}{http://schemas.xmlsoap.org/soap/envelope/}Body;"
    +                     + "{}{http://docs.oasis-open.org/wss/2004/01/oasis-"
    +                     + "200401-wss-wssecurity-utility-1.0.xsd}Timestamp;");
    +        
    +        bus.getOutInterceptors().add(new WSS4JOutInterceptor(outProps));
    +        
    +        int result = port.doubleIt(25);
    +        assertEquals(result, 50);
    +        
    +        bus.shutdown(true);
    +    }
    +    
    +    @org.junit.Test
    +    public void testHTTPGetSignedBody() throws Exception {
    +        if (!unrestrictedPoliciesInstalled) {
    +            return;
    +        }
    +        
    +        SpringBusFactory bf = new SpringBusFactory();
    +        URL busFile = HTTPGetTest.class.getResource("client/client.xml");
    +
    +        Bus bus = bf.createBus(busFile.toString());
    +        SpringBusFactory.setDefaultBus(bus);
    +        SpringBusFactory.setThreadDefaultBus(bus);
    +
    +        String address = "http://localhost:" + PORT + "/DoubleItSignBody/DoubleIt";
    +        WebClient client = WebClient.create(address);
    +        client.query("numberToDouble", "20");
    +        /*
    +        XMLSource result = client.get(XMLSource.class);
    +        result.setBuffering(true);
    +        
    +        String input = result.getNode("//doubledNumber", String.class);
    +        assertTrue(input.startsWith("<doubledNumber>40"));
    +        */
    +        
    +        try {
    +            client.get(XMLSource.class);
    +            fail("Failure expected on security policy failure");
    +        } catch (Exception ex) {
    +            // expected
    +        }
    +        
    +        bus.shutdown(true);
    +    }
    +    
    +    
    +    private boolean checkUnrestrictedPoliciesInstalled() {
    +        try {
    +            byte[] data = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
    +
    +            SecretKey key192 = new SecretKeySpec(
    +                new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    +                            0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    +                            0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17},
    +                            "AES");
    +            Cipher c = Cipher.getInstance("AES");
    +            c.init(Cipher.ENCRYPT_MODE, key192);
    +            c.doFinal(data);
    +            return true;
    +        } catch (Exception e) {
    +            //
    +        }
    +        return false;
    +    }
    +    
    +}
    
  • systests/ws-security/src/test/java/org/apache/cxf/systest/ws/httpget/server/Server.java+41 0 added
    @@ -0,0 +1,41 @@
    +/**
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements. See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership. The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License. You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing,
    + * software distributed under the License is distributed on an
    + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + * KIND, either express or implied. See the License for the
    + * specific language governing permissions and limitations
    + * under the License.
    + */
    +
    +package org.apache.cxf.systest.ws.httpget.server;
    +
    +import java.net.URL;
    +
    +import org.apache.cxf.Bus;
    +import org.apache.cxf.BusFactory;
    +import org.apache.cxf.bus.spring.SpringBusFactory;
    +import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
    +
    +public class Server extends AbstractBusTestServerBase {
    +
    +    public Server() {
    +
    +    }
    +
    +    protected void run()  {
    +        URL busFile = Server.class.getResource("server.xml");
    +        Bus busLocal = new SpringBusFactory().createBus(busFile);
    +        BusFactory.setDefaultBus(busLocal);
    +        setBus(busLocal);
    +    }
    +}
    
  • systests/ws-security/src/test/resources/org/apache/cxf/systest/ws/httpget/client/client.xml+55 0 added
    @@ -0,0 +1,55 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + Licensed to the Apache Software Foundation (ASF) under one
    + or more contributor license agreements. See the NOTICE file
    + distributed with this work for additional information
    + regarding copyright ownership. The ASF licenses this file
    + to you under the Apache License, Version 2.0 (the
    + "License"); you may not use this file except in compliance
    + with the License. You may obtain a copy of the License at
    + 
    + http://www.apache.org/licenses/LICENSE-2.0
    + 
    + Unless required by applicable law or agreed to in writing,
    + software distributed under the License is distributed on an
    + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + KIND, either express or implied. See the License for the
    + specific language governing permissions and limitations
    + under the License.
    +-->
    +<beans xmlns="http://www.springframework.org/schema/beans"
    +       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    +       xmlns:http="http://cxf.apache.org/transports/http/configuration"
    +       xmlns:jaxws="http://cxf.apache.org/jaxws"
    +       xmlns:cxf="http://cxf.apache.org/core"
    +       xmlns:p="http://cxf.apache.org/policy"
    +       xmlns:sec="http://cxf.apache.org/configuration/security"
    +       xsi:schemaLocation="
    +          http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans.xsd
    +          http://cxf.apache.org/jaxws                           http://cxf.apache.org/schemas/jaxws.xsd
    +          http://cxf.apache.org/transports/http/configuration   http://cxf.apache.org/schemas/configuration/http-conf.xsd
    +          http://cxf.apache.org/configuration/security          http://cxf.apache.org/schemas/configuration/security.xsd
    +          http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
    +          http://cxf.apache.org/policy http://cxf.apache.org/schemas/policy.xsd"
    +>
    +    <cxf:bus>
    +        <cxf:features>
    +            <p:policies/>
    +            <cxf:logging/>
    +        </cxf:features>
    +    </cxf:bus>
    +    
    +    <jaxws:client name="{http://www.example.org/contract/DoubleIt}DoubleItKeyIdentifierPort" 
    +                  createdFromAPI="true">
    +       <jaxws:properties>
    +           <entry key="ws-security.encryption.properties" 
    +                  value="org/apache/cxf/systest/ws/wssec10/client/bob.properties"/> 
    +           <entry key="ws-security.encryption.username" value="bob"/>
    +       </jaxws:properties>
    +    </jaxws:client>
    +    
    +    <jaxws:client name="{http://www.example.org/contract/DoubleIt}DoubleItSignBodyPort" 
    +                  createdFromAPI="true">
    +    </jaxws:client>
    +    
    +</beans>
    
  • systests/ws-security/src/test/resources/org/apache/cxf/systest/ws/httpget/DoubleItHTTPGet.wsdl+138 0 added
    @@ -0,0 +1,138 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + Licensed to the Apache Software Foundation (ASF) under one
    + or more contributor license agreements. See the NOTICE file
    + distributed with this work for additional information
    + regarding copyright ownership. The ASF licenses this file
    + to you under the Apache License, Version 2.0 (the
    + "License"); you may not use this file except in compliance
    + with the License. You may obtain a copy of the License at
    + 
    + http://www.apache.org/licenses/LICENSE-2.0
    + 
    + Unless required by applicable law or agreed to in writing,
    + software distributed under the License is distributed on an
    + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + KIND, either express or implied. See the License for the
    + specific language governing permissions and limitations
    + under the License.
    +-->
    +<wsdl:definitions name="DoubleIt"
    +    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    +    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/contract/DoubleIt"
    +    targetNamespace="http://www.example.org/contract/DoubleIt" 
    +    xmlns:wsp="http://www.w3.org/ns/ws-policy"
    +    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    +    xmlns:wsaws="http://www.w3.org/2005/08/addressing" 
    +    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
    +    xmlns:sp13="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200802">
    +    
    +    <wsdl:import location="src/test/resources/DoubleItLogical.wsdl" 
    +                 namespace="http://www.example.org/contract/DoubleIt"/>
    +
    +    <wsdl:binding name="DoubleItKeyIdentifierBinding" type="tns:DoubleItPortType">
    +        <wsp:PolicyReference URI="#DoubleItKeyIdentifierPolicy" />
    +        <soap:binding style="document"
    +            transport="http://schemas.xmlsoap.org/soap/http" />
    +        <wsdl:operation name="DoubleIt">
    +            <soap:operation soapAction="" />
    +            <wsdl:input>
    +                <soap:body use="literal" />
    +                <wsp:PolicyReference URI="#DoubleItBinding_DoubleIt_Input_Policy"/>
    +            </wsdl:input>
    +            <wsdl:output>
    +                <soap:body use="literal" />
    +                <wsp:PolicyReference URI="#DoubleItBinding_DoubleIt_Output_Policy"/>
    +            </wsdl:output>
    +            <wsdl:fault name="DoubleItFault">
    +                <soap:body use="literal" name="DoubleItFault" />
    +            </wsdl:fault>
    +        </wsdl:operation>
    +    </wsdl:binding>
    +    
    +    <wsdl:binding name="DoubleItNoSecurityBinding" type="tns:DoubleItPortType">
    +        <soap:binding style="document"
    +            transport="http://schemas.xmlsoap.org/soap/http" />
    +        <wsdl:operation name="DoubleIt">
    +            <soap:operation soapAction="" />
    +            <wsdl:input>
    +                <soap:body use="literal" />
    +            </wsdl:input>
    +            <wsdl:output>
    +                <soap:body use="literal" />
    +            </wsdl:output>
    +            <wsdl:fault name="DoubleItFault">
    +                <soap:body use="literal" name="DoubleItFault" />
    +            </wsdl:fault>
    +        </wsdl:operation>
    +    </wsdl:binding>
    +    
    +    <wsdl:service name="DoubleItService">
    +        <wsdl:port name="DoubleItKeyIdentifierPort" binding="tns:DoubleItKeyIdentifierBinding">
    +            <soap:address location="http://localhost:9001/DoubleItX509KeyIdentifier" />
    +        </wsdl:port>
    +        <wsdl:port name="DoubleItSignBodyPort" binding="tns:DoubleItNoSecurityBinding">
    +            <soap:address location="http://localhost:9001/DoubleItSignBody" />
    +        </wsdl:port>
    +    </wsdl:service>
    +
    +    <wsp:Policy wsu:Id="DoubleItKeyIdentifierPolicy">
    +        <wsp:ExactlyOne>
    +            <wsp:All>
    +                <sp:SymmetricBinding>
    +                  <wsp:Policy>
    +                    <sp:ProtectionToken>
    +                       <wsp:Policy>
    +                          <sp:X509Token
    +                             sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/Never">
    +                             <wsp:Policy>
    +                                <sp:WssX509V3Token10 />
    +                                <sp:RequireKeyIdentifierReference />
    +                             </wsp:Policy>
    +                          </sp:X509Token>
    +                       </wsp:Policy>
    +                    </sp:ProtectionToken>
    +                    <sp:Layout>
    +                       <wsp:Policy>
    +                          <sp:Lax/>
    +                       </wsp:Policy>
    +                    </sp:Layout>
    +                    <sp:IncludeTimestamp/>
    +                    <sp:OnlySignEntireHeadersAndBody/>
    +                    <sp:AlgorithmSuite>
    +                       <wsp:Policy>
    +                          <sp:Basic256/>
    +                       </wsp:Policy>
    +                    </sp:AlgorithmSuite>
    +                 </wsp:Policy>
    +              </sp:SymmetricBinding>
    +            </wsp:All>
    +        </wsp:ExactlyOne>
    +    </wsp:Policy>
    +    
    +    <wsp:Policy wsu:Id="DoubleItBinding_DoubleIt_Input_Policy">
    +      <wsp:ExactlyOne>
    +         <wsp:All>
    +            <sp:EncryptedParts>
    +               <sp:Body/>
    +            </sp:EncryptedParts>
    +            <sp:SignedParts>
    +               <sp:Body/>
    +            </sp:SignedParts>
    +         </wsp:All>
    +      </wsp:ExactlyOne>
    +   </wsp:Policy>
    +   <wsp:Policy wsu:Id="DoubleItBinding_DoubleIt_Output_Policy">
    +      <wsp:ExactlyOne>
    +         <wsp:All>
    +            <sp:EncryptedParts>
    +               <sp:Body/>
    +            </sp:EncryptedParts>
    +            <sp:SignedParts>
    +               <sp:Body/>
    +            </sp:SignedParts>
    +         </wsp:All>
    +      </wsp:ExactlyOne>
    +   </wsp:Policy>
    +    
    +</wsdl:definitions>
    
  • systests/ws-security/src/test/resources/org/apache/cxf/systest/ws/httpget/server/server.xml+89 0 added
    @@ -0,0 +1,89 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + Licensed to the Apache Software Foundation (ASF) under one
    + or more contributor license agreements. See the NOTICE file
    + distributed with this work for additional information
    + regarding copyright ownership. The ASF licenses this file
    + to you under the Apache License, Version 2.0 (the
    + "License"); you may not use this file except in compliance
    + with the License. You may obtain a copy of the License at
    + 
    + http://www.apache.org/licenses/LICENSE-2.0
    + 
    + Unless required by applicable law or agreed to in writing,
    + software distributed under the License is distributed on an
    + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + KIND, either express or implied. See the License for the
    + specific language governing permissions and limitations
    + under the License.
    +-->
    +<beans xmlns="http://www.springframework.org/schema/beans"
    +    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    +    xmlns:jaxws="http://cxf.apache.org/jaxws"
    +    xmlns:http="http://cxf.apache.org/transports/http/configuration"
    +    xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
    +    xmlns:sec="http://cxf.apache.org/configuration/security"
    +    xmlns:cxf="http://cxf.apache.org/core"
    +    xmlns:p="http://cxf.apache.org/policy"
    +    xsi:schemaLocation="
    +        http://www.springframework.org/schema/beans                     http://www.springframework.org/schema/beans/spring-beans.xsd
    +        http://cxf.apache.org/jaxws                                     http://cxf.apache.org/schemas/jaxws.xsd
    +        http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
    +        http://cxf.apache.org/policy http://cxf.apache.org/schemas/policy.xsd
    +        http://cxf.apache.org/transports/http/configuration             http://cxf.apache.org/schemas/configuration/http-conf.xsd
    +        http://cxf.apache.org/transports/http-jetty/configuration       http://cxf.apache.org/schemas/configuration/http-jetty.xsd
    +        http://cxf.apache.org/configuration/security                    http://cxf.apache.org/schemas/configuration/security.xsd
    +    ">
    +    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
    +    
    +    <cxf:bus>
    +        <cxf:features>
    +            <p:policies/>
    +            <cxf:logging/>
    +        </cxf:features>
    +    </cxf:bus>
    +    
    +    <jaxws:endpoint 
    +       id="KeyIdentifier"
    +       address="http://localhost:${testutil.ports.Server}/DoubleItX509KeyIdentifier" 
    +       serviceName="s:DoubleItService"
    +       endpointName="s:DoubleItKeyIdentifierPort"
    +       xmlns:s="http://www.example.org/contract/DoubleIt"
    +       implementor="org.apache.cxf.systest.ws.common.DoubleItImpl"
    +       wsdlLocation="org/apache/cxf/systest/ws/httpget/DoubleItHTTPGet.wsdl">
    +        
    +       <jaxws:properties>
    +          <entry key="ws-security.callback-handler" 
    +                  value="org.apache.cxf.systest.ws.wssec10.client.KeystorePasswordCallback"/>
    +          <entry key="ws-security.signature.properties" 
    +                  value="org/apache/cxf/systest/ws/wssec10/client/bob.properties"/> 
    +       </jaxws:properties> 
    +     
    +    </jaxws:endpoint>
    +    
    +    <jaxws:endpoint 
    +       id="SignBody"
    +       address="http://localhost:${testutil.ports.Server}/DoubleItSignBody" 
    +       serviceName="s:DoubleItService"
    +       endpointName="s:DoubleItSignBodyPort"
    +       xmlns:s="http://www.example.org/contract/DoubleIt"
    +       implementor="org.apache.cxf.systest.ws.common.DoubleItImpl"
    +       wsdlLocation="org/apache/cxf/systest/ws/httpget/DoubleItHTTPGet.wsdl">
    +        
    +       <jaxws:inInterceptors>
    +         <bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
    +           <constructor-arg>
    +            <map>
    +               <entry key="action" value="Signature Timestamp"/>
    +               <entry key="signaturePropFile" value="org/apache/cxf/systest/ws/wssec10/client/alice.properties"/>
    +               <entry key="passwordCallbackClass" 
    +                  value="org.apache.cxf.systest.ws.wssec10.client.KeystorePasswordCallback"/>
    +            </map>
    +           </constructor-arg>
    +        </bean>
    +        <!--<bean class="org.apache.cxf.ws.security.wss4j.DefaultCryptoCoverageChecker"/>-->
    +       </jaxws:inInterceptors>
    +    </jaxws:endpoint> 
    +    
    +    
    +</beans>
    
e0cdf873942b

Merged revisions 1420698 via git cherry-pick from

https://github.com/apache/cxfColm O HeigeartaighDec 12, 2012via ghsa
7 files changed · +551 3
  • rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JInInterceptor.java+7 3 modified
    @@ -182,15 +182,19 @@ public Object getProperty(Object msgContext, String key) {
         }
         public final boolean isGET(SoapMessage message) {
             String method = (String)message.get(SoapMessage.HTTP_REQUEST_METHOD);
    -        return "GET".equals(method) && message.getContent(XMLStreamReader.class) == null;
    +        boolean isGet = 
    +            "GET".equals(method) && message.getContent(XMLStreamReader.class) == null;
    +        if (isGet) {
    +            //make sure we skip the URIMapping as we cannot apply security requirements to that
    +            message.put(URIMappingInterceptor.URIMAPPING_SKIP, Boolean.TRUE);
    +        }
    +        return isGet;
         }
         
         public void handleMessage(SoapMessage msg) throws Fault {
             if (msg.containsKey(SECURITY_PROCESSED) || isGET(msg)) {
                 return;
             }
    -        //make sure we skip the URIMapping as we cannot apply security requirements to that
    -        msg.put(URIMappingInterceptor.URIMAPPING_SKIP, Boolean.TRUE);
             msg.put(SECURITY_PROCESSED, Boolean.TRUE);
             
             boolean utWithCallbacks = 
    
  • systests/ws-security/pom.xml+5 0 modified
    @@ -119,6 +119,11 @@
                 <artifactId>cxf-rt-frontend-jaxws</artifactId>
                 <version>${project.version}</version>
             </dependency>
    +        <dependency>
    +            <groupId>org.apache.cxf</groupId>
    +            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
    +            <version>${project.version}</version>
    +        </dependency>
     
             <dependency>
                 <groupId>org.apache.cxf</groupId>
    
  • systests/ws-security/src/test/java/org/apache/cxf/systest/ws/httpget/HTTPGetTest.java+216 0 added
    @@ -0,0 +1,216 @@
    +/**
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements. See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership. The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License. You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing,
    + * software distributed under the License is distributed on an
    + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + * KIND, either express or implied. See the License for the
    + * specific language governing permissions and limitations
    + * under the License.
    + */
    +
    +package org.apache.cxf.systest.ws.httpget;
    +
    +import java.net.URL;
    +import java.util.HashMap;
    +import java.util.Map;
    +
    +import javax.crypto.Cipher;
    +import javax.crypto.SecretKey;
    +import javax.crypto.spec.SecretKeySpec;
    +import javax.xml.namespace.QName;
    +import javax.xml.ws.Service;
    +
    +import org.apache.cxf.Bus;
    +import org.apache.cxf.bus.spring.SpringBusFactory;
    +import org.apache.cxf.jaxrs.client.WebClient;
    +import org.apache.cxf.jaxrs.ext.xml.XMLSource;
    +import org.apache.cxf.systest.ws.common.SecurityTestUtil;
    +import org.apache.cxf.systest.ws.httpget.server.Server;
    +import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
    +import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
    +import org.example.contract.doubleit.DoubleItPortType;
    +import org.junit.BeforeClass;
    +
    +/**
    + * A set of tests for CXF-4629.
    + */
    +public class HTTPGetTest extends AbstractBusClientServerTestBase {
    +    public static final String PORT = allocatePort(Server.class);
    +
    +    private static final String NAMESPACE = "http://www.example.org/contract/DoubleIt";
    +    private static final QName SERVICE_QNAME = new QName(NAMESPACE, "DoubleItService");
    +
    +    private boolean unrestrictedPoliciesInstalled = checkUnrestrictedPoliciesInstalled();
    +    
    +    @BeforeClass
    +    public static void startServers() throws Exception {
    +        assertTrue(
    +            "Server failed to launch",
    +            // run the server in the same process
    +            // set this to false to fork
    +            launchServer(Server.class, true)
    +        );
    +    }
    +    
    +    @org.junit.AfterClass
    +    public static void cleanup() throws Exception {
    +        SecurityTestUtil.cleanup();
    +        stopAllServers();
    +    }
    +
    +    @org.junit.Test
    +    public void testSOAPClientSecurityPolicy() throws Exception {
    +        if (!unrestrictedPoliciesInstalled) {
    +            return;
    +        }
    +
    +        SpringBusFactory bf = new SpringBusFactory();
    +        URL busFile = HTTPGetTest.class.getResource("client/client.xml");
    +
    +        Bus bus = bf.createBus(busFile.toString());
    +        SpringBusFactory.setDefaultBus(bus);
    +        SpringBusFactory.setThreadDefaultBus(bus);
    +        
    +        URL wsdl = HTTPGetTest.class.getResource("DoubleItHTTPGet.wsdl");
    +        Service service = Service.create(wsdl, SERVICE_QNAME);
    +        QName portQName = new QName(NAMESPACE, "DoubleItKeyIdentifierPort");
    +        DoubleItPortType x509Port = 
    +                service.getPort(portQName, DoubleItPortType.class);
    +        updateAddressPort(x509Port, PORT);
    +        int result = x509Port.doubleIt(25);
    +        assertEquals(result, 50);
    +        
    +        bus.shutdown(true);
    +    }
    +    
    +    @org.junit.Test
    +    public void testHTTPGetClientSecurityPolicy() throws Exception {
    +        if (!unrestrictedPoliciesInstalled) {
    +            return;
    +        }
    +
    +        SpringBusFactory bf = new SpringBusFactory();
    +        URL busFile = HTTPGetTest.class.getResource("client/client.xml");
    +
    +        Bus bus = bf.createBus(busFile.toString());
    +        SpringBusFactory.setDefaultBus(bus);
    +        SpringBusFactory.setThreadDefaultBus(bus);
    +        
    +        String address = "http://localhost:" + PORT + "/DoubleItX509KeyIdentifier/DoubleIt";
    +        WebClient client = WebClient.create(address);
    +        client.query("numberToDouble", "20");
    +        
    +        try {
    +            client.get(XMLSource.class);
    +            fail("Failure expected on security policy failure");
    +        } catch (Exception ex) {
    +            // expected
    +        }
    +        
    +        bus.shutdown(true);
    +    }
    +    
    +    @org.junit.Test
    +    public void testSignedBodyTimestamp() throws Exception {
    +        if (!unrestrictedPoliciesInstalled) {
    +            return;
    +        }
    +
    +        SpringBusFactory bf = new SpringBusFactory();
    +        URL busFile = HTTPGetTest.class.getResource("client/client.xml");
    +
    +        Bus bus = bf.createBus(busFile.toString());
    +        SpringBusFactory.setDefaultBus(bus);
    +        SpringBusFactory.setThreadDefaultBus(bus);
    +        
    +        URL wsdl = HTTPGetTest.class.getResource("DoubleItHTTPGet.wsdl");
    +        Service service = Service.create(wsdl, SERVICE_QNAME);
    +        QName portQName = new QName(NAMESPACE, "DoubleItSignBodyPort");
    +        DoubleItPortType port = 
    +                service.getPort(portQName, DoubleItPortType.class);
    +        updateAddressPort(port, PORT);
    +        
    +        Map<String, Object> outProps = new HashMap<String, Object>();
    +        outProps.put("action", "Timestamp Signature");
    +        outProps.put("signaturePropFile", 
    +                     "org/apache/cxf/systest/ws/wssec10/client/alice.properties");
    +        outProps.put("user", "alice");
    +        outProps.put("passwordCallbackClass", 
    +                     "org.apache.cxf.systest.ws.wssec10.client.KeystorePasswordCallback");
    +        outProps.put("signatureParts",
    +                     "{}{http://schemas.xmlsoap.org/soap/envelope/}Body;"
    +                     + "{}{http://docs.oasis-open.org/wss/2004/01/oasis-"
    +                     + "200401-wss-wssecurity-utility-1.0.xsd}Timestamp;");
    +        
    +        bus.getOutInterceptors().add(new WSS4JOutInterceptor(outProps));
    +        
    +        int result = port.doubleIt(25);
    +        assertEquals(result, 50);
    +        
    +        bus.shutdown(true);
    +    }
    +    
    +    @org.junit.Test
    +    public void testHTTPGetSignedBody() throws Exception {
    +        if (!unrestrictedPoliciesInstalled) {
    +            return;
    +        }
    +        
    +        SpringBusFactory bf = new SpringBusFactory();
    +        URL busFile = HTTPGetTest.class.getResource("client/client.xml");
    +
    +        Bus bus = bf.createBus(busFile.toString());
    +        SpringBusFactory.setDefaultBus(bus);
    +        SpringBusFactory.setThreadDefaultBus(bus);
    +
    +        String address = "http://localhost:" + PORT + "/DoubleItSignBody/DoubleIt";
    +        WebClient client = WebClient.create(address);
    +        client.query("numberToDouble", "20");
    +        /*
    +        XMLSource result = client.get(XMLSource.class);
    +        result.setBuffering(true);
    +        
    +        String input = result.getNode("//doubledNumber", String.class);
    +        assertTrue(input.startsWith("<doubledNumber>40"));
    +        */
    +        
    +        try {
    +            client.get(XMLSource.class);
    +            fail("Failure expected on security policy failure");
    +        } catch (Exception ex) {
    +            // expected
    +        }
    +        
    +        bus.shutdown(true);
    +    }
    +    
    +    
    +    private boolean checkUnrestrictedPoliciesInstalled() {
    +        try {
    +            byte[] data = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
    +
    +            SecretKey key192 = new SecretKeySpec(
    +                new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    +                            0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    +                            0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17},
    +                            "AES");
    +            Cipher c = Cipher.getInstance("AES");
    +            c.init(Cipher.ENCRYPT_MODE, key192);
    +            c.doFinal(data);
    +            return true;
    +        } catch (Exception e) {
    +            //
    +        }
    +        return false;
    +    }
    +    
    +}
    
  • systests/ws-security/src/test/java/org/apache/cxf/systest/ws/httpget/server/Server.java+41 0 added
    @@ -0,0 +1,41 @@
    +/**
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements. See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership. The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License. You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing,
    + * software distributed under the License is distributed on an
    + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + * KIND, either express or implied. See the License for the
    + * specific language governing permissions and limitations
    + * under the License.
    + */
    +
    +package org.apache.cxf.systest.ws.httpget.server;
    +
    +import java.net.URL;
    +
    +import org.apache.cxf.Bus;
    +import org.apache.cxf.BusFactory;
    +import org.apache.cxf.bus.spring.SpringBusFactory;
    +import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
    +
    +public class Server extends AbstractBusTestServerBase {
    +
    +    public Server() {
    +
    +    }
    +
    +    protected void run()  {
    +        URL busFile = Server.class.getResource("server.xml");
    +        Bus busLocal = new SpringBusFactory().createBus(busFile);
    +        BusFactory.setDefaultBus(busLocal);
    +        setBus(busLocal);
    +    }
    +}
    
  • systests/ws-security/src/test/resources/org/apache/cxf/systest/ws/httpget/client/client.xml+55 0 added
    @@ -0,0 +1,55 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + Licensed to the Apache Software Foundation (ASF) under one
    + or more contributor license agreements. See the NOTICE file
    + distributed with this work for additional information
    + regarding copyright ownership. The ASF licenses this file
    + to you under the Apache License, Version 2.0 (the
    + "License"); you may not use this file except in compliance
    + with the License. You may obtain a copy of the License at
    + 
    + http://www.apache.org/licenses/LICENSE-2.0
    + 
    + Unless required by applicable law or agreed to in writing,
    + software distributed under the License is distributed on an
    + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + KIND, either express or implied. See the License for the
    + specific language governing permissions and limitations
    + under the License.
    +-->
    +<beans xmlns="http://www.springframework.org/schema/beans"
    +       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    +       xmlns:http="http://cxf.apache.org/transports/http/configuration"
    +       xmlns:jaxws="http://cxf.apache.org/jaxws"
    +       xmlns:cxf="http://cxf.apache.org/core"
    +       xmlns:p="http://cxf.apache.org/policy"
    +       xmlns:sec="http://cxf.apache.org/configuration/security"
    +       xsi:schemaLocation="
    +          http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans.xsd
    +          http://cxf.apache.org/jaxws                           http://cxf.apache.org/schemas/jaxws.xsd
    +          http://cxf.apache.org/transports/http/configuration   http://cxf.apache.org/schemas/configuration/http-conf.xsd
    +          http://cxf.apache.org/configuration/security          http://cxf.apache.org/schemas/configuration/security.xsd
    +          http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
    +          http://cxf.apache.org/policy http://cxf.apache.org/schemas/policy.xsd"
    +>
    +    <cxf:bus>
    +        <cxf:features>
    +            <p:policies/>
    +            <cxf:logging/>
    +        </cxf:features>
    +    </cxf:bus>
    +    
    +    <jaxws:client name="{http://www.example.org/contract/DoubleIt}DoubleItKeyIdentifierPort" 
    +                  createdFromAPI="true">
    +       <jaxws:properties>
    +           <entry key="ws-security.encryption.properties" 
    +                  value="org/apache/cxf/systest/ws/wssec10/client/bob.properties"/> 
    +           <entry key="ws-security.encryption.username" value="bob"/>
    +       </jaxws:properties>
    +    </jaxws:client>
    +    
    +    <jaxws:client name="{http://www.example.org/contract/DoubleIt}DoubleItSignBodyPort" 
    +                  createdFromAPI="true">
    +    </jaxws:client>
    +    
    +</beans>
    
  • systests/ws-security/src/test/resources/org/apache/cxf/systest/ws/httpget/DoubleItHTTPGet.wsdl+138 0 added
    @@ -0,0 +1,138 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + Licensed to the Apache Software Foundation (ASF) under one
    + or more contributor license agreements. See the NOTICE file
    + distributed with this work for additional information
    + regarding copyright ownership. The ASF licenses this file
    + to you under the Apache License, Version 2.0 (the
    + "License"); you may not use this file except in compliance
    + with the License. You may obtain a copy of the License at
    + 
    + http://www.apache.org/licenses/LICENSE-2.0
    + 
    + Unless required by applicable law or agreed to in writing,
    + software distributed under the License is distributed on an
    + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + KIND, either express or implied. See the License for the
    + specific language governing permissions and limitations
    + under the License.
    +-->
    +<wsdl:definitions name="DoubleIt"
    +    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    +    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/contract/DoubleIt"
    +    targetNamespace="http://www.example.org/contract/DoubleIt" 
    +    xmlns:wsp="http://www.w3.org/ns/ws-policy"
    +    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    +    xmlns:wsaws="http://www.w3.org/2005/08/addressing" 
    +    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
    +    xmlns:sp13="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200802">
    +    
    +    <wsdl:import location="src/test/resources/DoubleItLogical.wsdl" 
    +                 namespace="http://www.example.org/contract/DoubleIt"/>
    +
    +    <wsdl:binding name="DoubleItKeyIdentifierBinding" type="tns:DoubleItPortType">
    +        <wsp:PolicyReference URI="#DoubleItKeyIdentifierPolicy" />
    +        <soap:binding style="document"
    +            transport="http://schemas.xmlsoap.org/soap/http" />
    +        <wsdl:operation name="DoubleIt">
    +            <soap:operation soapAction="" />
    +            <wsdl:input>
    +                <soap:body use="literal" />
    +                <wsp:PolicyReference URI="#DoubleItBinding_DoubleIt_Input_Policy"/>
    +            </wsdl:input>
    +            <wsdl:output>
    +                <soap:body use="literal" />
    +                <wsp:PolicyReference URI="#DoubleItBinding_DoubleIt_Output_Policy"/>
    +            </wsdl:output>
    +            <wsdl:fault name="DoubleItFault">
    +                <soap:body use="literal" name="DoubleItFault" />
    +            </wsdl:fault>
    +        </wsdl:operation>
    +    </wsdl:binding>
    +    
    +    <wsdl:binding name="DoubleItNoSecurityBinding" type="tns:DoubleItPortType">
    +        <soap:binding style="document"
    +            transport="http://schemas.xmlsoap.org/soap/http" />
    +        <wsdl:operation name="DoubleIt">
    +            <soap:operation soapAction="" />
    +            <wsdl:input>
    +                <soap:body use="literal" />
    +            </wsdl:input>
    +            <wsdl:output>
    +                <soap:body use="literal" />
    +            </wsdl:output>
    +            <wsdl:fault name="DoubleItFault">
    +                <soap:body use="literal" name="DoubleItFault" />
    +            </wsdl:fault>
    +        </wsdl:operation>
    +    </wsdl:binding>
    +    
    +    <wsdl:service name="DoubleItService">
    +        <wsdl:port name="DoubleItKeyIdentifierPort" binding="tns:DoubleItKeyIdentifierBinding">
    +            <soap:address location="http://localhost:9001/DoubleItX509KeyIdentifier" />
    +        </wsdl:port>
    +        <wsdl:port name="DoubleItSignBodyPort" binding="tns:DoubleItNoSecurityBinding">
    +            <soap:address location="http://localhost:9001/DoubleItSignBody" />
    +        </wsdl:port>
    +    </wsdl:service>
    +
    +    <wsp:Policy wsu:Id="DoubleItKeyIdentifierPolicy">
    +        <wsp:ExactlyOne>
    +            <wsp:All>
    +                <sp:SymmetricBinding>
    +                  <wsp:Policy>
    +                    <sp:ProtectionToken>
    +                       <wsp:Policy>
    +                          <sp:X509Token
    +                             sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/Never">
    +                             <wsp:Policy>
    +                                <sp:WssX509V3Token10 />
    +                                <sp:RequireKeyIdentifierReference />
    +                             </wsp:Policy>
    +                          </sp:X509Token>
    +                       </wsp:Policy>
    +                    </sp:ProtectionToken>
    +                    <sp:Layout>
    +                       <wsp:Policy>
    +                          <sp:Lax/>
    +                       </wsp:Policy>
    +                    </sp:Layout>
    +                    <sp:IncludeTimestamp/>
    +                    <sp:OnlySignEntireHeadersAndBody/>
    +                    <sp:AlgorithmSuite>
    +                       <wsp:Policy>
    +                          <sp:Basic256/>
    +                       </wsp:Policy>
    +                    </sp:AlgorithmSuite>
    +                 </wsp:Policy>
    +              </sp:SymmetricBinding>
    +            </wsp:All>
    +        </wsp:ExactlyOne>
    +    </wsp:Policy>
    +    
    +    <wsp:Policy wsu:Id="DoubleItBinding_DoubleIt_Input_Policy">
    +      <wsp:ExactlyOne>
    +         <wsp:All>
    +            <sp:EncryptedParts>
    +               <sp:Body/>
    +            </sp:EncryptedParts>
    +            <sp:SignedParts>
    +               <sp:Body/>
    +            </sp:SignedParts>
    +         </wsp:All>
    +      </wsp:ExactlyOne>
    +   </wsp:Policy>
    +   <wsp:Policy wsu:Id="DoubleItBinding_DoubleIt_Output_Policy">
    +      <wsp:ExactlyOne>
    +         <wsp:All>
    +            <sp:EncryptedParts>
    +               <sp:Body/>
    +            </sp:EncryptedParts>
    +            <sp:SignedParts>
    +               <sp:Body/>
    +            </sp:SignedParts>
    +         </wsp:All>
    +      </wsp:ExactlyOne>
    +   </wsp:Policy>
    +    
    +</wsdl:definitions>
    
  • systests/ws-security/src/test/resources/org/apache/cxf/systest/ws/httpget/server/server.xml+89 0 added
    @@ -0,0 +1,89 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + Licensed to the Apache Software Foundation (ASF) under one
    + or more contributor license agreements. See the NOTICE file
    + distributed with this work for additional information
    + regarding copyright ownership. The ASF licenses this file
    + to you under the Apache License, Version 2.0 (the
    + "License"); you may not use this file except in compliance
    + with the License. You may obtain a copy of the License at
    + 
    + http://www.apache.org/licenses/LICENSE-2.0
    + 
    + Unless required by applicable law or agreed to in writing,
    + software distributed under the License is distributed on an
    + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + KIND, either express or implied. See the License for the
    + specific language governing permissions and limitations
    + under the License.
    +-->
    +<beans xmlns="http://www.springframework.org/schema/beans"
    +    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    +    xmlns:jaxws="http://cxf.apache.org/jaxws"
    +    xmlns:http="http://cxf.apache.org/transports/http/configuration"
    +    xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
    +    xmlns:sec="http://cxf.apache.org/configuration/security"
    +    xmlns:cxf="http://cxf.apache.org/core"
    +    xmlns:p="http://cxf.apache.org/policy"
    +    xsi:schemaLocation="
    +        http://www.springframework.org/schema/beans                     http://www.springframework.org/schema/beans/spring-beans.xsd
    +        http://cxf.apache.org/jaxws                                     http://cxf.apache.org/schemas/jaxws.xsd
    +        http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
    +        http://cxf.apache.org/policy http://cxf.apache.org/schemas/policy.xsd
    +        http://cxf.apache.org/transports/http/configuration             http://cxf.apache.org/schemas/configuration/http-conf.xsd
    +        http://cxf.apache.org/transports/http-jetty/configuration       http://cxf.apache.org/schemas/configuration/http-jetty.xsd
    +        http://cxf.apache.org/configuration/security                    http://cxf.apache.org/schemas/configuration/security.xsd
    +    ">
    +    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
    +    
    +    <cxf:bus>
    +        <cxf:features>
    +            <p:policies/>
    +            <cxf:logging/>
    +        </cxf:features>
    +    </cxf:bus>
    +    
    +    <jaxws:endpoint 
    +       id="KeyIdentifier"
    +       address="http://localhost:${testutil.ports.Server}/DoubleItX509KeyIdentifier" 
    +       serviceName="s:DoubleItService"
    +       endpointName="s:DoubleItKeyIdentifierPort"
    +       xmlns:s="http://www.example.org/contract/DoubleIt"
    +       implementor="org.apache.cxf.systest.ws.common.DoubleItImpl"
    +       wsdlLocation="org/apache/cxf/systest/ws/httpget/DoubleItHTTPGet.wsdl">
    +        
    +       <jaxws:properties>
    +          <entry key="ws-security.callback-handler" 
    +                  value="org.apache.cxf.systest.ws.wssec10.client.KeystorePasswordCallback"/>
    +          <entry key="ws-security.signature.properties" 
    +                  value="org/apache/cxf/systest/ws/wssec10/client/bob.properties"/> 
    +       </jaxws:properties> 
    +     
    +    </jaxws:endpoint>
    +    
    +    <jaxws:endpoint 
    +       id="SignBody"
    +       address="http://localhost:${testutil.ports.Server}/DoubleItSignBody" 
    +       serviceName="s:DoubleItService"
    +       endpointName="s:DoubleItSignBodyPort"
    +       xmlns:s="http://www.example.org/contract/DoubleIt"
    +       implementor="org.apache.cxf.systest.ws.common.DoubleItImpl"
    +       wsdlLocation="org/apache/cxf/systest/ws/httpget/DoubleItHTTPGet.wsdl">
    +        
    +       <jaxws:inInterceptors>
    +         <bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
    +           <constructor-arg>
    +            <map>
    +               <entry key="action" value="Signature Timestamp"/>
    +               <entry key="signaturePropFile" value="org/apache/cxf/systest/ws/wssec10/client/alice.properties"/>
    +               <entry key="passwordCallbackClass" 
    +                  value="org.apache.cxf.systest.ws.wssec10.client.KeystorePasswordCallback"/>
    +            </map>
    +           </constructor-arg>
    +        </bean>
    +        <!--<bean class="org.apache.cxf.ws.security.wss4j.DefaultCryptoCoverageChecker"/>-->
    +       </jaxws:inInterceptors>
    +    </jaxws:endpoint> 
    +    
    +    
    +</beans>
    
1a6b532d53a7

Added some tests for CXF-4629

https://github.com/apache/cxfColm O HeigeartaighDec 12, 2012via ghsa
7 files changed · +551 3
  • rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JInInterceptor.java+7 3 modified
    @@ -179,15 +179,19 @@ public Object getProperty(Object msgContext, String key) {
         }
         public final boolean isGET(SoapMessage message) {
             String method = (String)message.get(SoapMessage.HTTP_REQUEST_METHOD);
    -        return "GET".equals(method) && message.getContent(XMLStreamReader.class) == null;
    +        boolean isGet = 
    +            "GET".equals(method) && message.getContent(XMLStreamReader.class) == null;
    +        if (isGet) {
    +            //make sure we skip the URIMapping as we cannot apply security requirements to that
    +            message.put(URIMappingInterceptor.URIMAPPING_SKIP, Boolean.TRUE);
    +        }
    +        return isGet;
         }
         
         public void handleMessage(SoapMessage msg) throws Fault {
             if (msg.containsKey(SECURITY_PROCESSED) || isGET(msg)) {
                 return;
             }
    -        //make sure we skip the URIMapping as we cannot apply security requirements to that
    -        msg.put(URIMappingInterceptor.URIMAPPING_SKIP, Boolean.TRUE);
             msg.put(SECURITY_PROCESSED, Boolean.TRUE);
             
             boolean utWithCallbacks = 
    
  • systests/ws-security/pom.xml+5 0 modified
    @@ -124,6 +124,11 @@
                 <artifactId>cxf-rt-frontend-jaxws</artifactId>
                 <version>${project.version}</version>
             </dependency>
    +        <dependency>
    +            <groupId>org.apache.cxf</groupId>
    +            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
    +            <version>${project.version}</version>
    +        </dependency>
     
             <dependency>
                 <groupId>org.apache.cxf</groupId>
    
  • systests/ws-security/src/test/java/org/apache/cxf/systest/ws/httpget/HTTPGetTest.java+216 0 added
    @@ -0,0 +1,216 @@
    +/**
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements. See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership. The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License. You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing,
    + * software distributed under the License is distributed on an
    + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + * KIND, either express or implied. See the License for the
    + * specific language governing permissions and limitations
    + * under the License.
    + */
    +
    +package org.apache.cxf.systest.ws.httpget;
    +
    +import java.net.URL;
    +import java.util.HashMap;
    +import java.util.Map;
    +
    +import javax.crypto.Cipher;
    +import javax.crypto.SecretKey;
    +import javax.crypto.spec.SecretKeySpec;
    +import javax.xml.namespace.QName;
    +import javax.xml.ws.Service;
    +
    +import org.apache.cxf.Bus;
    +import org.apache.cxf.bus.spring.SpringBusFactory;
    +import org.apache.cxf.jaxrs.client.WebClient;
    +import org.apache.cxf.jaxrs.ext.xml.XMLSource;
    +import org.apache.cxf.systest.ws.common.SecurityTestUtil;
    +import org.apache.cxf.systest.ws.httpget.server.Server;
    +import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
    +import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
    +import org.example.contract.doubleit.DoubleItPortType;
    +import org.junit.BeforeClass;
    +
    +/**
    + * A set of tests for CXF-4629.
    + */
    +public class HTTPGetTest extends AbstractBusClientServerTestBase {
    +    public static final String PORT = allocatePort(Server.class);
    +
    +    private static final String NAMESPACE = "http://www.example.org/contract/DoubleIt";
    +    private static final QName SERVICE_QNAME = new QName(NAMESPACE, "DoubleItService");
    +
    +    private boolean unrestrictedPoliciesInstalled = checkUnrestrictedPoliciesInstalled();
    +    
    +    @BeforeClass
    +    public static void startServers() throws Exception {
    +        assertTrue(
    +            "Server failed to launch",
    +            // run the server in the same process
    +            // set this to false to fork
    +            launchServer(Server.class, true)
    +        );
    +    }
    +    
    +    @org.junit.AfterClass
    +    public static void cleanup() throws Exception {
    +        SecurityTestUtil.cleanup();
    +        stopAllServers();
    +    }
    +
    +    @org.junit.Test
    +    public void testSOAPClientSecurityPolicy() throws Exception {
    +        if (!unrestrictedPoliciesInstalled) {
    +            return;
    +        }
    +
    +        SpringBusFactory bf = new SpringBusFactory();
    +        URL busFile = HTTPGetTest.class.getResource("client/client.xml");
    +
    +        Bus bus = bf.createBus(busFile.toString());
    +        SpringBusFactory.setDefaultBus(bus);
    +        SpringBusFactory.setThreadDefaultBus(bus);
    +        
    +        URL wsdl = HTTPGetTest.class.getResource("DoubleItHTTPGet.wsdl");
    +        Service service = Service.create(wsdl, SERVICE_QNAME);
    +        QName portQName = new QName(NAMESPACE, "DoubleItKeyIdentifierPort");
    +        DoubleItPortType x509Port = 
    +                service.getPort(portQName, DoubleItPortType.class);
    +        updateAddressPort(x509Port, PORT);
    +        int result = x509Port.doubleIt(25);
    +        assertEquals(result, 50);
    +        
    +        bus.shutdown(true);
    +    }
    +    
    +    @org.junit.Test
    +    public void testHTTPGetClientSecurityPolicy() throws Exception {
    +        if (!unrestrictedPoliciesInstalled) {
    +            return;
    +        }
    +
    +        SpringBusFactory bf = new SpringBusFactory();
    +        URL busFile = HTTPGetTest.class.getResource("client/client.xml");
    +
    +        Bus bus = bf.createBus(busFile.toString());
    +        SpringBusFactory.setDefaultBus(bus);
    +        SpringBusFactory.setThreadDefaultBus(bus);
    +        
    +        String address = "http://localhost:" + PORT + "/DoubleItX509KeyIdentifier/DoubleIt";
    +        WebClient client = WebClient.create(address);
    +        client.query("numberToDouble", "20");
    +        
    +        try {
    +            client.get(XMLSource.class);
    +            fail("Failure expected on security policy failure");
    +        } catch (Exception ex) {
    +            // expected
    +        }
    +        
    +        bus.shutdown(true);
    +    }
    +    
    +    @org.junit.Test
    +    public void testSignedBodyTimestamp() throws Exception {
    +        if (!unrestrictedPoliciesInstalled) {
    +            return;
    +        }
    +
    +        SpringBusFactory bf = new SpringBusFactory();
    +        URL busFile = HTTPGetTest.class.getResource("client/client.xml");
    +
    +        Bus bus = bf.createBus(busFile.toString());
    +        SpringBusFactory.setDefaultBus(bus);
    +        SpringBusFactory.setThreadDefaultBus(bus);
    +        
    +        URL wsdl = HTTPGetTest.class.getResource("DoubleItHTTPGet.wsdl");
    +        Service service = Service.create(wsdl, SERVICE_QNAME);
    +        QName portQName = new QName(NAMESPACE, "DoubleItSignBodyPort");
    +        DoubleItPortType port = 
    +                service.getPort(portQName, DoubleItPortType.class);
    +        updateAddressPort(port, PORT);
    +        
    +        Map<String, Object> outProps = new HashMap<String, Object>();
    +        outProps.put("action", "Timestamp Signature");
    +        outProps.put("signaturePropFile", 
    +                     "org/apache/cxf/systest/ws/wssec10/client/alice.properties");
    +        outProps.put("user", "alice");
    +        outProps.put("passwordCallbackClass", 
    +                     "org.apache.cxf.systest.ws.wssec10.client.KeystorePasswordCallback");
    +        outProps.put("signatureParts",
    +                     "{}{http://schemas.xmlsoap.org/soap/envelope/}Body;"
    +                     + "{}{http://docs.oasis-open.org/wss/2004/01/oasis-"
    +                     + "200401-wss-wssecurity-utility-1.0.xsd}Timestamp;");
    +        
    +        bus.getOutInterceptors().add(new WSS4JOutInterceptor(outProps));
    +        
    +        int result = port.doubleIt(25);
    +        assertEquals(result, 50);
    +        
    +        bus.shutdown(true);
    +    }
    +    
    +    @org.junit.Test
    +    public void testHTTPGetSignedBody() throws Exception {
    +        if (!unrestrictedPoliciesInstalled) {
    +            return;
    +        }
    +        
    +        SpringBusFactory bf = new SpringBusFactory();
    +        URL busFile = HTTPGetTest.class.getResource("client/client.xml");
    +
    +        Bus bus = bf.createBus(busFile.toString());
    +        SpringBusFactory.setDefaultBus(bus);
    +        SpringBusFactory.setThreadDefaultBus(bus);
    +
    +        String address = "http://localhost:" + PORT + "/DoubleItSignBody/DoubleIt";
    +        WebClient client = WebClient.create(address);
    +        client.query("numberToDouble", "20");
    +        /*
    +        XMLSource result = client.get(XMLSource.class);
    +        result.setBuffering(true);
    +        
    +        String input = result.getNode("//doubledNumber", String.class);
    +        assertTrue(input.startsWith("<doubledNumber>40"));
    +        */
    +        
    +        try {
    +            client.get(XMLSource.class);
    +            fail("Failure expected on security policy failure");
    +        } catch (Exception ex) {
    +            // expected
    +        }
    +        
    +        bus.shutdown(true);
    +    }
    +    
    +    
    +    private boolean checkUnrestrictedPoliciesInstalled() {
    +        try {
    +            byte[] data = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
    +
    +            SecretKey key192 = new SecretKeySpec(
    +                new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    +                            0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    +                            0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17},
    +                            "AES");
    +            Cipher c = Cipher.getInstance("AES");
    +            c.init(Cipher.ENCRYPT_MODE, key192);
    +            c.doFinal(data);
    +            return true;
    +        } catch (Exception e) {
    +            //
    +        }
    +        return false;
    +    }
    +    
    +}
    
  • systests/ws-security/src/test/java/org/apache/cxf/systest/ws/httpget/server/Server.java+41 0 added
    @@ -0,0 +1,41 @@
    +/**
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements. See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership. The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License. You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing,
    + * software distributed under the License is distributed on an
    + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + * KIND, either express or implied. See the License for the
    + * specific language governing permissions and limitations
    + * under the License.
    + */
    +
    +package org.apache.cxf.systest.ws.httpget.server;
    +
    +import java.net.URL;
    +
    +import org.apache.cxf.Bus;
    +import org.apache.cxf.BusFactory;
    +import org.apache.cxf.bus.spring.SpringBusFactory;
    +import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
    +
    +public class Server extends AbstractBusTestServerBase {
    +
    +    public Server() {
    +
    +    }
    +
    +    protected void run()  {
    +        URL busFile = Server.class.getResource("server.xml");
    +        Bus busLocal = new SpringBusFactory().createBus(busFile);
    +        BusFactory.setDefaultBus(busLocal);
    +        setBus(busLocal);
    +    }
    +}
    
  • systests/ws-security/src/test/resources/org/apache/cxf/systest/ws/httpget/client/client.xml+55 0 added
    @@ -0,0 +1,55 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + Licensed to the Apache Software Foundation (ASF) under one
    + or more contributor license agreements. See the NOTICE file
    + distributed with this work for additional information
    + regarding copyright ownership. The ASF licenses this file
    + to you under the Apache License, Version 2.0 (the
    + "License"); you may not use this file except in compliance
    + with the License. You may obtain a copy of the License at
    + 
    + http://www.apache.org/licenses/LICENSE-2.0
    + 
    + Unless required by applicable law or agreed to in writing,
    + software distributed under the License is distributed on an
    + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + KIND, either express or implied. See the License for the
    + specific language governing permissions and limitations
    + under the License.
    +-->
    +<beans xmlns="http://www.springframework.org/schema/beans"
    +       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    +       xmlns:http="http://cxf.apache.org/transports/http/configuration"
    +       xmlns:jaxws="http://cxf.apache.org/jaxws"
    +       xmlns:cxf="http://cxf.apache.org/core"
    +       xmlns:p="http://cxf.apache.org/policy"
    +       xmlns:sec="http://cxf.apache.org/configuration/security"
    +       xsi:schemaLocation="
    +          http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans.xsd
    +          http://cxf.apache.org/jaxws                           http://cxf.apache.org/schemas/jaxws.xsd
    +          http://cxf.apache.org/transports/http/configuration   http://cxf.apache.org/schemas/configuration/http-conf.xsd
    +          http://cxf.apache.org/configuration/security          http://cxf.apache.org/schemas/configuration/security.xsd
    +          http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
    +          http://cxf.apache.org/policy http://cxf.apache.org/schemas/policy.xsd"
    +>
    +    <cxf:bus>
    +        <cxf:features>
    +            <p:policies/>
    +            <cxf:logging/>
    +        </cxf:features>
    +    </cxf:bus>
    +    
    +    <jaxws:client name="{http://www.example.org/contract/DoubleIt}DoubleItKeyIdentifierPort" 
    +                  createdFromAPI="true">
    +       <jaxws:properties>
    +           <entry key="ws-security.encryption.properties" 
    +                  value="org/apache/cxf/systest/ws/wssec10/client/bob.properties"/> 
    +           <entry key="ws-security.encryption.username" value="bob"/>
    +       </jaxws:properties>
    +    </jaxws:client>
    +    
    +    <jaxws:client name="{http://www.example.org/contract/DoubleIt}DoubleItSignBodyPort" 
    +                  createdFromAPI="true">
    +    </jaxws:client>
    +    
    +</beans>
    
  • systests/ws-security/src/test/resources/org/apache/cxf/systest/ws/httpget/DoubleItHTTPGet.wsdl+138 0 added
    @@ -0,0 +1,138 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + Licensed to the Apache Software Foundation (ASF) under one
    + or more contributor license agreements. See the NOTICE file
    + distributed with this work for additional information
    + regarding copyright ownership. The ASF licenses this file
    + to you under the Apache License, Version 2.0 (the
    + "License"); you may not use this file except in compliance
    + with the License. You may obtain a copy of the License at
    + 
    + http://www.apache.org/licenses/LICENSE-2.0
    + 
    + Unless required by applicable law or agreed to in writing,
    + software distributed under the License is distributed on an
    + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + KIND, either express or implied. See the License for the
    + specific language governing permissions and limitations
    + under the License.
    +-->
    +<wsdl:definitions name="DoubleIt"
    +    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    +    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/contract/DoubleIt"
    +    targetNamespace="http://www.example.org/contract/DoubleIt" 
    +    xmlns:wsp="http://www.w3.org/ns/ws-policy"
    +    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    +    xmlns:wsaws="http://www.w3.org/2005/08/addressing" 
    +    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
    +    xmlns:sp13="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200802">
    +    
    +    <wsdl:import location="src/test/resources/DoubleItLogical.wsdl" 
    +                 namespace="http://www.example.org/contract/DoubleIt"/>
    +
    +    <wsdl:binding name="DoubleItKeyIdentifierBinding" type="tns:DoubleItPortType">
    +        <wsp:PolicyReference URI="#DoubleItKeyIdentifierPolicy" />
    +        <soap:binding style="document"
    +            transport="http://schemas.xmlsoap.org/soap/http" />
    +        <wsdl:operation name="DoubleIt">
    +            <soap:operation soapAction="" />
    +            <wsdl:input>
    +                <soap:body use="literal" />
    +                <wsp:PolicyReference URI="#DoubleItBinding_DoubleIt_Input_Policy"/>
    +            </wsdl:input>
    +            <wsdl:output>
    +                <soap:body use="literal" />
    +                <wsp:PolicyReference URI="#DoubleItBinding_DoubleIt_Output_Policy"/>
    +            </wsdl:output>
    +            <wsdl:fault name="DoubleItFault">
    +                <soap:body use="literal" name="DoubleItFault" />
    +            </wsdl:fault>
    +        </wsdl:operation>
    +    </wsdl:binding>
    +    
    +    <wsdl:binding name="DoubleItNoSecurityBinding" type="tns:DoubleItPortType">
    +        <soap:binding style="document"
    +            transport="http://schemas.xmlsoap.org/soap/http" />
    +        <wsdl:operation name="DoubleIt">
    +            <soap:operation soapAction="" />
    +            <wsdl:input>
    +                <soap:body use="literal" />
    +            </wsdl:input>
    +            <wsdl:output>
    +                <soap:body use="literal" />
    +            </wsdl:output>
    +            <wsdl:fault name="DoubleItFault">
    +                <soap:body use="literal" name="DoubleItFault" />
    +            </wsdl:fault>
    +        </wsdl:operation>
    +    </wsdl:binding>
    +    
    +    <wsdl:service name="DoubleItService">
    +        <wsdl:port name="DoubleItKeyIdentifierPort" binding="tns:DoubleItKeyIdentifierBinding">
    +            <soap:address location="http://localhost:9001/DoubleItX509KeyIdentifier" />
    +        </wsdl:port>
    +        <wsdl:port name="DoubleItSignBodyPort" binding="tns:DoubleItNoSecurityBinding">
    +            <soap:address location="http://localhost:9001/DoubleItSignBody" />
    +        </wsdl:port>
    +    </wsdl:service>
    +
    +    <wsp:Policy wsu:Id="DoubleItKeyIdentifierPolicy">
    +        <wsp:ExactlyOne>
    +            <wsp:All>
    +                <sp:SymmetricBinding>
    +                  <wsp:Policy>
    +                    <sp:ProtectionToken>
    +                       <wsp:Policy>
    +                          <sp:X509Token
    +                             sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/Never">
    +                             <wsp:Policy>
    +                                <sp:WssX509V3Token10 />
    +                                <sp:RequireKeyIdentifierReference />
    +                             </wsp:Policy>
    +                          </sp:X509Token>
    +                       </wsp:Policy>
    +                    </sp:ProtectionToken>
    +                    <sp:Layout>
    +                       <wsp:Policy>
    +                          <sp:Lax/>
    +                       </wsp:Policy>
    +                    </sp:Layout>
    +                    <sp:IncludeTimestamp/>
    +                    <sp:OnlySignEntireHeadersAndBody/>
    +                    <sp:AlgorithmSuite>
    +                       <wsp:Policy>
    +                          <sp:Basic256/>
    +                       </wsp:Policy>
    +                    </sp:AlgorithmSuite>
    +                 </wsp:Policy>
    +              </sp:SymmetricBinding>
    +            </wsp:All>
    +        </wsp:ExactlyOne>
    +    </wsp:Policy>
    +    
    +    <wsp:Policy wsu:Id="DoubleItBinding_DoubleIt_Input_Policy">
    +      <wsp:ExactlyOne>
    +         <wsp:All>
    +            <sp:EncryptedParts>
    +               <sp:Body/>
    +            </sp:EncryptedParts>
    +            <sp:SignedParts>
    +               <sp:Body/>
    +            </sp:SignedParts>
    +         </wsp:All>
    +      </wsp:ExactlyOne>
    +   </wsp:Policy>
    +   <wsp:Policy wsu:Id="DoubleItBinding_DoubleIt_Output_Policy">
    +      <wsp:ExactlyOne>
    +         <wsp:All>
    +            <sp:EncryptedParts>
    +               <sp:Body/>
    +            </sp:EncryptedParts>
    +            <sp:SignedParts>
    +               <sp:Body/>
    +            </sp:SignedParts>
    +         </wsp:All>
    +      </wsp:ExactlyOne>
    +   </wsp:Policy>
    +    
    +</wsdl:definitions>
    
  • systests/ws-security/src/test/resources/org/apache/cxf/systest/ws/httpget/server/server.xml+89 0 added
    @@ -0,0 +1,89 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + Licensed to the Apache Software Foundation (ASF) under one
    + or more contributor license agreements. See the NOTICE file
    + distributed with this work for additional information
    + regarding copyright ownership. The ASF licenses this file
    + to you under the Apache License, Version 2.0 (the
    + "License"); you may not use this file except in compliance
    + with the License. You may obtain a copy of the License at
    + 
    + http://www.apache.org/licenses/LICENSE-2.0
    + 
    + Unless required by applicable law or agreed to in writing,
    + software distributed under the License is distributed on an
    + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + KIND, either express or implied. See the License for the
    + specific language governing permissions and limitations
    + under the License.
    +-->
    +<beans xmlns="http://www.springframework.org/schema/beans"
    +    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    +    xmlns:jaxws="http://cxf.apache.org/jaxws"
    +    xmlns:http="http://cxf.apache.org/transports/http/configuration"
    +    xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
    +    xmlns:sec="http://cxf.apache.org/configuration/security"
    +    xmlns:cxf="http://cxf.apache.org/core"
    +    xmlns:p="http://cxf.apache.org/policy"
    +    xsi:schemaLocation="
    +        http://www.springframework.org/schema/beans                     http://www.springframework.org/schema/beans/spring-beans.xsd
    +        http://cxf.apache.org/jaxws                                     http://cxf.apache.org/schemas/jaxws.xsd
    +        http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
    +        http://cxf.apache.org/policy http://cxf.apache.org/schemas/policy.xsd
    +        http://cxf.apache.org/transports/http/configuration             http://cxf.apache.org/schemas/configuration/http-conf.xsd
    +        http://cxf.apache.org/transports/http-jetty/configuration       http://cxf.apache.org/schemas/configuration/http-jetty.xsd
    +        http://cxf.apache.org/configuration/security                    http://cxf.apache.org/schemas/configuration/security.xsd
    +    ">
    +    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
    +    
    +    <cxf:bus>
    +        <cxf:features>
    +            <p:policies/>
    +            <cxf:logging/>
    +        </cxf:features>
    +    </cxf:bus>
    +    
    +    <jaxws:endpoint 
    +       id="KeyIdentifier"
    +       address="http://localhost:${testutil.ports.Server}/DoubleItX509KeyIdentifier" 
    +       serviceName="s:DoubleItService"
    +       endpointName="s:DoubleItKeyIdentifierPort"
    +       xmlns:s="http://www.example.org/contract/DoubleIt"
    +       implementor="org.apache.cxf.systest.ws.common.DoubleItImpl"
    +       wsdlLocation="org/apache/cxf/systest/ws/httpget/DoubleItHTTPGet.wsdl">
    +        
    +       <jaxws:properties>
    +          <entry key="ws-security.callback-handler" 
    +                  value="org.apache.cxf.systest.ws.wssec10.client.KeystorePasswordCallback"/>
    +          <entry key="ws-security.signature.properties" 
    +                  value="org/apache/cxf/systest/ws/wssec10/client/bob.properties"/> 
    +       </jaxws:properties> 
    +     
    +    </jaxws:endpoint>
    +    
    +    <jaxws:endpoint 
    +       id="SignBody"
    +       address="http://localhost:${testutil.ports.Server}/DoubleItSignBody" 
    +       serviceName="s:DoubleItService"
    +       endpointName="s:DoubleItSignBodyPort"
    +       xmlns:s="http://www.example.org/contract/DoubleIt"
    +       implementor="org.apache.cxf.systest.ws.common.DoubleItImpl"
    +       wsdlLocation="org/apache/cxf/systest/ws/httpget/DoubleItHTTPGet.wsdl">
    +        
    +       <jaxws:inInterceptors>
    +         <bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
    +           <constructor-arg>
    +            <map>
    +               <entry key="action" value="Signature Timestamp"/>
    +               <entry key="signaturePropFile" value="org/apache/cxf/systest/ws/wssec10/client/alice.properties"/>
    +               <entry key="passwordCallbackClass" 
    +                  value="org.apache.cxf.systest.ws.wssec10.client.KeystorePasswordCallback"/>
    +            </map>
    +           </constructor-arg>
    +        </bean>
    +        <!--<bean class="org.apache.cxf.ws.security.wss4j.DefaultCryptoCoverageChecker"/>-->
    +       </jaxws:inInterceptors>
    +    </jaxws:endpoint> 
    +    
    +    
    +</beans>
    
e733c692e933

Merged revisions 1409910 via git cherry-pick from

https://github.com/apache/cxfDaniel KulpNov 15, 2012via ghsa
2 files changed · +8 0
  • rt/core/src/main/java/org/apache/cxf/interceptor/URIMappingInterceptor.java+5 0 modified
    @@ -46,6 +46,7 @@
     import org.apache.cxf.message.Exchange;
     import org.apache.cxf.message.Message;
     import org.apache.cxf.message.MessageContentsList;
    +import org.apache.cxf.message.MessageUtils;
     import org.apache.cxf.phase.Phase;
     import org.apache.cxf.service.Service;
     import org.apache.cxf.service.model.BindingInfo;
    @@ -55,6 +56,7 @@
     import org.apache.cxf.service.model.ServiceModelUtil;
     
     public class URIMappingInterceptor extends AbstractInDatabindingInterceptor {
    +    public static final String URIMAPPING_SKIP = URIMappingInterceptor.class.getName() + ".skip";
         
         private static final Logger LOG = LogUtils.getL7dLogger(URIMappingInterceptor.class);
         
    @@ -73,6 +75,9 @@ public void handleMessage(Message message) throws Fault {
                 }
                 return;
             }
    +        if (MessageUtils.getContextualBoolean(message, URIMAPPING_SKIP, false)) {
    +            return;
    +        }
     
             String opName = getOperationName(message);
             if (LOG.isLoggable(Level.FINE)) {
    
  • rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JInInterceptor.java+3 0 modified
    @@ -59,6 +59,7 @@
     import org.apache.cxf.endpoint.Endpoint;
     import org.apache.cxf.helpers.CastUtils;
     import org.apache.cxf.interceptor.Fault;
    +import org.apache.cxf.interceptor.URIMappingInterceptor;
     import org.apache.cxf.message.MessageUtils;
     import org.apache.cxf.phase.Phase;
     import org.apache.cxf.phase.PhaseInterceptor;
    @@ -196,6 +197,8 @@ public void handleMessage(SoapMessage msg) throws Fault {
             if (msg.containsKey(SECURITY_PROCESSED) || isGET(msg)) {
                 return;
             }
    +        //make sure we skip the URIMapping as we cannot apply security requirements to that
    +        msg.put(URIMappingInterceptor.URIMAPPING_SKIP, Boolean.TRUE);
             msg.put(SECURITY_PROCESSED, Boolean.TRUE);
             
             boolean utWithCallbacks = 
    
d99f96aa970d

Merged revisions 1409324 via git cherry-pick from

https://github.com/apache/cxfDaniel KulpNov 15, 2012via ghsa
2 files changed · +8 0
  • api/src/main/java/org/apache/cxf/interceptor/URIMappingInterceptor.java+5 0 modified
    @@ -45,6 +45,7 @@
     import org.apache.cxf.message.Exchange;
     import org.apache.cxf.message.Message;
     import org.apache.cxf.message.MessageContentsList;
    +import org.apache.cxf.message.MessageUtils;
     import org.apache.cxf.phase.Phase;
     import org.apache.cxf.service.Service;
     import org.apache.cxf.service.invoker.MethodDispatcher;
    @@ -55,6 +56,7 @@
     import org.apache.cxf.service.model.ServiceModelUtil;
     
     public class URIMappingInterceptor extends AbstractInDatabindingInterceptor {
    +    public static final String URIMAPPING_SKIP = URIMappingInterceptor.class.getName() + ".skip";
         
         private static final Logger LOG = LogUtils.getL7dLogger(URIMappingInterceptor.class);
         
    @@ -73,6 +75,9 @@ public void handleMessage(Message message) throws Fault {
                 }
                 return;
             }
    +        if (MessageUtils.getContextualBoolean(message, URIMAPPING_SKIP, false)) {
    +            return;
    +        }
     
             String opName = getOperationName(message);
             if (LOG.isLoggable(Level.FINE)) {
    
  • rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JInInterceptor.java+3 0 modified
    @@ -59,6 +59,7 @@
     import org.apache.cxf.endpoint.Endpoint;
     import org.apache.cxf.helpers.CastUtils;
     import org.apache.cxf.interceptor.Fault;
    +import org.apache.cxf.interceptor.URIMappingInterceptor;
     import org.apache.cxf.message.MessageUtils;
     import org.apache.cxf.phase.Phase;
     import org.apache.cxf.phase.PhaseInterceptor;
    @@ -192,6 +193,8 @@ public void handleMessage(SoapMessage msg) throws Fault {
             if (msg.containsKey(SECURITY_PROCESSED) || isGET(msg)) {
                 return;
             }
    +        //make sure we skip the URIMapping as we cannot apply security requirements to that
    +        msg.put(URIMappingInterceptor.URIMAPPING_SKIP, Boolean.TRUE);
             msg.put(SECURITY_PROCESSED, Boolean.TRUE);
             
             boolean utWithCallbacks = 
    
94a98b3fe9c7

[CXF-4629] Part 2 - remove the URIMappingInterceptor from the default chains

https://github.com/apache/cxfDaniel KulpNov 14, 2012via ghsa
14 files changed · +74 75
  • api/src/main/java/org/apache/cxf/interceptor/URIMappingInterceptor.java+1 0 modified
    @@ -60,6 +60,7 @@ public class URIMappingInterceptor extends AbstractInDatabindingInterceptor {
         
         private static final Logger LOG = LogUtils.getL7dLogger(URIMappingInterceptor.class);
         
    +    @Deprecated
         public URIMappingInterceptor() {
             super(Phase.UNMARSHAL);
         }
    
  • rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java+0 6 modified
    @@ -88,7 +88,6 @@
     import org.apache.cxf.interceptor.InterceptorProvider;
     import org.apache.cxf.interceptor.StaxInInterceptor;
     import org.apache.cxf.interceptor.StaxOutInterceptor;
    -import org.apache.cxf.interceptor.URIMappingInterceptor;
     import org.apache.cxf.interceptor.WrappedOutInterceptor;
     import org.apache.cxf.message.Message;
     import org.apache.cxf.phase.Phase;
    @@ -435,11 +434,6 @@ public Binding createBinding(BindingInfo binding) {
             sb.getOutFaultInterceptors().add(new SoapOutInterceptor(getBus()));
             sb.getOutFaultInterceptors().add(SoapHeaderOutFilterInterceptor.INSTANCE);
     
    -        // REVISIT: The phase interceptor chain seems to freak out if this added
    -        // first. Not sure what the deal is at the moment, I suspect the
    -        // ordering algorithm needs to be improved
    -        sb.getInInterceptors().add(new URIMappingInterceptor());
    -
             if (version.getVersion() == 1.1) {
                 sb.getInFaultInterceptors().add(new Soap11FaultInInterceptor());
                 sb.getOutFaultInterceptors().add(new Soap11FaultOutInterceptor());
    
  • rt/bindings/xml/src/main/java/org/apache/cxf/binding/xml/XMLBindingFactory.java+0 2 modified
    @@ -37,7 +37,6 @@
     import org.apache.cxf.interceptor.DocLiteralInInterceptor;
     import org.apache.cxf.interceptor.StaxInInterceptor;
     import org.apache.cxf.interceptor.StaxOutInterceptor;
    -import org.apache.cxf.interceptor.URIMappingInterceptor;
     import org.apache.cxf.interceptor.WrappedOutInterceptor;
     import org.apache.cxf.service.model.BindingInfo;
     import org.apache.cxf.service.model.BindingOperationInfo;
    @@ -65,7 +64,6 @@ public Binding createBinding(BindingInfo binding) {
             
             xb.getInInterceptors().add(new AttachmentInInterceptor());    
             xb.getInInterceptors().add(new StaxInInterceptor());
    -        xb.getInInterceptors().add(new URIMappingInterceptor());
             xb.getInInterceptors().add(new DocLiteralInInterceptor());
             xb.getInInterceptors().add(new XMLMessageInInterceptor());
             
    
  • rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/jaxws/AegisJaxwsGetTest.java+4 0 modified
    @@ -34,6 +34,7 @@
     import org.apache.cxf.endpoint.Server;
     import org.apache.cxf.frontend.ServerFactoryBean;
     import org.apache.cxf.interceptor.AbstractInDatabindingInterceptor;
    +import org.apache.cxf.interceptor.URIMappingInterceptor;
     import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
     import org.apache.cxf.staxutils.StaxUtils;
     import org.apache.cxf.test.AbstractCXFTest;
    @@ -50,12 +51,14 @@ public class AegisJaxwsGetTest extends AbstractCXFTest {
         public static final String PORT = TestUtil.getPortNumber(AegisJaxwsGetTest.class); 
         
         
    +    @SuppressWarnings("deprecation")
         @Before
         public void before() throws Exception {
             JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
             sf.setAddress("http://localhost:" + PORT + "/Echo");
             sf.setDataBinding(new AegisDatabinding());
             sf.setServiceBean(new Echo());
    +        sf.getInInterceptors().add(new URIMappingInterceptor());
             Server server = sf.create();
             // turn off nanny in URIMappingInterceptor
             server.getEndpoint()
    @@ -65,6 +68,7 @@ public void before() throws Exception {
             sf2.setAddress("http://localhost:" + PORT + "/SimpleEcho");
             sf2.setDataBinding(new AegisDatabinding());
             sf2.setServiceBean(new Echo());
    +        sf2.getInInterceptors().add(new URIMappingInterceptor());
             server = sf2.create();
             // turn off nanny in URIMappingInterceptor
             server.getEndpoint()
    
  • rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/URIMappingInterceptorDocLitTest.java+1 0 modified
    @@ -45,6 +45,7 @@
     import org.junit.Before;
     import org.junit.Test;
     
    +@SuppressWarnings("deprecation")
     public class URIMappingInterceptorDocLitTest extends AbstractCXFTest {
         
         Message message;
    
  • rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/URIMappingInterceptorRPCTest.java+1 0 modified
    @@ -45,6 +45,7 @@
     import org.junit.Before;
     import org.junit.Test;
     
    +@SuppressWarnings("deprecation")
     public class URIMappingInterceptorRPCTest extends AbstractCXFTest {
         
         Message message;
    
  • systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/httpget/JavaFirstHttpGetTest.java+3 0 modified
    @@ -26,6 +26,7 @@
     import org.apache.cxf.helpers.IOUtils;
     import org.apache.cxf.interceptor.LoggingInInterceptor;
     import org.apache.cxf.interceptor.LoggingOutInterceptor;
    +import org.apache.cxf.interceptor.URIMappingInterceptor;
     import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
     import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
     import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
    @@ -41,10 +42,12 @@ public class JavaFirstHttpGetTest extends AbstractBusClientServerTestBase {
                 + PORT + "/JavaFirstHttpGetTest";
         
         public static class Server extends AbstractBusTestServerBase {        
    +        @SuppressWarnings("deprecation")
             protected void run() {
                 MyImplementation implementor = new MyImplementation();
                 JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
                 svrFactory.setServiceClass(MyInterface.class);
    +            svrFactory.getInInterceptors().add(new URIMappingInterceptor());
                 svrFactory.setAddress(BASE_URL);
                 svrFactory.setServiceBean(implementor);
                 svrFactory.getInInterceptors().add(new LoggingInInterceptor());
    
  • systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ServerGreeterNoWsdl.java+4 0 modified
    @@ -26,11 +26,14 @@
     
     import org.apache.cxf.frontend.WSDLGetUtils;
     import org.apache.cxf.greeter_control.GreeterImplNoWsdl;
    +import org.apache.cxf.interceptor.URIMappingInterceptor;
    +import org.apache.cxf.jaxws.EndpointImpl;
     import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
     
     public class ServerGreeterNoWsdl extends AbstractBusTestServerBase {
         static final String PORT = allocatePort(ServerGreeterNoWsdl.class);
     
    +    @SuppressWarnings("deprecation")
         protected void run() {
             Object implementor = new GreeterImplNoWsdl();
             String address = "http://localhost:" + PORT + "/SoapContext/GreeterPort";
    @@ -39,6 +42,7 @@ protected void run() {
             props.put(WSDLGetUtils.WSDL_CREATE_IMPORTS, Boolean.TRUE);
             ep.setProperties(props);
             ep.publish(address);
    +        ((EndpointImpl)ep).getService().getInInterceptors().add(new URIMappingInterceptor());
         }
     
         public static void main(String[] args) {
    
  • systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/Server.java+23 7 modified
    @@ -20,13 +20,16 @@
     package org.apache.cxf.systest.jaxws;
     
     import java.net.URL;
    +import java.util.LinkedList;
    +import java.util.List;
     import java.util.concurrent.Future;
     
     import javax.jws.WebService;
     import javax.xml.ws.AsyncHandler;
     import javax.xml.ws.Endpoint;
     
     import org.apache.cxf.annotations.UseAsyncMethod;
    +import org.apache.cxf.interceptor.URIMappingInterceptor;
     import org.apache.cxf.jaxws.EndpointImpl;
     import org.apache.cxf.jaxws.ServerAsyncResponse;
     import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
    @@ -40,6 +43,9 @@ public class Server extends AbstractBusTestServerBase {
         static final String BARE_PORT = allocatePort(Server.class, 1);
         static final String BOGUS_REAL_PORT = allocatePort(Server.class, 2);
     
    +    List<Endpoint> eps = new LinkedList<Endpoint>();
    +
    +    @SuppressWarnings("deprecation")
         protected void run() {
             URL url = getClass().getResource("fault-stack-trace.xml");
             if (url != null) {
    @@ -50,23 +56,25 @@ protected void run() {
     
             implementor = new AsyncGreeter();
             address = "http://localhost:" + PORT + "/SoapContext/AsyncSoapPort";
    -        Endpoint.publish(address, implementor);
    +        eps.add(Endpoint.publish(address, implementor));
             
             implementor = new GreeterImplMultiPort();
             address = "http://localhost:" + PORT + "/MultiPort/GreeterPort";
    -        Endpoint.publish(address, implementor);
    +        eps.add(Endpoint.publish(address, implementor));
     
             implementor = new DocLitBareGreeterMultiPort();
             address = "http://localhost:" + PORT + "/MultiPort/DocBarePort";
    -        Endpoint.publish(address, implementor);
    +        eps.add(Endpoint.publish(address, implementor));
             
             implementor = new GreeterImpl();
             address = "http://localhost:" + PORT + "/SoapContext/SoapPort";
    -        Endpoint.publish(address, implementor);
    +        Endpoint ep = Endpoint.publish(address, implementor);
    +        ((EndpointImpl)ep).getService().getInInterceptors().add(new URIMappingInterceptor());
    +        eps.add(ep);
     
             implementor = new RefGreeterImpl();
             address = "http://localhost:" + PORT + "/SoapContext/SoapPort2";
    -        Endpoint.publish(address, implementor);
    +        eps.add(Endpoint.publish(address, implementor));
             
             //publish port with soap12 binding
             address = "http://localhost:" + PORT + "/SoapContext/SoapPort";
    @@ -75,17 +83,25 @@ protected void run() {
             EndpointImpl e = (EndpointImpl) Endpoint.create(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING, 
                                                             new Greeter12Impl());
             e.publish(address);
    +        eps.add(e);
             
             implementor = new DocLitBareGreeterImpl();
             address = "http://localhost:" + BARE_PORT + "/SoapContext/SoapPort";
    -        Endpoint.publish(address, implementor);
    +        eps.add(Endpoint.publish(address, implementor));
             
             
             implementor = new GreeterImplBogus();
             address = "http://localhost:" + BOGUS_REAL_PORT + "/SoapContext/SoapPort";
    -        Endpoint.publish(address, implementor);
    +        eps.add(Endpoint.publish(address, implementor));
         }
         
    +    public void tearDown() {
    +        while (!eps.isEmpty()) {
    +            Endpoint ep = eps.remove(0);
    +            ep.stop();
    +        }
    +    }    
    +    
         @WebService(endpointInterface = "org.apache.hello_world_soap_http.Greeter",
                     targetNamespace = "http://apache.org/hello_world_soap_http")
         public class Greeter12Impl extends BaseGreeterImpl {
    
  • systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ServerMisc.java+3 0 modified
    @@ -23,6 +23,7 @@
     
     import org.apache.cxf.anonymous_complex_type.AnonymousComplexTypeImpl;
     import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
    +import org.apache.cxf.interceptor.URIMappingInterceptor;
     import org.apache.cxf.jaxb_element_test.JaxbElementTestImpl;
     import org.apache.cxf.jaxws.EndpointImpl;
     import org.apache.cxf.jaxws.JAXWSMethodInvoker;
    @@ -51,6 +52,7 @@ public class ServerMisc extends AbstractBusTestServerBase {
         public static final String DOCLIT_CODEFIRST_SETTINGS_URL = 
             "http://localhost:" + PORT + "/DocLitWrappedCodeFirstServiceSettings/";
         
    +    @SuppressWarnings("deprecation")
         protected void run() {
             
             Factory factory = new PerRequestFactory(DocLitWrappedCodeFirstServiceImpl.class);
    @@ -86,6 +88,7 @@ public Long getWrapperPartMinOccurs(MessagePartInfo mpi) {
             Object implementor7 = new DocLitBareCodeFirstServiceImpl();
             EndpointImpl ep = (EndpointImpl)Endpoint.publish(DOCLITBARE_CODEFIRST_URL, implementor7);
             ep.getServer().getEndpoint().getInInterceptors().add(new SAAJInInterceptor());
    +        ep.getServer().getEndpoint().getInInterceptors().add(new URIMappingInterceptor());
     
             
             Object implementor6 = new InterfaceInheritTestImpl();
    
  • systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ServerXMLBinding.java+22 5 modified
    @@ -19,8 +19,13 @@
     
     package org.apache.cxf.systest.jaxws;
     
    +import java.util.LinkedList;
    +import java.util.List;
    +
     import javax.xml.ws.Endpoint;
     
    +import org.apache.cxf.interceptor.URIMappingInterceptor;
    +import org.apache.cxf.jaxws.EndpointImpl;
     import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
     import org.apache.headers.HeaderTesterImpl;
     import org.apache.hello_world_xml_http.bare.GreeterImpl;
    @@ -32,26 +37,38 @@ public class ServerXMLBinding extends AbstractBusTestServerBase {
         static final String WRAP_PORT = allocatePort(ServerXMLBinding.class, 1);
         static final String MIX_PORT = allocatePort(ServerXMLBinding.class, 2);
     
    +    List<Endpoint> eps = new LinkedList<Endpoint>();
    +    
    +    @SuppressWarnings("deprecation")
         protected void run() {
             Object implementor = new GreeterImpl();
             String address = "http://localhost:" + REG_PORT + "/XMLService/XMLPort";
    -        Endpoint.publish(address, implementor);
    +        eps.add(Endpoint.publish(address, implementor));
    +        
    +        ((EndpointImpl)eps.get(0)).getService().getInInterceptors().add(new URIMappingInterceptor());
     
             Object implementor1 = new org.apache.hello_world_xml_http.wrapped.GreeterImpl();
             address = "http://localhost:" + WRAP_PORT + "/XMLService/XMLPort";
    -        Endpoint.publish(address, implementor1);
    +        eps.add(Endpoint.publish(address, implementor1));
     
             Object faultImplementor = new GreeterFaultImpl();
             String faultAddress = "http://localhost:" + REG_PORT + "/XMLService/XMLFaultPort";
    -        Endpoint.publish(faultAddress, faultImplementor);
    +        eps.add(Endpoint.publish(faultAddress, faultImplementor));
     
             Object implementor2 = new HeaderTesterImpl();
             address = "http://localhost:" + REG_PORT + "/XMLContext/XMLPort";
    -        Endpoint.publish(address, implementor2);
    +        eps.add(Endpoint.publish(address, implementor2));
             
             Object implementor3 = new org.apache.hello_world_xml_http.mixed.GreeterImpl();
             address = "http://localhost:" + MIX_PORT + "/XMLService/XMLPort";
    -        Endpoint.publish(address, implementor3);
    +        eps.add(Endpoint.publish(address, implementor3));
    +    }
    +    
    +    public void tearDown() {
    +        while (!eps.isEmpty()) {
    +            Endpoint ep = eps.remove(0);
    +            ep.stop();
    +        }
         }
     
         public static void main(String[] args) {
    
  • systests/transports/src/test/java/org/apache/cxf/systest/servlet/SpringAutoPublishServletTest.java+1 27 modified
    @@ -71,33 +71,7 @@ public void invokingEndpoint(WebRequest req) throws Exception {
             assertValid("/s:Envelope/s:Body", doc);
             assertValid("//h:sayHiResponse", doc);
         }
    -    
    -    @Test
    -    public void testGreetMeGetRequest() throws Exception {
    -        ServletUnitClient client = newClient();
    -        client.setExceptionsThrownOnErrorStatus(true);
    -        
    -        WebRequest req = 
    -            new GetMethodQueryWebRequest(CONTEXT_URL + "/services/SOAPService/greetMe?"
    -                                         + "requestType=hello");
    -        
    -        WebResponse response = client.getResponse(req);        
    -        Document doc = DOMUtils.readXml(response.getInputStream());
    -        addNamespace("h", "http://apache.org/hello_world_soap_http/types");
    -        assertValid("/s:Envelope/s:Body", doc);
    -        assertValid("//h:greetMeResponse", doc);
    -        
    -        req = 
    -            new GetMethodQueryWebRequest(CONTEXT_URL + "/services/DerivedGreeterService/greetMe?"
    -                                         + "requestType=hello");
    -        
    -        response = client.getResponse(req);        
    -        doc = DOMUtils.readXml(response.getInputStream());
    -        addNamespace("h", "http://apache.org/hello_world_soap_http/types");
    -        assertValid("/s:Envelope/s:Body", doc);
    -        assertValid("//h:greetMeResponse", doc);
    -    }
    -    
    +     
             
         @Test
         public void testGetWSDL() throws Exception {
    
  • systests/transports/src/test/java/org/apache/cxf/systest/servlet/SpringServletTest.java+1 27 modified
    @@ -74,33 +74,7 @@ public void invokingEndpoint(WebRequest req) throws Exception {
             assertValid("/s:Envelope/s:Body", doc);
             assertValid("//h:sayHiResponse", doc);
         }
    -    
    -    @Test
    -    public void testGreetMeGetRequest() throws Exception {
    -        ServletUnitClient client = newClient();
    -        client.setExceptionsThrownOnErrorStatus(true);
    -        
    -        WebRequest req = 
    -            new GetMethodQueryWebRequest(CONTEXT_URL + "/services/Greeter/greetMe?"
    -                                         + "requestType=hello");
    -        
    -        WebResponse response = client.getResponse(req);        
    -        Document doc = DOMUtils.readXml(response.getInputStream());
    -        addNamespace("h", "http://apache.org/hello_world_soap_http/types");
    -        assertValid("/s:Envelope/s:Body", doc);
    -        assertValid("//h:greetMeResponse", doc);
    -        
    -        req = 
    -            new GetMethodQueryWebRequest(CONTEXT_URL + "/services/Greeter1/greetMe?"
    -                                         + "requestType=hello");
    -        
    -        response = client.getResponse(req);        
    -        doc = DOMUtils.readXml(response.getInputStream());
    -        addNamespace("h", "http://apache.org/hello_world_soap_http/types");
    -        assertValid("/s:Envelope/s:Body", doc);
    -        assertValid("//h:greetMeResponse", doc);
    -    }
    -    
    +     
             
         @Test
         public void testGetWSDL() throws Exception {
    
  • systests/uncategorized/src/test/java/org/apache/cxf/systest/soap12/Server.java+10 1 modified
    @@ -21,18 +21,27 @@
     
     import javax.xml.ws.Endpoint;
     
    +import org.apache.cxf.interceptor.URIMappingInterceptor;
    +import org.apache.cxf.jaxws.EndpointImpl;
     import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
     
     public class Server extends AbstractBusTestServerBase {
         public static final String PORT = allocatePort(Server.class);
     
    +    Endpoint ep;
     
    +    @SuppressWarnings("deprecation")
         protected void run()  {    
             Object implementor = new GreeterImpl();
             String address = "http://localhost:" + PORT + "/SoapContext/SoapPort";
    -        Endpoint.publish(address, implementor);
    +        ep = Endpoint.publish(address, implementor);
    +        EndpointImpl epi = (EndpointImpl)ep;
    +        epi.getService().getInInterceptors().add(new URIMappingInterceptor());
         }
     
    +    public void tearDown() throws Exception {
    +        ep.stop();
    +    }
     
         public static void main(String[] args) {
             try {
    
db11c9115f31

[CXF-4629] Skip the URIMappingInterceptor if ws-security is being used.

https://github.com/apache/cxfDaniel KulpNov 14, 2012via ghsa
2 files changed · +8 0
  • api/src/main/java/org/apache/cxf/interceptor/URIMappingInterceptor.java+5 0 modified
    @@ -45,6 +45,7 @@
     import org.apache.cxf.message.Exchange;
     import org.apache.cxf.message.Message;
     import org.apache.cxf.message.MessageContentsList;
    +import org.apache.cxf.message.MessageUtils;
     import org.apache.cxf.phase.Phase;
     import org.apache.cxf.service.Service;
     import org.apache.cxf.service.invoker.MethodDispatcher;
    @@ -55,6 +56,7 @@
     import org.apache.cxf.service.model.ServiceModelUtil;
     
     public class URIMappingInterceptor extends AbstractInDatabindingInterceptor {
    +    public static final String URIMAPPING_SKIP = URIMappingInterceptor.class.getName() + ".skip";
         
         private static final Logger LOG = LogUtils.getL7dLogger(URIMappingInterceptor.class);
         
    @@ -73,6 +75,9 @@ public void handleMessage(Message message) throws Fault {
                 }
                 return;
             }
    +        if (MessageUtils.getContextualBoolean(message, URIMAPPING_SKIP, false)) {
    +            return;
    +        }
     
             String opName = getOperationName(message);
             if (LOG.isLoggable(Level.FINE)) {
    
  • rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JInInterceptor.java+3 0 modified
    @@ -56,6 +56,7 @@
     import org.apache.cxf.endpoint.Endpoint;
     import org.apache.cxf.helpers.CastUtils;
     import org.apache.cxf.interceptor.Fault;
    +import org.apache.cxf.interceptor.URIMappingInterceptor;
     import org.apache.cxf.interceptor.security.SAMLSecurityContext;
     import org.apache.cxf.message.MessageUtils;
     import org.apache.cxf.phase.Phase;
    @@ -189,6 +190,8 @@ public void handleMessage(SoapMessage msg) throws Fault {
             if (msg.containsKey(SECURITY_PROCESSED) || isGET(msg)) {
                 return;
             }
    +        //make sure we skip the URIMapping as we cannot apply security requirements to that
    +        msg.put(URIMappingInterceptor.URIMAPPING_SKIP, Boolean.TRUE);
             msg.put(SECURITY_PROCESSED, Boolean.TRUE);
             
             boolean utWithCallbacks = 
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

42

News mentions

0

No linked articles in our index yet.