You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@artemis.apache.org by cl...@apache.org on 2026/09/10 17:09:24 UTC

(artemis) 11/11: Further harden RemoveSubscriptionInfo handling

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

clebertsuconic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/artemis.git

commit eb3c2b757ff103de5ed509dccc049d05a848cafe
Author: Timothy Bish <ta...@gmail.com>
AuthorDate: Tue Aug 18 16:25:03 2026 -0400

    Further harden RemoveSubscriptionInfo handling
    
    (cherry picked from commit 6fcc19573c73b7c064cdf1a7c1329ea606d5b9de)
---
 .../core/protocol/openwire/OpenWireConnection.java |  8 +++
 .../OpenWireRemoveSubscriptionInfoFrameTest.java   | 70 ++++++++++++++++++++--
 2 files changed, 74 insertions(+), 4 deletions(-)

diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
index 58b41dc05c..9473d02351 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
@@ -1360,6 +1360,14 @@ public class OpenWireConnection extends AbstractRemotingConnection implements Se
             throw new IllegalStateException("Cannot remove a subscription on a connection that had not been registered");
          }
 
+         if (!Objects.equals(cs.getInfo().getConnectionId(), subInfo.getConnectionId())) {
+            throw new IllegalStateException("Rejecting remove subscription command with invalid data");
+         }
+
+         if (!Objects.equals(cs.getInfo().getClientId(), subInfo.getClientId())) {
+            throw new IllegalStateException("Rejecting remove subscription command with invalid data");
+         }
+
          final SimpleString subQueueName = org.apache.activemq.artemis.jms.client.ActiveMQDestination.createQueueNameForSubscription(true, subInfo.getClientId(), subInfo.getSubscriptionName());
 
          ss.deleteQueue(subQueueName);
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/openwire/OpenWireRemoveSubscriptionInfoFrameTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/openwire/OpenWireRemoveSubscriptionInfoFrameTest.java
index 1e96b55a50..65b58f947f 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/openwire/OpenWireRemoveSubscriptionInfoFrameTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/openwire/OpenWireRemoveSubscriptionInfoFrameTest.java
@@ -41,6 +41,7 @@ import java.util.function.Consumer;
 
 import javax.jms.Connection;
 import javax.jms.DeliveryMode;
+import javax.jms.JMSException;
 import javax.jms.JMSSecurityException;
 import javax.jms.MessageConsumer;
 import javax.jms.MessageProducer;
@@ -105,7 +106,7 @@ public class OpenWireRemoveSubscriptionInfoFrameTest extends BasicOpenWireTest {
    protected void extraServerConfig(Configuration configuration) {
       super.extraServerConfig(configuration);
 
-      final Role allowed = new Role(ALLOWED_ROLE, true, true, true, true, false, false, false, false, true, false, false, false);
+      final Role allowed = new Role(ALLOWED_ROLE, true, true, true, true, false, false, false, false, true, true, false, false);
       final Role denied = new Role(DENIED_ROLE, false, false, false, false, false, false, false, false, false, false, false, false);
 
       final ActiveMQJAASSecurityManager securityManager = (ActiveMQJAASSecurityManager) server.getSecurityManager();
@@ -174,12 +175,73 @@ public class OpenWireRemoveSubscriptionInfoFrameTest extends BasicOpenWireTest {
       }
    }
 
+   @Test
+   public void testConnectionWithAuthorizationCannotDeleteSubscriptionQueueUsingAlternateClientId() throws Exception {
+      final String CLIENT_ID = "test-id";
+      final String SUBSCRIPTION_NAME = getTestMethodName();
+      final SimpleString SUBSCRIPTION_QUEUE =
+         org.apache.activemq.artemis.jms.client.ActiveMQDestination.createQueueNameForSubscription(true, CLIENT_ID, SUBSCRIPTION_NAME);
+
+      try (Connection connection = factory.createConnection(ALLOWED_USER, PASS)) {
+
+         connection.setClientID(CLIENT_ID);
+
+         final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+         final Topic destination = session.createTopic(ADDRESS);
+
+         final MessageProducer producer = session.createProducer(destination);
+         final MessageConsumer consumer = session.createDurableConsumer(destination, SUBSCRIPTION_NAME);
+
+         consumer.close();
+
+         producer.setDeliveryMode(DeliveryMode.PERSISTENT); // ALLOWED USER
+         producer.send(session.createTextMessage("durable-message"));
+
+         Wait.assertTrue(() -> server.queueQuery(SUBSCRIPTION_QUEUE).isExists(), 1_000, 50);
+
+         final Queue subscriptionQueue = server.locateQueue(SUBSCRIPTION_QUEUE);
+
+         assertEquals(1, subscriptionQueue.getMessageCount());
+
+         final ConnectionInfo connectionInfo = new ConnectionInfo();
+         connectionInfo.setConnectionId(new ConnectionId("test:1"));
+         connectionInfo.setClientId(UUID.randomUUID().toString());
+         connectionInfo.setUserName(ALLOWED_USER);
+         connectionInfo.setPassword(PASS);
+         connectionInfo.setResponseRequired(true);
+
+         final RemoveSubscriptionInfo removeSubscription = new RemoveSubscriptionInfo();
+         removeSubscription.setClientId(CLIENT_ID);
+         removeSubscription.setConnectionId(new ConnectionId("test:1"));
+         removeSubscription.setResponseRequired(true);
+         removeSubscription.setSubcriptionName(SUBSCRIPTION_NAME);
+
+         try (OpenwireTestClient client = new OpenwireTestClient(OWHOST, OWPORT)) {
+            client.connect().get(2, TimeUnit.SECONDS);
+            client.send(connectionInfo).get(20, TimeUnit.SECONDS);
+
+            final Response response = client.send(removeSubscription).get(10, TimeUnit.SECONDS);
+
+            assertTrue(response.isException());
+            assertNull(client.getLastError());
+
+            final ExceptionResponse exResponse = (ExceptionResponse) response;
+
+            assertTrue(exResponse.getException() instanceof JMSException);
+         }
+
+         Thread.sleep(50); // Bit of buffer to allow the command to be handled.
+
+         Wait.assertTrue(() -> server.queueQuery(SUBSCRIPTION_QUEUE).isExists(), 1_000, 50);
+      }
+   }
+
    @Test
    public void testConnectionWithoutAuthorizationCannotDeleteSubscriptionQueue() throws Exception {
       final String CLIENT_ID = "test-id";
       final String SUBSCRIPTION_NAME = getTestMethodName();
-      final SimpleString SUBSCRIPTION_QUEUE = org.apache.activemq.artemis.jms.client.ActiveMQDestination.createQueueNameForSubscription(true, CLIENT_ID,
-         SUBSCRIPTION_NAME);
+      final SimpleString SUBSCRIPTION_QUEUE =
+         org.apache.activemq.artemis.jms.client.ActiveMQDestination.createQueueNameForSubscription(true, CLIENT_ID, SUBSCRIPTION_NAME);
 
       try (Connection connection = factory.createConnection(ALLOWED_USER, PASS)) {
 
@@ -206,7 +268,7 @@ public class OpenWireRemoveSubscriptionInfoFrameTest extends BasicOpenWireTest {
 
          final ConnectionInfo connectionInfo = new ConnectionInfo();
          connectionInfo.setConnectionId(new ConnectionId("test:1"));
-         connectionInfo.setClientId(UUID.randomUUID().toString());
+         connectionInfo.setClientId(CLIENT_ID);
          connectionInfo.setUserName(DENIED_USER);
          connectionInfo.setPassword(PASS);
          connectionInfo.setResponseRequired(true);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@artemis.apache.org
For additional commands, e-mail: commits-help@artemis.apache.org