/**
* 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.wssc;
import java.util.Arrays;
import java.util.Collection;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.binding.soap.SoapBindingConstants;
import org.apache.cxf.binding.soap.interceptor.SoapActionInInterceptor;
import org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor;
import org.apache.cxf.bus.spring.SpringBusFactory;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.systest.ws.common.SecurityTestUtil;
import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
import org.apache.cxf.ws.security.SecurityConstants;
import org.apache.cxf.ws.security.trust.STSClient;
import org.apache.cxf.ws.security.trust.STSUtils;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
/**
* SecureConversation tests.
*/
@RunWith(value = org.junit.runners.Parameterized.class)
public class WSSCTest extends AbstractBusClientServerTestBase {
static final String PORT = allocatePort(Server.class);
static final String PORT2 = allocatePort(Server.class, 2);
static final String STAX_PORT = allocatePort(StaxServer.class);
static final String STAX_PORT2 = allocatePort(StaxServer.class, 2);
private static final String OUT = "CXF : ping";
private static wssec.wssc.PingService svc;
private static Bus bus;
final TestParam test;
public WSSCTest(TestParam type) {
this.test = type;
}
static class TestParam {
final String prefix;
final boolean streaming;
final String port;
final boolean clearAction;
TestParam(String p, String port, boolean b) {
prefix = p;
this.port = port;
streaming = b;
clearAction = false;
}
TestParam(String p, String port, boolean b, boolean a) {
prefix = p;
this.port = port;
streaming = b;
clearAction = a;
}
public String toString() {
return prefix + ":" + port + ":" + (streaming ? "streaming" : "dom")
+ (clearAction ? "/no SOAPAction" : "");
}
}
@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)
);
assertTrue(
"Server failed to launch",
// run the server in the same process
// set this to false to fork
launchServer(StaxServer.class, true)
);
bus = new SpringBusFactory().createBus("org/apache/cxf/systest/ws/wssc/client.xml");
BusFactory.setDefaultBus(bus);
BusFactory.setThreadDefaultBus(bus);
svc = new wssec.wssc.PingService();
}
@Parameters(name = "{0}")
public static Collection<TestParam[]> data() {
return Arrays.asList(new TestParam[][] {
{new TestParam("SecureConversation_UserNameOverTransport_IPingService", PORT2, false)},
{new TestParam("SecureConversation_MutualCertificate10SignEncrypt_IPingService", PORT, false)},
{new TestParam("AC_IPingService", PORT, false)},
{new TestParam("ADC_IPingService", PORT, false)},
{new TestParam("ADC-ES_IPingService", PORT, false)},
{new TestParam("_A_IPingService", PORT, false)},
{new TestParam("_AD_IPingService", PORT, false)},
{new TestParam("_AD-ES_IPingService", PORT, false)},
{new TestParam("UXC_IPingService", PORT, false)},
{new TestParam("UXDC_IPingService", PORT, false)},
{new TestParam("UXDC-SEES_IPingService", PORT, false)},
{new TestParam("_UX_IPingService", PORT, false)},
{new TestParam("_UXD_IPingService", PORT, false)},
{new TestParam("_UXD-SEES_IPingService", PORT, false)},
{new TestParam("XC_IPingService", PORT, false)},
{new TestParam("XDC_IPingService", PORT, false)},
{new TestParam("XDC_IPingService1", PORT, false)},
{new TestParam("XDC-ES_IPingService", PORT, false)},
{new TestParam("XDC-SEES_IPingService", PORT, false)},
{new TestParam("_X_IPingService", PORT, false)},
{new TestParam("_X10_IPingService", PORT, false)},
{new TestParam("_XD_IPingService", PORT, false)},
{new TestParam("_XD-SEES_IPingService", PORT, false)},
{new TestParam("_XD-ES_IPingService", PORT, false)},
{new TestParam("SecureConversation_UserNameOverTransport_IPingService", PORT2, true)},
// TODO Endorsing streaming not supported
// {new TestParam("SecureConversation_MutualCertificate10SignEncrypt_IPingService", PORT, true)},
{new TestParam("AC_IPingService", PORT, true)},
{new TestParam("ADC_IPingService", PORT, true)},
{new TestParam("ADC-ES_IPingService", PORT, true)},
{new TestParam("_A_IPingService", PORT, true)},
{new TestParam("_AD_IPingService", PORT, true)},
{new TestParam("_AD-ES_IPingService", PORT, true)},
{new TestParam("UXC_IPingService", PORT, true)},
{new TestParam("UXDC_IPingService", PORT, true)},
{new TestParam("UXDC-SEES_IPingService", PORT, true)},
{new TestParam("_UX_IPingService", PORT, true)},
{new TestParam("_UXD_IPingService", PORT, true)},
{new TestParam("_UXD-SEES_IPingService", PORT, true)},
// TODO Streaming endorsing not working
// {new TestParam("XC_IPingService", PORT, true)},
// {new TestParam("XDC_IPingService", PORT, true)},
// {new TestParam("XDC_IPingService1", PORT, true)},
// {new TestParam("XDC-ES_IPingService", PORT, true)},
// {new TestParam("XDC-SEES_IPingService", PORT, true)},
// {new TestParam("_X_IPingService", PORT, true)},
{new TestParam("_X10_IPingService", PORT, true)},
// TODO Streaming endorsing not working
// {new TestParam("_XD_IPingService", PORT, true)},
// {new TestParam("_XD-SEES_IPingService", PORT, true)},
// {new TestParam("_XD-ES_IPingService", PORT, true)},
{new TestParam("SecureConversation_UserNameOverTransport_IPingService", STAX_PORT2, false)},
// TODO StAX Policy Validation error caused by incorrect DOM message
// {new TestParam("SecureConversation_MutualCertificate10SignEncrypt_IPingService",
// STAX_PORT, false)},
{new TestParam("AC_IPingService", STAX_PORT, false)},
{new TestParam("ADC_IPingService", STAX_PORT, false)},
{new TestParam("ADC-ES_IPingService", STAX_PORT, false)},
{new TestParam("_A_IPingService", STAX_PORT, false)},
{new TestParam("_AD_IPingService", STAX_PORT, false)},
{new TestParam("_AD-ES_IPingService", STAX_PORT, false)},
{new TestParam("UXC_IPingService", STAX_PORT, false)},
{new TestParam("UXDC_IPingService", STAX_PORT, false)},
{new TestParam("UXDC-SEES_IPingService", STAX_PORT, false)},
{new TestParam("_UX_IPingService", STAX_PORT, false)},
{new TestParam("_UXD_IPingService", STAX_PORT, false)},
{new TestParam("_UXD-SEES_IPingService", STAX_PORT, false)},
{new TestParam("XC_IPingService", STAX_PORT, false)},
{new TestParam("XDC_IPingService", STAX_PORT, false)},
{new TestParam("XDC_IPingService1", STAX_PORT, false)},
{new TestParam("XDC-ES_IPingService", STAX_PORT, false)},
{new TestParam("XDC-SEES_IPingService", STAX_PORT, false)},
{new TestParam("_X_IPingService", STAX_PORT, false)},
{new TestParam("_X10_IPingService", STAX_PORT, false)},
{new TestParam("_XD_IPingService", STAX_PORT, false)},
{new TestParam("_XD-SEES_IPingService", STAX_PORT, false)},
{new TestParam("_XD-ES_IPingService", STAX_PORT, false)},
{new TestParam("SecureConversation_UserNameOverTransport_IPingService", STAX_PORT2, true)},
// TODO Endorsing derived keys not supported.
// {new TestParam("SecureConversation_MutualCertificate10SignEncrypt_IPingService",
// STAX_PORT, true)},
{new TestParam("AC_IPingService", STAX_PORT, true)},
{new TestParam("ADC_IPingService", STAX_PORT, true)},
{new TestParam("ADC-ES_IPingService", STAX_PORT, true)},
{new TestParam("_A_IPingService", STAX_PORT, true)},
{new TestParam("_AD_IPingService", STAX_PORT, true)},
{new TestParam("_AD-ES_IPingService", STAX_PORT, true)},
{new TestParam("UXC_IPingService", STAX_PORT, true)},
{new TestParam("UXDC_IPingService", STAX_PORT, true)},
{new TestParam("UXDC-SEES_IPingService", STAX_PORT, true)},
{new TestParam("_UX_IPingService", STAX_PORT, true)},
{new TestParam("_UXD_IPingService", STAX_PORT, true)},
{new TestParam("_UXD-SEES_IPingService", STAX_PORT, true)},
// TODO Streaming endorsing not working
// {new TestParam("XC_IPingService", STAX_PORT, true)},
// {new TestParam("XDC_IPingService", STAX_PORT, true)},
// {new TestParam("XDC_IPingService1", STAX_PORT, true)},
// {new TestParam("XDC-ES_IPingService", STAX_PORT, true)},
// {new TestParam("XDC-SEES_IPingService", STAX_PORT, true)},
// {new TestParam("_X_IPingService", STAX_PORT, true)},
{new TestParam("_X10_IPingService", STAX_PORT, true)},
// TODO Streaming endorsing not working
// {new TestParam("_XD_IPingService", STAX_PORT, true)},
// {new TestParam("_XD-SEES_IPingService", STAX_PORT, true)},
// {new TestParam("_XD-ES_IPingService", STAX_PORT, true)},
{new TestParam("AC_IPingService", PORT, false, true)},
{new TestParam("AC_IPingService", PORT, true, true)},
{new TestParam("AC_IPingService", STAX_PORT, false, true)},
{new TestParam("AC_IPingService", STAX_PORT, true, true)},
});
}
@org.junit.AfterClass
public static void cleanup() throws Exception {
SecurityTestUtil.cleanup();
bus.shutdown(true);
stopAllServers();
}
@Test
public void testSecureConversation() throws Exception {
final wssec.wssc.IPingService port =
svc.getPort(
new QName("http://WSSec/wssc", test.prefix),
wssec.wssc.IPingService.class
);
if (PORT2.equals(test.port) || STAX_PORT2.equals(test.port)) {
((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"https://localhost:" + test.port + "/" + test.prefix);
} else {
((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://localhost:" + test.port + "/" + test.prefix);
}
if (test.prefix.charAt(0) == '_') {
//MS would like the _ versions to send a cancel
((BindingProvider)port).getRequestContext()
.put(SecurityConstants.STS_TOKEN_DO_CANCEL, Boolean.TRUE);
}
if (test.streaming) {
((BindingProvider)port).getRequestContext().put(
SecurityConstants.ENABLE_STREAMING_SECURITY, "true"
);
((BindingProvider)port).getResponseContext().put(
SecurityConstants.ENABLE_STREAMING_SECURITY, "true"
);
}
if (test.clearAction) {
AbstractPhaseInterceptor<Message> clearActionInterceptor
= new AbstractPhaseInterceptor<Message>(Phase.POST_LOGICAL) {
public void handleMessage(Message message) throws Fault {
STSClient client = STSUtils.getClient(message, "sct");
client.getOutInterceptors().add(this);
message.put(SecurityConstants.STS_CLIENT, client);
String s = (String)message.get(SoapBindingConstants.SOAP_ACTION);
if (s == null) {
s = SoapActionInInterceptor.getSoapAction(message);
}
if (s != null && s.contains("RST/SCT")) {
message.put(SoapBindingConstants.SOAP_ACTION, "");
}
}
};
clearActionInterceptor.addBefore(SoapPreProtocolOutInterceptor.class.getName());
((Client)port).getOutInterceptors().add(clearActionInterceptor);
}
wssec.wssc.PingRequest params = new wssec.wssc.PingRequest();
org.xmlsoap.ping.Ping ping = new org.xmlsoap.ping.Ping();
ping.setOrigin("CXF");
ping.setScenario("Scenario5");
ping.setText("ping");
params.setPing(ping);
try {
wssec.wssc.PingResponse output = port.ping(params);
assertEquals(OUT, output.getPingResponse().getText());
} catch (Exception ex) {
throw new Exception("Error doing " + test.prefix, ex);
}
((java.io.Closeable)port).close();
}
}