From 6b2de7d6f4d715f7b12266ca801f7657c658e036 Mon Sep 17 00:00:00 2001 From: Peter Palaga Date: Thu, 27 Sep 2018 16:06:04 +0200 Subject: [PATCH] [resolves #2605] Test CXF RS endpoints with Elytron --- .../test/common/security/SecurityUtils.java | 15 +- ...FRSBasicSecureProducerIntegrationTest.java | 133 ++++++++++++++++ .../test/cxf/rs/secure/CXFRSSecureUtils.java | 61 ++++++++ ...ingBasicSecureProducerIntegrationTest.java | 90 +++++++++++ .../test/cxf/rs/secure/subA/Application.java | 148 ++++++++++++++++++ .../cxf/rs/secure/subA/CxfRsRouteBuilder.java | 56 +++++++ .../rs/secure/subA/CxfRsRouteBuilderRel.java | 57 +++++++ .../rs/secure/subA/CxfRsRouteBuilderSub.java | 57 +++++++ .../rs/secure/subA/GreetingsProcessor.java | 31 ++++ .../cxf/rs/secure/subA/GreetingsService.java | 17 ++ ...EarBasicSecureProducerIntegrationTest.java | 12 +- .../test/cxf/ws/secure/CXFWSSecureUtils.java | 1 + ...ingBasicSecureProducerIntegrationTest.java | 10 +- .../cxf/secure/spring/cxfrs-camel-context.xml | 40 +++++ 14 files changed, 712 insertions(+), 16 deletions(-) create mode 100644 itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/CXFRSBasicSecureProducerIntegrationTest.java create mode 100644 itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/CXFRSSecureUtils.java create mode 100644 itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/CXFRSSpringBasicSecureProducerIntegrationTest.java create mode 100644 itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/Application.java create mode 100644 itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/CxfRsRouteBuilder.java create mode 100644 itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/CxfRsRouteBuilderRel.java create mode 100644 itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/CxfRsRouteBuilderSub.java create mode 100644 itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/GreetingsProcessor.java create mode 100644 itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/GreetingsService.java create mode 100644 itests/standalone/basic/src/test/resources/cxf/secure/spring/cxfrs-camel-context.xml diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/common/security/SecurityUtils.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/common/security/SecurityUtils.java index 8afd489098..5165779d76 100644 --- a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/common/security/SecurityUtils.java +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/common/security/SecurityUtils.java @@ -62,7 +62,6 @@ public class SecurityUtils { private static final String SERVER_CRT = "server.crt"; private static final String SERVER_KEYSTORE = "server.keystore"; private static final String SERVER_TRUSTSTORE = "server.truststore"; - public static final String SPRING_CONSUMER_ENDPOINT_ADDRESS = "https://localhost:8443/webservices/greeting-secure-spring"; private static final String UNTRUSTED_CRT = "untrusted.crt"; private static final String UNTRUSTED_KEYSTORE = "untrusted.keystore"; @@ -90,17 +89,23 @@ public class SecurityUtils { + "" ; - public static void addSpringXml(WebArchive archive) { + public static void addSpringXmlWs(WebArchive archive, String endpointUrl) { + addSpringXml(archive, "cxfws-camel-context.xml", endpointUrl); + } + public static void addSpringXmlRs(WebArchive archive, String endpointUrl) { + addSpringXml(archive, "cxfrs-camel-context.xml", endpointUrl); + } + public static void addSpringXml(WebArchive archive, String file, String endpointUrl) { final StringBuilder sb = new StringBuilder(); try { FileUtils.copy( - SecurityUtils.class.getClassLoader().getResource("cxf/secure/spring/cxfws-camel-context.xml"), sb); + SecurityUtils.class.getClassLoader().getResource("cxf/secure/spring/"+ file), sb); } catch (IOException e) { throw new RuntimeException(e); } final String xml = sb.toString().replace("${SPRING_CONSUMER_ENDPOINT_ADDRESS}", - SPRING_CONSUMER_ENDPOINT_ADDRESS); - archive.addAsWebInfResource(new StringAsset(xml), "cxfws-camel-context.xml"); + endpointUrl); + archive.addAsWebInfResource(new StringAsset(xml), file); } private static void copy(String fileName, Path targetDirectory) throws IOException { diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/CXFRSBasicSecureProducerIntegrationTest.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/CXFRSBasicSecureProducerIntegrationTest.java new file mode 100644 index 0000000000..29d1774344 --- /dev/null +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/CXFRSBasicSecureProducerIntegrationTest.java @@ -0,0 +1,133 @@ +/* + * #%L + * Wildfly Camel :: Testsuite + * %% + * Copyright (C) 2013 - 2014 RedHat + * %% + * Licensed 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. + * #L% + */ +package org.wildfly.camel.test.cxf.rs.secure; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.as.arquillian.api.ServerSetup; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.wildfly.camel.test.common.security.BasicSecurityDomainASetup; +import org.wildfly.camel.test.common.security.SecurityUtils; +import org.wildfly.camel.test.common.utils.EnvironmentUtils; +import org.wildfly.camel.test.cxf.rs.secure.subA.Application; +import org.wildfly.camel.test.cxf.rs.secure.subA.CxfRsRouteBuilder; +import org.wildfly.extension.camel.CamelAware; + +/** + * @author Peter Palaga + */ +@CamelAware +@RunAsClient +@RunWith(Arquillian.class) +@ServerSetup(BasicSecurityDomainASetup.class) +public class CXFRSBasicSecureProducerIntegrationTest { + public static final String APP_NAME = "CXFRSBasicSecureProducerIntegrationTest"; + private static final Map PATH_ROLE_MAP = new LinkedHashMap() { + private static final long serialVersionUID = 1L; + { + try { + put("//" + new URI(Application.CXF_ENDPOINT_URI).getPath(), + BasicSecurityDomainASetup.APPLICATION_ROLE); + put("//" + new URI(Application.CXF_ENDPOINT_SUB_URI).getPath(), + BasicSecurityDomainASetup.APPLICATION_ROLE_SUB); + put(new URI(Application.CXF_ENDPOINT_REL_URI).getPath().substring(("/"+APP_NAME).length()), + BasicSecurityDomainASetup.APPLICATION_ROLE_REL); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + }; + + @Deployment + public static Archive deployment() { + final WebArchive archive = ShrinkWrap + .create(WebArchive.class, APP_NAME + ".war") + .addClasses(BasicSecurityDomainASetup.class, CXFRSSecureUtils.class) + .addPackage(CxfRsRouteBuilder.class.getPackage()) + .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") + ; + SecurityUtils.enhanceArchive(archive, BasicSecurityDomainASetup.SECURITY_DOMAIN, + BasicSecurityDomainASetup.AUTH_METHOD, PATH_ROLE_MAP); + return archive; + } + + @Test + public void greetAnonymous() throws Exception { + CXFRSSecureUtils.assertGreet(EnvironmentUtils.getWildFlyHome(), Application.CXF_ENDPOINT_URI, null, null, 401, null); + } + + + @Test + public void greetAnonymousSub() throws Exception { + CXFRSSecureUtils.assertGreet(EnvironmentUtils.getWildFlyHome(), Application.CXF_ENDPOINT_SUB_URI, null, null, 401, + null); + } + + @Test + public void greetBasicBadUser() throws Exception { + CXFRSSecureUtils.assertGreet(EnvironmentUtils.getWildFlyHome(), Application.CXF_ENDPOINT_URI, + BasicSecurityDomainASetup.APPLICATION_USER_SUB, BasicSecurityDomainASetup.APPLICATION_PASSWORD_SUB, 403, + null); + } + + @Test + public void greetBasicGoodUser() throws Exception { + CXFRSSecureUtils.assertGreet(EnvironmentUtils.getWildFlyHome(), Application.CXF_ENDPOINT_URI, + BasicSecurityDomainASetup.APPLICATION_USER, BasicSecurityDomainASetup.APPLICATION_PASSWORD, 200, + "Hi Joe"); + } + + @Test + public void greetBasicSubBadUser() throws Exception { + CXFRSSecureUtils.assertGreet(EnvironmentUtils.getWildFlyHome(), Application.CXF_ENDPOINT_SUB_URI, + BasicSecurityDomainASetup.APPLICATION_USER, BasicSecurityDomainASetup.APPLICATION_PASSWORD, 403, null); + } + + @Test + public void greetBasicSubGoodUser() throws Exception { + CXFRSSecureUtils.assertGreet(EnvironmentUtils.getWildFlyHome(), Application.CXF_ENDPOINT_SUB_URI, + BasicSecurityDomainASetup.APPLICATION_USER_SUB, BasicSecurityDomainASetup.APPLICATION_PASSWORD_SUB, 200, + "Hi Joe"); + } + + @Test + public void greetBasicRelBadUser() throws Exception { + CXFRSSecureUtils.assertGreet(EnvironmentUtils.getWildFlyHome(), Application.CXF_ENDPOINT_REL_URI, + BasicSecurityDomainASetup.APPLICATION_USER_SUB, BasicSecurityDomainASetup.APPLICATION_PASSWORD_SUB, 403, null); + } + + @Test + public void greetBasicRelGoodUser() throws Exception { + CXFRSSecureUtils.assertGreet(EnvironmentUtils.getWildFlyHome(), Application.CXF_ENDPOINT_REL_URI, + BasicSecurityDomainASetup.APPLICATION_USER_REL, BasicSecurityDomainASetup.APPLICATION_PASSWORD_REL, 200, + "Hi Joe"); + } +} diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/CXFRSSecureUtils.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/CXFRSSecureUtils.java new file mode 100644 index 0000000000..984b96b722 --- /dev/null +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/CXFRSSecureUtils.java @@ -0,0 +1,61 @@ +package org.wildfly.camel.test.cxf.rs.secure; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.util.Base64; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpHeaders; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.junit.Assert; +import org.wildfly.camel.test.common.security.SecurityUtils; + +/** + * @author Peter Palaga + */ +public class CXFRSSecureUtils { + public static final String SPRING_CONSUMER_ENDPOINT_BASE_ADDRESS = "https://localhost:8443/rest/greeting-secure-spring"; + public static final String SPRING_CONSUMER_ENDPOINT_ADDRESS = SPRING_CONSUMER_ENDPOINT_BASE_ADDRESS + "/greet/hi"; + + static void assertGreet(Path wildFlyHome, String uri, String user, String password, int responseCode, + String responseBody) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, + KeyStoreException, CertificateException, IOException { + try (CloseableHttpClient httpclient = HttpClients.custom() + .setSSLSocketFactory(SecurityUtils.createBasicSocketFactory(wildFlyHome)).build()) { + HttpPost request = new HttpPost(uri); + request.setHeader("Content-Type", "text/plain"); + + if (user != null) { + String auth = user + ":" + password; + String authHeader = "Basic " + + Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.ISO_8859_1)); + request.setHeader(HttpHeaders.AUTHORIZATION, authHeader); + } + + request.setEntity(new StringEntity("Joe", StandardCharsets.UTF_8)); + try (CloseableHttpResponse response = httpclient.execute(request)) { + final int actualCode = response.getStatusLine().getStatusCode(); + Assert.assertEquals(responseCode, actualCode); + if (actualCode == 200) { + HttpEntity entity = response.getEntity(); + String body = EntityUtils.toString(entity, StandardCharsets.UTF_8); + Assert.assertEquals(responseBody, body); + } + } + } + } + + private CXFRSSecureUtils() {} + +} diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/CXFRSSpringBasicSecureProducerIntegrationTest.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/CXFRSSpringBasicSecureProducerIntegrationTest.java new file mode 100644 index 0000000000..85df658004 --- /dev/null +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/CXFRSSpringBasicSecureProducerIntegrationTest.java @@ -0,0 +1,90 @@ +/* + * #%L + * Wildfly Camel :: Testsuite + * %% + * Copyright (C) 2013 - 2014 RedHat + * %% + * Licensed 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. + * #L% + */ +package org.wildfly.camel.test.cxf.rs.secure; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.as.arquillian.api.ServerSetup; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.wildfly.camel.test.common.security.BasicSecurityDomainASetup; +import org.wildfly.camel.test.common.security.SecurityUtils; +import org.wildfly.camel.test.common.utils.EnvironmentUtils; +import org.wildfly.camel.test.cxf.rs.secure.subA.GreetingsProcessor; +import org.wildfly.camel.test.cxf.rs.secure.subA.GreetingsService; +import org.wildfly.extension.camel.CamelAware; + +/** + * @author Peter Palaga + */ +@CamelAware +@RunAsClient +@RunWith(Arquillian.class) +@ServerSetup(BasicSecurityDomainASetup.class) +public class CXFRSSpringBasicSecureProducerIntegrationTest { + private static final Map PATH_ROLE_MAP = new LinkedHashMap() {{ + try { + put("//" + new URI(CXFRSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS).getPath(), BasicSecurityDomainASetup.APPLICATION_ROLE); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + }}; + + @Deployment + public static Archive deployment() { + final WebArchive archive = ShrinkWrap + .create(WebArchive.class, CXFRSSpringBasicSecureProducerIntegrationTest.class.getSimpleName() + ".war") + .addClasses(BasicSecurityDomainASetup.class, CXFRSSecureUtils.class, GreetingsService.class, + GreetingsProcessor.class); + SecurityUtils.addSpringXmlRs(archive, CXFRSSecureUtils.SPRING_CONSUMER_ENDPOINT_BASE_ADDRESS); + SecurityUtils.enhanceArchive(archive, BasicSecurityDomainASetup.SECURITY_DOMAIN, + BasicSecurityDomainASetup.AUTH_METHOD, PATH_ROLE_MAP); + return archive; + } + + @Test + public void greetAnonymous() throws Exception { + CXFRSSecureUtils.assertGreet(EnvironmentUtils.getWildFlyHome(), CXFRSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, null, null, 401, null); + } + + @Test + public void greetBasicGoodUser() throws Exception { + CXFRSSecureUtils.assertGreet(EnvironmentUtils.getWildFlyHome(), CXFRSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, + BasicSecurityDomainASetup.APPLICATION_USER, BasicSecurityDomainASetup.APPLICATION_PASSWORD, 200, + "Hi Joe"); + } + + @Test + public void greetBasicBadUser() throws Exception { + CXFRSSecureUtils.assertGreet(EnvironmentUtils.getWildFlyHome(), CXFRSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, + BasicSecurityDomainASetup.APPLICATION_USER_SUB, BasicSecurityDomainASetup.APPLICATION_PASSWORD_SUB, 403, + null); + } + +} diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/Application.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/Application.java new file mode 100644 index 0000000000..13c6c49285 --- /dev/null +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/Application.java @@ -0,0 +1,148 @@ +/* + * #%L + * Wildfly Camel :: Example :: Camel CXF JAX-WS CDI Secure + * %% + * Copyright (C) 2013 - 2017 RedHat + * %% + * Licensed 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. + * #L% + */ +package org.wildfly.camel.test.cxf.rs.secure.subA; + +import javax.enterprise.inject.Produces; +import javax.inject.Inject; +import javax.inject.Named; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLSession; + +import org.apache.camel.CamelContext; +import org.apache.camel.Processor; +import org.apache.camel.cdi.ContextName; +import org.apache.camel.component.cxf.jaxrs.CxfRsComponent; +import org.apache.camel.component.cxf.jaxrs.CxfRsEndpoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.wildfly.camel.test.cxf.rs.secure.CXFRSBasicSecureProducerIntegrationTest; + +@Named("cxf_cdi_security_app") +public class Application { + + public static final String CXF_ENDPOINT_BASE_URI = "https://localhost:8443/rest"; + public static final String CXF_ENDPOINT_URI = CXF_ENDPOINT_BASE_URI + "/greet/hi"; + public static final String CXF_ENDPOINT_SUB_BASE_URI = CXF_ENDPOINT_BASE_URI + "/sub"; + public static final String CXF_ENDPOINT_SUB_URI = CXF_ENDPOINT_SUB_BASE_URI + "/greet/hi"; + public static final String CXF_ENDPOINT_REL_BASE_URI = "https://localhost:8443/"+ CXFRSBasicSecureProducerIntegrationTest.APP_NAME +"/rel-greeting-secure-cdi"; + public static final String CXF_ENDPOINT_REL_URI = CXF_ENDPOINT_REL_BASE_URI + "/greet/hi"; + + private static final Logger log = LoggerFactory.getLogger(Application.class); + + @Inject + @ContextName("cxfrs-secure-cdi-camel-context") + CamelContext camelContext; + + @Named("cxfConsumerEndpoint") + @Produces + public CxfRsEndpoint createCxfConsumerEndpoint() { + CxfRsComponent cxfConsumerComponent = new CxfRsComponent(this.camelContext); + CxfRsEndpoint cxfConsumerEndpoint = new CxfRsEndpoint(CXF_ENDPOINT_BASE_URI, cxfConsumerComponent); + cxfConsumerEndpoint.setBeanId("cxfConsumerEndpoint"); + cxfConsumerEndpoint.addResourceClass(GreetingsService.class); + return cxfConsumerEndpoint; + } + + @Named("cxfConsumerEndpointSub") + @Produces + public CxfRsEndpoint createCxfConsumerEndpointSub() { + CxfRsComponent cxfConsumerComponent = new CxfRsComponent(this.camelContext); + CxfRsEndpoint cxfConsumerEndpoint = new CxfRsEndpoint(CXF_ENDPOINT_SUB_BASE_URI, cxfConsumerComponent); + cxfConsumerEndpoint.setBeanId("cxfConsumerEndpointSub"); + cxfConsumerEndpoint.addResourceClass(GreetingsService.class); + return cxfConsumerEndpoint; + } + + @Named("cxfConsumerEndpointRel") + @Produces + public CxfRsEndpoint createCxfConsumerEndpointRel() { + CxfRsComponent cxfConsumerComponent = new CxfRsComponent(this.camelContext); + CxfRsEndpoint cxfConsumerEndpoint = new CxfRsEndpoint(CXF_ENDPOINT_REL_BASE_URI, cxfConsumerComponent); + cxfConsumerEndpoint.setBeanId("cxfConsumerEndpointRel"); + cxfConsumerEndpoint.addResourceClass(GreetingsService.class); + return cxfConsumerEndpoint; + } + + @Named("cxfProducerEndpoint") + @Produces + public CxfRsEndpoint createCxfProducerEndpoint() { + CxfRsComponent cxfProducerComponent = new CxfRsComponent(this.camelContext); + CxfRsEndpoint cxfProducerEndpoint = new CxfRsEndpoint(CXF_ENDPOINT_BASE_URI, cxfProducerComponent); + cxfProducerEndpoint.setBeanId("cxfProducerEndpoint"); + cxfProducerEndpoint.addResourceClass(GreetingsService.class); + + // Not for use in production + HostnameVerifier hostnameVerifier = new HostnameVerifier() { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + cxfProducerEndpoint.setHostnameVerifier(hostnameVerifier); + + return cxfProducerEndpoint; + } + + @Named("cxfProducerEndpointSub") + @Produces + public CxfRsEndpoint createCxfProducerEndpointSub() { + CxfRsComponent cxfProducerComponent = new CxfRsComponent(this.camelContext); + CxfRsEndpoint cxfProducerEndpoint = new CxfRsEndpoint(CXF_ENDPOINT_SUB_BASE_URI, cxfProducerComponent); + cxfProducerEndpoint.setBeanId("cxfProducerEndpointSub"); + cxfProducerEndpoint.addResourceClass(GreetingsService.class); + + // Not for use in production + HostnameVerifier hostnameVerifier = new HostnameVerifier() { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + cxfProducerEndpoint.setHostnameVerifier(hostnameVerifier); + + return cxfProducerEndpoint; + } + + @Named("cxfProducerEndpointRel") + @Produces + public CxfRsEndpoint createCxfProducerEndpointRel() { + CxfRsComponent cxfProducerComponent = new CxfRsComponent(this.camelContext); + CxfRsEndpoint cxfProducerEndpoint = new CxfRsEndpoint(CXF_ENDPOINT_REL_BASE_URI, cxfProducerComponent); + cxfProducerEndpoint.setBeanId("cxfProducerEndpointRel"); + cxfProducerEndpoint.addResourceClass(GreetingsService.class); + + // Not for use in production + HostnameVerifier hostnameVerifier = new HostnameVerifier() { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + cxfProducerEndpoint.setHostnameVerifier(hostnameVerifier); + + return cxfProducerEndpoint; + } + @Named("greetingsProcessor") + @Produces + public Processor produceGreetingsProcessor() { + return new GreetingsProcessor(); + } + +} diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/CxfRsRouteBuilder.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/CxfRsRouteBuilder.java new file mode 100644 index 0000000000..406735cbf3 --- /dev/null +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/CxfRsRouteBuilder.java @@ -0,0 +1,56 @@ +/* + * #%L + * Wildfly Camel :: Example :: Camel CXF JAX-WS CDI Secure + * %% + * Copyright (C) 2013 - 2017 RedHat + * %% + * Licensed 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. + * #L% + */ +package org.wildfly.camel.test.cxf.rs.secure.subA; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.inject.Named; + +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.cdi.ContextName; +import org.apache.camel.component.cxf.CxfEndpoint; +import org.apache.camel.component.cxf.jaxrs.CxfRsEndpoint; + +@ApplicationScoped +@ContextName("cxfrs-secure-cdi-camel-context") +public class CxfRsRouteBuilder extends RouteBuilder { + + @Inject + @Named("greetingsProcessor") + Processor greetingsProcessor; + + @Inject + @Named("cxfConsumerEndpoint") + CxfRsEndpoint cxfConsumerEndpoint; + + @Inject + @Named("cxfProducerEndpoint") + CxfRsEndpoint cxfProducerEndpoint; + + @Override + public void configure() throws Exception { + from("direct:start") + .to(this.cxfProducerEndpoint); + + from(this.cxfConsumerEndpoint) + .process(this.greetingsProcessor); + } +} diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/CxfRsRouteBuilderRel.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/CxfRsRouteBuilderRel.java new file mode 100644 index 0000000000..d0fdb3ad28 --- /dev/null +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/CxfRsRouteBuilderRel.java @@ -0,0 +1,57 @@ +/* + * #%L + * Wildfly Camel :: Example :: Camel CXF JAX-WS CDI Secure + * %% + * Copyright (C) 2013 - 2017 RedHat + * %% + * Licensed 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. + * #L% + */ +package org.wildfly.camel.test.cxf.rs.secure.subA; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.inject.Named; + +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.cdi.ContextName; +import org.apache.camel.component.cxf.jaxrs.CxfRsEndpoint; + +@ApplicationScoped +@ContextName("cxfrs-secure-cdi-camel-context") +public class CxfRsRouteBuilderRel extends RouteBuilder { + + @Inject + @Named("greetingsProcessor") + Processor greetingsProcessor; + + @Inject + @Named("cxfConsumerEndpointRel") + CxfRsEndpoint cxfConsumerEndpointRel; + + @Inject + @Named("cxfProducerEndpointRel") + CxfRsEndpoint cxfProducerEndpointRel; + + @Override + public void configure() throws Exception { + + from("direct:start3") + .to(this.cxfProducerEndpointRel); + + from(this.cxfConsumerEndpointRel) + .process(this.greetingsProcessor); + + } +} diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/CxfRsRouteBuilderSub.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/CxfRsRouteBuilderSub.java new file mode 100644 index 0000000000..9bd8d90acd --- /dev/null +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/CxfRsRouteBuilderSub.java @@ -0,0 +1,57 @@ +/* + * #%L + * Wildfly Camel :: Example :: Camel CXF JAX-WS CDI Secure + * %% + * Copyright (C) 2013 - 2017 RedHat + * %% + * Licensed 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. + * #L% + */ +package org.wildfly.camel.test.cxf.rs.secure.subA; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.inject.Named; + +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.cdi.ContextName; +import org.apache.camel.component.cxf.jaxrs.CxfRsEndpoint; + +@ApplicationScoped +@ContextName("cxfrs-secure-cdi-camel-context") +public class CxfRsRouteBuilderSub extends RouteBuilder { + + @Inject + @Named("greetingsProcessor") + Processor greetingsProcessor; + + @Inject + @Named("cxfConsumerEndpointSub") + CxfRsEndpoint cxfConsumerEndpointSub; + + @Inject + @Named("cxfProducerEndpointSub") + CxfRsEndpoint cxfProducerEndpointSub; + + @Override + public void configure() throws Exception { + + from("direct:start2") + .to(this.cxfProducerEndpointSub); + + from(this.cxfConsumerEndpointSub) + .process(this.greetingsProcessor); + + } +} diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/GreetingsProcessor.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/GreetingsProcessor.java new file mode 100644 index 0000000000..a718e6b5f7 --- /dev/null +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/GreetingsProcessor.java @@ -0,0 +1,31 @@ +/* + * #%L + * Wildfly Camel :: Example :: Camel CXF JAX-WS CDI Secure + * %% + * Copyright (C) 2013 - 2017 RedHat + * %% + * Licensed 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. + * #L% + */ +package org.wildfly.camel.test.cxf.rs.secure.subA; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; + +public class GreetingsProcessor implements Processor { + @Override + public void process(Exchange exchange) throws Exception { + String name = exchange.getIn().getBody(String.class); + exchange.getOut().setBody("Hi " + name); + } +} diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/GreetingsService.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/GreetingsService.java new file mode 100644 index 0000000000..1bfec94834 --- /dev/null +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/rs/secure/subA/GreetingsService.java @@ -0,0 +1,17 @@ +package org.wildfly.camel.test.cxf.rs.secure.subA; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Path("/greet") +public interface GreetingsService { + + @POST + @Path("/hi") + @Produces(MediaType.TEXT_PLAIN) + @Consumes(MediaType.TEXT_PLAIN) + public String hi(String name); +} diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/ws/secure/CXFWSEarBasicSecureProducerIntegrationTest.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/ws/secure/CXFWSEarBasicSecureProducerIntegrationTest.java index 9412a6a035..423ba089f1 100644 --- a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/ws/secure/CXFWSEarBasicSecureProducerIntegrationTest.java +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/ws/secure/CXFWSEarBasicSecureProducerIntegrationTest.java @@ -84,7 +84,7 @@ public class CXFWSEarBasicSecureProducerIntegrationTest { private static final long serialVersionUID = 1L; { try { - put("//" + new URI(SecurityUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS).getPath(), BasicSecurityDomainBSetup.APPLICATION_ROLE); + put("//" + new URI(CXFWSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS).getPath(), BasicSecurityDomainBSetup.APPLICATION_ROLE); } catch (URISyntaxException e) { throw new RuntimeException(e); } @@ -109,7 +109,7 @@ public static Archive deployment() { .addAsWebInfResource("cxf/secure/spring/cxfws-camel-context.xml") .addClasses(BasicSecurityDomainBSetup.class, CXFWSSecureUtils.class, GreetingService.class, GreetingsProcessor.class); - SecurityUtils.addSpringXml(warB); + SecurityUtils.addSpringXmlWs(warB, CXFWSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS); SecurityUtils.enhanceArchive(warB, BasicSecurityDomainBSetup.SECURITY_DOMAIN, BasicSecurityDomainBSetup.AUTH_METHOD, PATH_ROLE_MAP_B); @@ -171,25 +171,25 @@ public void greetABasicSubGoodUser() throws Exception { @Test public void greetBAnonymous() throws Exception { - CXFWSSecureUtils.assertGreet(WILDFLY_HOME, SecurityUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, null, null, 401, null); + CXFWSSecureUtils.assertGreet(WILDFLY_HOME, CXFWSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, null, null, 401, null); } @Test public void greetBBasicGoodUser() throws Exception { - CXFWSSecureUtils.assertGreet(WILDFLY_HOME, SecurityUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, + CXFWSSecureUtils.assertGreet(WILDFLY_HOME, CXFWSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, BasicSecurityDomainBSetup.APPLICATION_USER, BasicSecurityDomainBSetup.APPLICATION_PASSWORD, 200, "Hi Joe"); } @Test public void greetBBasicBadUser() throws Exception { - CXFWSSecureUtils.assertGreet(WILDFLY_HOME, SecurityUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, + CXFWSSecureUtils.assertGreet(WILDFLY_HOME, CXFWSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, BasicSecurityDomainBSetup.APPLICATION_USER_SUB, BasicSecurityDomainBSetup.APPLICATION_PASSWORD_SUB, 403, null); } public void greetBBasicUserFromA() throws Exception { - CXFWSSecureUtils.assertGreet(WILDFLY_HOME, SecurityUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, + CXFWSSecureUtils.assertGreet(WILDFLY_HOME, CXFWSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, BasicSecurityDomainASetup.APPLICATION_USER, BasicSecurityDomainASetup.APPLICATION_PASSWORD, 403, null); } diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/ws/secure/CXFWSSecureUtils.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/ws/secure/CXFWSSecureUtils.java index 02ca4a7063..6e5f152eb0 100644 --- a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/ws/secure/CXFWSSecureUtils.java +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/ws/secure/CXFWSSecureUtils.java @@ -26,6 +26,7 @@ */ public class CXFWSSecureUtils { + public static final String SPRING_CONSUMER_ENDPOINT_ADDRESS = "https://localhost:8443/webservices/greeting-secure-spring"; private static final String WS_MESSAGE_TEMPLATE = "" + "" + "" diff --git a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/ws/secure/CXFWSSpringBasicSecureProducerIntegrationTest.java b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/ws/secure/CXFWSSpringBasicSecureProducerIntegrationTest.java index 65e3a75ed0..c33163a3ca 100644 --- a/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/ws/secure/CXFWSSpringBasicSecureProducerIntegrationTest.java +++ b/itests/standalone/basic/src/test/java/org/wildfly/camel/test/cxf/ws/secure/CXFWSSpringBasicSecureProducerIntegrationTest.java @@ -53,7 +53,7 @@ public class CXFWSSpringBasicSecureProducerIntegrationTest { private static final Path WILDFLY_HOME = EnvironmentUtils.getWildFlyHome(); private static final Map PATH_ROLE_MAP = new LinkedHashMap() {{ try { - put("//" + new URI(SecurityUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS).getPath(), BasicSecurityDomainASetup.APPLICATION_ROLE); + put("//" + new URI(CXFWSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS).getPath(), BasicSecurityDomainASetup.APPLICATION_ROLE); } catch (URISyntaxException e) { throw new RuntimeException(e); } @@ -65,7 +65,7 @@ public static Archive deployment() { .create(WebArchive.class, CXFWSSpringBasicSecureProducerIntegrationTest.class.getSimpleName() + ".war") .addClasses(BasicSecurityDomainASetup.class, CXFWSSecureUtils.class, GreetingService.class, GreetingsProcessor.class); - SecurityUtils.addSpringXml(archive); + SecurityUtils.addSpringXmlWs(archive, CXFWSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS); SecurityUtils.enhanceArchive(archive, BasicSecurityDomainASetup.SECURITY_DOMAIN, BasicSecurityDomainASetup.AUTH_METHOD, PATH_ROLE_MAP); return archive; @@ -73,19 +73,19 @@ public static Archive deployment() { @Test public void greetAnonymous() throws Exception { - CXFWSSecureUtils.assertGreet(WILDFLY_HOME, SecurityUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, null, null, 401, null); + CXFWSSecureUtils.assertGreet(WILDFLY_HOME, CXFWSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, null, null, 401, null); } @Test public void greetBasicGoodUser() throws Exception { - CXFWSSecureUtils.assertGreet(WILDFLY_HOME, SecurityUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, + CXFWSSecureUtils.assertGreet(WILDFLY_HOME, CXFWSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, BasicSecurityDomainASetup.APPLICATION_USER, BasicSecurityDomainASetup.APPLICATION_PASSWORD, 200, "Hi Joe"); } @Test public void greetBasicBadUser() throws Exception { - CXFWSSecureUtils.assertGreet(WILDFLY_HOME, SecurityUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, + CXFWSSecureUtils.assertGreet(WILDFLY_HOME, CXFWSSecureUtils.SPRING_CONSUMER_ENDPOINT_ADDRESS, BasicSecurityDomainASetup.APPLICATION_USER_SUB, BasicSecurityDomainASetup.APPLICATION_PASSWORD_SUB, 403, null); } diff --git a/itests/standalone/basic/src/test/resources/cxf/secure/spring/cxfrs-camel-context.xml b/itests/standalone/basic/src/test/resources/cxf/secure/spring/cxfrs-camel-context.xml new file mode 100644 index 0000000000..3832f57206 --- /dev/null +++ b/itests/standalone/basic/src/test/resources/cxf/secure/spring/cxfrs-camel-context.xml @@ -0,0 +1,40 @@ + + + + + + + + + + Hi ${body} + + + +