You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2015/06/17 18:41:58 UTC

svn commit: r1686072 - in /qpid/java/trunk: broker-core/src/main/java/org/apache/qpid/server/configuration/updater/ broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/ broker-core/src/test/java/org/apache/qpid/server/configuration/updater...

Author: orudyy
Date: Wed Jun 17 16:41:58 2015
New Revision: 1686072

URL: http://svn.apache.org/r1686072
Log:
QPID-6591: Add virtual host principal to the subject in management operations for the virtualhost and its children

Modified:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutor.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutorImpl.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/updater/CurrentThreadTaskExecutor.java
    qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostLoggerRestTest.java

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutor.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutor.java?rev=1686072&r1=1686071&r2=1686072&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutor.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutor.java Wed Jun 17 16:41:58 2015
@@ -20,6 +20,7 @@
  */
 package org.apache.qpid.server.configuration.updater;
 
+import java.security.Principal;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
@@ -29,7 +30,12 @@ public interface TaskExecutor
     interface Factory
     {
         TaskExecutor newInstance();
-        TaskExecutor newInstance(String name);
+        TaskExecutor newInstance(String name, PrincipalAccessor principalAccessor);
+    }
+
+    interface PrincipalAccessor
+    {
+        Principal getPrincipal();
     }
 
     boolean isRunning();

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutorImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutorImpl.java?rev=1686072&r1=1686071&r2=1686072&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutorImpl.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/updater/TaskExecutorImpl.java Wed Jun 17 16:41:58 2015
@@ -21,8 +21,11 @@
 package org.apache.qpid.server.configuration.updater;
 
 import java.security.AccessController;
+import java.security.Principal;
 import java.security.PrivilegedAction;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.ExecutionException;
@@ -46,6 +49,7 @@ public class TaskExecutorImpl implements
 {
     private static final String TASK_EXECUTION_THREAD_NAME = "Broker-Configuration-Thread";
     private static final Logger LOGGER = LoggerFactory.getLogger(TaskExecutorImpl.class);
+    private final PrincipalAccessor _principalAccessor;
 
     private volatile Thread _taskThread;
     private final AtomicBoolean _running = new AtomicBoolean();
@@ -55,12 +59,13 @@ public class TaskExecutorImpl implements
 
     public TaskExecutorImpl()
     {
-        this(TASK_EXECUTION_THREAD_NAME);
+        this(TASK_EXECUTION_THREAD_NAME, null);
     }
 
-    public TaskExecutorImpl(final String name)
+    public TaskExecutorImpl(final String name, PrincipalAccessor principalAccessor)
     {
         _name = name;
+        _principalAccessor = principalAccessor;
     }
 
     @Override
@@ -323,22 +328,41 @@ public class TaskExecutorImpl implements
         return result;
     }
 
+    private Subject getContextSubject()
+    {
+        Subject contextSubject = Subject.getSubject(AccessController.getContext());
+        if (contextSubject != null && _principalAccessor != null)
+        {
+            Principal additionalPrincipal = _principalAccessor.getPrincipal();
+            Set<Principal> principals = contextSubject.getPrincipals();
+            if (additionalPrincipal != null && !principals.contains(additionalPrincipal))
+            {
+                Set<Principal> extendedPrincipals = new HashSet<>(principals);
+                extendedPrincipals.add(_principalAccessor.getPrincipal());
+                contextSubject = new Subject(contextSubject.isReadOnly(),
+                        extendedPrincipals,
+                        contextSubject.getPublicCredentials(),
+                        contextSubject.getPrivateCredentials());
+            }
+        }
+        return contextSubject;
+    }
+
     private class CallableWrapper<T> implements Callable<T>
     {
-        private Task<T> _userTask;
-        private Subject _contextSubject;
+        private final Task<T> _userTask;
+        private final Subject _contextSubject;
 
         public CallableWrapper(Task<T> userWork)
         {
             _userTask = userWork;
-            _contextSubject = Subject.getSubject(AccessController.getContext());
+            _contextSubject = getContextSubject();
         }
 
         @Override
         public T call()
         {
-            T result = null;
-            result = Subject.doAs(_contextSubject, new PrivilegedAction<T>()
+            T result = Subject.doAs(_contextSubject, new PrivilegedAction<T>()
                 {
                     @Override
                     public T run()
@@ -347,7 +371,6 @@ public class TaskExecutorImpl implements
                     }
                 });
 
-
             return result;
         }
     }
@@ -407,7 +430,23 @@ public class TaskExecutorImpl implements
             }
             else
             {
-                _executor.execute(command);
+                final Subject subject = getContextSubject();
+                _executor.execute(new Runnable()
+                {
+                    @Override
+                    public void run()
+                    {
+                        Subject.doAs(subject, new PrivilegedAction<Void>()
+                        {
+                            @Override
+                            public Void run()
+                            {
+                                command.run();
+                                return null;
+                            }
+                        });
+                    }
+                });
             }
 
         }
@@ -442,9 +481,9 @@ public class TaskExecutorImpl implements
             }
 
             @Override
-            public TaskExecutor newInstance(final String name)
+            public TaskExecutor newInstance(final String name, PrincipalAccessor principalAccessor)
             {
-                return new TaskExecutorImpl(name);
+                return new TaskExecutorImpl(name, principalAccessor);
             }
         };
     }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java?rev=1686072&r1=1686071&r2=1686072&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java Wed Jun 17 16:41:58 2015
@@ -26,6 +26,7 @@ import java.io.Reader;
 import java.io.StringReader;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.security.Principal;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -105,7 +106,19 @@ public abstract class AbstractVirtualHos
     {
         super(Collections.<Class<? extends ConfiguredObject>,ConfiguredObject<?>>singletonMap(Broker.class, parent),
               attributes);
-        _virtualHostExecutor = getTaskExecutor().getFactory().newInstance("VirtualHostNode-"+getName()+"-Configuration-Thread");
+        _virtualHostExecutor = getTaskExecutor().getFactory().newInstance("VirtualHostNode-" + getName() + "-Configuration-Thread", new TaskExecutor.PrincipalAccessor()
+        {
+            @Override
+            public Principal getPrincipal()
+            {
+                VirtualHost<?,?,?> virtualHost = getVirtualHost();
+                if (virtualHost != null)
+                {
+                    return virtualHost.getPrincipal();
+                }
+                return null;
+            }
+        });
         _virtualHostExecutor.start();
         _broker = parent;
         SystemConfig<?> systemConfig = _broker.getParent(SystemConfig.class);

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/updater/CurrentThreadTaskExecutor.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/updater/CurrentThreadTaskExecutor.java?rev=1686072&r1=1686071&r2=1686072&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/updater/CurrentThreadTaskExecutor.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/updater/CurrentThreadTaskExecutor.java Wed Jun 17 16:41:58 2015
@@ -171,7 +171,7 @@ public class CurrentThreadTaskExecutor i
             }
 
             @Override
-            public TaskExecutor newInstance(final String name)
+            public TaskExecutor newInstance(final String name, PrincipalAccessor principalAccessor)
             {
                 return CurrentThreadTaskExecutor.this;
             }

Modified: qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostLoggerRestTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostLoggerRestTest.java?rev=1686072&r1=1686071&r2=1686072&view=diff
==============================================================================
--- qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostLoggerRestTest.java (original)
+++ qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostLoggerRestTest.java Wed Jun 17 16:41:58 2015
@@ -21,14 +21,19 @@
 package org.apache.qpid.systest.rest;
 
 import java.io.File;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.qpid.server.logging.VirtualHostFileLogger;
+import org.apache.qpid.server.logging.messages.QueueMessages;
 import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.Queue;
 import org.apache.qpid.server.model.VirtualHostLogger;
+import org.apache.qpid.util.LogMonitor;
 
 public class VirtualHostLoggerRestTest extends QpidRestTestCase
 {
@@ -39,7 +44,6 @@ public class VirtualHostLoggerRestTest e
         String loggerRestUrlBase = "virtualhostlogger/" + TEST1_VIRTUALHOST + "/" + TEST1_VIRTUALHOST;
         String loggerRestUrl = loggerRestUrlBase + "/" + loggerName;
 
-
         Map<String, Object> virtualHostLoggerAttributes = new HashMap<>();
         virtualHostLoggerAttributes.put(VirtualHostLogger.NAME, loggerName);
         virtualHostLoggerAttributes.put(ConfiguredObject.TYPE, VirtualHostFileLogger.TYPE);
@@ -61,6 +65,22 @@ public class VirtualHostLoggerRestTest e
         String logFileLocation = String.valueOf(loggerData.get(VirtualHostFileLogger.FILE_NAME));
         assertNotNull("Log file attribute is not set ", logFileLocation);
         assertTrue(String.format("Log file '%s' does not exists", logFileLocation), new File(logFileLocation).exists());
+
+
+        LogMonitor logMonitor = new LogMonitor(new File(logFileLocation));
+        try
+        {
+            List<String> logs = logMonitor.findMatches("QUE-1001");
+            assertEquals("Unexpected number of Queue creation operational logs before Queue creation", 0, logs.size());
+            Map<String, Object> queueAttributes = Collections.<String, Object>singletonMap(Queue.NAME, getTestQueueName());
+            getRestTestHelper().submitRequest("queue/" + TEST1_VIRTUALHOST + "/" + TEST1_VIRTUALHOST, "PUT", queueAttributes, HttpServletResponse.SC_CREATED);
+            logs = logMonitor.waitAndFindMatches("QUE-1001", 1000);
+            assertEquals("Unexpected number of Queue creation operational logs after Queue creation", 1, logs.size());
+        }
+        finally
+        {
+            logMonitor.close();
+        }
     }
 
     public void testDeleteVirtualHostLoggerAndFilter() throws Exception



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