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/07/02 17:37:15 UTC
activemq git commit: https://issues.apache.org/jira/browse/AMQ-5814
Repository: activemq
Updated Branches:
refs/heads/master 0c72e5d7d -> e4af2eb63
https://issues.apache.org/jira/browse/AMQ-5814
Use the context of the subscription when the producer adds a destination
that matches its wildcard.
Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/e4af2eb6
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/e4af2eb6
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/e4af2eb6
Branch: refs/heads/master
Commit: e4af2eb63501251befc33a415abfad2b72d53321
Parents: 0c72e5d
Author: Timothy Bish <ta...@gmail.com>
Authored: Thu Jul 2 11:36:53 2015 -0400
Committer: Timothy Bish <ta...@gmail.com>
Committed: Thu Jul 2 11:36:53 2015 -0400
----------------------------------------------------------------------
.../activemq/broker/region/AbstractRegion.java | 27 +++-
.../org/apache/activemq/bugs/AMQ5814Test.java | 140 +++++++++++++++++++
2 files changed, 162 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq/blob/e4af2eb6/activemq-broker/src/main/java/org/apache/activemq/broker/region/AbstractRegion.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/broker/region/AbstractRegion.java b/activemq-broker/src/main/java/org/apache/activemq/broker/region/AbstractRegion.java
index ab47ea4..be77b6e 100755
--- a/activemq-broker/src/main/java/org/apache/activemq/broker/region/AbstractRegion.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/broker/region/AbstractRegion.java
@@ -28,10 +28,10 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
import javax.jms.IllegalStateException;
import javax.jms.JMSException;
+import org.apache.activemq.DestinationDoesNotExistException;
import org.apache.activemq.advisory.AdvisorySupport;
import org.apache.activemq.broker.ConnectionContext;
import org.apache.activemq.broker.ConsumerBrokerExchange;
-import org.apache.activemq.DestinationDoesNotExistException;
import org.apache.activemq.broker.ProducerBrokerExchange;
import org.apache.activemq.broker.region.policy.PolicyEntry;
import org.apache.activemq.broker.region.virtual.CompositeDestinationFilter;
@@ -90,6 +90,7 @@ public abstract class AbstractRegion implements Region {
this.destinationFactory = destinationFactory;
}
+ @Override
public final void start() throws Exception {
started = true;
@@ -113,6 +114,7 @@ public abstract class AbstractRegion implements Region {
}
}
+ @Override
public void stop() throws Exception {
started = false;
destinationsLock.readLock().lock();
@@ -136,6 +138,7 @@ public abstract class AbstractRegion implements Region {
}
}
+ @Override
public Destination addDestination(ConnectionContext context, ActiveMQDestination destination,
boolean createIfTemporary) throws Exception {
@@ -230,16 +233,15 @@ public abstract class AbstractRegion implements Region {
}
}
- protected List<Subscription> addSubscriptionsForDestination(ConnectionContext context, Destination dest)
- throws Exception {
-
+ protected List<Subscription> addSubscriptionsForDestination(ConnectionContext context, Destination dest) throws Exception {
List<Subscription> rc = new ArrayList<Subscription>();
// Add all consumers that are interested in the destination.
for (Iterator<Subscription> iter = subscriptions.values().iterator(); iter.hasNext();) {
Subscription sub = iter.next();
if (sub.matches(dest.getActiveMQDestination())) {
try {
- dest.addSubscription(context, sub);
+ ConnectionContext originalContext = sub.getContext() != null ? sub.getContext() : context;
+ dest.addSubscription(originalContext, sub);
rc.add(sub);
} catch (SecurityException e) {
if (sub.isWildcard()) {
@@ -255,6 +257,7 @@ public abstract class AbstractRegion implements Region {
}
+ @Override
public void removeDestination(ConnectionContext context, ActiveMQDestination destination, long timeout)
throws Exception {
@@ -313,6 +316,7 @@ public abstract class AbstractRegion implements Region {
*
* @return a set of matching destination objects.
*/
+ @Override
@SuppressWarnings("unchecked")
public Set<Destination> getDestinations(ActiveMQDestination destination) {
destinationsLock.readLock().lock();
@@ -323,10 +327,12 @@ public abstract class AbstractRegion implements Region {
}
}
+ @Override
public Map<ActiveMQDestination, Destination> getDestinationMap() {
return destinations;
}
+ @Override
@SuppressWarnings("unchecked")
public Subscription addConsumer(ConnectionContext context, ConsumerInfo info) throws Exception {
LOG.debug("{} adding consumer: {} for destination: {}", new Object[]{ broker.getBrokerName(), info.getConsumerId(), info.getDestination() });
@@ -446,6 +452,7 @@ public abstract class AbstractRegion implements Region {
return inactiveDests;
}
+ @Override
@SuppressWarnings("unchecked")
public void removeConsumer(ConnectionContext context, ConsumerInfo info) throws Exception {
LOG.debug("{} removing consumer: {} for destination: {}", new Object[]{ broker.getBrokerName(), info.getConsumerId(), info.getDestination() });
@@ -479,10 +486,12 @@ public abstract class AbstractRegion implements Region {
sub.destroy();
}
+ @Override
public void removeSubscription(ConnectionContext context, RemoveSubscriptionInfo info) throws Exception {
throw new JMSException("Invalid operation.");
}
+ @Override
public void send(final ProducerBrokerExchange producerExchange, Message messageSend) throws Exception {
final ConnectionContext context = producerExchange.getConnectionContext();
@@ -498,6 +507,7 @@ public abstract class AbstractRegion implements Region {
}
}
+ @Override
public void acknowledge(ConsumerBrokerExchange consumerExchange, MessageAck ack) throws Exception {
Subscription sub = consumerExchange.getSubscription();
if (sub == null) {
@@ -516,6 +526,7 @@ public abstract class AbstractRegion implements Region {
sub.acknowledge(consumerExchange.getConnectionContext(), ack);
}
+ @Override
public Response messagePull(ConnectionContext context, MessagePull pull) throws Exception {
Subscription sub = subscriptions.get(pull.getConsumerId());
if (sub == null) {
@@ -557,6 +568,7 @@ public abstract class AbstractRegion implements Region {
return dest;
}
+ @Override
public void processDispatchNotification(MessageDispatchNotification messageDispatchNotification) throws Exception {
Subscription sub = subscriptions.get(messageDispatchNotification.getConsumerId());
if (sub != null) {
@@ -594,6 +606,7 @@ public abstract class AbstractRegion implements Region {
}
}
+ @Override
public void gc() {
for (Subscription sub : subscriptions.values()) {
sub.gc();
@@ -624,6 +637,7 @@ public abstract class AbstractRegion implements Region {
this.autoCreateDestinations = autoCreateDestinations;
}
+ @Override
@SuppressWarnings("unchecked")
public void addProducer(ConnectionContext context, ProducerInfo info) throws Exception {
destinationsLock.readLock().lock();
@@ -644,6 +658,7 @@ public abstract class AbstractRegion implements Region {
* @throws Exception
* TODO
*/
+ @Override
@SuppressWarnings("unchecked")
public void removeProducer(ConnectionContext context, ProducerInfo info) throws Exception {
destinationsLock.readLock().lock();
@@ -662,6 +677,7 @@ public abstract class AbstractRegion implements Region {
destinationFactory.removeDestination(dest);
}
+ @Override
public void processConsumerControl(ConsumerBrokerExchange consumerExchange, ConsumerControl control) {
Subscription sub = subscriptions.get(control.getConsumerId());
if (sub != null && sub instanceof AbstractSubscription) {
@@ -681,6 +697,7 @@ public abstract class AbstractRegion implements Region {
}
}
+ @Override
public void reapplyInterceptor() {
destinationsLock.writeLock().lock();
try {
http://git-wip-us.apache.org/repos/asf/activemq/blob/e4af2eb6/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5814Test.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5814Test.java b/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5814Test.java
new file mode 100644
index 0000000..29cad9f
--- /dev/null
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ5814Test.java
@@ -0,0 +1,140 @@
+/**
+ * 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.bugs;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.Topic;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.broker.BrokerPlugin;
+import org.apache.activemq.broker.BrokerService;
+import org.apache.activemq.broker.TransportConnector;
+import org.apache.activemq.filter.DestinationMapEntry;
+import org.apache.activemq.security.AuthenticationUser;
+import org.apache.activemq.security.AuthorizationEntry;
+import org.apache.activemq.security.AuthorizationPlugin;
+import org.apache.activemq.security.DefaultAuthorizationMap;
+import org.apache.activemq.security.SimpleAuthenticationPlugin;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AMQ5814Test {
+
+ private BrokerService brokerService;
+ private String openwireClientUrl;
+
+ public BrokerPlugin configureAuthentication() throws Exception {
+ List<AuthenticationUser> users = new ArrayList<>();
+ users.add(new AuthenticationUser("publisher", "123", "publisher"));
+ users.add(new AuthenticationUser("subscriber", "123", "subscriber"));
+ users.add(new AuthenticationUser("admin", "123", "publisher,subscriber"));
+
+ SimpleAuthenticationPlugin authenticationPlugin = new SimpleAuthenticationPlugin(users);
+
+ return authenticationPlugin;
+ }
+
+ public BrokerPlugin configureAuthorization() throws Exception {
+
+ @SuppressWarnings("rawtypes")
+ List<DestinationMapEntry> authorizationEntries = new ArrayList<>();
+
+ AuthorizationEntry entry = new AuthorizationEntry();
+ entry.setTopic("dcu.>");
+ entry.setRead("subscriber");
+ entry.setWrite("publisher");
+ entry.setAdmin("publisher,subscriber");
+ authorizationEntries.add(entry);
+
+ entry = new AuthorizationEntry();
+ entry.setTopic("ActiveMQ.Advisory.>");
+ entry.setRead("publisher,subscriber");
+ entry.setWrite("publisher,subscriber");
+ entry.setAdmin("publisher,subscriber");
+ authorizationEntries.add(entry);
+
+ DefaultAuthorizationMap authorizationMap = new DefaultAuthorizationMap(authorizationEntries);
+ AuthorizationPlugin authorizationPlugin = new AuthorizationPlugin(authorizationMap);
+
+ return authorizationPlugin;
+ }
+
+ @Before
+ public void setup() throws Exception {
+
+ TransportConnector openwireConnector = new TransportConnector();
+ openwireConnector.setUri(new URI("tcp://localhost:0"));
+ openwireConnector.setName("openwire");
+
+ ArrayList<BrokerPlugin> plugins = new ArrayList<>();
+ plugins.add(configureAuthentication());
+ plugins.add(configureAuthorization());
+
+ brokerService = new BrokerService();
+ brokerService.setPersistent(false);
+ brokerService.addConnector(openwireConnector);
+ if (!plugins.isEmpty()) {
+ BrokerPlugin[] array = new BrokerPlugin[plugins.size()];
+ brokerService.setPlugins(plugins.toArray(array));
+ }
+ brokerService.start();
+ brokerService.waitUntilStarted();
+
+ openwireClientUrl = openwireConnector.getPublishableConnectString();
+ }
+
+ @After
+ public void shutdown() throws Exception {
+ if (brokerService != null) {
+ brokerService.stop();
+ brokerService.waitUntilStopped();
+ brokerService = null;
+ }
+ }
+
+ @Test(timeout=30000)
+ public void testProduceConsumeWithAuthorization() throws Exception {
+ ConnectionFactory factory = new ActiveMQConnectionFactory(openwireClientUrl);
+ Connection connection1 = factory.createConnection("subscriber", "123");
+ Session session1 = connection1.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ Topic wildCarded = session1.createTopic("dcu.>");
+ MessageConsumer consumer = session1.createConsumer(wildCarded);
+ connection1.start();
+
+ Connection connection2 = factory.createConnection("publisher", "123");
+ Session session2 = connection2.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ Topic named = session2.createTopic("dcu.id");
+ MessageProducer producer = session2.createProducer(named);
+ producer.send(session2.createTextMessage("test"));
+
+ assertNotNull(consumer.receive(2000));
+
+ connection1.close();
+ connection2.close();
+ }
+}