You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2017/06/22 06:23:46 UTC

qpid-broker-j git commit: QPID-7798: Prevent NPE when invoking an operation using AMQP Management but the target object cannot be found

Repository: qpid-broker-j
Updated Branches:
  refs/heads/master 8e7665198 -> 820d00416


QPID-7798: Prevent NPE when invoking an operation using AMQP Management but the target object cannot be found


Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/820d0041
Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/820d0041
Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/820d0041

Branch: refs/heads/master
Commit: 820d004167d192227c96e3a7dd03fd5d516e39b5
Parents: 8e76651
Author: Keith Wall <ke...@gmail.com>
Authored: Tue Jun 20 22:29:04 2017 +0100
Committer: Keith Wall <ke...@gmail.com>
Committed: Thu Jun 22 07:23:30 2017 +0100

----------------------------------------------------------------------
 .../server/management/amqp/ManagementNode.java  | 61 +++++++++++---------
 .../management/amqp/AmqpManagementTest.java     | 48 +++++++++++++++
 2 files changed, 83 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/820d0041/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNode.java
----------------------------------------------------------------------
diff --git a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNode.java b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNode.java
index 020eb8c..0df5591 100644
--- a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNode.java
+++ b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNode.java
@@ -835,37 +835,46 @@ class ManagementNode implements MessageSource, MessageDestination, BaseQueue
         final Map<String, Object> headers = requestHeader.getHeaderMap();
 
         ConfiguredObject<?> object = findObject(clazz, headers);
-        Map<String,Object> parameters = new HashMap<>(headers);
-        parameters.remove(KEY_ATTRIBUTE);
-        parameters.remove(IDENTITY_ATTRIBUTE);
-        parameters.remove(TYPE_ATTRIBUTE);
-        parameters.remove(INDEX_ATTRIBUTE);
-        parameters.remove(OPERATION_HEADER);
-
-        Iterator<String> paramIterator = parameters.keySet().iterator();
-        while (paramIterator.hasNext())
-        {
-            final String paramName = paramIterator.next();
-            if(paramName.startsWith("JMS_QPID"))
+        if (object == null)
+        {
+            return createFailureResponse(message, STATUS_CODE_NOT_FOUND, "Not found");
+        }
+
+
+        try
+        {
+            Map<String,Object> parameters = new HashMap<>(headers);
+            parameters.remove(KEY_ATTRIBUTE);
+            parameters.remove(IDENTITY_ATTRIBUTE);
+            parameters.remove(TYPE_ATTRIBUTE);
+            parameters.remove(INDEX_ATTRIBUTE);
+            parameters.remove(OPERATION_HEADER);
+
+            parameters.keySet().removeIf(paramName -> paramName.startsWith("JMS_QPID"));
+
+            final MutableMessageHeader responseHeader = new MutableMessageHeader();
+            responseHeader.setCorrelationId(requestHeader.getCorrelationId() == null
+                                                    ? requestHeader.getMessageId()
+                                                    : requestHeader.getCorrelationId());
+            responseHeader.setMessageId(UUID.randomUUID().toString());
+            responseHeader.setHeader(STATUS_CODE_HEADER, STATUS_CODE_OK);
+
+            Serializable result = (Serializable) method.perform(object, parameters);
+            if(result == null)
             {
-                paramIterator.remove();
+                result = new byte[0];
             }
-
+            return InternalMessage.createMessage(_addressSpace.getMessageStore(), responseHeader,
+                                                 result, false);
         }
-        final MutableMessageHeader responseHeader = new MutableMessageHeader();
-        responseHeader.setCorrelationId(requestHeader.getCorrelationId() == null
-                                                ? requestHeader.getMessageId()
-                                                : requestHeader.getCorrelationId());
-        responseHeader.setMessageId(UUID.randomUUID().toString());
-        responseHeader.setHeader(STATUS_CODE_HEADER, STATUS_CODE_OK);
-
-        Serializable result = (Serializable) method.perform(object, parameters);
-        if(result == null)
+        catch (IllegalArgumentException | IllegalStateException | IllegalConfigurationException e)
         {
-            result = new byte[0];
+            return createFailureResponse(message, STATUS_CODE_BAD_REQUEST, e.getMessage());
+        }
+        catch (AccessControlException e)
+        {
+            return createFailureResponse(message, STATUS_CODE_FORBIDDEN, "Forbidden");
         }
-        return InternalMessage.createMessage(_addressSpace.getMessageStore(), responseHeader,
-                                             result, false);
     }
 
     String generatePath(final ConfiguredObject<?> object)

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/820d0041/systests/src/test/java/org/apache/qpid/systest/management/amqp/AmqpManagementTest.java
----------------------------------------------------------------------
diff --git a/systests/src/test/java/org/apache/qpid/systest/management/amqp/AmqpManagementTest.java b/systests/src/test/java/org/apache/qpid/systest/management/amqp/AmqpManagementTest.java
index a64d6d9..39188e6 100644
--- a/systests/src/test/java/org/apache/qpid/systest/management/amqp/AmqpManagementTest.java
+++ b/systests/src/test/java/org/apache/qpid/systest/management/amqp/AmqpManagementTest.java
@@ -545,6 +545,54 @@ public class AmqpManagementTest extends QpidBrokerTestCase
         assertNotNull("Derived attribute (productVersion) should be available", getValueFromMapResponse(responseMessage, "productVersion"));
     }
 
+    public void testReadObject_ObjectNotFound() throws Exception
+    {
+        if (!_runTest)
+        {
+            return;
+        }
+        setupVirtualHostManagementConnection();
+
+        MapMessage message = _session.createMapMessage();
+
+        message.setStringProperty("type", "org.apache.qpid.Exchange");
+        message.setStringProperty("operation", "READ");
+        message.setStringProperty("index", "object-path");
+        message.setStringProperty("key", "not-found-exchange");
+        message.setJMSReplyTo(_replyAddress);
+        _producer.send(message);
+
+        Message responseMessage = _consumer.receive(getReceiveTimeout());
+        assertNotNull("A response message was not sent", responseMessage);
+        assertTrue("The response message does not have a status code",
+                   Collections.list(responseMessage.getPropertyNames()).contains("statusCode"));
+        assertEquals("Incorrect response code", 404, responseMessage.getIntProperty("statusCode"));
+    }
+
+    public void testInvokeOperation_ObjectNotFound() throws Exception
+    {
+        if (!_runTest)
+        {
+            return;
+        }
+        setupVirtualHostManagementConnection();
+
+        MapMessage message = _session.createMapMessage();
+
+        message.setStringProperty("type", "org.apache.qpid.Exchange");
+        message.setStringProperty("operation", "getStatistics");
+        message.setStringProperty("index", "object-path");
+        message.setStringProperty("key", "not-found-exchange");
+        message.setJMSReplyTo(_replyAddress);
+        _producer.send(message);
+
+        Message responseMessage = _consumer.receive(getReceiveTimeout());
+        assertNotNull("A response message was not sent", responseMessage);
+        assertTrue("The response message does not have a status code",
+                   Collections.list(responseMessage.getPropertyNames()).contains("statusCode"));
+        assertEquals("Incorrect response code", 404, responseMessage.getIntProperty("statusCode"));
+    }
+
     // create a virtual host from $management
     public void testCreateVirtualHost() throws Exception
     {


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