This is an automated email from the ASF dual-hosted git repository.

tabish 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 3a10faa949 ARTEMIS-5465 Resolve USER_NAME key with 
TextFileCertificateLoginModule
3a10faa949 is described below

commit 3a10faa94908b83d58e5e5ccd15708570bfcb5e4
Author: Domenico Francesco Bruscino <[email protected]>
AuthorDate: Thu May 29 11:44:05 2025 +0200

    ARTEMIS-5465 Resolve USER_NAME key with TextFileCertificateLoginModule
---
 .../protocol/amqp/proton/AMQPRoutingContext.java   |   2 +-
 .../core/protocol/mqtt/MQTTProtocolHandler.java    |   2 +-
 .../core/protocol/mqtt/MQTTRoutingContext.java     |   5 +-
 .../core/protocol/mqtt/MQTTRoutingHandler.java     |   5 +-
 .../protocol/openwire/OpenWireRoutingContext.java  |   3 +-
 .../protocol/core/impl/ActiveMQPacketHandler.java  |   2 +-
 .../protocol/core/impl/ActiveMQRoutingContext.java |   5 +-
 .../protocol/core/impl/ActiveMQRoutingHandler.java |   5 +-
 .../tests/integration/routing/KeyTypeTest.java     | 166 +++++++++++++++------
 .../tests/integration/routing/RoutingTestBase.java |  35 ++++-
 10 files changed, 164 insertions(+), 66 deletions(-)

diff --git 
a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRoutingContext.java
 
b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRoutingContext.java
index 6cfc8e4b0f..acfd9fb94c 100644
--- 
a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRoutingContext.java
+++ 
b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRoutingContext.java
@@ -30,7 +30,7 @@ public class AMQPRoutingContext extends RoutingContext {
 
    public AMQPRoutingContext(AMQPConnectionContext connectionContext, 
Connection protonConnection) {
       
super(connectionContext.getConnectionCallback().getProtonConnectionDelegate(), 
connectionContext.getRemoteContainer(),
-         connectionContext.getSASLResult() != null ? 
connectionContext.getSASLResult().getUser() : null);
+              connectionContext.getValidatedUser() != null ? 
connectionContext.getValidatedUser() : connectionContext.getUser());
       this.protonConnection = protonConnection;
    }
 }
diff --git 
a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolHandler.java
 
b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolHandler.java
index 484537578d..c6da66b0bf 100644
--- 
a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolHandler.java
+++ 
b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolHandler.java
@@ -259,7 +259,7 @@ public class MQTTProtocolHandler extends 
ChannelInboundHandlerAdapter {
          
protocolManager.getStateManager().addConnectedClient(session.getConnection().getClientID(),
 session.getConnection());
       }
 
-      if (connection.getTransportConnection().getRouter() == null || 
!protocolManager.getRoutingHandler().route(connection, session, connect)) {
+      if (connection.getTransportConnection().getRouter() == null || 
!protocolManager.getRoutingHandler().route(connection, session, 
validationData.getB() != null ? validationData.getB() : username)) {
          calculateKeepAlive(connect);
 
          session.getConnectionManager().connect(connect, 
validationData.getB(), username, password);
diff --git 
a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingContext.java
 
b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingContext.java
index 985205b8c3..cb09b14867 100644
--- 
a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingContext.java
+++ 
b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingContext.java
@@ -16,7 +16,6 @@
  */
 package org.apache.activemq.artemis.core.protocol.mqtt;
 
-import io.netty.handler.codec.mqtt.MqttConnectMessage;
 import org.apache.activemq.artemis.core.server.routing.RoutingContext;
 
 public class MQTTRoutingContext extends RoutingContext {
@@ -29,8 +28,8 @@ public class MQTTRoutingContext extends RoutingContext {
    }
 
 
-   public MQTTRoutingContext(MQTTConnection mqttConnection, MQTTSession 
mqttSession, MqttConnectMessage connect) {
-      super(mqttConnection, mqttConnection.getClientID(), 
connect.payload().userName());
+   public MQTTRoutingContext(MQTTConnection mqttConnection, MQTTSession 
mqttSession, String username) {
+      super(mqttConnection, mqttConnection.getClientID(), username);
       this.mqttSession = mqttSession;
    }
 }
diff --git 
a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingHandler.java
 
b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingHandler.java
index a66e3cf241..0d6ac484cf 100644
--- 
a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingHandler.java
+++ 
b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingHandler.java
@@ -16,7 +16,6 @@
  */
 package org.apache.activemq.artemis.core.protocol.mqtt;
 
-import io.netty.handler.codec.mqtt.MqttConnectMessage;
 import io.netty.handler.codec.mqtt.MqttProperties;
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
@@ -31,8 +30,8 @@ public class MQTTRoutingHandler extends 
RoutingHandler<MQTTRoutingContext> {
       super(server);
    }
 
-   public boolean route(MQTTConnection mqttConnection, MQTTSession 
mqttSession, MqttConnectMessage connect) throws Exception {
-      return route(new MQTTRoutingContext(mqttConnection, mqttSession, 
connect));
+   public boolean route(MQTTConnection mqttConnection, MQTTSession 
mqttSession, String username) throws Exception {
+      return route(new MQTTRoutingContext(mqttConnection, mqttSession, 
username));
    }
 
    @Override
diff --git 
a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRoutingContext.java
 
b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRoutingContext.java
index 2af059e282..32177cfc8d 100644
--- 
a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRoutingContext.java
+++ 
b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRoutingContext.java
@@ -30,7 +30,8 @@ public class OpenWireRoutingContext extends RoutingContext {
 
 
    public OpenWireRoutingContext(OpenWireConnection openWireConnection, 
ConnectionInfo connectionInfo) {
-      super(openWireConnection.getRemotingConnection(), 
connectionInfo.getClientId(), connectionInfo.getUserName());
+      super(openWireConnection.getRemotingConnection(), 
connectionInfo.getClientId(),
+              openWireConnection.getValidatedUser() != null ? 
openWireConnection.getValidatedUser() : connectionInfo.getUserName());
       this.openWireConnection = openWireConnection;
    }
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java
index 9854ec3786..87fc1c00c1 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java
@@ -182,7 +182,7 @@ public class ActiveMQPacketHandler implements 
ChannelHandler {
 
          final String validatedUser = server.validateUser(activeMQPrincipal == 
null ? request.getUsername() : activeMQPrincipal.getUserName(), 
activeMQPrincipal == null ? request.getPassword() : 
activeMQPrincipal.getPassword(), connection, 
protocolManager.getSecurityDomain());
          if (connection.getTransportConnection().getRouter() != null) {
-            protocolManager.getRoutingHandler().route(connection, request);
+            protocolManager.getRoutingHandler().route(connection, 
validatedUser != null ? validatedUser : request.getUsername());
          }
 
          OperationContext sessionOperationContext = 
server.newOperationContext();
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingContext.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingContext.java
index 6e2939dd7e..5ebf05f591 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingContext.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingContext.java
@@ -17,11 +17,10 @@
 package org.apache.activemq.artemis.core.protocol.core.impl;
 
 import org.apache.activemq.artemis.core.protocol.core.CoreRemotingConnection;
-import 
org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateSessionMessage;
 import org.apache.activemq.artemis.core.server.routing.RoutingContext;
 
 public class ActiveMQRoutingContext extends RoutingContext {
-   public ActiveMQRoutingContext(CoreRemotingConnection connection, 
CreateSessionMessage message) {
-      super(connection, connection.getClientID(), message.getUsername());
+   public ActiveMQRoutingContext(CoreRemotingConnection connection, String 
username) {
+      super(connection, connection.getClientID(), username);
    }
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingHandler.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingHandler.java
index 6011ec8d3a..05e215958c 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingHandler.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingHandler.java
@@ -18,7 +18,6 @@ package org.apache.activemq.artemis.core.protocol.core.impl;
 
 import org.apache.activemq.artemis.api.core.DisconnectReason;
 import org.apache.activemq.artemis.core.protocol.core.CoreRemotingConnection;
-import 
org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateSessionMessage;
 import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.routing.RoutingHandler;
@@ -29,12 +28,12 @@ public class ActiveMQRoutingHandler extends 
RoutingHandler<ActiveMQRoutingContex
       super(server);
    }
 
-   public boolean route(CoreRemotingConnection connection, 
CreateSessionMessage message) throws Exception {
+   public boolean route(CoreRemotingConnection connection, String username) 
throws Exception {
       if (!connection.isVersionSupportRouting()) {
          throw ActiveMQMessageBundle.BUNDLE.incompatibleClientServer();
       }
 
-      return route(new ActiveMQRoutingContext(connection, message));
+      return route(new ActiveMQRoutingContext(connection, username));
    }
 
    @Override
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/KeyTypeTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/KeyTypeTest.java
index 1cd8f99c28..5bfddae8f1 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/KeyTypeTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/KeyTypeTest.java
@@ -36,22 +36,33 @@ import 
org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager
 import 
org.apache.activemq.artemis.tests.extensions.parameterized.ParameterizedTestExtension;
 import org.apache.activemq.artemis.tests.extensions.parameterized.Parameters;
 import org.apache.activemq.artemis.tests.integration.security.SecurityTest;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.TestTemplate;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 import javax.jms.Connection;
 import javax.jms.ConnectionFactory;
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManagerFactory;
 import java.lang.management.ManagementFactory;
 import java.net.InetAddress;
 import java.net.URL;
 import java.net.UnknownHostException;
+import java.security.KeyStore;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.UUID;
 import java.util.stream.Collectors;
 
 @ExtendWith(ParameterizedTestExtension.class)
@@ -63,7 +74,7 @@ public class KeyTypeTest extends RoutingTestBase {
    public static Collection<Object[]> data() {
       Collection<Object[]> data = new ArrayList<>();
 
-      for (String protocol : Arrays.asList(new String[] {AMQP_PROTOCOL, 
CORE_PROTOCOL, OPENWIRE_PROTOCOL})) {
+      for (String protocol : Arrays.asList(AMQP_PROTOCOL, CORE_PROTOCOL, 
MQTT_PROTOCOL, OPENWIRE_PROTOCOL)) {
          data.add(new Object[] {protocol});
       }
 
@@ -107,14 +118,8 @@ public class KeyTypeTest extends RoutingTestBase {
       setupRouterServerWithDiscovery(0, KeyType.CLIENT_ID, MOCK_POLICY_NAME, 
null, true, null, 1);
       startServers(0);
 
-      ConnectionFactory connectionFactory = createFactory(protocol, false, 
TransportConstants.DEFAULT_HOST,
-         TransportConstants.DEFAULT_PORT + 0, "test", null, null);
-
-      keys.clear();
-
-      try (Connection connection = connectionFactory.createConnection()) {
-         connection.start();
-      }
+      testConnection(TransportConstants.DEFAULT_HOST, 
TransportConstants.DEFAULT_PORT + 0,
+              "test", null, null, false, false, -1);
 
       assertEquals(1, keys.size());
       assertEquals("test", keys.get(0));
@@ -146,14 +151,8 @@ public class KeyTypeTest extends RoutingTestBase {
 
       waitForFailoverTopology(1);
 
-      ConnectionFactory connectionFactory = createFactory(protocol, false, 
TransportConstants.DEFAULT_HOST,
-                                                          
TransportConstants.DEFAULT_PORT + 1, "test", null, null);
-
-      keys.clear();
-
-      try (Connection connection = connectionFactory.createConnection()) {
-         connection.start();
-      }
+      testConnection(TransportConstants.DEFAULT_HOST, 
TransportConstants.DEFAULT_PORT + 1,
+              "test", null, null, false, false, -1);
 
       assertEquals(1, keys.size());
       assertEquals("test", keys.get(0));
@@ -181,12 +180,8 @@ public class KeyTypeTest extends RoutingTestBase {
       setupRouterServerWithDiscovery(0, KeyType.SNI_HOST, MOCK_POLICY_NAME, 
null, true, null, 1);
       startServers(0);
 
-      ConnectionFactory connectionFactory = createFactory(protocol, true, 
localHostname,
-         TransportConstants.DEFAULT_PORT + 0, null, null, null);
-
-      try (Connection connection = connectionFactory.createConnection()) {
-         connection.start();
-      }
+      testConnection(localHostname, TransportConstants.DEFAULT_PORT + 0,
+              null, null, null, true, false, -1);
 
       assertEquals(1, keys.size());
       assertEquals(localHostname, keys.get(0));
@@ -198,12 +193,8 @@ public class KeyTypeTest extends RoutingTestBase {
       setupRouterServerWithDiscovery(0, KeyType.SOURCE_IP, MOCK_POLICY_NAME, 
null, true, null, 1);
       startServers(0);
 
-      ConnectionFactory connectionFactory = createFactory(protocol, false, 
TransportConstants.DEFAULT_HOST,
-         TransportConstants.DEFAULT_PORT + 0, null, null, null);
-
-      try (Connection connection = connectionFactory.createConnection()) {
-         connection.start();
-      }
+      testConnection(TransportConstants.DEFAULT_HOST, 
TransportConstants.DEFAULT_PORT + 0,
+              null, null, null, false, false, -1);
 
       assertEquals(1, keys.size());
       assertEquals(InetAddress.getLoopbackAddress().getHostAddress(), 
keys.get(0));
@@ -215,17 +206,40 @@ public class KeyTypeTest extends RoutingTestBase {
       setupRouterServerWithDiscovery(0, KeyType.USER_NAME, MOCK_POLICY_NAME, 
null, true, null, 1);
       startServers(0);
 
-      ConnectionFactory connectionFactory = createFactory(protocol, false, 
TransportConstants.DEFAULT_HOST,
-         TransportConstants.DEFAULT_PORT + 0, null, "admin", "admin");
-
-      try (Connection connection = connectionFactory.createConnection()) {
-         connection.start();
-      }
+      testConnection(TransportConstants.DEFAULT_HOST, 
TransportConstants.DEFAULT_PORT + 0,
+              null, "admin", "admin", false, false, -1);
 
       assertEquals(1, keys.size());
       assertEquals("admin", keys.get(0));
    }
 
+   @TestTemplate
+   public void testUserNameKeyFromCertificate() throws Exception {
+      setupPrimaryServerWithDiscovery(0, GROUP_ADDRESS, GROUP_PORT, true, 
true, false);
+      getDefaultServerAcceptor(0).getParams().put("securityDomain", 
"CertLogin");
+      
getDefaultServerAcceptor(0).getParams().put(TransportConstants.SSL_ENABLED_PROP_NAME,
 true);
+      
getDefaultServerAcceptor(0).getParams().put(TransportConstants.KEYSTORE_PATH_PROP_NAME,
 "server-keystore.jks");
+      
getDefaultServerAcceptor(0).getParams().put(TransportConstants.KEYSTORE_PASSWORD_PROP_NAME,
 "securepass");
+      
getDefaultServerAcceptor(0).getParams().put(TransportConstants.WANT_CLIENT_AUTH_PROP_NAME,
 "true");
+      
getDefaultServerAcceptor(0).getParams().put(TransportConstants.NEED_CLIENT_AUTH_PROP_NAME,
 "true");
+      
getDefaultServerAcceptor(0).getParams().put(TransportConstants.TRUSTSTORE_PATH_PROP_NAME,
 "client-ca-truststore.jks");
+      
getDefaultServerAcceptor(0).getParams().put(TransportConstants.TRUSTSTORE_PASSWORD_PROP_NAME,
 "securepass");
+
+      getServer(0).getConfiguration().setSecurityEnabled(true);
+      getServer(0).getSecurityRepository().addMatch("#", Collections.singleton(
+              new Role("programmers", true, true, true, true, true, true, 
true, true, true, true, false, false)));
+
+      setupRouterServerWithDiscovery(0, KeyType.USER_NAME, MOCK_POLICY_NAME, 
null, true, null, 1);
+
+      startServers(0);
+
+      testConnection(TransportConstants.DEFAULT_HOST, 
TransportConstants.DEFAULT_PORT + 0,
+              null, null, null, true, true, -1);
+
+      assertEquals(1, keys.size());
+      assertEquals("first", keys.get(0));
+   }
+
    @TestTemplate
    public void testRoleNameKeyLocalTarget() throws Exception {
       ActiveMQJAASSecurityManager securityManager = new 
ActiveMQJAASSecurityManager("PropertiesLogin");
@@ -241,23 +255,83 @@ public class KeyTypeTest extends RoutingTestBase {
 
       startServers(0);
 
-      final int noRetriesSuchThatWeGetAnErrorOnRejection = 0;
-      ConnectionFactory connectionFactory = createFactory(protocol, false, 
TransportConstants.DEFAULT_HOST,
-                                                          
TransportConstants.DEFAULT_PORT + 0, null, "a", "a", 
noRetriesSuchThatWeGetAnErrorOnRejection);
-
       // expect disconnect/reject as not role b
-      try (Connection connection = connectionFactory.createConnection()) {
-         connection.start();
+      try {
+         final int noRetriesSuchThatWeGetAnErrorOnRejection = 0;
+         testConnection(TransportConstants.DEFAULT_HOST, 
TransportConstants.DEFAULT_PORT + 0,
+                 null, "a", "a", false, false, 
noRetriesSuchThatWeGetAnErrorOnRejection);
          fail("Expect to be rejected as not in role b");
       } catch (Exception expectedButNotSpecificDueToDifferentProtocolsInPlay) {
       }
 
-      connectionFactory = createFactory(protocol, false, 
TransportConstants.DEFAULT_HOST,
-                                        TransportConstants.DEFAULT_PORT + 0, 
null, "b", "b");
+      testConnection(TransportConstants.DEFAULT_HOST, 
TransportConstants.DEFAULT_PORT + 0,
+              null, "b", "b", false, false, -1);
+   }
+
+   private void testConnection(String host, int port, String clientID, String 
user, String password, boolean sslEnabled, boolean needClientAuth, int retries) 
throws Exception {
+      if (MQTT_PROTOCOL.equals(protocol)) {
+         for (int i = 0; retries == -1 || i <= retries; i++) {
+            try {
+               testMQTTConnection(host, port, clientID, user, password, 
sslEnabled, needClientAuth);
+               break;
+            } catch (Throwable t) {
+               if (i == retries)  {
+                  throw t;
+               }
+            }
+         }
+      } else {
+         ConnectionFactory connectionFactory = createFactory(protocol, 
sslEnabled, host,
+                 port, clientID, user, password, needClientAuth, retries);
+
+         try (Connection connection = connectionFactory.createConnection()) {
+            connection.start();
+         }
+      }
+   }
+
+   private void testMQTTConnection(String host, int port, String clientID, 
String user, String password, boolean sslEnabled, boolean needClientAuth) 
throws Exception {
+      MqttConnectOptions connOpts = new MqttConnectOptions();
+      connOpts.setCleanSession(true);
+      connOpts.setUserName(user);
+      if (password != null) {
+         connOpts.setPassword(password.toCharArray());
+      }
+
+      String serverURIScheme = "tcp";
+
+      if (sslEnabled) {
+         serverURIScheme = "ssl";
+
+         SSLContext sslContext = SSLContext.getInstance("TLS");
+
+         KeyManager[] kms = null;
+         if (needClientAuth) {
+            KeyStore keyStore = KeyStore.getInstance("JKS");
+            
keyStore.load(getClass().getClassLoader().getResourceAsStream("client-keystore.jks"),
 "securepass".toCharArray());
+            KeyManagerFactory kmf = 
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+            kmf.init(keyStore, "securepass".toCharArray());
+            kms = kmf.getKeyManagers();
+         }
+
+         KeyStore trustStore = KeyStore.getInstance("JKS");
+         
trustStore.load(getClass().getClassLoader().getResourceAsStream("server-ca-truststore.jks"),
 "securepass".toCharArray());
+         TrustManagerFactory tmf = 
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+         tmf.init(trustStore);
+
+         sslContext.init(kms, tmf.getTrustManagers(), null); // null 
KeyManagers, null TrustManagers, null SecureRandom
+
+         SSLSocketFactory socketFactory = sslContext.getSocketFactory();
+         connOpts.setSocketFactory(socketFactory);
+      }
+
+      if (clientID == null) {
+         clientID = UUID.randomUUID().toString();
+      }
 
-      // expect to be accepted, b has role b
-      try (Connection connection = connectionFactory.createConnection()) {
-         connection.start();
+      try (MqttClient mqttClient = new MqttClient(serverURIScheme + "://" + 
host + ":" + port, clientID, new MemoryPersistence())) {
+         mqttClient.connect(connOpts);
+         mqttClient.disconnect();
       }
    }
 
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/RoutingTestBase.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/RoutingTestBase.java
index 6d8c829a11..12236b1e6c 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/RoutingTestBase.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/RoutingTestBase.java
@@ -39,6 +39,7 @@ import org.apache.qpid.jms.JmsConnectionFactory;
 public class RoutingTestBase extends ClusterTestBase {
    protected static final String AMQP_PROTOCOL = "AMQP";
    protected static final String CORE_PROTOCOL = "CORE";
+   protected static final String MQTT_PROTOCOL = "MQTT";
    protected static final String OPENWIRE_PROTOCOL = "OPENWIRE";
 
    protected static final String CLUSTER_POOL = "CLUSTER";
@@ -160,10 +161,10 @@ public class RoutingTestBase extends ClusterTestBase {
    }
 
    protected ConnectionFactory createFactory(String protocol, boolean 
sslEnabled, String host, int port, String clientID, String user, String 
password) throws Exception {
-      return createFactory(protocol, sslEnabled,  host, port, clientID, user, 
password, -1);
+      return createFactory(protocol, sslEnabled,  host, port, clientID, user, 
password, false, -1);
    }
 
-   protected ConnectionFactory createFactory(String protocol, boolean 
sslEnabled, String host, int port, String clientID, String user, String 
password, int retries) throws Exception {
+   protected ConnectionFactory createFactory(String protocol, boolean 
sslEnabled, String host, int port, String clientID, String user, String 
password, boolean needClientAuth, int retries) throws Exception {
       switch (protocol) {
          case CORE_PROTOCOL: {
             StringBuilder urlBuilder = new StringBuilder();
@@ -172,7 +173,7 @@ public class RoutingTestBase extends ClusterTestBase {
             urlBuilder.append(host);
             urlBuilder.append(":");
             urlBuilder.append(port);
-            
urlBuilder.append("?ha=true&reconnectAttempts=10&initialConnectAttempts=" + 
retries);
+            
urlBuilder.append("?ha=true&reconnectAttempts=10&retryInterval=250&initialConnectAttempts="
 + retries);
 
             urlBuilder.append("&sniHost=");
             urlBuilder.append(host);
@@ -197,6 +198,18 @@ public class RoutingTestBase extends ClusterTestBase {
                
urlBuilder.append(TransportConstants.TRUSTSTORE_PASSWORD_PROP_NAME);
                urlBuilder.append("=");
                urlBuilder.append("securepass");
+
+               if (needClientAuth) {
+                  urlBuilder.append("&");
+                  
urlBuilder.append(TransportConstants.KEYSTORE_PATH_PROP_NAME);
+                  urlBuilder.append("=");
+                  urlBuilder.append("client-keystore.jks");
+
+                  urlBuilder.append("&");
+                  
urlBuilder.append(TransportConstants.KEYSTORE_PASSWORD_PROP_NAME);
+                  urlBuilder.append("=");
+                  urlBuilder.append("securepass");
+               }
             }
 
             return new ActiveMQConnectionFactory(urlBuilder.toString(), user, 
password);
@@ -214,7 +227,15 @@ public class RoutingTestBase extends ClusterTestBase {
 
                urlBuilder.append("?transport.trustStoreLocation=");
                
urlBuilder.append(getClass().getClassLoader().getResource("server-ca-truststore.jks").getFile());
-               urlBuilder.append("&transport.trustStorePassword=securepass)");
+               urlBuilder.append("&transport.trustStorePassword=securepass");
+
+               if (needClientAuth) {
+                  urlBuilder.append("&transport.keyStoreLocation=");
+                  
urlBuilder.append(getClass().getClassLoader().getResource("client-keystore.jks").getFile());
+                  urlBuilder.append("&transport.keyStorePassword=securepass");
+               }
+
+               urlBuilder.append(")");
             } else {
                urlBuilder.append("amqp://");
                urlBuilder.append(host);
@@ -264,6 +285,12 @@ public class RoutingTestBase extends ClusterTestBase {
                sslConnectionFactory.setPassword(password);
                sslConnectionFactory.setTrustStore("server-ca-truststore.jks");
                sslConnectionFactory.setTrustStorePassword("securepass");
+
+               if (needClientAuth) {
+                  sslConnectionFactory.setKeyStore("client-keystore.jks");
+                  sslConnectionFactory.setKeyStorePassword("securepass");
+               }
+
                return sslConnectionFactory;
             } else {
                return new org.apache.activemq.ActiveMQConnectionFactory(user, 
password, urlBuilder.toString());


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact


Reply via email to