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