QPID-8411: [Broker-J] Fix invocation of management operations with reserved parameters
(cherry picked from commit a848e0df04abcd03414ba546ecce700043966044)
diff --git a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/controller/latest/LatestManagementController.java b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/controller/latest/LatestManagementController.java
index 7a32153..eaf5075 100644
--- a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/controller/latest/LatestManagementController.java
+++ b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/controller/latest/LatestManagementController.java
@@ -66,6 +66,7 @@
import org.apache.qpid.server.model.ConfiguredObjectFinder;
import org.apache.qpid.server.model.ConfiguredObjectOperation;
import org.apache.qpid.server.model.Model;
+import org.apache.qpid.server.model.OperationParameter;
import org.apache.qpid.server.model.State;
import org.apache.qpid.server.model.preferences.UserPreferences;
@@ -336,7 +337,25 @@
category));
}
- if (operation.isSecure(target, operationArguments) && !isSecureOrAllowedOnInsecureChannel)
+ final Map<String, Object> arguments;
+ if (isPost)
+ {
+ arguments = operationArguments;
+ }
+ else
+ {
+ final Set<String> supported = ((List<OperationParameter>) operation.getParameters()).stream()
+ .map(OperationParameter::getName)
+ .collect(Collectors.toSet());
+ arguments = operationArguments.entrySet()
+ .stream()
+ .filter(e -> !RESERVED_PARAMS.contains(e.getKey())
+ || supported.contains(e.getKey()))
+ .collect(Collectors.toMap(Map.Entry::getKey,
+ Map.Entry::getValue));
+ }
+
+ if (operation.isSecure(target, arguments) && !isSecureOrAllowedOnInsecureChannel)
{
throw createForbiddenManagementException(String.format(
"Operation '%s' can only be performed over a secure (HTTPS) connection",
@@ -350,7 +369,7 @@
operationName), Collections.singletonMap("Allow", "POST"));
}
- returnValue = operation.perform(target, operationArguments);
+ returnValue = operation.perform(target, arguments);
if (ConfiguredObject.class.isAssignableFrom(operation.getReturnType())
|| returnsCollectionOfConfiguredObjects(operation))
diff --git a/systests/qpid-systests-http-management/src/main/java/org/apache/qpid/tests/http/HttpTestHelper.java b/systests/qpid-systests-http-management/src/main/java/org/apache/qpid/tests/http/HttpTestHelper.java
index a2b94ad..1e16909 100644
--- a/systests/qpid-systests-http-management/src/main/java/org/apache/qpid/tests/http/HttpTestHelper.java
+++ b/systests/qpid-systests-http-management/src/main/java/org/apache/qpid/tests/http/HttpTestHelper.java
@@ -326,8 +326,14 @@
public byte[] getBytes(String path) throws IOException
{
HttpURLConnection connection = openManagementConnection(path, "GET");
- connection.connect();
- return readConnectionInputStream(connection);
+ try
+ {
+ return readConnectionInputStream(connection);
+ }
+ finally
+ {
+ connection.disconnect();
+ }
}
public String getAcceptEncoding()
diff --git a/systests/qpid-systests-http-management/src/test/java/org/apache/qpid/tests/http/rest/model/OperationTest.java b/systests/qpid-systests-http-management/src/test/java/org/apache/qpid/tests/http/rest/model/OperationTest.java
index 6a06855..2a2f13f 100644
--- a/systests/qpid-systests-http-management/src/test/java/org/apache/qpid/tests/http/rest/model/OperationTest.java
+++ b/systests/qpid-systests-http-management/src/test/java/org/apache/qpid/tests/http/rest/model/OperationTest.java
@@ -20,11 +20,13 @@
*/
package org.apache.qpid.tests.http.rest.model;
+import static java.nio.charset.StandardCharsets.UTF_8;
import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import static org.apache.qpid.server.management.plugin.servlet.rest.AbstractServlet.SC_UNPROCESSABLE_ENTITY;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;
@@ -127,4 +129,15 @@
}
}
+
+ @Test
+ public void invokeOperationWithReservedParameter() throws Exception
+ {
+ final HttpTestHelper brokerHelper = new HttpTestHelper(getBrokerAdmin());
+ final byte[] response = brokerHelper.getBytes(
+ "broker/getThreadStackTraces?contentDispositionAttachmentFilename=stack-traces.txt&appendToLog=false");
+ assertThat(response, is(notNullValue()));
+ assertThat(new String(response, UTF_8).contains("Full thread dump captured"), is(equalTo(true)));
+
+ }
}