From fdb1c14e2e69e861940a1e64eb659676dbf4402c Mon Sep 17 00:00:00 2001 From: Dogface2k <100990646+Dogface2k@users.noreply.github.com> Date: Sun, 2 Aug 2026 14:05:13 +0100 Subject: [PATCH 1/3] UI: submit object storage creation using POST --- .../storage/AddObjectStoragePoolCmd.java | 2 +- .../storage/AddObjectStoragePoolCmdTest.java | 11 +++ .../main/java/com/cloud/api/ApiServlet.java | 7 +- .../java/com/cloud/api/ApiServletTest.java | 24 +++++++ ui/src/views/infra/AddObjectStorage.vue | 4 +- .../unit/views/infra/AddObjectStorage.spec.js | 71 +++++++++++++++++++ 6 files changed, 115 insertions(+), 4 deletions(-) create mode 100644 ui/tests/unit/views/infra/AddObjectStorage.spec.js diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/AddObjectStoragePoolCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/AddObjectStoragePoolCmd.java index 460b8d642e90..c24d61b7200b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/AddObjectStoragePoolCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/AddObjectStoragePoolCmd.java @@ -32,7 +32,7 @@ import java.util.Map; @APICommand(name = "addObjectStoragePool", description = "Adds a object storage pool", responseObject = ObjectStoreResponse.class, since = "4.19.0", - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) + requestHasSensitiveInfo = true, responseHasSensitiveInfo = false) public class AddObjectStoragePoolCmd extends BaseCmd { ///////////////////////////////////////////////////// diff --git a/api/src/test/java/org/apache/cloudstack/api/command/admin/storage/AddObjectStoragePoolCmdTest.java b/api/src/test/java/org/apache/cloudstack/api/command/admin/storage/AddObjectStoragePoolCmdTest.java index c7aeb8ba99bf..1669bcb60e6a 100644 --- a/api/src/test/java/org/apache/cloudstack/api/command/admin/storage/AddObjectStoragePoolCmdTest.java +++ b/api/src/test/java/org/apache/cloudstack/api/command/admin/storage/AddObjectStoragePoolCmdTest.java @@ -20,6 +20,7 @@ import com.cloud.exception.DiscoveryException; import com.cloud.storage.StorageService; +import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ResponseGenerator; import org.apache.cloudstack.api.response.ObjectStoreResponse; import org.apache.cloudstack.context.CallContext; @@ -38,6 +39,8 @@ import java.util.HashMap; import java.util.Map; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; @RunWith(MockitoJUnitRunner.class) @@ -98,4 +101,12 @@ public void testAddObjectStore() throws DiscoveryException { Mockito.verify(storageService, Mockito.times(1)) .discoverObjectStore(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()); } + + @Test + public void testRequestIsMarkedAsContainingSensitiveInformation() { + APICommand apiCommand = AddObjectStoragePoolCmd.class.getAnnotation(APICommand.class); + + assertNotNull(apiCommand); + assertTrue(apiCommand.requestHasSensitiveInfo()); + } } diff --git a/server/src/main/java/com/cloud/api/ApiServlet.java b/server/src/main/java/com/cloud/api/ApiServlet.java index 3ac5bbb01a75..7d129664cc96 100644 --- a/server/src/main/java/com/cloud/api/ApiServlet.java +++ b/server/src/main/java/com/cloud/api/ApiServlet.java @@ -100,6 +100,7 @@ public class ApiServlet extends HttpServlet { "updaterolepermission", "updateprojectrolepermission", "createstoragepool", + "addobjectstoragepool", "addhost", "updatehostpassword", "addcluster", @@ -241,7 +242,7 @@ void processRequestInContext(final HttpServletRequest req, final HttpServletResp if (LOGGER.isDebugEnabled()) { reqStr = auditTrailSb.toString() + " " + cleanQueryString; if (req.getMethod().equalsIgnoreCase("POST") && org.apache.commons.lang3.StringUtils.isNotBlank(command)) { - if (!POST_REQUESTS_TO_DISABLE_LOGGING.contains(command.toLowerCase()) && !reqParams.containsKey(ApiConstants.USER_DATA)) { + if (shouldLogPostRequestParameters(command, reqParams)) { String cleanParamsString = getCleanParamsString(reqParams); if (org.apache.commons.lang3.StringUtils.isNotBlank(cleanParamsString)) { reqStr += "\n" + cleanParamsString; @@ -771,4 +772,8 @@ private String getCleanParamsString(Map reqParams) { return cleanParamsString.toString(); } + + protected boolean shouldLogPostRequestParameters(String command, Map reqParams) { + return !POST_REQUESTS_TO_DISABLE_LOGGING.contains(command.toLowerCase()) && !reqParams.containsKey(ApiConstants.USER_DATA); + } } diff --git a/server/src/test/java/com/cloud/api/ApiServletTest.java b/server/src/test/java/com/cloud/api/ApiServletTest.java index 79fe4b86f859..84ebfc73283d 100644 --- a/server/src/test/java/com/cloud/api/ApiServletTest.java +++ b/server/src/test/java/com/cloud/api/ApiServletTest.java @@ -461,4 +461,28 @@ public void testVerify2FAWhenExpectedCommandIsNotCalled() throws UnknownHostExce Assert.assertEquals(false, result); } + + @Test + public void shouldNotLogPostRequestParametersForAddObjectStoragePool() { + boolean result = servlet.shouldLogPostRequestParameters("addObjectStoragePool", new HashMap<>()); + + Assert.assertFalse(result); + } + + @Test + public void shouldLogPostRequestParametersForCommandWithoutSensitiveParameters() { + boolean result = servlet.shouldLogPostRequestParameters("listZones", new HashMap<>()); + + Assert.assertTrue(result); + } + + @Test + public void shouldNotLogPostRequestParametersContainingUserData() { + Map params = new HashMap<>(); + params.put(ApiConstants.USER_DATA, new String[] {"sensitive-user-data"}); + + boolean result = servlet.shouldLogPostRequestParameters("deployVirtualMachine", params); + + Assert.assertFalse(result); + } } diff --git a/ui/src/views/infra/AddObjectStorage.vue b/ui/src/views/infra/AddObjectStorage.vue index 5410a9b9502f..a6f1d425e355 100644 --- a/ui/src/views/infra/AddObjectStorage.vue +++ b/ui/src/views/infra/AddObjectStorage.vue @@ -106,7 +106,7 @@