This is an automated email from the ASF dual-hosted git repository. coheigea pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit e650ce4ce422edfcc25175905a8d5a89c05ca65e Author: Colm O hEigeartaigh <cohei...@apache.org> AuthorDate: Fri May 3 10:21:54 2019 +0100 CAMEL-13471 - Added TLS + TCP support --- .../java/org/apache/camel/coap/CoAPComponent.java | 25 ++++++++++++++++++++-- .../java/org/apache/camel/coap/CoAPEndpoint.java | 6 +++--- .../java/org/apache/camel/coap/CoAPProducer.java | 17 +++++++++++++-- .../apache/camel/coap/CoAPComponentTLSTest.java | 21 ++++++++++++++++++ 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java index 2f0b2dc..b82b323 100644 --- a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java +++ b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java @@ -18,11 +18,14 @@ package org.apache.camel.coap; import java.io.IOException; import java.net.InetSocketAddress; +import java.security.GeneralSecurityException; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import javax.net.ssl.SSLContext; + import org.apache.camel.CamelContext; import org.apache.camel.Consumer; import org.apache.camel.Endpoint; @@ -39,6 +42,7 @@ import org.eclipse.californium.core.CoapServer; import org.eclipse.californium.core.network.CoapEndpoint; import org.eclipse.californium.core.network.config.NetworkConfig; import org.eclipse.californium.elements.tcp.TcpServerConnector; +import org.eclipse.californium.elements.tcp.TlsServerConnector; import org.eclipse.californium.scandium.DTLSConnector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,7 +60,7 @@ public class CoAPComponent extends DefaultComponent implements RestConsumerFacto public CoAPComponent() { } - public synchronized CoapServer getServer(int port, CoAPEndpoint endpoint) throws IOException { + public synchronized CoapServer getServer(int port, CoAPEndpoint endpoint) throws IOException, GeneralSecurityException { CoapServer server = servers.get(port); if (server == null && port == -1) { server = getServer(DEFAULT_PORT, endpoint); @@ -74,7 +78,24 @@ public class CoAPComponent extends DefaultComponent implements RestConsumerFacto } else if (CoAPEndpoint.enableTCP(endpoint.getUri())) { int tcpThreads = config.getInt(NetworkConfig.Keys.TCP_WORKER_THREADS); int tcpIdleTimeout = config.getInt(NetworkConfig.Keys.TCP_CONNECTION_IDLE_TIMEOUT); - TcpServerConnector tcpConnector = new TcpServerConnector(address, tcpThreads, tcpIdleTimeout); + + TcpServerConnector tcpConnector = null; + // TLS + TCP + if (endpoint.getUri().getScheme().startsWith("coaps")) { + int tlsHandshakeTimeout = config.getInt(NetworkConfig.Keys.TLS_HANDSHAKE_TIMEOUT); + + SSLContext sslContext = endpoint.getSslContextParameters().createSSLContext(getCamelContext()); + TlsServerConnector.ClientAuthMode clientAuthMode = TlsServerConnector.ClientAuthMode.NONE; + if (endpoint.isClientAuthenticationRequired()) { + clientAuthMode = TlsServerConnector.ClientAuthMode.NEEDED; + } else if (endpoint.isClientAuthenticationWanted()) { + clientAuthMode = TlsServerConnector.ClientAuthMode.WANTED; + } + tcpConnector = + new TlsServerConnector(sslContext, clientAuthMode, address, tcpThreads, tlsHandshakeTimeout, tcpIdleTimeout); + } else { + tcpConnector = new TcpServerConnector(address, tcpThreads, tcpIdleTimeout); + } coapBuilder.setConnector(tcpConnector); } else { coapBuilder.setInetSocketAddress(address); diff --git a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPEndpoint.java b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPEndpoint.java index 04d67ae..d940ca1 100644 --- a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPEndpoint.java +++ b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPEndpoint.java @@ -126,7 +126,7 @@ public class CoAPEndpoint extends DefaultEndpoint { return uri; } - public CoapServer getCoapServer() throws IOException { + public CoapServer getCoapServer() throws IOException, GeneralSecurityException { return component.getServer(getUri().getPort(), this); } @@ -270,7 +270,7 @@ public class CoAPEndpoint extends DefaultEndpoint { this.clientAuthentication = clientAuthentication; } - private boolean isClientAuthenticationRequired() { + public boolean isClientAuthenticationRequired() { String clientAuth = clientAuthentication; if (clientAuth == null && sslContextParameters != null && sslContextParameters.getServerParameters() != null) { clientAuth = sslContextParameters.getServerParameters().getClientAuthentication(); @@ -279,7 +279,7 @@ public class CoAPEndpoint extends DefaultEndpoint { return clientAuth != null && ClientAuthentication.valueOf(clientAuth) == ClientAuthentication.REQUIRE; } - private boolean isClientAuthenticationWanted() { + public boolean isClientAuthenticationWanted() { String clientAuth = clientAuthentication; if (clientAuth == null && sslContextParameters != null && sslContextParameters.getServerParameters() != null) { clientAuth = sslContextParameters.getServerParameters().getClientAuthentication(); diff --git a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java index 8e001e1..5b834da 100644 --- a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java +++ b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java @@ -18,6 +18,9 @@ package org.apache.camel.coap; import java.io.IOException; import java.net.URI; +import java.security.GeneralSecurityException; + +import javax.net.ssl.SSLContext; import org.apache.camel.Exchange; import org.apache.camel.Message; @@ -28,6 +31,7 @@ import org.eclipse.californium.core.coap.MediaTypeRegistry; import org.eclipse.californium.core.network.CoapEndpoint; import org.eclipse.californium.core.network.config.NetworkConfig; import org.eclipse.californium.elements.tcp.TcpClientConnector; +import org.eclipse.californium.elements.tcp.TlsClientConnector; import org.eclipse.californium.scandium.DTLSConnector; /** @@ -89,7 +93,7 @@ public class CoAPProducer extends DefaultProducer { } } - private synchronized CoapClient getClient(Exchange exchange) throws IOException { + private synchronized CoapClient getClient(Exchange exchange) throws IOException, GeneralSecurityException { if (client == null) { URI uri = exchange.getIn().getHeader(CoAPConstants.COAP_URI, URI.class); if (uri == null) { @@ -109,7 +113,16 @@ public class CoAPProducer extends DefaultProducer { int tcpThreads = config.getInt(NetworkConfig.Keys.TCP_WORKER_THREADS); int tcpConnectTimeout = config.getInt(NetworkConfig.Keys.TCP_CONNECT_TIMEOUT); int tcpIdleTimeout = config.getInt(NetworkConfig.Keys.TCP_CONNECTION_IDLE_TIMEOUT); - TcpClientConnector tcpConnector = new TcpClientConnector(tcpThreads, tcpConnectTimeout, tcpIdleTimeout); + TcpClientConnector tcpConnector = null; + + // TLS + TCP + if (endpoint.getUri().getScheme().startsWith("coaps")) { + SSLContext sslContext = endpoint.getSslContextParameters().createSSLContext(endpoint.getCamelContext()); + tcpConnector = new TlsClientConnector(sslContext, tcpThreads, tcpConnectTimeout, tcpIdleTimeout); + } else { + tcpConnector = new TcpClientConnector(tcpThreads, tcpConnectTimeout, tcpIdleTimeout); + } + CoapEndpoint.Builder tcpBuilder = new CoapEndpoint.Builder(); tcpBuilder.setConnector(tcpConnector); diff --git a/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTLSTest.java b/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTLSTest.java index 058ac66..1257b66 100644 --- a/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTLSTest.java +++ b/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTLSTest.java @@ -53,6 +53,7 @@ public class CoAPComponentTLSTest extends CamelTestSupport { private static final int PORT6 = AvailablePortFinder.getNextAvailable(); private static final int PORT7 = AvailablePortFinder.getNextAvailable(); private static final int PORT8 = AvailablePortFinder.getNextAvailable(); + private static final int PORT9 = AvailablePortFinder.getNextAvailable(); @Test public void testSuccessfulCall() throws Exception { @@ -193,6 +194,18 @@ public class CoAPComponentTLSTest extends CamelTestSupport { assertMockEndpointsSatisfied(); } + @Test + public void testTCP() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMinimumMessageCount(1); + mock.expectedBodiesReceived("Hello Camel CoAP"); + mock.expectedHeaderReceived(Exchange.CONTENT_TYPE, MediaTypeRegistry.toString(MediaTypeRegistry.APPLICATION_OCTET_STREAM)); + mock.expectedHeaderReceived(CoAPConstants.COAP_RESPONSE_CODE, CoAP.ResponseCode.CONTENT.toString()); + sendBodyAndHeader("direct:tcp", "Camel CoAP", CoAPConstants.COAP_METHOD, "POST"); + assertMockEndpointsSatisfied(); + } + + @Override protected RouteBuilder createRouteBuilder() throws Exception { @@ -226,6 +239,9 @@ public class CoAPComponentTLSTest extends CamelTestSupport { fromF("coaps://localhost:%d/TestResource?sslContextParameters=#serviceSSLContextParameters&pskStore=#pskStore", PORT8) .transform(body().prepend("Hello ")); + fromF("coaps+tcp://localhost:%d/TestResource?sslContextParameters=#serviceSSLContextParameters", PORT9) + .transform(body().prepend("Hello ")); + from("direct:start") .toF("coaps://localhost:%d/TestResource?sslContextParameters=#clientSSLContextParameters", PORT) .to("mock:result"); @@ -281,6 +297,11 @@ public class CoAPComponentTLSTest extends CamelTestSupport { from("direct:pskx509") .toF("coaps://localhost:%d/TestResource?pskStore=#pskStore&sslContextParameters=#clientSSLContextParameters", PORT8) .to("mock:result"); + + from("direct:tcp") + .toF("coaps+tcp://localhost:%d/TestResource?sslContextParameters=#clientSSLContextParameters", PORT9) + .to("mock:result"); + } }; }