From e640627de96180eb86753fb64dec355aff0d4f5b Mon Sep 17 00:00:00 2001 From: James Tomson Date: Fri, 27 May 2022 12:47:15 -0400 Subject: [PATCH] Add configurable hostname lookup Signed-off-by: James Tomson --- .../org/eclipse/paho/client/mqttv3/IMqttDns.java | 8 ++++++++ .../paho/client/mqttv3/MqttConnectOptions.java | 14 ++++++++++++++ .../client/mqttv3/internal/SSLNetworkModule.java | 5 +++-- .../mqttv3/internal/SSLNetworkModuleFactory.java | 2 +- .../client/mqttv3/internal/TCPNetworkModule.java | 16 +++++++++++++--- .../mqttv3/internal/TCPNetworkModuleFactory.java | 2 +- .../websocket/WebSocketNetworkModule.java | 5 +++-- .../websocket/WebSocketNetworkModuleFactory.java | 2 +- .../websocket/WebSocketSecureNetworkModule.java | 5 +++-- .../WebSocketSecureNetworkModuleFactory.java | 2 +- 10 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/IMqttDns.java diff --git a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/IMqttDns.java b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/IMqttDns.java new file mode 100644 index 000000000..d1b7e29a3 --- /dev/null +++ b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/IMqttDns.java @@ -0,0 +1,8 @@ +package org.eclipse.paho.client.mqttv3; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +public interface IMqttDns { + InetAddress lookup(String host) throws UnknownHostException; +} diff --git a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/MqttConnectOptions.java b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/MqttConnectOptions.java index 78c966eea..b2b9e3cf3 100644 --- a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/MqttConnectOptions.java +++ b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/MqttConnectOptions.java @@ -74,6 +74,7 @@ public class MqttConnectOptions { private boolean automaticReconnect = false; private int maxReconnectDelay = 128000; private Properties customWebSocketHeaders = null; + private IMqttDns dns = null; // Client Operation Parameters private int executorServiceTimeout = 1; // How long to wait in seconds when terminating the executor service. @@ -646,6 +647,14 @@ public int getExecutorServiceTimeout() { return executorServiceTimeout; } + public IMqttDns getDns() { + return dns; + } + + public void setDns(IMqttDns dns) { + this.dns = dns; + } + /** * Set the time in seconds that the executor service should wait when * terminating before forcefully terminating. It is not recommended to change @@ -679,6 +688,11 @@ public Properties getDebug() { } else { p.put("SSLProperties", getSSLProperties()); } + if (getDns() == null) { + p.put("Dns", strNull); + } else { + p.put("Dns", getDns()); + } return p; } diff --git a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/SSLNetworkModule.java b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/SSLNetworkModule.java index 56baaa321..08ae9c3e1 100644 --- a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/SSLNetworkModule.java +++ b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/SSLNetworkModule.java @@ -30,6 +30,7 @@ import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; +import org.eclipse.paho.client.mqttv3.IMqttDns; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.logging.Logger; import org.eclipse.paho.client.mqttv3.logging.LoggerFactory; @@ -64,8 +65,8 @@ public class SSLNetworkModule extends TCPNetworkModule { * @param resourceContext * Resource Context */ - public SSLNetworkModule(SSLSocketFactory factory, String host, int port, String resourceContext) { - super(factory, host, port, resourceContext); + public SSLNetworkModule(SSLSocketFactory factory, String host, int port, String resourceContext, IMqttDns dns) { + super(factory, host, port, resourceContext, dns); this.host = host; this.port = port; log.setResourceName(resourceContext); diff --git a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/SSLNetworkModuleFactory.java b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/SSLNetworkModuleFactory.java index 96ae75c84..3e693139b 100644 --- a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/SSLNetworkModuleFactory.java +++ b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/SSLNetworkModuleFactory.java @@ -71,7 +71,7 @@ public NetworkModule createNetworkModule(URI brokerUri, MqttConnectOptions optio } // Create the network module... - SSLNetworkModule netModule = new SSLNetworkModule((SSLSocketFactory) factory, host, port, clientId); + SSLNetworkModule netModule = new SSLNetworkModule((SSLSocketFactory) factory, host, port, clientId, options.getDns()); netModule.setSSLhandshakeTimeout(options.getConnectionTimeout()); netModule.setSSLHostnameVerifier(options.getSSLHostnameVerifier()); netModule.setHttpsHostnameVerificationEnabled(options.isHttpsHostnameVerificationEnabled()); diff --git a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/TCPNetworkModule.java b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/TCPNetworkModule.java index ddcff906a..cf034e97a 100644 --- a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/TCPNetworkModule.java +++ b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/TCPNetworkModule.java @@ -22,9 +22,11 @@ import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; +import java.net.InetAddress; import javax.net.SocketFactory; +import org.eclipse.paho.client.mqttv3.IMqttDns; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.logging.Logger; import org.eclipse.paho.client.mqttv3.logging.LoggerFactory; @@ -41,6 +43,7 @@ public class TCPNetworkModule implements NetworkModule { private String host; private int port; private int conTimeout; + private IMqttDns dns; /** * Constructs a new TCPNetworkModule using the specified host and @@ -50,13 +53,14 @@ public class TCPNetworkModule implements NetworkModule { * @param host The server hostname * @param port The server port * @param resourceContext The Resource Context + * @param dns the {@link IMqttDns} to be used for hostname lookup */ - public TCPNetworkModule(SocketFactory factory, String host, int port, String resourceContext) { + public TCPNetworkModule(SocketFactory factory, String host, int port, String resourceContext, IMqttDns dns) { log.setResourceName(resourceContext); this.factory = factory; this.host = host; this.port = port; - + this.dns = dns; } /** @@ -69,7 +73,13 @@ public void start() throws IOException, MqttException { try { // @TRACE 252=connect to host {0} port {1} timeout {2} log.fine(CLASS_NAME,methodName, "252", new Object[] {host, Integer.valueOf(port), Long.valueOf(conTimeout*1000)}); - SocketAddress sockaddr = new InetSocketAddress(host, port); + final SocketAddress sockaddr; + if (dns != null) { + InetAddress inetAddr = dns.lookup(host); + sockaddr = new InetSocketAddress(inetAddr, port); + } else { + sockaddr = new InetSocketAddress(host, port); // default system resolver + } socket = factory.createSocket(); socket.connect(sockaddr, conTimeout*1000); socket.setSoTimeout(1000); diff --git a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/TCPNetworkModuleFactory.java b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/TCPNetworkModuleFactory.java index b75441a6e..17e901e6b 100644 --- a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/TCPNetworkModuleFactory.java +++ b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/TCPNetworkModuleFactory.java @@ -56,7 +56,7 @@ public NetworkModule createNetworkModule(URI brokerUri, MqttConnectOptions optio } else if (factory instanceof SSLSocketFactory) { throw ExceptionHelper.createMqttException(MqttException.REASON_CODE_SOCKET_FACTORY_MISMATCH); } - TCPNetworkModule networkModule = new TCPNetworkModule(factory, host, port, clientId); + TCPNetworkModule networkModule = new TCPNetworkModule(factory, host, port, clientId, options.getDns()); networkModule.setConnectTimeout(options.getConnectionTimeout()); return networkModule; } diff --git a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketNetworkModule.java b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketNetworkModule.java index 9d0bab4c8..dc16e0936 100644 --- a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketNetworkModule.java +++ b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketNetworkModule.java @@ -25,6 +25,7 @@ import javax.net.SocketFactory; +import org.eclipse.paho.client.mqttv3.IMqttDns; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule; import org.eclipse.paho.client.mqttv3.logging.Logger; @@ -50,8 +51,8 @@ public class WebSocketNetworkModule extends TCPNetworkModule { */ private ByteArrayOutputStream outputStream = new ExtendedByteArrayOutputStream(this); - public WebSocketNetworkModule(SocketFactory factory, String uri, String host, int port, String resourceContext, Properties customWebsocketHeaders){ - super(factory, host, port, resourceContext); + public WebSocketNetworkModule(SocketFactory factory, String uri, String host, int port, String resourceContext, Properties customWebsocketHeaders, IMqttDns dns){ + super(factory, host, port, resourceContext, dns); this.uri = uri; this.host = host; this.port = port; diff --git a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketNetworkModuleFactory.java b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketNetworkModuleFactory.java index 45d292c55..5550530df 100644 --- a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketNetworkModuleFactory.java +++ b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketNetworkModuleFactory.java @@ -52,7 +52,7 @@ public NetworkModule createNetworkModule(URI brokerUri, MqttConnectOptions optio throw ExceptionHelper.createMqttException(MqttException.REASON_CODE_SOCKET_FACTORY_MISMATCH); } WebSocketNetworkModule netModule = new WebSocketNetworkModule(factory, brokerUri.toString(), host, port, - clientId, options.getCustomWebSocketHeaders()); + clientId, options.getCustomWebSocketHeaders(), options.getDns()); netModule.setConnectTimeout(options.getConnectionTimeout()); return netModule; } diff --git a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketSecureNetworkModule.java b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketSecureNetworkModule.java index 6dccff257..41f76b872 100644 --- a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketSecureNetworkModule.java +++ b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketSecureNetworkModule.java @@ -24,6 +24,7 @@ import java.util.Properties; import javax.net.ssl.SSLSocketFactory; +import org.eclipse.paho.client.mqttv3.IMqttDns; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.internal.SSLNetworkModule; import org.eclipse.paho.client.mqttv3.logging.Logger; @@ -49,8 +50,8 @@ public class WebSocketSecureNetworkModule extends SSLNetworkModule{ */ private ByteArrayOutputStream outputStream = new ExtendedByteArrayOutputStream(this); - public WebSocketSecureNetworkModule(SSLSocketFactory factory, String uri, String host, int port, String clientId, Properties customWebSocketHeaders) { - super(factory, host, port, clientId); + public WebSocketSecureNetworkModule(SSLSocketFactory factory, String uri, String host, int port, String clientId, IMqttDns dns, Properties customWebSocketHeaders) { + super(factory, host, port, clientId, dns); this.uri = uri; this.host = host; this.port = port; diff --git a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketSecureNetworkModuleFactory.java b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketSecureNetworkModuleFactory.java index bd364cf05..d0a0c6c57 100644 --- a/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketSecureNetworkModuleFactory.java +++ b/org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/internal/websocket/WebSocketSecureNetworkModuleFactory.java @@ -64,7 +64,7 @@ public NetworkModule createNetworkModule(URI brokerUri, MqttConnectOptions optio // Create the network module... WebSocketSecureNetworkModule netModule = new WebSocketSecureNetworkModule((SSLSocketFactory) factory, - brokerUri.toString(), host, port, clientId, options.getCustomWebSocketHeaders()); + brokerUri.toString(), host, port, clientId, options.getDns(), options.getCustomWebSocketHeaders()); netModule.setSSLhandshakeTimeout(options.getConnectionTimeout()); netModule.setSSLHostnameVerifier(options.getSSLHostnameVerifier()); netModule.setHttpsHostnameVerificationEnabled(options.isHttpsHostnameVerificationEnabled());