This is an automated email from the ASF dual-hosted git repository.
jbertram pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
The following commit(s) were added to refs/heads/main by this push:
new 4d46588cdf ARTEMIS-4174 Listen only to provided connector-host for JMX
RMI sockets
new 791fb7fd7b This closes #4374
4d46588cdf is described below
commit 4d46588cdf87f2c00e27cc1122ac1118aad0aeb2
Author: Marvin Blauth <[email protected]>
AuthorDate: Fri Feb 17 17:40:53 2023 +0100
ARTEMIS-4174 Listen only to provided connector-host for JMX RMI sockets
---
.../server/management/ManagementConnector.java | 1 +
.../core/server/management/RmiRegistryFactory.java | 50 ++++++++++++++++++++-
.../server/management/JMXRMIRegistryPortTest.java | 52 ++++++++++++++++++++++
3 files changed, 102 insertions(+), 1 deletion(-)
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementConnector.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementConnector.java
index 8b8aecbe68..b75159d6e1 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementConnector.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementConnector.java
@@ -55,6 +55,7 @@ public class ManagementConnector implements ActiveMQComponent
{
public void start() throws Exception {
rmiRegistryFactory = new RmiRegistryFactory();
rmiRegistryFactory.setPort(configuration.getConnectorPort());
+ rmiRegistryFactory.setHost(configuration.getConnectorHost());
rmiRegistryFactory.init();
mbeanServerFactory = new MBeanServerFactory();
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/RmiRegistryFactory.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/RmiRegistryFactory.java
index 4c5cab2e95..dd0d87ded5 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/RmiRegistryFactory.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/RmiRegistryFactory.java
@@ -16,16 +16,26 @@
*/
package org.apache.activemq.artemis.core.server.management;
+import javax.net.ServerSocketFactory;
+import javax.net.SocketFactory;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
import java.net.UnknownHostException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
+import java.rmi.server.RMIClientSocketFactory;
+import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.UnicastRemoteObject;
public class RmiRegistryFactory {
private int port = Registry.REGISTRY_PORT;
private Registry registry;
+ private String host;
+ private HostLimitedServerSocketFactory socketFactory;
/**
* @return the port
*/
@@ -40,12 +50,50 @@ public class RmiRegistryFactory {
this.port = port;
}
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ /**
+ * Create a server socket for testing purposes.
+ */
+ ServerSocket createTestSocket() throws IOException {
+ return socketFactory.createServerSocket(1100);
+ }
+
public Object getObject() throws Exception {
return registry;
}
+ class HostLimitedServerSocketFactory implements RMIServerSocketFactory {
+ @Override
+ public ServerSocket createServerSocket(int port) throws IOException {
+ InetAddress hostAddress;
+ if (host != null) {
+ hostAddress = InetAddress.getByName(host);
+ } else {
+ hostAddress = null; // accept connections on all local addresses
+ }
+ return ServerSocketFactory.getDefault().createServerSocket(port, 0,
hostAddress);
+ }
+ }
+
+ private static class PassThroughToDefaultSocketFactory implements
RMIClientSocketFactory {
+ @Override
+ public Socket createSocket(String host, int port) throws IOException {
+ return SocketFactory.getDefault().createSocket(host, port);
+ }
+ }
+
public void init() throws RemoteException, UnknownHostException {
- registry = LocateRegistry.createRegistry(port);
+ socketFactory = new HostLimitedServerSocketFactory();
+ registry = LocateRegistry.createRegistry(port,
+ new PassThroughToDefaultSocketFactory(),
+ socketFactory);
}
public void destroy() throws RemoteException {
diff --git
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/management/JMXRMIRegistryPortTest.java
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/management/JMXRMIRegistryPortTest.java
new file mode 100644
index 0000000000..9e3ac560d4
--- /dev/null
+++
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/management/JMXRMIRegistryPortTest.java
@@ -0,0 +1,52 @@
+package org.apache.activemq.artemis.core.server.management;
+
+import org.apache.activemq.artemis.core.config.JMXConnectorConfiguration;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+
+public class JMXRMIRegistryPortTest {
+
+ @Test
+ public void explicitLocalhostRegistry() throws IOException {
+ RmiRegistryFactory registryFactory = new RmiRegistryFactory();
+ registryFactory.setHost("localhost");
+ registryFactory.setPort(1099);
+ registryFactory.init();
+ try (ServerSocket testSocket = registryFactory.createTestSocket()) {
+ Assert.assertEquals(InetAddress.getByName("localhost"),
+ testSocket.getInetAddress());
+ }
+ registryFactory.destroy();
+ }
+
+ @Test
+ public void unlimitedHostRegistry() throws IOException {
+ RmiRegistryFactory registryFactory = new RmiRegistryFactory();
+ registryFactory.setHost(null);
+ registryFactory.setPort(1099);
+ registryFactory.init();
+ try (ServerSocket testSocket = registryFactory.createTestSocket()) {
+ Assert.assertEquals(InetAddress.getByAddress(new byte[] { 0, 0, 0,
0 }),
+ testSocket.getInetAddress());
+ }
+ registryFactory.destroy();
+ }
+
+ @Test
+ public void defaultRegistry() throws IOException {
+ RmiRegistryFactory registryFactory = new RmiRegistryFactory();
+ JMXConnectorConfiguration configuration = new
JMXConnectorConfiguration();
+ registryFactory.setHost(configuration.getConnectorHost());
+ registryFactory.setPort(configuration.getConnectorPort());
+ registryFactory.init();
+ try (ServerSocket testSocket = registryFactory.createTestSocket()) {
+ Assert.assertEquals(InetAddress.getByName("localhost"),
+ testSocket.getInetAddress());
+ }
+ registryFactory.destroy();
+ }
+}