You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2015/08/04 20:54:23 UTC

[4/4] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5916

https://issues.apache.org/jira/browse/AMQ-5916

Apply patch from Ganesh Murthy to resolve issue of creation of durable
subscriber fails via broker AdminView due to lack of SecurityContext on
ConnectionContext

Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/82e3ce80
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/82e3ce80
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/82e3ce80

Branch: refs/heads/master
Commit: 82e3ce805ee349a83c0684c908d6ebe0d546f432
Parents: 5e05df1
Author: Timothy Bish <ta...@gmail.com>
Authored: Tue Aug 4 14:51:15 2015 -0400
Committer: Timothy Bish <ta...@gmail.com>
Committed: Tue Aug 4 14:51:15 2015 -0400

----------------------------------------------------------------------
 .../apache/activemq/broker/jmx/BrokerView.java  |  21 ++-
 .../jmx/JMXRemoveDurableSubscriberTest.java     | 166 +++++++++++++++++++
 2 files changed, 185 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/82e3ce80/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/BrokerView.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/BrokerView.java b/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/BrokerView.java
index 350992c..98417b1 100755
--- a/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/BrokerView.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/BrokerView.java
@@ -418,7 +418,7 @@ public class BrokerView implements BrokerViewMBean {
     @Override
     public ObjectName createDurableSubscriber(String clientId, String subscriberName, String topicName,
                                               String selector) throws Exception {
-        ConnectionContext context = new ConnectionContext();
+        ConnectionContext context = getConnectionContext();
         context.setBroker(safeGetBroker());
         context.setClientId(clientId);
         ConsumerInfo info = new ConsumerInfo();
@@ -443,7 +443,7 @@ public class BrokerView implements BrokerViewMBean {
         RemoveSubscriptionInfo info = new RemoveSubscriptionInfo();
         info.setClientId(clientId);
         info.setSubscriptionName(subscriberName);
-        ConnectionContext context = new ConnectionContext();
+        ConnectionContext context = getConnectionContext();
         context.setBroker(safeGetBroker());
         context.setClientId(clientId);
         brokerService.getBroker().removeSubscription(context, info);
@@ -549,4 +549,21 @@ public class BrokerView implements BrokerViewMBean {
 
         return broker;
     }
+
+    private ConnectionContext getConnectionContext() {
+        ConnectionContext context;
+        if(broker == null) {
+            context = new ConnectionContext();
+
+        }
+        else {
+            ConnectionContext sharedContext = BrokerSupport.getConnectionContext(broker.getContextBroker());
+            //Make a local copy of the sharedContext. We do this because we do not want to set a clientId on the
+            //global sharedContext. Taking a copy of the sharedContext is a good way to make sure that we are not
+            //messing up the shared context
+            context = sharedContext.copy();
+        }
+
+        return context;
+    }
 }

http://git-wip-us.apache.org/repos/asf/activemq/blob/82e3ce80/activemq-unit-tests/src/test/java/org/apache/activemq/broker/jmx/JMXRemoveDurableSubscriberTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/broker/jmx/JMXRemoveDurableSubscriberTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/broker/jmx/JMXRemoveDurableSubscriberTest.java
new file mode 100644
index 0000000..8fc489a
--- /dev/null
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/broker/jmx/JMXRemoveDurableSubscriberTest.java
@@ -0,0 +1,166 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.broker.jmx;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.activemq.broker.BrokerPlugin;
+import org.apache.activemq.broker.BrokerService;
+import org.apache.activemq.filter.DestinationMapEntry;
+import org.apache.activemq.security.AuthorizationEntry;
+import org.apache.activemq.security.AuthorizationMap;
+import org.apache.activemq.security.AuthorizationPlugin;
+import org.apache.activemq.security.DefaultAuthorizationMap;
+import org.apache.activemq.security.JaasAuthenticationPlugin;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Makes sure a durable subscriber can be added and deleted from the
+ * brokerServer.getAdminView() when JAAS authentication and authorization are
+ * setup
+ */
+public class JMXRemoveDurableSubscriberTest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(JMXRemoveDurableSubscriberTest.class);
+
+    private BrokerService brokerService;
+
+    @SuppressWarnings("rawtypes")
+    @Before
+    public void setUp() throws Exception {
+        brokerService = new BrokerService();
+
+        JaasAuthenticationPlugin jaasAuthenticationPlugin = new JaasAuthenticationPlugin();
+        jaasAuthenticationPlugin.setDiscoverLoginConfig(true);
+
+        BrokerPlugin[] brokerPlugins = new BrokerPlugin[2];
+        brokerPlugins[0] = jaasAuthenticationPlugin;
+
+        AuthorizationPlugin authorizationPlugin = new AuthorizationPlugin();
+
+        List<DestinationMapEntry> destinationMapEntries = new ArrayList<DestinationMapEntry>();
+
+        // Add Authorization Entries.
+        AuthorizationEntry authEntry1 = new AuthorizationEntry();
+        authEntry1.setRead("manager,viewer,Operator,Maintainer,Deployer,Auditor,Administrator,SuperUser, admin");
+        authEntry1.setWrite("manager,Operator,Maintainer,Deployer,Auditor,Administrator,SuperUser,admin");
+        authEntry1.setAdmin("manager,Operator,Maintainer,Deployer,Auditor,Administrator,SuperUser,admin");
+        authEntry1.setQueue(">");
+
+        AuthorizationEntry authEntry2 = new AuthorizationEntry();
+        authEntry2.setRead("manager,viewer,Operator,Maintainer,Deployer,Auditor,Administrator,SuperUser, admin");
+        authEntry2.setWrite("manager,Operator,Maintainer,Deployer,Auditor,Administrator,SuperUser,admin");
+        authEntry2.setAdmin("manager,Operator,Maintainer,Deployer,Auditor,Administrator,SuperUser,admin");
+        authEntry2.setTopic(">");
+
+        AuthorizationEntry authEntry3 = new AuthorizationEntry();
+        authEntry3.setRead("manager,viewer,Operator,Maintainer,Deployer,Auditor,Administrator,SuperUser, admin");
+        authEntry3.setWrite("manager,Operator,Maintainer,Deployer,Auditor,Administrator,SuperUser,admin");
+        authEntry3.setAdmin("manager,Operator,Maintainer,Deployer,Auditor,Administrator,SuperUser,admin");
+        authEntry3.setTopic("ActiveMQ.Advisory.>");
+
+        destinationMapEntries.add(authEntry1);
+        destinationMapEntries.add(authEntry2);
+        destinationMapEntries.add(authEntry3);
+
+        AuthorizationMap authorizationMap = new DefaultAuthorizationMap(destinationMapEntries);
+
+        authorizationPlugin.setMap(authorizationMap);
+
+        brokerPlugins[1] = authorizationPlugin;
+
+        brokerService.setPlugins(brokerPlugins);
+
+        brokerService.setBrokerName("ActiveMQBroker");
+        brokerService.setPersistent(false);
+        brokerService.setUseVirtualTopics(false);
+        brokerService.setUseJmx(true);
+        brokerService.addConnector("tcp://localhost:0");
+        brokerService.start();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (brokerService != null) {
+            try {
+                brokerService.stop();
+            } catch (Exception e) {
+            }
+        }
+    }
+
+    /**
+     * Creates a durable subscription via the AdminView
+     */
+    @Test(timeout = 60000)
+    public void testCreateDurableSubsciber() throws Exception {
+
+        String clientId = "10";
+
+        // Add a topic called test topic
+        brokerService.getAdminView().addTopic("testTopic");
+
+        boolean createSubscriberSecurityException = false;
+
+        String subscriberName = "testSubscriber";
+
+        // Create a durable subscriber with the name testSubscriber
+        try {
+            brokerService.getAdminView().createDurableSubscriber(clientId, subscriberName, "testTopic", null);
+            LOG.info("Successfully created durable subscriber " + subscriberName + " via AdminView");
+        } catch (java.lang.SecurityException se1) {
+            if (se1.getMessage().equals("User is not authenticated.")) {
+                createSubscriberSecurityException = true;
+            }
+        }
+        assertFalse(createSubscriberSecurityException);
+
+        // Delete the durable subscriber that was created earlier.
+        boolean destroySubscriberSecurityException = false;
+        try {
+            brokerService.getAdminView().destroyDurableSubscriber(clientId, subscriberName);
+            LOG.info("Successfully destroyed durable subscriber " + subscriberName + " via AdminView");
+        } catch (java.lang.SecurityException se2) {
+            if (se2.getMessage().equals("User is not authenticated.")) {
+                destroySubscriberSecurityException = true;
+            }
+        }
+        assertFalse(destroySubscriberSecurityException);
+
+        // Just to make sure the subscriber was actually deleted, try deleting
+        // the subscriber again
+        // and that should throw an exception
+        boolean subscriberAlreadyDeleted = false;
+        try {
+            brokerService.getAdminView().destroyDurableSubscriber(clientId, subscriberName);
+            LOG.info("Successfully destroyed durable subscriber " + subscriberName + " via AdminView");
+        } catch (javax.jms.InvalidDestinationException t) {
+            if (t.getMessage().equals("No durable subscription exists for clientID: 10 and subscriptionName: testSubscriber")) {
+                subscriberAlreadyDeleted = true;
+            }
+        }
+        assertTrue(subscriberAlreadyDeleted);
+    }
+}