Author: rgodfrey
Date: Wed Aug  3 21:45:58 2016
New Revision: 1755117

URL: http://svn.apache.org/viewvc?rev=1755117&view=rev
Log:
QPID-7318 : Ensure reload of ACL file causes update of policy

Modified:
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
    
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AclFileAccessControlProviderImpl.java
    
qpid/java/trunk/systests/src/test/java/org/apache/qpid/server/security/acl/AbstractACLTestCase.java
    
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/ExchangeRestACLTest.java

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java?rev=1755117&r1=1755116&r2=1755117&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
 Wed Aug  3 21:45:58 2016
@@ -234,7 +234,6 @@ public class BrokerImpl extends Abstract
     {
         super.postResolveChildren();
 
-
         final SystemConfig parent = getParent(SystemConfig.class);
         Runnable task =  parent.getOnContainerResolveTask();
         if(task != null)
@@ -242,6 +241,10 @@ public class BrokerImpl extends Abstract
             task.run();
         }
         addChangeListener(_accessControlProviderListener);
+        for(AccessControlProvider aclProvider : 
getChildren(AccessControlProvider.class))
+        {
+            aclProvider.addChangeListener(_accessControlProviderListener);
+        }
         _eventLogger.message(BrokerMessages.CONFIG(parent instanceof 
FileBasedSettings
                                                            ? 
((FileBasedSettings) parent).getStorePath()
                                                            : "N/A"));

Modified: 
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AclFileAccessControlProviderImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AclFileAccessControlProviderImpl.java?rev=1755117&r1=1755116&r2=1755117&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AclFileAccessControlProviderImpl.java
 (original)
+++ 
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AclFileAccessControlProviderImpl.java
 Wed Aug  3 21:45:58 2016
@@ -20,6 +20,7 @@
  */
 package org.apache.qpid.server.security.access.plugins;
 
+import java.util.Collections;
 import java.util.Map;
 
 import org.apache.qpid.server.logging.messages.AccessControlMessages;
@@ -82,6 +83,9 @@ public class AclFileAccessControlProvide
         try
         {
             recreateAccessController();
+            LOGGER.debug("Calling changeAttributes to try to force update");
+            // force the change listener to fire, causing the parent broker to 
update its cache
+            changeAttributes(Collections.<String,Object>emptyMap());
             
getEventLogger().message(AccessControlMessages.LOADED(String.valueOf(getPath()).startsWith("data:")
 ? "data:..." : getPath()));
 
         }

Modified: 
qpid/java/trunk/systests/src/test/java/org/apache/qpid/server/security/acl/AbstractACLTestCase.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/test/java/org/apache/qpid/server/security/acl/AbstractACLTestCase.java?rev=1755117&r1=1755116&r2=1755117&view=diff
==============================================================================
--- 
qpid/java/trunk/systests/src/test/java/org/apache/qpid/server/security/acl/AbstractACLTestCase.java
 (original)
+++ 
qpid/java/trunk/systests/src/test/java/org/apache/qpid/server/security/acl/AbstractACLTestCase.java
 Wed Aug  3 21:45:58 2016
@@ -97,7 +97,7 @@ public abstract class AbstractACLTestCas
         writeACLFileUtil(this, rules);
     }
 
-    public static void writeACLFileUtil(QpidBrokerTestCase testcase, 
String...rules) throws IOException
+    public static String writeACLFileUtil(QpidBrokerTestCase testcase, 
String...rules) throws IOException
     {
         File aclFile = 
File.createTempFile(testcase.getClass().getSimpleName(), testcase.getName());
         aclFile.deleteOnExit();
@@ -111,6 +111,7 @@ public abstract class AbstractACLTestCas
             out.println(line);
         }
         out.close();
+        return aclFile.getCanonicalPath();
     }
 
     /**

Modified: 
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/ExchangeRestACLTest.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/ExchangeRestACLTest.java?rev=1755117&r1=1755116&r2=1755117&view=diff
==============================================================================
--- 
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/ExchangeRestACLTest.java
 (original)
+++ 
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/ExchangeRestACLTest.java
 Wed Aug  3 21:45:58 2016
@@ -20,13 +20,20 @@
  */
 package org.apache.qpid.systest.rest.acl;
 
+import static 
org.apache.qpid.server.security.acl.AbstractACLTestCase.writeACLFileUtil;
+import static 
org.apache.qpid.test.utils.TestBrokerConfiguration.ENTRY_NAME_ACL_FILE;
+
+import java.io.FileWriter;
 import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.qpid.server.management.plugin.servlet.rest.AbstractServlet;
+import org.apache.qpid.server.model.AccessControlProvider;
 import org.apache.qpid.server.model.Binding;
 import org.apache.qpid.server.model.Exchange;
 import org.apache.qpid.server.model.Queue;
@@ -38,30 +45,35 @@ public class ExchangeRestACLTest extends
 {
     private static final String ALLOWED_USER = "user1";
     private static final String DENIED_USER = "user2";
+    private static final String ADMIN = "ADMIN";
+
     private String _queueName;
     private String _exchangeName;
     private String _exchangeUrl;
+    private String _aclFilePath;
 
     @Override
     protected void customizeConfiguration() throws Exception
     {
         super.customizeConfiguration();
         final TestBrokerConfiguration defaultBrokerConfiguration = 
getDefaultBrokerConfiguration();
-        
defaultBrokerConfiguration.configureTemporaryPasswordFile(ALLOWED_USER, 
DENIED_USER);
+        
defaultBrokerConfiguration.configureTemporaryPasswordFile(ALLOWED_USER, 
DENIED_USER, ADMIN);
 
-        AbstractACLTestCase.writeACLFileUtil(this, "ACL ALLOW-LOG ALL ACCESS 
MANAGEMENT",
-                "ACL ALLOW-LOG " + ALLOWED_USER + " CREATE QUEUE",
-                "ACL ALLOW-LOG " + ALLOWED_USER + " CREATE EXCHANGE",
-                "ACL DENY-LOG " + DENIED_USER + " CREATE EXCHANGE",
-                "ACL ALLOW-LOG " + ALLOWED_USER + " UPDATE EXCHANGE",
-                "ACL DENY-LOG " + DENIED_USER + " UPDATE EXCHANGE",
-                "ACL ALLOW-LOG " + ALLOWED_USER + " DELETE EXCHANGE",
-                "ACL DENY-LOG " + DENIED_USER + " DELETE EXCHANGE",
-                "ACL ALLOW-LOG " + ALLOWED_USER + " BIND EXCHANGE",
-                "ACL DENY-LOG " + DENIED_USER + " BIND EXCHANGE",
-                "ACL ALLOW-LOG " + ALLOWED_USER + " UNBIND EXCHANGE",
-                "ACL DENY-LOG " + DENIED_USER + " UNBIND EXCHANGE",
-                "ACL DENY-LOG ALL ALL");
+        _aclFilePath = writeACLFileUtil(this,
+                                        "ACL ALLOW-LOG ALL ACCESS MANAGEMENT",
+                                        "ACL ALLOW-LOG " + ALLOWED_USER + " 
CREATE QUEUE",
+                                        "ACL ALLOW-LOG " + ALLOWED_USER + " 
CREATE EXCHANGE",
+                                        "ACL DENY-LOG " + DENIED_USER + " 
CREATE EXCHANGE",
+                                        "ACL ALLOW-LOG " + ALLOWED_USER + " 
UPDATE EXCHANGE",
+                                        "ACL DENY-LOG " + DENIED_USER + " 
UPDATE EXCHANGE",
+                                        "ACL ALLOW-LOG " + ALLOWED_USER + " 
DELETE EXCHANGE",
+                                        "ACL DENY-LOG " + DENIED_USER + " 
DELETE EXCHANGE",
+                                        "ACL ALLOW-LOG " + ALLOWED_USER + " 
BIND EXCHANGE",
+                                        "ACL DENY-LOG " + DENIED_USER + " BIND 
EXCHANGE",
+                                        "ACL ALLOW-LOG " + ALLOWED_USER + " 
UNBIND EXCHANGE",
+                                        "ACL DENY-LOG " + DENIED_USER + " 
UNBIND EXCHANGE",
+                                        "ACL ALLOW-LOG " + ADMIN + " ALL ALL",
+                                        "ACL DENY-LOG ALL ALL");
     }
 
     @Override
@@ -100,6 +112,56 @@ public class ExchangeRestACLTest extends
         assertExchangeDoesNotExist();
     }
 
+
+    public void testCreateExchangeAllowedAfterReload() throws Exception
+    {
+
+
+        getRestTestHelper().setUsernameAndPassword(DENIED_USER, DENIED_USER);
+
+        int responseCode = createExchange();
+        assertEquals("Exchange creation should be denied", 403, responseCode);
+
+        assertExchangeDoesNotExist();
+
+        overwriteAclFile("ACL ALLOW-LOG ALL ACCESS MANAGEMENT",
+                         "ACL ALLOW-LOG " + ALLOWED_USER + " CREATE QUEUE",
+                         "ACL ALLOW-LOG " + ALLOWED_USER + " CREATE EXCHANGE",
+                         "ACL ALLOW-LOG " + DENIED_USER + " CREATE EXCHANGE",
+                         "ACL ALLOW-LOG " + ALLOWED_USER + " UPDATE EXCHANGE",
+                         "ACL DENY-LOG " + DENIED_USER + " UPDATE EXCHANGE",
+                         "ACL ALLOW-LOG " + ALLOWED_USER + " DELETE EXCHANGE",
+                         "ACL DENY-LOG " + DENIED_USER + " DELETE EXCHANGE",
+                         "ACL ALLOW-LOG " + ALLOWED_USER + " BIND EXCHANGE",
+                         "ACL DENY-LOG " + DENIED_USER + " BIND EXCHANGE",
+                         "ACL ALLOW-LOG " + ALLOWED_USER + " UNBIND EXCHANGE",
+                         "ACL DENY-LOG " + DENIED_USER + " UNBIND EXCHANGE",
+                         "ACL ALLOW-LOG " + ADMIN + " ALL ALL",
+                         "ACL DENY-LOG ALL ALL");
+        getRestTestHelper().setUsernameAndPassword(ADMIN, ADMIN);
+        getRestTestHelper().submitRequest("/api/latest/"
+                                          + 
AccessControlProvider.class.getSimpleName().toLowerCase()
+                                          + "/" + ENTRY_NAME_ACL_FILE + 
"/reload", "POST", Collections.emptyMap(), 200);
+        getRestTestHelper().setUsernameAndPassword(DENIED_USER, DENIED_USER);
+
+        responseCode = createExchange();
+        assertEquals("Exchange creation should be allowed", 201, responseCode);
+
+        assertExchangeExists();
+
+    }
+
+    private void overwriteAclFile(final String... rules) throws IOException
+    {
+        try(FileWriter fw = new FileWriter(_aclFilePath); PrintWriter out = 
new PrintWriter(fw))
+        {
+            for(String line :rules)
+            {
+                out.println(line);
+            }
+        }
+    }
+
     public void testDeleteExchangeAllowed() throws Exception
     {
         getRestTestHelper().setUsernameAndPassword(ALLOWED_USER, ALLOWED_USER);



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to