You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ro...@apache.org on 2012/08/24 17:33:05 UTC

svn commit: r1376968 [1/7] - in /qpid/trunk/qpid/java: broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/ broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/ broker-plugins...

Author: robbie
Date: Fri Aug 24 15:33:00 2012
New Revision: 1376968

URL: http://svn.apache.org/viewvc?rev=1376968&view=rev
Log:
QPID-4236, QPID-4237, QPID-4245: Added group management functionality, and exposed it via the web management interface. Removed group definition functionality from the ACL plugin. The ACL plugin uses groups but no longer defines them.

Introduced SubjectCreator as a facade to AuthenticationManager and group
management classes.

Applied access control to user and group management.

Fixed bug in choosing between update and creation in RestServlet.

Moved lots of RestTest helper methods to RestTestHelper.

Fixed authentication, authorisation, and status logging when using the web ui.

Applied patch from Philip Harvey <ph...@philharveyonline.com>, Keith Wall and myself.

Added:
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/group/
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/group/addGroupMember.html
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/group/showGroup.html
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/addGroup.html
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showFileGroupManager.html
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/addGroupMember.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/GroupProviderRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/GroupRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/RestTestHelper.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/systest/
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/systest/rest/
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/systest/rest/acl/
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/systest/rest/acl/GroupRestACLTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/systest/rest/acl/UserRestACLTest.java
    qpid/trunk/qpid/java/broker/etc/groups
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/actors/AbstractManagementActor.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/actors/HttpManagementActor.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Group.java
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/GroupMember.java
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/GroupProvider.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/SubjectCreator.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/AuthenticatedPrincipal.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/SubjectAuthenticationResult.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/UsernamePrincipal.java
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/UsernamePrincipal.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/FileGroupDatabase.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/FileGroupManager.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/GroupDatabase.java
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslRestTest.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/GroupManager.java
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslRestTest.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/GroupManagerPluginFactory.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/GroupPrincipal.java
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/GroupPrincipal.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/GroupPrincipalAccessor.java
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/sasl/TestPrincipalUtils.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/logging/actors/AbstractManagementActorTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/logging/actors/HttpManagementActorTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/SubjectCreatorTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/AuthenticatedPrincipalTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/AuthenticatedPrincipalTestHelper.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/AuthenticationResultTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/TestPrincipalUtils.java
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/sasl/TestPrincipalUtils.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/UsernamePrincipalTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/group/
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/group/FileGroupManagerTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/group/GroupPrincipalAccessorTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/group/GroupPrincipalTest.java
      - copied, changed from r1376735, qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/sasl/GroupPrincipalTest.java
    qpid/trunk/qpid/java/systests/etc/groups-systests
Removed:
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/GroupPrincipal.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/UsernamePrincipal.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/sasl/GroupPrincipalTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/sasl/TestPrincipalUtils.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/sasl/UsernamePrincipalTest.java
Modified:
    qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java
    qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/Rule.java
    qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/RuleSet.java
    qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AccessControl.java
    qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AccessControlConfiguration.java
    qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java
    qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java
    qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/RuleSetTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/MANIFEST.MF
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/Management.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/controller.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/treeView.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/AuthenticationProviderRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/BindingRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/BrokerRestHttpsTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/BrokerRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ConnectionRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/ExchangeRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/MessagesRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/PortRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/QpidRestTestCase.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/QueueRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/UserRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostRestTest.java
    qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagedObjectRegistry.java
    qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/MBeanInvocationHandlerImpl.java
    qpid/trunk/qpid/java/broker/etc/broker_example.acl
    qpid/trunk/qpid/java/broker/etc/config.xml
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionSecureOkMethodHandler.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionStartOkMethodHandler.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/actors/ManagementActor.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/LogSubjectFormat.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugins/PluginManager.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/IApplicationRegistry.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/AuthorizationHolder.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/SecurityManager.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/access/ObjectType.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/AuthenticationResult.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/database/AbstractPasswordFilePrincipalDatabase.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/database/PropertiesPrincipalDatabase.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AnonymousAuthenticationManager.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationManager.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationManagerRegistry.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/ExternalAuthenticationManager.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/IAuthenticationManagerRegistry.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/KerberosAuthenticationManager.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManager.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManager.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/rmi/RMIPasswordAuthenticator.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/UsernamePasswordInitialiser.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/anonymous/AnonymousSaslServer.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/state/AMQStateManager.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerConnectionDelegate.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/logging/actors/ManagementActorTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/UUIDGeneratorTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/InternalTestProtocolSession.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/database/Base64MD5PasswordFilePrincipalDatabaseTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/database/PlainPasswordFilePrincipalDatabaseTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/manager/AnonymousAuthenticationManagerTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/manager/AuthenticationManagerRegistryTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/manager/ExternalAuthenticationManagerTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManagerTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/rmi/RMIPasswordAuthenticatorTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/util/TestApplicationRegistry.java
    qpid/trunk/qpid/java/systests/etc/config-systests-settings.xml
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/AccessControlLoggingTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/security/acl/AbstractACLTestCase.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/security/acl/ExternalACLTest.java

Modified: qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java Fri Aug 24 15:33:00 2012
@@ -1,5 +1,5 @@
 /*
- * 
+ *
  * 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
@@ -7,16 +7,16 @@
  * 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.qpid.server.security.access.config;
 
@@ -44,43 +44,41 @@ public class PlainConfiguration extends 
     public static final Character COMMENT = '#';
     public static final Character CONTINUATION = '\\';
 
-    public static final String GROUP = "group";
     public static final String ACL = "acl";
     public static final String CONFIG = "config";
 
     public static final String UNRECOGNISED_INITIAL_MSG = "Unrecognised initial token '%s' at line %d";
     public static final String NOT_ENOUGH_TOKENS_MSG = "Not enough tokens at line %d";
-    public static final String NUMBER_NOT_ALLOWED_MSG = "Number not allowed before '%s' at line %d";    
+    public static final String NUMBER_NOT_ALLOWED_MSG = "Number not allowed before '%s' at line %d";
     public static final String CANNOT_LOAD_MSG = "Cannot load config file %s";
     public static final String PREMATURE_CONTINUATION_MSG = "Premature continuation character at line %d";
     public static final String PREMATURE_EOF_MSG = "Premature end of file reached at line %d";
     public static final String PARSE_TOKEN_FAILED_MSG = "Failed to parse token at line %d";
     public static final String CONFIG_NOT_FOUND_MSG = "Cannot find config file %s";
-    public static final String NOT_ENOUGH_GROUP_MSG = "Not enough data for a group at line %d";
     public static final String NOT_ENOUGH_ACL_MSG = "Not enough data for an acl at line %d";
     public static final String NOT_ENOUGH_CONFIG_MSG = "Not enough data for config at line %d";
     public static final String BAD_ACL_RULE_NUMBER_MSG = "Invalid rule number at line %d";
     public static final String PROPERTY_KEY_ONLY_MSG = "Incomplete property (key only) at line %d";
     public static final String PROPERTY_NO_EQUALS_MSG = "Incomplete property (no equals) at line %d";
     public static final String PROPERTY_NO_VALUE_MSG = "Incomplete property (no value) at line %d";
-    
+
     private StreamTokenizer _st;
 
     public PlainConfiguration(File file)
     {
         super(file);
     }
-    
+
     @Override
     public RuleSet load() throws ConfigurationException
     {
         RuleSet ruleSet = super.load();
-        
+
         try
         {
             _st = new StreamTokenizer(new BufferedReader(new FileReader(getFile())));
             _st.resetSyntax(); // setup the tokenizer
-                
+
             _st.commentChar(COMMENT); // single line comments
             _st.eolIsSignificant(true); // return EOL as a token
             _st.ordinaryChar('='); // equals is a token
@@ -97,7 +95,7 @@ public class PlainConfiguration extends 
             _st.wordChars('*', '*'); // star
             _st.wordChars('@', '@'); // at
             _st.wordChars(':', ':'); // colon
-            
+
             // parse the acl file lines
             Stack<String> stack = new Stack<String>();
             int current;
@@ -111,7 +109,7 @@ public class PlainConfiguration extends 
                         {
                             break; // blank line
                         }
-                        
+
                         // pull out the first token from the bottom of the stack and check arguments exist
                         String first = stack.firstElement();
                         stack.removeElementAt(0);
@@ -119,13 +117,13 @@ public class PlainConfiguration extends 
                         {
                             throw new ConfigurationException(String.format(NOT_ENOUGH_TOKENS_MSG, getLine()));
                         }
-                        
+
                         // check for and parse optional initial number for ACL lines
                         Integer number = null;
                         if (StringUtils.isNumeric(first))
                         {
                             // set the acl number and get the next element
-                            number = Integer.valueOf(first);                            
+                            number = Integer.valueOf(first);
                             first = stack.firstElement();
                             stack.removeElementAt(0);
                         }
@@ -136,9 +134,9 @@ public class PlainConfiguration extends 
                         }
                         else if (number == null)
                         {
-                            if (StringUtils.equalsIgnoreCase(GROUP, first))
+                            if(StringUtils.equalsIgnoreCase("GROUP", first))
                             {
-                                parseGroup(stack);
+                                throw new ConfigurationException(String.format("GROUP keyword not supported. Groups should defined via a Group Provider, not in the ACL file.", getLine()));
                             }
                             else if (StringUtils.equalsIgnoreCase(CONFIG, first))
                             {
@@ -153,7 +151,7 @@ public class PlainConfiguration extends 
                         {
                             throw new ConfigurationException(String.format(NUMBER_NOT_ALLOWED_MSG, first, getLine()));
                         }
-                        
+
                         // reset stack, start next line
                         stack.clear();
                         break;
@@ -171,7 +169,7 @@ public class PlainConfiguration extends 
                             {
 	                            break; // continue reading next line
                             }
-                            
+
                             // invalid location for continuation character (add one to line beacuse we ate the EOL)
                             throw new ConfigurationException(String.format(PREMATURE_CONTINUATION_MSG, getLine() + 1));
                         }
@@ -185,7 +183,7 @@ public class PlainConfiguration extends 
                         }
                 }
             } while (current != StreamTokenizer.TT_EOF);
-        
+
             if (!stack.isEmpty())
             {
                 throw new ConfigurationException(String.format(PREMATURE_EOF_MSG, getLine()));
@@ -203,20 +201,10 @@ public class PlainConfiguration extends 
         {
             throw new ConfigurationException(String.format(CANNOT_LOAD_MSG, getFile().getName()), ioe);
         }
-        
+
         return ruleSet;
     }
-    
-    private void parseGroup(List<String> args) throws ConfigurationException
-    {
-        if (args.size() < 2)
-        {
-            throw new ConfigurationException(String.format(NOT_ENOUGH_GROUP_MSG, getLine()));
-        }
-        
-        getConfiguration().addGroup(args.get(0), args.subList(1, args.size()));
-    }
-    
+
     private void parseAcl(Integer number, List<String> args) throws ConfigurationException
     {
         if (args.size() < 3)
@@ -227,12 +215,12 @@ public class PlainConfiguration extends 
         Permission permission = Permission.parse(args.get(0));
         String identity = args.get(1);
         Operation operation = Operation.parse(args.get(2));
-        
+
         if (number != null && !getConfiguration().isValidNumber(number))
         {
             throw new ConfigurationException(String.format(BAD_ACL_RULE_NUMBER_MSG, getLine()));
         }
-        
+
         if (args.size() == 3)
         {
             getConfiguration().grant(number, identity, permission, operation);
@@ -245,7 +233,7 @@ public class PlainConfiguration extends 
             getConfiguration().grant(number, identity, permission, operation, object, properties);
         }
     }
-    
+
     private void parseConfig(List<String> args) throws ConfigurationException
     {
         if (args.size() < 3)
@@ -254,10 +242,10 @@ public class PlainConfiguration extends 
         }
 
         Map<String, Boolean> properties = toPluginProperties(args);
-        
+
         getConfiguration().configure(properties);
     }
-    
+
     /** Converts a {@link List} of "name", "=", "value" tokens into a {@link Map}. */
     protected ObjectProperties toObjectProperties(List<String> args) throws ConfigurationException
     {
@@ -279,14 +267,14 @@ public class PlainConfiguration extends 
                 throw new ConfigurationException(String.format(PROPERTY_NO_VALUE_MSG, getLine()));
             }
             String value = i.next();
-            
+
             // parse property key
             ObjectProperties.Property property = ObjectProperties.Property.parse(key);
             properties.put(property, value);
         }
         return properties;
     }
-    
+
     /** Converts a {@link List} of "name", "=", "value" tokens into a {@link Map}. */
     protected Map<String, Boolean> toPluginProperties(List<String> args) throws ConfigurationException
     {
@@ -307,14 +295,14 @@ public class PlainConfiguration extends 
             {
                 throw new ConfigurationException(String.format(PROPERTY_NO_VALUE_MSG, getLine()));
             }
-            
+
             // parse property value and save
             Boolean value = Boolean.valueOf(i.next());
             properties.put(key, value);
         }
         return properties;
     }
-    
+
     protected int getLine()
     {
         return _st.lineno() - 1;

Modified: qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/Rule.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/Rule.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/Rule.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/Rule.java Fri Aug 24 15:33:00 2012
@@ -29,7 +29,7 @@ import org.apache.qpid.server.security.a
 
 /**
  * An access control v2 rule.
- * 
+ *
  * A rule consists of {@link Permission} for a particular identity to perform an {@link Action}. The identity
  * may be either a user or a group.
  */
@@ -37,13 +37,13 @@ public class Rule implements Comparable<
 {
 	/** String indicating all identitied. */
 	public static final String ALL = "all";
-	
+
     private Integer _number;
     private Boolean _enabled = Boolean.TRUE;
     private String _identity;
     private Action _action;
     private Permission _permission;
-    
+
     public Rule(Integer number, String identity, Action action, Permission permission)
     {
         setNumber(number);
@@ -51,27 +51,27 @@ public class Rule implements Comparable<
         setAction(action);
         setPermission(permission);
     }
-    
+
     public Rule(String identity, Action action, Permission permission)
     {
         this(null, identity, action, permission);
     }
-    
+
     public boolean isEnabled()
     {
         return _enabled;
     }
-    
+
     public void setEnabled(boolean enabled)
     {
         _enabled = enabled;
     }
-    
+
     public void enable()
     {
         _enabled = Boolean.TRUE;
     }
-    
+
     public void disable()
     {
         _enabled = Boolean.FALSE;
@@ -96,7 +96,7 @@ public class Rule implements Comparable<
     {
         _identity = identity;
     }
-    
+
     public Action getAction()
     {
         return _action;
@@ -136,7 +136,7 @@ public class Rule implements Comparable<
             return false;
         }
         Rule r = (Rule) o;
-        
+
         return new EqualsBuilder()
                 .append(getIdentity(), r.getIdentity())
                 .append(getAction(), r.getAction())

Modified: qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/RuleSet.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/RuleSet.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/RuleSet.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/RuleSet.java Fri Aug 24 15:33:00 2012
@@ -19,7 +19,6 @@
 package org.apache.qpid.server.security.access.config;
 
 import java.security.Principal;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumMap;
@@ -66,7 +65,6 @@ public class RuleSet
 
     private static final Integer _increment = 10;
 
-    private final Map<String, List<String>> _aclGroups = new HashMap<String, List<String>>();
     private final SortedMap<Integer, Rule> _rules = new TreeMap<Integer, Rule>();
     private final Map<Subject, Map<Operation, Map<ObjectType, List<Rule>>>> _cache =
                         new WeakHashMap<Subject, Map<Operation, Map<ObjectType, List<Rule>>>>();
@@ -79,14 +77,13 @@ public class RuleSet
     }
 
     /**
-     * Clear the contents, including acl groups, rules and configuration.
+     * Clear the contents, including acl rules and configuration.
      */
     public void clear()
     {
         _rules.clear();
         _cache.clear();
         _config.clear();
-        _aclGroups.clear();
     }
 
     public int getRuleCount()
@@ -222,53 +219,6 @@ public class RuleSet
         _rules.get(Integer.valueOf(ruleNumber)).disable();
     }
 
-    public boolean addGroup(String group, List<String> constituents)
-    {
-        _cache.clear();
-
-        if (_aclGroups.containsKey(group))
-        {
-            // cannot redefine
-            return false;
-        }
-        else
-        {
-            _aclGroups.put(group, new ArrayList<String>());
-        }
-
-        for (String name : constituents)
-        {
-            if (name.equalsIgnoreCase(group))
-            {
-                // recursive definition
-                return false;
-            }
-
-            if (!checkName(name))
-            {
-                // invalid name
-                return false;
-            }
-
-            if (_aclGroups.containsKey(name))
-            {
-                // is a group
-                _aclGroups.get(group).addAll(_aclGroups.get(name));
-            }
-            else
-            {
-                // is a user
-                if (!isvalidUserName(name))
-                {
-                    // invalid username
-                    return false;
-                }
-                _aclGroups.get(group).add(name);
-            }
-        }
-        return true;
-    }
-
     /** Return true if the name is well-formed (contains legal characters). */
     protected boolean checkName(String name)
     {
@@ -312,12 +262,6 @@ public class RuleSet
         return true;
     }
 
-    // CPP broker authorise function prototype
-    // virtual bool authorise(const std::string& id, const Action& action, const ObjectType& objType,
-    //        const std::string& name, std::map<Property, std::string>* params=0)
-
-    // Possibly add a String name paramater?
-
     /**
      * Check the authorisation granted to a particular identity for an operation on an object type with
      * specific properties.
@@ -446,8 +390,7 @@ public class RuleSet
             {
                 final Principal principal = iterator.next();
 
-                if (rule.getIdentity().equalsIgnoreCase(principal.getName())
-                    || (_aclGroups.containsKey(rule.getIdentity()) && _aclGroups.get(rule.getIdentity()).contains(principal.getName())))
+                if (rule.getIdentity().equalsIgnoreCase(principal.getName()))
                 {
                     return true;
                 }

Modified: qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AccessControl.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AccessControl.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AccessControl.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AccessControl.java Fri Aug 24 15:33:00 2012
@@ -40,9 +40,9 @@ import org.apache.qpid.server.security.a
 public class AccessControl extends AbstractPlugin
 {
     public static final Logger _logger = Logger.getLogger(AccessControl.class);
-    
+
     private RuleSet _ruleSet;
-    
+
     public static final SecurityPluginFactory<AccessControl> FACTORY = new SecurityPluginFactory<AccessControl>()
     {
         public Class<AccessControl> getPluginClass()
@@ -86,7 +86,7 @@ public class AccessControl extends Abstr
     {
         return authorise(Operation.ACCESS, objectType, ObjectProperties.EMPTY);
     }
-    
+
     /**
      * Check if an operation is authorised by asking the  configuration object about the access
      * control rules granted to the current thread's {@link Subject}. If there is no current
@@ -100,7 +100,7 @@ public class AccessControl extends Abstr
         {
             return Result.ABSTAIN;
         }
- 
+
         _logger.debug("Checking " + operation + " " + objectType);
         return  _ruleSet.check(subject, operation, objectType, properties);
     }

Modified: qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AccessControlConfiguration.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AccessControlConfiguration.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AccessControlConfiguration.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AccessControlConfiguration.java Fri Aug 24 15:33:00 2012
@@ -34,7 +34,7 @@ import org.apache.qpid.server.security.a
 
 public class AccessControlConfiguration extends ConfigurationPlugin
 {
-    public static final ConfigurationPluginFactory FACTORY = new ConfigurationPluginFactory() 
+    public static final ConfigurationPluginFactory FACTORY = new ConfigurationPluginFactory()
     {
         public ConfigurationPlugin newInstance(String path, Configuration config) throws ConfigurationException
         {
@@ -70,7 +70,7 @@ public class AccessControlConfiguration 
         }
 
         File aclFile = new File(filename);
-        
+
         ConfigurationFile configFile = new PlainConfiguration(aclFile);
         _ruleSet = configFile.load();
     }

Modified: qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java Fri Aug 24 15:33:00 2012
@@ -20,8 +20,6 @@
  */
 package org.apache.qpid.server.security.access.plugins;
 
-import java.util.Arrays;
-
 import junit.framework.TestCase;
 
 import org.apache.commons.configuration.ConfigurationException;
@@ -37,19 +35,22 @@ import org.apache.qpid.server.security.a
 import org.apache.qpid.server.security.access.Permission;
 import org.apache.qpid.server.security.access.config.Rule;
 import org.apache.qpid.server.security.access.config.RuleSet;
-import org.apache.qpid.server.security.auth.sasl.TestPrincipalUtils;
+import org.apache.qpid.server.security.auth.TestPrincipalUtils;
 
 /**
- * Unit test for ACL V2 plugin.  
- * 
+ * Unit test for ACL V2 plugin.
+ *
  * This unit test tests the AccessControl class and it collaboration with {@link RuleSet},
  * {@link SecurityManager} and {@link CurrentActor}.   The ruleset is configured programmatically,
  * rather than from an external file.
- * 
+ *
  * @see RuleSetTest
  */
 public class AccessControlTest extends TestCase
 {
+    private static final String ALLOWED_GROUP = "allowed_group";
+    private static final String DENIED_GROUP = "denied_group";
+
     private AccessControl _plugin = null;  // Class under test
     private final UnitTestMessageLogger messageLogger = new UnitTestMessageLogger();
 
@@ -68,14 +69,12 @@ public class AccessControlTest extends T
     private RuleSet createGroupRuleSet()
     {
         final RuleSet rs = new RuleSet();
-        rs.addGroup("aclGroup1", Arrays.asList(new String[] {"member1", "Member2"}));
 
         // Rule expressed with username
         rs.grant(0, "user1", Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
-        // Rule expressed with a acl group
-        rs.grant(1, "aclGroup1", Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
-        // Rule expressed with an external group
-        rs.grant(2, "extGroup1", Permission.DENY, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+        // Rules expressed with groups
+        rs.grant(1, ALLOWED_GROUP, Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+        rs.grant(2, DENIED_GROUP, Permission.DENY, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
         // Catch all rule
         rs.grant(3, Rule.ALL, Permission.DENY_LOG, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
 
@@ -117,31 +116,23 @@ public class AccessControlTest extends T
      * Tests that an allow rule expressed with an <b>ACL groupname</b> allows an operation performed by a thread running
      * by a user who belongs to the same group..
      */
-    public void testAclGroupMembershipAllowsOperation() throws ConfigurationException
+    public void testGroupMembershipAllowsOperation() throws ConfigurationException
     {
         setUpGroupAccessControl();
-        SecurityManager.setThreadSubject(TestPrincipalUtils.createTestSubject("member1"));
-
-        Result result = _plugin.authorise(Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
-        assertEquals(Result.ALLOWED, result);
-
-        SecurityManager.setThreadSubject(TestPrincipalUtils.createTestSubject("Member2"));
 
-        result = _plugin.authorise(Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
-        assertEquals(Result.ALLOWED, result);
+        authoriseAndAssertResult(Result.ALLOWED, "member of allowed group", ALLOWED_GROUP);
+        authoriseAndAssertResult(Result.DENIED, "member of denied group", DENIED_GROUP);
+        authoriseAndAssertResult(Result.ALLOWED, "another member of allowed group", ALLOWED_GROUP);
     }
 
     /**
-     * Tests that a deny rule expressed with an <b>External groupname</b> denies an operation performed by a thread running
+     * Tests that a deny rule expressed with a <b>groupname</b> denies an operation performed by a thread running
      * by a user who belongs to the same group.
      */
-    public void testExternalGroupMembershipDeniesOperation() throws ConfigurationException
+    public void testGroupMembershipDeniesOperation() throws ConfigurationException
     {
         setUpGroupAccessControl();
-        SecurityManager.setThreadSubject(TestPrincipalUtils.createTestSubject("user3", "extGroup1"));
-
-        final Result result = _plugin.authorise(Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
-        assertEquals(Result.DENIED, result);
+        authoriseAndAssertResult(Result.DENIED, "user3", DENIED_GROUP);
     }
 
     /**
@@ -325,6 +316,14 @@ public class AccessControlTest extends T
         assertEquals(Result.DEFER, result);
     }
 
+    private void authoriseAndAssertResult(Result expectedResult, String userName, String... groups)
+    {
+        SecurityManager.setThreadSubject(TestPrincipalUtils.createTestSubject(userName, groups));
+
+        Result result = _plugin.authorise(Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+        assertEquals(expectedResult, result);
+    }
+
     /**
      * Creates a configuration plugin for the {@link AccessControl} plugin.
      */

Modified: qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java Fri Aug 24 15:33:00 2012
@@ -108,19 +108,6 @@ public class PlainConfigurationTest exte
         }
     }
 
-    public void testACLFileSyntaxNotEnoughGroup() throws Exception
-    {
-        try
-        {
-            writeACLConfig("GROUP blah");
-            fail("fail");
-        }
-        catch (ConfigurationException ce)
-        {
-            assertEquals(String.format(PlainConfiguration.NOT_ENOUGH_GROUP_MSG, 1), ce.getMessage());
-        }
-    }
-
     public void testACLFileSyntaxNotEnoughACL() throws Exception
     {
         try
@@ -391,4 +378,77 @@ public class PlainConfigurationTest exte
         assertEquals("Rule has unexpected object properties", ObjectProperties.EMPTY, rule.getAction().getProperties());
     }
 
+    public void testUserRuleParsing() throws Exception
+    {
+        validateRule(writeACLConfig("ACL ALLOW user1 CREATE USER"),
+                "user1", Operation.CREATE, ObjectType.USER, ObjectProperties.EMPTY);
+        validateRule(writeACLConfig("ACL ALLOW user1 CREATE USER name=\"otherUser\""),
+                "user1", Operation.CREATE, ObjectType.USER, new ObjectProperties("otherUser"));
+
+        validateRule(writeACLConfig("ACL ALLOW user1 DELETE USER"),
+                "user1", Operation.DELETE, ObjectType.USER, ObjectProperties.EMPTY);
+        validateRule(writeACLConfig("ACL ALLOW user1 DELETE USER name=\"otherUser\""),
+                "user1", Operation.DELETE, ObjectType.USER, new ObjectProperties("otherUser"));
+
+        validateRule(writeACLConfig("ACL ALLOW user1 UPDATE USER"),
+                "user1", Operation.UPDATE, ObjectType.USER, ObjectProperties.EMPTY);
+        validateRule(writeACLConfig("ACL ALLOW user1 UPDATE USER name=\"otherUser\""),
+                "user1", Operation.UPDATE, ObjectType.USER, new ObjectProperties("otherUser"));
+
+        validateRule(writeACLConfig("ACL ALLOW user1 ALL USER"),
+                "user1", Operation.ALL, ObjectType.USER, ObjectProperties.EMPTY);
+        validateRule(writeACLConfig("ACL ALLOW user1 ALL USER name=\"otherUser\""),
+                "user1", Operation.ALL, ObjectType.USER, new ObjectProperties("otherUser"));
+    }
+
+    public void testGroupRuleParsing() throws Exception
+    {
+        validateRule(writeACLConfig("ACL ALLOW user1 CREATE GROUP"),
+                "user1", Operation.CREATE, ObjectType.GROUP, ObjectProperties.EMPTY);
+        validateRule(writeACLConfig("ACL ALLOW user1 CREATE GROUP name=\"groupName\""),
+                "user1", Operation.CREATE, ObjectType.GROUP, new ObjectProperties("groupName"));
+
+        validateRule(writeACLConfig("ACL ALLOW user1 DELETE GROUP"),
+                "user1", Operation.DELETE, ObjectType.GROUP, ObjectProperties.EMPTY);
+        validateRule(writeACLConfig("ACL ALLOW user1 DELETE GROUP name=\"groupName\""),
+                "user1", Operation.DELETE, ObjectType.GROUP, new ObjectProperties("groupName"));
+
+        validateRule(writeACLConfig("ACL ALLOW user1 UPDATE GROUP"),
+                "user1", Operation.UPDATE, ObjectType.GROUP, ObjectProperties.EMPTY);
+        validateRule(writeACLConfig("ACL ALLOW user1 UPDATE GROUP name=\"groupName\""),
+                "user1", Operation.UPDATE, ObjectType.GROUP, new ObjectProperties("groupName"));
+
+        validateRule(writeACLConfig("ACL ALLOW user1 ALL GROUP"),
+                "user1", Operation.ALL, ObjectType.GROUP, ObjectProperties.EMPTY);
+        validateRule(writeACLConfig("ACL ALLOW user1 ALL GROUP name=\"groupName\""),
+                "user1", Operation.ALL, ObjectType.GROUP, new ObjectProperties("groupName"));
+    }
+
+    /** explicitly test for exception indicating that this functionality has been moved to Group Providers */
+    public void testGroupDefinitionThrowsException() throws Exception
+    {
+        try
+        {
+            writeACLConfig("GROUP group1 bob alice");
+            fail("Expected exception not thrown");
+        }
+        catch(ConfigurationException e)
+        {
+            assertTrue(e.getMessage().contains("GROUP keyword not supported"));
+        }
+    }
+
+    private void validateRule(final PlainConfiguration config, String username, Operation operation, ObjectType objectType, ObjectProperties objectProperties)
+    {
+        final RuleSet rs = config.getConfiguration();
+        assertEquals(1, rs.getRuleCount());
+
+        final Map<Integer, Rule> rules = rs.getAllRules();
+        assertEquals(1, rules.size());
+        final Rule rule = rules.get(0);
+        assertEquals("Rule has unexpected identity", username, rule.getIdentity());
+        assertEquals("Rule has unexpected operation", operation, rule.getAction().getOperation());
+        assertEquals("Rule has unexpected operation", objectType, rule.getAction().getObjectType());
+        assertEquals("Rule has unexpected object properties", objectProperties, rule.getAction().getProperties());
+    }
 }

Modified: qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/RuleSetTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/RuleSetTest.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/RuleSetTest.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/RuleSetTest.java Fri Aug 24 15:33:00 2012
@@ -22,7 +22,6 @@
 package org.apache.qpid.server.security.access.plugins;
 
 import java.security.Principal;
-import java.util.Arrays;
 
 import javax.security.auth.Subject;
 
@@ -34,8 +33,7 @@ import org.apache.qpid.server.security.a
 import org.apache.qpid.server.security.access.Permission;
 import org.apache.qpid.server.security.access.config.Rule;
 import org.apache.qpid.server.security.access.config.RuleSet;
-import org.apache.qpid.server.security.auth.sasl.TestPrincipalUtils;
-import org.apache.qpid.server.security.auth.sasl.UsernamePrincipal;
+import org.apache.qpid.server.security.auth.TestPrincipalUtils;
 import org.apache.qpid.test.utils.QpidTestCase;
 
 /**
@@ -46,10 +44,7 @@ import org.apache.qpid.test.utils.QpidTe
  * access control mechanism is validated by checking whether operations would be authorised by calling the
  * {@link RuleSet#check(Principal, Operation, ObjectType, ObjectProperties)} method.
  *
- * It ensure that permissions can be granted correctly on users directly, ACL groups (that is those
- * groups declared directly in the ACL itself), and External groups (that is a group from an External
- * Authentication Provider, such as an LDAP).
-
+ * It ensure that permissions can be granted correctly on users directly and on groups.
  */
 public class RuleSetTest extends QpidTestCase
 {
@@ -316,63 +311,36 @@ public class RuleSetTest extends QpidTes
         assertEquals(Result.ALLOWED, _ruleSet.check(TestPrincipalUtils.createTestSubject("userb"),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
     }
 
-    /**
-     * Tests support for ACL groups (i.e. inline groups declared in the ACL file itself).
-     */
-    public void testAclGroupsSupported()
+    public void testGroupsSupported()
     {
-        assertTrue(_ruleSet.addGroup("aclgroup", Arrays.asList(new String[] {"usera", "userb"})));
-
-        _ruleSet.grant(1, "aclgroup", Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
-        assertEquals(1, _ruleSet.getRuleCount());
-
-        assertEquals(Result.ALLOWED, _ruleSet.check(TestPrincipalUtils.createTestSubject("usera"),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
-        assertEquals(Result.ALLOWED, _ruleSet.check(TestPrincipalUtils.createTestSubject("userb"),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
-        assertEquals(Result.DEFER, _ruleSet.check(TestPrincipalUtils.createTestSubject("userc"),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
-    }
-
-    /**
-     * Tests support for nested ACL groups.
-     */
-    public void testNestedAclGroupsSupported()
-    {
-        assertTrue(_ruleSet.addGroup("aclgroup1", Arrays.asList(new String[] {"userb"})));
-        assertTrue(_ruleSet.addGroup("aclgroup2", Arrays.asList(new String[] {"usera", "aclgroup1"})));
-
-        _ruleSet.grant(1, "aclgroup2", Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
-        assertEquals(1, _ruleSet.getRuleCount());
+        String allowGroup = "allowGroup";
+        String deniedGroup = "deniedGroup";
 
-        assertEquals(Result.ALLOWED, _ruleSet.check(TestPrincipalUtils.createTestSubject("usera"),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
-        assertEquals(Result.ALLOWED, _ruleSet.check(TestPrincipalUtils.createTestSubject("userb"),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
-    }
+        _ruleSet.grant(1, allowGroup, Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+        _ruleSet.grant(2, deniedGroup, Permission.DENY, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
 
-    /**
-     * Tests support for nested External groups (i.e. those groups coming from an external source such as an LDAP).
-     */
-    public void testExternalGroupsSupported()
-    {
-        _ruleSet.grant(1, "extgroup1", Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
-        _ruleSet.grant(2, "extgroup2", Permission.DENY, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
         assertEquals(2, _ruleSet.getRuleCount());
 
-        assertEquals(Result.ALLOWED, _ruleSet.check(TestPrincipalUtils.createTestSubject("usera", "extgroup1"),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
-        assertEquals(Result.DENIED, _ruleSet.check(TestPrincipalUtils.createTestSubject("userb", "extgroup2"),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
+        assertEquals(Result.ALLOWED, _ruleSet.check(TestPrincipalUtils.createTestSubject("usera", allowGroup),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
+        assertEquals(Result.DENIED, _ruleSet.check(TestPrincipalUtils.createTestSubject("userb", deniedGroup),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
+        assertEquals(Result.DEFER, _ruleSet.check(TestPrincipalUtils.createTestSubject("user", "group not mentioned in acl"),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
     }
 
     /**
      * Rule order in the ACL determines the outcome of the check.  This test ensures that a user who is
-     * granted explicit permission on an object, is granted that access even although late a group
+     * granted explicit permission on an object, is granted that access even though a group
      * to which the user belongs is later denied the permission.
      */
     public void testAllowDeterminedByRuleOrder()
     {
-        assertTrue(_ruleSet.addGroup("aclgroup", Arrays.asList(new String[] {"usera"})));
+        String group = "group";
+        String user = "user";
 
-        _ruleSet.grant(1, "usera", Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
-        _ruleSet.grant(2, "aclgroup", Permission.DENY, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+        _ruleSet.grant(1, user, Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+        _ruleSet.grant(2, group, Permission.DENY, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
         assertEquals(2, _ruleSet.getRuleCount());
 
-        assertEquals(Result.ALLOWED, _ruleSet.check(TestPrincipalUtils.createTestSubject("usera"),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
+        assertEquals(Result.ALLOWED, _ruleSet.check(TestPrincipalUtils.createTestSubject(user, group),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
     }
 
     /**
@@ -381,13 +349,33 @@ public class RuleSetTest extends QpidTes
      */
     public void testDenyDeterminedByRuleOrder()
     {
-        assertTrue(_ruleSet.addGroup("aclgroup", Arrays.asList(new String[] {"usera"})));
+        String group = "aclgroup";
+        String user = "usera";
 
-        _ruleSet.grant(1, "aclgroup", Permission.DENY, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
-        _ruleSet.grant(2, "usera", Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+        _ruleSet.grant(1, group, Permission.DENY, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+        _ruleSet.grant(2, user, Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
 
         assertEquals(2, _ruleSet.getRuleCount());
 
-        assertEquals(Result.DENIED, _ruleSet.check(TestPrincipalUtils.createTestSubject("usera"),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
+        assertEquals(Result.DENIED, _ruleSet.check(TestPrincipalUtils.createTestSubject(user, group),Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
+    }
+
+    public void testUserInMultipleGroups()
+    {
+        String allowedGroup = "group1";
+        String deniedGroup = "group2";
+
+        _ruleSet.grant(1, allowedGroup, Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+        _ruleSet.grant(2, deniedGroup, Permission.DENY, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+
+        Subject subjectInBothGroups = TestPrincipalUtils.createTestSubject("user", allowedGroup, deniedGroup);
+        Subject subjectInDeniedGroupAndOneOther = TestPrincipalUtils.createTestSubject("user", deniedGroup, "some other group");
+        Subject subjectInAllowedGroupAndOneOther = TestPrincipalUtils.createTestSubject("user", allowedGroup, "some other group");
+
+        assertEquals(Result.ALLOWED, _ruleSet.check(subjectInBothGroups,Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
+
+        assertEquals(Result.DENIED, _ruleSet.check(subjectInDeniedGroupAndOneOther,Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
+
+        assertEquals(Result.ALLOWED, _ruleSet.check(subjectInAllowedGroupAndOneOther,Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY));
     }
 }

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/MANIFEST.MF
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/MANIFEST.MF?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/MANIFEST.MF (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/MANIFEST.MF Fri Aug 24 15:33:00 2012
@@ -20,6 +20,7 @@ Import-Package:  org.apache.qpid,
  org.apache.qpid.server.binding,
  org.apache.qpid.server.exchange,
  org.apache.qpid.server.logging,
+ org.apache.qpid.server.logging.actors,
  org.apache.qpid.server.message,
  org.apache.qpid.server.model,
  org.apache.qpid.server.model.adapter,

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/Management.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/Management.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/Management.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/Management.java Fri Aug 24 15:33:00 2012
@@ -44,6 +44,9 @@ import org.apache.qpid.server.model.Brok
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Connection;
 import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.Group;
+import org.apache.qpid.server.model.GroupMember;
+import org.apache.qpid.server.model.GroupProvider;
 import org.apache.qpid.server.model.Port;
 import org.apache.qpid.server.model.Protocol;
 import org.apache.qpid.server.model.Queue;
@@ -158,6 +161,9 @@ public class Management
         addRestServlet(root, "virtualhost", VirtualHost.class);
         addRestServlet(root, "authenticationprovider", AuthenticationProvider.class);
         addRestServlet(root, "user", AuthenticationProvider.class, User.class);
+        addRestServlet(root, "groupprovider", GroupProvider.class);
+        addRestServlet(root, "group", GroupProvider.class, Group.class);
+        addRestServlet(root, "groupmember", GroupProvider.class, Group.class, GroupMember.class);
         addRestServlet(root, "exchange", VirtualHost.class, Exchange.class);
         addRestServlet(root, "queue", VirtualHost.class, Queue.class);
         addRestServlet(root, "connection", VirtualHost.class, Connection.class);

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java Fri Aug 24 15:33:00 2012
@@ -24,8 +24,10 @@ package org.apache.qpid.server.managemen
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
-import java.security.Principal;
-import java.util.Collections;
+import java.security.AccessControlException;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+
 import javax.security.auth.Subject;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -33,168 +35,293 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import org.apache.commons.codec.binary.Base64;
+import org.apache.log4j.Logger;
+import org.apache.qpid.server.logging.LogActor;
+import org.apache.qpid.server.logging.RootMessageLogger;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.actors.HttpManagementActor;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.registry.ApplicationRegistry;
-import org.apache.qpid.server.security.auth.AuthenticationResult;
+import org.apache.qpid.server.security.SubjectCreator;
+import org.apache.qpid.server.security.auth.AuthenticationResult.AuthenticationStatus;
+import org.apache.qpid.server.security.auth.SubjectAuthenticationResult;
 import org.apache.qpid.server.security.auth.manager.AnonymousAuthenticationManager;
-import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
 
 public abstract class AbstractServlet extends HttpServlet
 {
+    private static final Logger LOGGER = Logger.getLogger(AbstractServlet.class);
+
+    protected static final String ATTR_SUBJECT = "subject";
+    private static final String ATTR_LOG_ACTOR = "AbstractServlet.logActor";
+
     private final Broker _broker;
 
+    private RootMessageLogger _rootLogger;
+
     protected AbstractServlet()
     {
         super();
         _broker = ApplicationRegistry.getInstance().getBroker();
+        _rootLogger = ApplicationRegistry.getInstance().getRootMessageLogger();
     }
 
     protected AbstractServlet(Broker broker)
     {
         _broker = broker;
+        _rootLogger = ApplicationRegistry.getInstance().getRootMessageLogger();
     }
 
     @Override
-    protected final void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException
+    protected final void doGet(final HttpServletRequest request, final HttpServletResponse resp)
     {
-        setAuthorizedSubject(request);
-        try
-        {
-            onGet(request, resp);
-        }
-        finally
-        {
-            clearAuthorizedSubject();
-        }
+        doWithSubjectAndActor(
+            new PrivilegedExceptionAction<Void>()
+            {
+                @Override
+                public Void run() throws Exception
+                {
+                    doGetWithSubjectAndActor(request, resp);
+                    return null;
+                }
+            },
+            request,
+            resp
+        );
     }
 
-    protected void onGet(HttpServletRequest request, HttpServletResponse resp) throws IOException, ServletException
+    /**
+     * Performs the GET action as the logged-in {@link Subject}.
+     * The {@link LogActor} is set before this method is called.
+     * Subclasses commonly override this method
+     */
+    protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException
     {
-        super.doGet(request, resp);
+        throw new UnsupportedOperationException("GET not supported by this servlet");
     }
 
-    private void clearAuthorizedSubject()
+
+    @Override
+    protected final void doPost(final HttpServletRequest request, final HttpServletResponse resp)
     {
-        org.apache.qpid.server.security.SecurityManager.setThreadSubject(null);
+        doWithSubjectAndActor(
+            new PrivilegedExceptionAction<Void>()
+            {
+                @Override
+                public Void run()  throws Exception
+                {
+                    doPostWithSubjectAndActor(request, resp);
+                    return null;
+                }
+            },
+            request,
+            resp
+        );
     }
 
-
-    private void setAuthorizedSubject(HttpServletRequest request)
+    /**
+     * Performs the POST action as the logged-in {@link Subject}.
+     * The {@link LogActor} is set before this method is called.
+     * Subclasses commonly override this method
+     */
+    protected void doPostWithSubjectAndActor(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
     {
-        HttpSession session = request.getSession(true);
-        Subject subject = (Subject) session.getAttribute("subject");
+        throw new UnsupportedOperationException("POST not supported by this servlet");
+    }
 
-        if(subject == null)
-        {
-            Principal principal = request.getUserPrincipal();
-            if(principal != null)
-            {
-                subject = new Subject(false, Collections.singleton(principal),Collections.emptySet(),
-                                      Collections.emptySet());
-            }
-            else
+    @Override
+    protected final void doPut(final HttpServletRequest request, final HttpServletResponse resp)
+    {
+        doWithSubjectAndActor(
+            new PrivilegedExceptionAction<Void>()
             {
-                String header = request.getHeader("Authorization");
+                @Override
+                public Void run() throws Exception
+                {
+                    doPutWithSubjectAndActor(request, resp);
+                    return null;
+                }
+            },
+            request,
+            resp
+        );
+    }
 
-                /*
-                 * TODO - Should configure whether basic authentication is allowed... and in particular whether it
-                 * should be allowed over non-ssl connections
-                 * */
+    /**
+     * Performs the PUT action as the logged-in {@link Subject}.
+     * The {@link LogActor} is set before this method is called.
+     * Subclasses commonly override this method
+     */
+    protected void doPutWithSubjectAndActor(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+    {
+        throw new UnsupportedOperationException("PUT not supported by this servlet");
+    }
 
-                if (header != null)
+    @Override
+    protected final void doDelete(final HttpServletRequest request, final HttpServletResponse resp)
+            throws ServletException, IOException
+    {
+        doWithSubjectAndActor(
+            new PrivilegedExceptionAction<Void>()
+            {
+                @Override
+                public Void run() throws Exception
                 {
-                    String[] tokens = header.split("\\s");
-                    if(tokens.length >= 2
-                       && "BASIC".equalsIgnoreCase(tokens[0]))
-                    {
-                        String[] credentials = (new String(Base64.decodeBase64(tokens[1].getBytes()))).split(":",2);
-                        if(credentials.length == 2)
-                        {
-                            SocketAddress address = getSocketAddress(request);
-                            AuthenticationManager authenticationManager =
-                                    ApplicationRegistry.getInstance().getAuthenticationManager(address);
-                            AuthenticationResult authResult =
-                                    authenticationManager.authenticate(credentials[0], credentials[1]);
-                            subject = authResult.getSubject();
-
-                        }
-                    }
+                    doDeleteWithSubjectAndActor(request, resp);
+                    return null;
                 }
-            }
-        }
-        if (subject == null)
-        {
-            subject = AnonymousAuthenticationManager.ANONYMOUS_SUBJECT;
-        }
-        org.apache.qpid.server.security.SecurityManager.setThreadSubject(subject);
-
+            },
+            request,
+            resp
+        );
     }
 
-    protected Subject getSubject(HttpSession session)
+    /**
+     * Performs the PUT action as the logged-in {@link Subject}.
+     * The {@link LogActor} is set before this method is called.
+     * Subclasses commonly override this method
+     */
+    protected void doDeleteWithSubjectAndActor(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
     {
-        return (Subject)session.getAttribute("subject");
+        throw new UnsupportedOperationException("DELETE not supported by this servlet");
     }
 
-    @Override
-    protected final void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+    private void doWithSubjectAndActor(
+                    PrivilegedExceptionAction<Void> privilegedExceptionAction,
+                    final HttpServletRequest request,
+                    final HttpServletResponse resp)
     {
-        setAuthorizedSubject(req);
+        Subject subject = getAndCacheAuthorizedSubject(request);
+        org.apache.qpid.server.security.SecurityManager.setThreadSubject(subject);
+
         try
         {
-            onPost(req, resp);
+            HttpManagementActor logActor = getLogActorAndCacheInSession(request);
+            CurrentActor.set(logActor);
+            try
+            {
+                Subject.doAs(subject, privilegedExceptionAction);
+            }
+            catch(RuntimeException e)
+            {
+                LOGGER.error("Unable to perform action", e);
+                throw e;
+            }
+            catch (PrivilegedActionException e)
+            {
+                LOGGER.error("Unable to perform action", e);
+                throw new RuntimeException(e.getCause());
+            }
+            finally
+            {
+                CurrentActor.remove();
+            }
         }
         finally
         {
-            clearAuthorizedSubject();
+            org.apache.qpid.server.security.SecurityManager.setThreadSubject(null);
         }
-
     }
 
-    protected void onPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+    /**
+     * Gets the logged-in {@link Subject} by trying the following:
+     *
+     * <ul>
+     * <li>Get it from the session</li>
+     * <li>Get it from the request</li>
+     * <li>Log in using the username and password in the Authorization HTTP header</li>
+     * <li>Create a Subject representing the anonymous user.</li>
+     * </ul>
+     *
+     * If an authenticated subject is found it is cached in the http session.
+     */
+    private Subject getAndCacheAuthorizedSubject(HttpServletRequest request)
     {
-        super.doPost(req, resp);
-    }
+        HttpSession session = request.getSession();
+        Subject subject = getSubjectFromSession(session);
 
-    @Override
-    protected final void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
-    {
-        setAuthorizedSubject(req);
-        try
+        if(subject != null)
         {
-            onPut(req, resp);
+            return subject;
+        }
 
+        SubjectCreator subjectCreator = ApplicationRegistry.getInstance().getSubjectCreator(getSocketAddress(request));
+
+        String remoteUser = request.getRemoteUser();
+        if(remoteUser != null)
+        {
+            subject = subjectCreator.createSubjectWithGroups(remoteUser);
         }
-        finally
+        else
         {
-            clearAuthorizedSubject();
+            String header = request.getHeader("Authorization");
+
+            /*
+             * TODO - Should configure whether basic authentication is allowed... and in particular whether it
+             * should be allowed over non-ssl connections
+             * */
+
+            if (header != null)
+            {
+                String[] tokens = header.split("\\s");
+                if(tokens.length >= 2
+                        && "BASIC".equalsIgnoreCase(tokens[0]))
+                {
+                    String[] credentials = (new String(Base64.decodeBase64(tokens[1].getBytes()))).split(":",2);
+                    if(credentials.length == 2)
+                    {
+                        SubjectAuthenticationResult authResult = subjectCreator.authenticate(credentials[0], credentials[1]);
+                        if( authResult.getStatus() != AuthenticationStatus.SUCCESS)
+                        {
+                            //TODO: write a return response indicating failure?
+                            throw new AccessControlException("Incorrect username or password");
+                        }
+                        subject = authResult.getSubject();
+                    }
+                    else
+                    {
+                        //TODO: write a return response indicating failure?
+                        throw new AccessControlException("Invalid number of credentials supplied: "
+                                                        + credentials.length);
+                    }
+                }
+            }
         }
-    }
 
-    protected void onPut(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException
-    {
-        super.doPut(req,resp);
+        if (subject != null)
+        {
+            setSubjectInSession(subject, session);
+        }
+        else
+        {
+            subject = subjectCreator.createSubjectWithGroups(AnonymousAuthenticationManager.ANONYMOUS_USERNAME);
+        }
+
+        return subject;
     }
 
-    @Override
-    protected final void doDelete(HttpServletRequest req, HttpServletResponse resp)
-            throws ServletException, IOException
+    private HttpManagementActor getLogActorAndCacheInSession(HttpServletRequest req)
     {
-        setAuthorizedSubject(req);
-        try
-        {
-            onDelete(req, resp);
-        }
-        finally
+        HttpSession session = req.getSession();
+
+        HttpManagementActor actor = (HttpManagementActor) session.getAttribute(ATTR_LOG_ACTOR);
+        if(actor == null)
         {
-            clearAuthorizedSubject();
+            actor = new HttpManagementActor(_rootLogger, req.getRemoteAddr(), req.getRemotePort());
+            session.setAttribute(ATTR_LOG_ACTOR, actor);
         }
+
+        return actor;
     }
 
-    protected void onDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+    protected Subject getSubjectFromSession(HttpSession session)
     {
-        super.doDelete(req, resp);
+        return (Subject)session.getAttribute(ATTR_SUBJECT);
     }
 
+    protected void setSubjectInSession(Subject subject, final HttpSession session)
+    {
+        session.setAttribute(ATTR_SUBJECT, subject);
+    }
 
     protected Broker getBroker()
     {

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java Fri Aug 24 15:33:00 2012
@@ -44,7 +44,7 @@ public class LogRecordsServlet extends A
     }
 
     @Override
-    protected void onGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+    protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
     {
         response.setContentType("application/json");
         response.setStatus(HttpServletResponse.SC_OK);

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java Fri Aug 24 15:33:00 2012
@@ -48,7 +48,7 @@ public class MessageContentServlet exten
     }
 
     @Override
-    protected void onGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+    protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
     {
 
         if(request.getPathInfo() != null && request.getPathInfo().length()>0 && request.getPathInfo().substring(1).split("/").length > 2)

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java Fri Aug 24 15:33:00 2012
@@ -62,7 +62,7 @@ public class MessageServlet extends Abst
     }
 
     @Override
-    protected void onGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+    protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
     {
 
         if(request.getPathInfo() != null && request.getPathInfo().length()>0 && request.getPathInfo().substring(1).split("/").length > 2)
@@ -400,7 +400,7 @@ public class MessageServlet extends Abst
      * POST moves or copies messages to the given queue from a queue specified in the posted JSON data
      */
     @Override
-    protected void onPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    protected void doPostWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
     {
 
         try
@@ -450,7 +450,7 @@ public class MessageServlet extends Abst
      * DELETE removes messages from the queue
      */
     @Override
-    protected void onDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    protected void doDeleteWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response)
     {
 
         final Queue sourceQueue = getQueueFromRequest(request);

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java?rev=1376968&r1=1376967&r2=1376968&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java Fri Aug 24 15:33:00 2012
@@ -31,7 +31,6 @@ import org.apache.qpid.server.model.*;
 import org.codehaus.jackson.map.ObjectMapper;
 import org.codehaus.jackson.map.SerializationConfig;
 
-
 public class RestServlet extends AbstractServlet
 {
     private static final Logger LOGGER = Logger.getLogger(RestServlet.class);
@@ -285,7 +284,7 @@ public class RestServlet extends Abstrac
     }
 
     @Override
-    protected void onGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
     {
         response.setContentType("application/json");
         response.setStatus(HttpServletResponse.SC_OK);
@@ -319,7 +318,7 @@ public class RestServlet extends Abstrac
     }
 
     @Override
-    protected void onPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    protected void doPutWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
     {
         response.setContentType("application/json");
 
@@ -336,7 +335,8 @@ public class RestServlet extends Abstrac
 
             if(names.size() != _hierarchy.length)
             {
-                throw new IllegalArgumentException("Path to object to create must be fully specified");
+                throw new IllegalArgumentException("Path to object to create must be fully specified. "
+                       + "Found " + names.size() + " expecting " + _hierarchy.length);
             }
         }
 
@@ -428,8 +428,11 @@ public class RestServlet extends Abstrac
                        || (obj.getName().equals(providedObject.get("name")) && equalParents(obj, otherParents)))
                     {
                         doUpdate(obj, providedObject);
+                        response.setStatus(HttpServletResponse.SC_OK);
+                        return;
                     }
                 }
+
                 theParent.createChild(objClass, providedObject, otherParents);
             }
             catch (RuntimeException e)
@@ -464,11 +467,12 @@ public class RestServlet extends Abstrac
     {
         if (e.getCause() instanceof AMQSecurityException)
         {
+            LOGGER.debug("Caught AMQSecurityException", e);
             response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
         }
         else
         {
-            LOGGER.warn("Unexpected exception is caught", e);
+            LOGGER.warn("Caught exception", e);
 
             // TODO
             response.setStatus(HttpServletResponse.SC_CONFLICT);
@@ -476,7 +480,7 @@ public class RestServlet extends Abstrac
     }
 
     @Override
-    protected void onDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    protected void doDeleteWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
     {
         response.setContentType("application/json");
         response.setStatus(HttpServletResponse.SC_OK);



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