resolve https://issues.apache.org/activemq/browse/AMQ-2516 - broker send to dlq now uses broker security context so it will bypass the authentication plugin when configured

git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@884778 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Gary Tully 2009-11-27 08:19:19 +00:00
parent 13f9ec8555
commit adb7fccda0
2 changed files with 39 additions and 0 deletions

View File

@ -61,6 +61,7 @@ import org.apache.activemq.command.Response;
import org.apache.activemq.filter.BooleanExpression; import org.apache.activemq.filter.BooleanExpression;
import org.apache.activemq.filter.MessageEvaluationContext; import org.apache.activemq.filter.MessageEvaluationContext;
import org.apache.activemq.filter.NonCachedMessageEvaluationContext; import org.apache.activemq.filter.NonCachedMessageEvaluationContext;
import org.apache.activemq.security.SecurityContext;
import org.apache.activemq.selector.SelectorParser; import org.apache.activemq.selector.SelectorParser;
import org.apache.activemq.store.MessageRecoveryListener; import org.apache.activemq.store.MessageRecoveryListener;
import org.apache.activemq.store.MessageStore; import org.apache.activemq.store.MessageStore;
@ -1262,6 +1263,7 @@ public class Queue extends BaseDestination implements Task, UsageListener {
ConnectionContext answer = new ConnectionContext(new NonCachedMessageEvaluationContext()); ConnectionContext answer = new ConnectionContext(new NonCachedMessageEvaluationContext());
answer.setBroker(this.broker); answer.setBroker(this.broker);
answer.getMessageEvaluationContext().setDestination(getActiveMQDestination()); answer.getMessageEvaluationContext().setDestination(getActiveMQDestination());
answer.setSecurityContext(SecurityContext.BROKER_SECURITY_CONTEXT);
return answer; return answer;
} }

View File

@ -18,7 +18,13 @@ package org.apache.activemq.security;
import java.net.URI; import java.net.URI;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.QueueBrowser;
import javax.jms.Session;
import javax.management.MBeanServerConnection; import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler; import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName; import javax.management.ObjectName;
@ -28,9 +34,11 @@ import javax.management.remote.JMXServiceURL;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerFactory; import org.apache.activemq.broker.BrokerFactory;
import org.apache.activemq.broker.BrokerService; import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.broker.jmx.QueueViewMBean; import org.apache.activemq.broker.jmx.QueueViewMBean;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@ -46,6 +54,7 @@ public class SecurityJMXTest extends TestCase {
} }
public void tearDown() throws Exception { public void tearDown() throws Exception {
broker.stop();
} }
public void testMoveMessages() throws Exception { public void testMoveMessages() throws Exception {
@ -59,6 +68,34 @@ public class SecurityJMXTest extends TestCase {
queueMbean.moveMessageTo(msgId, "TEST1.Q"); queueMbean.moveMessageTo(msgId, "TEST1.Q");
} }
public void testBrowseExpiredMessages() throws Exception {
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1199/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(url, null);
connector.connect();
MBeanServerConnection connection = connector.getMBeanServerConnection();
ObjectName name = new ObjectName("org.apache.activemq:BrokerName=localhost,Type=Queue,Destination=TEST.Q");
QueueViewMBean queueMbean = (QueueViewMBean) MBeanServerInvocationHandler.newProxyInstance(connection, name, QueueViewMBean.class, true);
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("JMSExpiration", Long.toString(System.currentTimeMillis() + 2000));
headers.put("JMSDeliveryMode", Integer.toString(DeliveryMode.PERSISTENT));
String msgId = queueMbean.sendTextMessage(headers, "test", "system", "manager");
// allow message to expire on the queue
TimeUnit.SECONDS.sleep(3);
Connection c = new ActiveMQConnectionFactory("vm://localhost").createConnection("system", "manager");
c.start();
// browser consumer will force expriation check on addConsumer
QueueBrowser browser = c.createSession(false, Session.AUTO_ACKNOWLEDGE).createBrowser(new ActiveMQQueue("TEST.Q"));
assertTrue("no message in the q", !browser.getEnumeration().hasMoreElements());
// verify dlq got the message, no security exception as brokers context is now used
browser = c.createSession(false, Session.AUTO_ACKNOWLEDGE).createBrowser(new ActiveMQQueue("ActiveMQ.DLQ"));
assertTrue("one message in the dlq", browser.getEnumeration().hasMoreElements());
}
protected BrokerService createBroker() throws Exception { protected BrokerService createBroker() throws Exception {
return createBroker("org/apache/activemq/security/simple-auth-broker.xml"); return createBroker("org/apache/activemq/security/simple-auth-broker.xml");
} }