summaryrefslogtreecommitdiff
path: root/qpid/java
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2014-03-08 10:28:33 +0000
committerRobert Godfrey <rgodfrey@apache.org>2014-03-08 10:28:33 +0000
commitc7ed759b025963ad2645b4da7e5b90d104a35948 (patch)
tree10ea20c7768eaf0839cf3ba4793a5a6f326bfd16 /qpid/java
parentdbc2cf98b3ecbb42eea0fa218faca1f974b25bcb (diff)
downloadqpid-python-c7ed759b025963ad2645b4da7e5b90d104a35948.tar.gz
QPID-5611 : Ensure the appropriate principals are available at the time of all event logging
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1575506 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAMessageStore.java6
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java11
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/VirtualHostMessages.java22
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/VirtualHost_logmessages.properties4
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java3
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java109
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java2
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java7
-rwxr-xr-xqpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/SubFlushRunner.java4
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java5
-rwxr-xr-xqpid/java/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java28
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java4
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java8
-rw-r--r--qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/KeyStoreRecovererTest.java2
-rw-r--r--qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/TrustStoreRecovererTest.java2
-rw-r--r--qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/VirtualHostMessagesTest.java5
-rw-r--r--qpid/java/broker-core/src/velocity/templates/org/apache/qpid/server/logging/messages/LogMessages.vm2
-rw-r--r--qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/MBeanInvocationHandlerImpl.java6
-rw-r--r--qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/ManagementLogonLogoffReporter.java49
-rw-r--r--qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/UsernameAccessor.java4
-rw-r--r--qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/UsernameCachingRMIJRMPServer.java11
-rw-r--r--qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/ManagementLogonLogoffReporterTest.java10
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java7
23 files changed, 177 insertions, 134 deletions
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAMessageStore.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAMessageStore.java
index d61da537f3..d99733acf0 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAMessageStore.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAMessageStore.java
@@ -619,12 +619,10 @@ public class BDBHAMessageStore extends AbstractBDBMessageStore implements HAMess
{
final String originalThreadName = Thread.currentThread().getName();
Thread.currentThread().setName(threadName);
- Subject subject = new Subject(false, SecurityManager.SYSTEM.getPrincipals(),
- Collections.emptySet(), Collections.emptySet());
- subject.getPrincipals().add(new TaskPrincipal("BDB HA State Change"));
+
try
{
- Subject.doAs(subject, new PrivilegedAction<Object>()
+ Subject.doAs(SecurityManager.getSystemTaskSubject("BDB HA State Change"), new PrivilegedAction<Object>()
{
@Override
public Object run()
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java
index 69d3950ce4..ffa1d65ec2 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java
@@ -86,12 +86,9 @@ public class Broker
public void startup(final BrokerOptions options) throws Exception
{
- Subject subject = SecurityManager.SYSTEM;
- subject = new Subject(false, subject.getPrincipals(), subject.getPublicCredentials(), subject.getPrivateCredentials());
- subject.getPrincipals().add(new TaskPrincipal("Broker"));
_eventLogger = new EventLogger(new SystemOutMessageLogger());
- Subject.doAs(subject, new PrivilegedExceptionAction<Object>()
+ Subject.doAs(SecurityManager.getSystemTaskSubject("Broker"), new PrivilegedExceptionAction<Object>()
{
@Override
public Object run() throws Exception
@@ -282,11 +279,7 @@ public class Broker
{
public void run()
{
-
- Subject subject = SecurityManager.SYSTEM;
- subject = new Subject(false, subject.getPrincipals(), subject.getPublicCredentials(), subject.getPrivateCredentials());
- subject.getPrincipals().add(new TaskPrincipal("Shutdown"));
- Subject.doAs(subject, new PrivilegedAction<Object>()
+ Subject.doAs(SecurityManager.getSystemTaskSubject("Shutdown"), new PrivilegedAction<Object>()
{
@Override
public Object run()
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/VirtualHostMessages.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/VirtualHostMessages.java
index d1a90f0b91..a53927c283 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/VirtualHostMessages.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/VirtualHostMessages.java
@@ -64,16 +64,21 @@ public class VirtualHostMessages
/**
* Log a VirtualHost message of the Format:
- * <pre>VHT-1002 : Closed</pre>
+ * <pre>VHT-1002 : Closed : {0}</pre>
* Optional values are contained in [square brackets] and are numbered
* sequentially in the method call.
*
*/
- public static LogMessage CLOSED()
+ public static LogMessage CLOSED(String param1)
{
String rawMessage = _messages.getString("CLOSED");
- final String message = rawMessage;
+ final Object[] messageArguments = {param1};
+ // Create a new MessageFormat to ensure thread safety.
+ // Sharing a MessageFormat and using applyPattern is not thread safe
+ MessageFormat formatter = new MessageFormat(rawMessage, _currentLocale);
+
+ final String message = formatter.format(messageArguments);
return new LogMessage()
{
@@ -187,16 +192,21 @@ public class VirtualHostMessages
/**
* Log a VirtualHost message of the Format:
- * <pre>VHT-1005 : Unexpected fatal error</pre>
+ * <pre>VHT-1005 : {0} Unexpected fatal error</pre>
* Optional values are contained in [square brackets] and are numbered
* sequentially in the method call.
*
*/
- public static LogMessage ERRORED()
+ public static LogMessage ERRORED(String param1)
{
String rawMessage = _messages.getString("ERRORED");
- final String message = rawMessage;
+ final Object[] messageArguments = {param1};
+ // Create a new MessageFormat to ensure thread safety.
+ // Sharing a MessageFormat and using applyPattern is not thread safe
+ MessageFormat formatter = new MessageFormat(rawMessage, _currentLocale);
+
+ final String message = formatter.format(messageArguments);
return new LogMessage()
{
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/VirtualHost_logmessages.properties b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/VirtualHost_logmessages.properties
index 5695026cbc..8cd15f0120 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/VirtualHost_logmessages.properties
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/logging/messages/VirtualHost_logmessages.properties
@@ -20,9 +20,9 @@
#
# 0 - name
CREATED = VHT-1001 : Created : {0}
-CLOSED = VHT-1002 : Closed
+CLOSED = VHT-1002 : Closed : {0}
STATS_DATA = VHT-1003 : {0} : {1,choice,0#delivered|1#received} : {2,number,#.###} kB/s peak : {3,number,#} bytes total
STATS_MSGS = VHT-1004 : {0} : {1,choice,0#delivered|1#received} : {2,number,#.###} msg/s peak : {3,number,#} msgs total
-ERRORED = VHT-1005 : Unexpected fatal error \ No newline at end of file
+ERRORED = VHT-1005 : {0} Unexpected fatal error \ No newline at end of file
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
index 6a8405649a..05d907e03d 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
@@ -41,7 +41,6 @@ import org.apache.qpid.server.configuration.IllegalConfigurationException;
import org.apache.qpid.server.configuration.updater.TaskExecutor;
import org.apache.qpid.server.logging.EventLogger;
import org.apache.qpid.server.logging.LogRecorder;
-import org.apache.qpid.server.logging.MessageLogger;
import org.apache.qpid.server.logging.messages.BrokerMessages;
import org.apache.qpid.server.model.*;
import org.apache.qpid.server.plugin.PreferencesProviderFactory;
@@ -477,7 +476,7 @@ public class BrokerAdapter<X extends Broker<X>> extends AbstractConfiguredObject
// permission has already been granted to create the virtual host
// disable further access check on other operations, e.g. create exchange
- Subject.doAs(SecurityManager.SYSTEM, new PrivilegedAction<Object>()
+ Subject.doAs(SecurityManager.getSubjectWithAddedSystemRights(), new PrivilegedAction<Object>()
{
@Override
public Object run()
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
index 663d177541..181568ea5d 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
@@ -22,6 +22,7 @@ import java.lang.reflect.Type;
import java.security.AccessControlException;
import java.security.AccessController;
import java.security.Principal;
+import java.security.PrivilegedAction;
import java.util.*;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -55,6 +56,8 @@ import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.protocol.AMQSessionModel;
import org.apache.qpid.server.consumer.Consumer;
import org.apache.qpid.server.consumer.ConsumerTarget;
+import org.apache.qpid.server.security.*;
+import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
import org.apache.qpid.server.store.DurableConfigurationStoreHelper;
import org.apache.qpid.server.store.StorableMessageMetaData;
@@ -985,60 +988,72 @@ public abstract class AbstractQueue
_totalMessagesReceived.incrementAndGet();
- QueueEntry entry;
+
final QueueConsumer<?> exclusiveSub = _exclusiveSubscriber;
- entry = _entries.add(message);
+ final QueueEntry entry = _entries.add(message);
if(action != null || (exclusiveSub == null && _queueRunner.isIdle()))
{
/*
-
- iterate over consumers and if any is at the end of the queue and can deliver this message, then deliver the message
-
+ * iterate over consumers and if any is at the end of the queue and can deliver this message,
+ * then deliver the message
*/
- QueueConsumerList.ConsumerNode node = _consumerList.getMarkedNode();
- QueueConsumerList.ConsumerNode nextNode = node.findNext();
- if (nextNode == null)
- {
- nextNode = _consumerList.getHead().findNext();
- }
- while (nextNode != null)
- {
- if (_consumerList.updateMarkedNode(node, nextNode))
- {
- break;
- }
- else
- {
- node = _consumerList.getMarkedNode();
- nextNode = node.findNext();
- if (nextNode == null)
- {
- nextNode = _consumerList.getHead().findNext();
- }
- }
- }
-
- // always do one extra loop after we believe we've finished
- // this catches the case where we *just* miss an update
- int loops = 2;
-
- while (entry.isAvailable() && loops != 0)
- {
- if (nextNode == null)
- {
- loops--;
- nextNode = _consumerList.getHead();
- }
- else
- {
- // if consumer at end, and active, offer
- QueueConsumer<?> sub = nextNode.getConsumer();
- deliverToConsumer(sub, entry);
- }
- nextNode = nextNode.findNext();
- }
+ Subject.doAs(SecurityManager.getSystemTaskSubject("Immediate Delivery"),
+ new PrivilegedAction<Object>()
+ {
+ @Override
+ public Object run()
+ {
+
+ QueueConsumerList.ConsumerNode node = _consumerList.getMarkedNode();
+ QueueConsumerList.ConsumerNode nextNode = node.findNext();
+ if (nextNode == null)
+ {
+ nextNode = _consumerList.getHead().findNext();
+ }
+ while (nextNode != null)
+ {
+ if (_consumerList.updateMarkedNode(node, nextNode))
+ {
+ break;
+ }
+ else
+ {
+ node = _consumerList.getMarkedNode();
+ nextNode = node.findNext();
+ if (nextNode == null)
+ {
+ nextNode = _consumerList.getHead().findNext();
+ }
+ }
+ }
+ // always do one extra loop after we believe we've finished
+ // this catches the case where we *just* miss an update
+ int loops = 2;
+
+ while (entry.isAvailable() && loops != 0)
+ {
+ if (nextNode == null)
+ {
+ loops--;
+ nextNode = _consumerList.getHead();
+ }
+ else
+ {
+ // if consumer at end, and active, offer
+ final QueueConsumer<?> sub = nextNode.getConsumer();
+ deliverToConsumer(sub, entry);
+
+
+ }
+ nextNode = nextNode.findNext();
+
+ }
+
+ return null;
+ }
+ });
}
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
index ebddc6318d..645262e227 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
@@ -92,7 +92,7 @@ class QueueConsumerImpl
{
public void stateChanged(QueueConsumerImpl sub, State oldState, State newState)
{
- _eventLogger.message(SubscriptionMessages.STATE(newState.toString()));
+ _eventLogger.message(QueueConsumerImpl.this, SubscriptionMessages.STATE(newState.toString()));
}
};
@ManagedAttributeField
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java
index 4d21e9d23a..f3f644b2f9 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java
@@ -28,6 +28,8 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.log4j.Logger;
+import org.apache.qpid.server.security.*;
+import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.security.auth.TaskPrincipal;
import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
import org.apache.qpid.transport.TransportException;
@@ -66,10 +68,7 @@ public class QueueRunner implements Runnable
{
if(_scheduled.compareAndSet(SCHEDULED,RUNNING))
{
- Subject subject = new Subject(false, org.apache.qpid.server.security.SecurityManager.SYSTEM.getPrincipals(), Collections
- .emptySet(), Collections.emptySet());
- subject.getPrincipals().add(new TaskPrincipal("Queue Delivery"));
- Subject.doAs(subject, new PrivilegedAction<Object>()
+ Subject.doAs(SecurityManager.getSystemTaskSubject("Queue Delivery"), new PrivilegedAction<Object>()
{
@Override
public Object run()
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/SubFlushRunner.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/SubFlushRunner.java
index 610c5f8202..73a23cd53e 100755
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/SubFlushRunner.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/queue/SubFlushRunner.java
@@ -62,9 +62,7 @@ class SubFlushRunner implements Runnable
{
if(_scheduled.compareAndSet(SCHEDULED, RUNNING))
{
- Subject subject = new Subject(false, SecurityManager.SYSTEM.getPrincipals(), Collections.emptySet(), Collections.emptySet());
- subject.getPrincipals().add(new TaskPrincipal("Sub. Delivery"));
- Subject.doAs(subject, new PrivilegedAction<Object>()
+ Subject.doAs(SecurityManager.getSystemTaskSubject("Sub. Delivery"), new PrivilegedAction<Object>()
{
@Override
public Object run()
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
index e3e2ec272c..6add2cef21 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
@@ -151,10 +151,7 @@ public class ApplicationRegistry implements IApplicationRegistry
{
_reset = reset;
_logger = logger;
- _subject = new Subject(false, SecurityManager.SYSTEM.getPrincipals(), Collections.emptySet(), Collections.emptySet());
- _subject.getPrincipals().add(new TaskPrincipal("Statistics"));
- _subject.setReadOnly();
-
+ _subject = SecurityManager.getSystemTaskSubject("Statistics");
}
public void run()
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
index ba07fb56a7..c45b7bb2be 100755
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
@@ -34,6 +34,7 @@ import org.apache.qpid.server.security.access.ObjectProperties;
import org.apache.qpid.server.security.access.ObjectType;
import org.apache.qpid.server.security.access.Operation;
import org.apache.qpid.server.security.access.OperationLoggingDetails;
+import org.apache.qpid.server.security.auth.TaskPrincipal;
import javax.security.auth.Subject;
@@ -69,7 +70,7 @@ public class SecurityManager implements ConfigurationChangeListener
{
private static final Logger _logger = Logger.getLogger(SecurityManager.class);
- public static final Subject SYSTEM = new Subject(true,
+ private static final Subject SYSTEM = new Subject(true,
Collections.singleton(new SystemPrincipal()),
Collections.emptySet(),
Collections.emptySet());
@@ -107,6 +108,31 @@ public class SecurityManager implements ConfigurationChangeListener
}
}
+ public static Subject getSubjectWithAddedSystemRights()
+ {
+ Subject subject = Subject.getSubject(AccessController.getContext());
+ if(subject == null)
+ {
+ subject = new Subject();
+ }
+ else
+ {
+ subject = new Subject(false, subject.getPrincipals(), subject.getPublicCredentials(), subject.getPrivateCredentials());
+ }
+ subject.getPrincipals().addAll(SYSTEM.getPrincipals());
+ subject.setReadOnly();
+ return subject;
+ }
+
+
+ public static Subject getSystemTaskSubject(String taskName)
+ {
+ Subject subject = new Subject(false, SYSTEM.getPrincipals(), SYSTEM.getPublicCredentials(), SYSTEM.getPrivateCredentials());
+ subject.getPrincipals().add(new TaskPrincipal(taskName));
+ subject.setReadOnly();
+ return subject;
+ }
+
private void configureVirtualHostAclPlugin(String aclFile, String vhostName)
{
if(aclFile != null)
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
index 650abd360c..a4719f6058 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
@@ -714,7 +714,7 @@ public abstract class AbstractVirtualHost implements VirtualHost, IConnectionReg
_state = State.STOPPED;
- _eventLogger.message(VirtualHostMessages.CLOSED());
+ _eventLogger.message(VirtualHostMessages.CLOSED(getName()));
}
protected void closeStorage()
@@ -921,7 +921,7 @@ public abstract class AbstractVirtualHost implements VirtualHost, IConnectionReg
{
if (state == State.ERRORED)
{
- _eventLogger.message(VirtualHostMessages.ERRORED());
+ _eventLogger.message(VirtualHostMessages.ERRORED(getName()));
}
}
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java
index 83ef437410..6e5ac79559 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java
@@ -22,6 +22,8 @@ package org.apache.qpid.server.virtualhost;
import org.apache.log4j.Logger;
+import org.apache.qpid.server.security.*;
+import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.security.auth.TaskPrincipal;
import javax.security.auth.Subject;
@@ -42,11 +44,7 @@ public abstract class HouseKeepingTask implements Runnable
{
_virtualHost = vhost;
_name = _virtualHost.getName() + ":" + this.getClass().getSimpleName();
- _subject = new Subject(false, org.apache.qpid.server.security.SecurityManager.SYSTEM.getPrincipals(), Collections
- .emptySet(), Collections.emptySet());
- _subject.getPrincipals().add(new TaskPrincipal(_name));
- _subject.setReadOnly();
-
+ _subject = SecurityManager.getSystemTaskSubject(_name);
}
final public void run()
diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/KeyStoreRecovererTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/KeyStoreRecovererTest.java
index 1a204292b7..55dc225326 100644
--- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/KeyStoreRecovererTest.java
+++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/KeyStoreRecovererTest.java
@@ -63,7 +63,7 @@ public class KeyStoreRecovererTest extends TestCase
assertEquals(id, keyStore.getId());
//verify we can retrieve the actual password using the method
- Subject.doAs(SecurityManager.SYSTEM, new PrivilegedAction<Object>()
+ Subject.doAs(SecurityManager.getSubjectWithAddedSystemRights(), new PrivilegedAction<Object>()
{
@Override
public Object run()
diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/TrustStoreRecovererTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/TrustStoreRecovererTest.java
index 6ba53007dd..5e0ce9dbc4 100644
--- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/TrustStoreRecovererTest.java
+++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/TrustStoreRecovererTest.java
@@ -59,7 +59,7 @@ public class TrustStoreRecovererTest extends QpidTestCase
assertNotNull("Trust store configured object is not created", trustStore);
assertEquals(id, trustStore.getId());
- Subject.doAs(SecurityManager.SYSTEM, new PrivilegedAction<Object>()
+ Subject.doAs(SecurityManager.getSubjectWithAddedSystemRights(), new PrivilegedAction<Object>()
{
@Override
public Object run()
diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/VirtualHostMessagesTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/VirtualHostMessagesTest.java
index c1068b4a0b..5a272ff481 100644
--- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/VirtualHostMessagesTest.java
+++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/messages/VirtualHostMessagesTest.java
@@ -40,10 +40,11 @@ public class VirtualHostMessagesTest extends AbstractTestMessages
public void testVirtualhostClosed()
{
- _logMessage = VirtualHostMessages.CLOSED();
+ String name = "test";
+ _logMessage = VirtualHostMessages.CLOSED(name);
List<Object> log = performLog();
- String[] expected = {"Closed"};
+ String[] expected = {"Closed :", name};
validateLogMessage(log, "VHT-1002", expected);
}
diff --git a/qpid/java/broker-core/src/velocity/templates/org/apache/qpid/server/logging/messages/LogMessages.vm b/qpid/java/broker-core/src/velocity/templates/org/apache/qpid/server/logging/messages/LogMessages.vm
index 803c2151da..6a97f7facd 100644
--- a/qpid/java/broker-core/src/velocity/templates/org/apache/qpid/server/logging/messages/LogMessages.vm
+++ b/qpid/java/broker-core/src/velocity/templates/org/apache/qpid/server/logging/messages/LogMessages.vm
@@ -20,7 +20,7 @@
*/
package ${package};
-import static org.apache.qpid.server.logging.AbstractRootMessageLogger.DEFAULT_LOG_HIERARCHY_PREFIX;
+import static org.apache.qpid.server.logging.AbstractMessageLogger.DEFAULT_LOG_HIERARCHY_PREFIX;
import org.apache.log4j.Logger;
import org.apache.qpid.server.configuration.BrokerProperties;
diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/MBeanInvocationHandlerImpl.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/MBeanInvocationHandlerImpl.java
index b20685985f..7b0a48cac1 100644
--- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/MBeanInvocationHandlerImpl.java
+++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/MBeanInvocationHandlerImpl.java
@@ -222,11 +222,7 @@ public class MBeanInvocationHandlerImpl implements InvocationHandler
{
try
{
- Subject subject = Subject.getSubject(AccessController.getContext());
- subject = new Subject(false, subject.getPrincipals(), subject.getPublicCredentials(), subject.getPrivateCredentials());
- subject.getPrincipals().addAll(SecurityManager.SYSTEM.getPrincipals());
-
- return Subject.doAs(subject, new PrivilegedExceptionAction<Object>()
+ return Subject.doAs(SecurityManager.getSubjectWithAddedSystemRights(), new PrivilegedExceptionAction<Object>()
{
@Override
public Object run() throws IllegalAccessException, InvocationTargetException
diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/ManagementLogonLogoffReporter.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/ManagementLogonLogoffReporter.java
index f99fe89f7b..c1792f0227 100644
--- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/ManagementLogonLogoffReporter.java
+++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/ManagementLogonLogoffReporter.java
@@ -38,7 +38,6 @@ import org.apache.qpid.server.security.auth.jmx.JMXConnectionPrincipal;
import java.rmi.server.RemoteServer;
import java.rmi.server.ServerNotActiveException;
import java.security.PrivilegedAction;
-import java.util.Collections;
public class ManagementLogonLogoffReporter implements NotificationListener, NotificationFilter
{
@@ -63,31 +62,45 @@ public class ManagementLogonLogoffReporter implements NotificationListener, Not
LOGGER.debug("Notification connectionId : " + connectionId + " type : " + type);
}
- String user = _usernameAccessor.getUsernameForConnectionId(connectionId);
+ Subject subject = _usernameAccessor.getSubjectConnectionId(connectionId);
+ if(subject == null)
+ {
+ subject = new Subject();
+ }
+ AuthenticatedPrincipal authenticatedPrincipal =
+ AuthenticatedPrincipal.getOptionalAuthenticatedPrincipalFromSubject(subject);
- // If user is still null, fallback to an unordered list of Principals from the connection id.
- if (user == null)
+ String user;
+
+ if(authenticatedPrincipal != null)
{
+ user = authenticatedPrincipal.getName();
+ }
+ else
+ {
+ // If user is still null, fallback to an unordered list of Principals from the connection id.
final String[] splitConnectionId = connectionId.split(" ");
user = splitConnectionId[1];
}
- Subject originalSubject = new Subject(false, Collections.singleton(new AuthenticatedPrincipal(user)), Collections.emptySet(), Collections.emptySet());
- Subject subject;
- try
- {
- String clientHost = RemoteServer.getClientHost();
- subject = new Subject(false,
- originalSubject.getPrincipals(),
- originalSubject.getPublicCredentials(),
- originalSubject.getPrivateCredentials());
- subject.getPrincipals().add(new JMXConnectionPrincipal(clientHost));
- subject.setReadOnly();
- }
- catch(ServerNotActiveException e)
+
+ if(subject.getPrincipals(JMXConnectionPrincipal.class).isEmpty())
{
- subject = originalSubject;
+ try
+ {
+ String clientHost = RemoteServer.getClientHost();
+ subject = new Subject(false,
+ subject.getPrincipals(),
+ subject.getPublicCredentials(),
+ subject.getPrivateCredentials());
+ subject.getPrincipals().add(new JMXConnectionPrincipal(clientHost));
+ subject.setReadOnly();
+ }
+ catch(ServerNotActiveException e)
+ {
+ }
}
+
final String username = user;
Subject.doAs(subject, new PrivilegedAction<Object>()
{
diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/UsernameAccessor.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/UsernameAccessor.java
index 0cbb0d2687..18ab02ece1 100644
--- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/UsernameAccessor.java
+++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/UsernameAccessor.java
@@ -19,8 +19,10 @@
*/
package org.apache.qpid.server.jmx;
+import javax.security.auth.Subject;
+
public interface UsernameAccessor
{
- public String getUsernameForConnectionId(String connectionId);
+ public Subject getSubjectConnectionId(String connectionId);
}
diff --git a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/UsernameCachingRMIJRMPServer.java b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/UsernameCachingRMIJRMPServer.java
index 838e9e5664..4caa14014a 100644
--- a/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/UsernameCachingRMIJRMPServer.java
+++ b/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/UsernameCachingRMIJRMPServer.java
@@ -37,11 +37,9 @@ import javax.management.remote.rmi.RMIConnection;
import javax.management.remote.rmi.RMIJRMPServerImpl;
import javax.security.auth.Subject;
-import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
-
/**
* An implementation of RMIJRMPServerImpl that caches the usernames of users as they log-on
- * and makes the same available via {@link UsernameAccessor#getUsernameForConnectionId(String)}.
+ * and makes the same available via {@link UsernameAccessor#getSubjectConnectionId(String)}.
*
* Caller is responsible for installing this object as a {@link NotificationListener} of the
* {@link JMXConnectorServer} so the cache entries are removed as the clients disconnect.
@@ -50,7 +48,7 @@ import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
public class UsernameCachingRMIJRMPServer extends RMIJRMPServerImpl implements NotificationListener, NotificationFilter, UsernameAccessor
{
// ConnectionId is guaranteed to be unique per client connection, according to the JMX spec.
- private final Map<String, String> _connectionIdUsernameMap = new ConcurrentHashMap<String, String>();
+ private final Map<String, Subject> _connectionIdUsernameMap = new ConcurrentHashMap<String, Subject>();
UsernameCachingRMIJRMPServer(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf,
Map<String, ?> env) throws IOException
@@ -62,13 +60,12 @@ public class UsernameCachingRMIJRMPServer extends RMIJRMPServerImpl implements N
protected RMIConnection makeClient(String connectionId, Subject subject) throws IOException
{
final RMIConnection makeClient = super.makeClient(connectionId, subject);
- final AuthenticatedPrincipal authenticatedPrincipalFromSubject = AuthenticatedPrincipal.getAuthenticatedPrincipalFromSubject(subject);
- _connectionIdUsernameMap.put(connectionId, authenticatedPrincipalFromSubject.getName());
+ _connectionIdUsernameMap.put(connectionId, subject);
return makeClient;
}
@Override
- public String getUsernameForConnectionId(String connectionId)
+ public Subject getSubjectConnectionId(String connectionId)
{
return _connectionIdUsernameMap.get(connectionId);
}
diff --git a/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/ManagementLogonLogoffReporterTest.java b/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/ManagementLogonLogoffReporterTest.java
index 0027815142..be5fe1eeca 100644
--- a/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/ManagementLogonLogoffReporterTest.java
+++ b/qpid/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/server/jmx/ManagementLogonLogoffReporterTest.java
@@ -31,18 +31,22 @@ import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import javax.management.remote.JMXConnectionNotification;
+import javax.security.auth.Subject;
import org.apache.qpid.server.logging.EventLogger;
import org.apache.qpid.server.logging.LogMessage;
import org.apache.qpid.server.logging.MessageLogger;
import junit.framework.TestCase;
+import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
import org.mockito.ArgumentMatcher;
+import java.util.Collections;
+
public class ManagementLogonLogoffReporterTest extends TestCase
{
private static final String TEST_JMX_UNIQUE_CONNECTION_ID = "jmxconnectionid1 jmxuser,group";
- private static final String TEST_USER = "jmxuser";
+ private static final Subject TEST_USER = new Subject(false, Collections.singleton(new AuthenticatedPrincipal("jmxuser")), Collections.emptySet(), Collections.emptySet());
private ManagementLogonLogoffReporter _reporter;
private UsernameAccessor _usernameAccessor;
@@ -62,7 +66,7 @@ public class ManagementLogonLogoffReporterTest extends TestCase
public void testOpenedNotification()
{
- when(_usernameAccessor.getUsernameForConnectionId(TEST_JMX_UNIQUE_CONNECTION_ID)).thenReturn(TEST_USER);
+ when(_usernameAccessor.getSubjectConnectionId(TEST_JMX_UNIQUE_CONNECTION_ID)).thenReturn(TEST_USER);
JMXConnectionNotification openNotification = createMockNotification(TEST_JMX_UNIQUE_CONNECTION_ID, OPENED);
_reporter.handleNotification(openNotification, null);
@@ -86,7 +90,7 @@ public class ManagementLogonLogoffReporterTest extends TestCase
public void testClosedNotification()
{
- when(_usernameAccessor.getUsernameForConnectionId(TEST_JMX_UNIQUE_CONNECTION_ID)).thenReturn(TEST_USER);
+ when(_usernameAccessor.getSubjectConnectionId(TEST_JMX_UNIQUE_CONNECTION_ID)).thenReturn(TEST_USER);
JMXConnectionNotification closeNotification = createMockNotification(TEST_JMX_UNIQUE_CONNECTION_ID, CLOSED);
_reporter.handleNotification(closeNotification, null);
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java
index c2713a5e1f..f980453d49 100644
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java
@@ -27,6 +27,7 @@ import org.apache.log4j.Logger;
import org.apache.qpid.server.Broker;
import org.apache.qpid.server.security.auth.TaskPrincipal;
+import org.apache.qpid.server.security.SecurityManager;
import javax.security.auth.Subject;
@@ -61,11 +62,7 @@ public class InternalBrokerHolder implements BrokerHolder
{
LOGGER.info("Shutting down Broker instance");
- Subject subject = org.apache.qpid.server.security.SecurityManager.SYSTEM;
- subject = new Subject(false, subject.getPrincipals(), subject.getPublicCredentials(), subject.getPrivateCredentials());
- subject.getPrincipals().add(new TaskPrincipal("Shutdown"));
-
- Subject.doAs(subject, new PrivilegedAction<Object>()
+ Subject.doAs(SecurityManager.getSystemTaskSubject("Shutdown"), new PrivilegedAction<Object>()
{
@Override
public Object run()