diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/Constants.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/Constants.java index 10c311d1b9..c7218f2dfe 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/Constants.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/Constants.java @@ -1,7 +1,12 @@ package org.cloudfoundry.multiapps.controller.web; +import java.util.Set; import java.util.concurrent.TimeUnit; +import org.cloudfoundry.multiapps.controller.process.variables.Variables; + +import static org.cloudfoundry.multiapps.controller.persistence.Constants.VARIABLE_NAME_SERVICE_ID; + public class Constants { private Constants() { @@ -58,4 +63,11 @@ private Endpoints() { public static final String PURGE = "/purge"; } + + public static final Set NAMES_OF_SERVICE_PARAMETERS = Set.of( + VARIABLE_NAME_SERVICE_ID, Variables.USER.getName(), + Variables.USER_GUID.getName(), Variables.SPACE_NAME.getName(), Variables.SPACE_GUID.getName(), + Variables.ORGANIZATION_NAME.getName(), Variables.ORGANIZATION_GUID.getName(), Variables.TIMESTAMP.getName(), + Variables.MTA_NAMESPACE.getName()); + } diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImpl.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImpl.java index e919a60b75..aad9d710c5 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImpl.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImpl.java @@ -64,6 +64,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.server.ResponseStatusException; +import static org.cloudfoundry.multiapps.controller.web.Constants.NAMES_OF_SERVICE_PARAMETERS; + @Named public class OperationsApiServiceImpl implements OperationsApiService { @@ -275,10 +277,27 @@ private Operation addServiceParameters(Operation operation, String spaceGuid, St } private Operation addParameterValues(Operation operation, Set predefinedParameters) { - Map parameters = new HashMap<>(operation.getParameters()); - parameters.putAll(ParameterConversion.toFlowableVariables(predefinedParameters, parameters)); + Map filteredParameters = filterUnnecessaryParameters(predefinedParameters, operation.getParameters()); + filteredParameters.putAll(ParameterConversion.toFlowableVariables(predefinedParameters, filteredParameters)); return ImmutableOperation.copyOf(operation) - .withParameters(parameters); + .withParameters(filteredParameters); + } + + private Map filterUnnecessaryParameters(Set predefinedParameters, Map parameters) { + Set allowedParameters = getAllowedParameters(predefinedParameters); + + return parameters.entrySet() + .stream() + .filter(entry -> allowedParameters.contains(entry.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> b, HashMap::new)); + } + + private Set getAllowedParameters(Set predefinedParameters) { + Set allowedParameters = predefinedParameters.stream() + .map(ParameterMetadata::getId) + .collect(Collectors.toSet()); + allowedParameters.addAll(NAMES_OF_SERVICE_PARAMETERS); + return allowedParameters; } private void ensureRequiredParametersSet(Operation operation, Set predefinedParameters) { diff --git a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImplTest.java b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImplTest.java index aa0d80df7c..26554e57fe 100644 --- a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImplTest.java +++ b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/OperationsApiServiceImplTest.java @@ -42,6 +42,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Answers; +import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; @@ -203,6 +204,40 @@ void testStartOperation() { .startProcess(Mockito.any(), Mockito.anyMap()); } + @Test + void testStartOperationWithInvalidParametersForTheProcess() { + Map parameters = Map.of(Variables.MTA_ID.getName(), "test", Variables.EXT_DESCRIPTOR_FILE_ID.getName(), "ext_test", + Variables.CTS_PROCESS_ID.getName(), "cts_test", Variables.DEPLOY_URI.getName(), + "deploy_test"); + Operation operation = createOperation(null, null, parameters); + Mockito.when(operationsHelper.getProcessDefinitionKey(operation)) + .thenReturn("deploy"); + + operationsApiService.startOperation(mockHttpServletRequest(EXAMPLE_USER), SPACE_GUID, operation); + + Mockito.verify(flowableFacade) + .startProcess(ArgumentMatchers.eq("deploy"), ArgumentMatchers.argThat( + map -> map.containsKey(Variables.MTA_ID.getName()) && map.containsKey(Variables.EXT_DESCRIPTOR_FILE_ID.getName()) + && !map.containsKey(Variables.CTS_PROCESS_ID.getName()) && !map.containsKey(Variables.DEPLOY_URI.getName()))); + } + + @Test + void testStartOperationWithValidParametersForTheProcess() { + Map parameters = Map.of(Variables.MTA_ID.getName(), "test", Variables.EXT_DESCRIPTOR_FILE_ID.getName(), "ext_test", + Variables.NO_START.getName(), false, Variables.MTA_NAMESPACE.getName(), + "namespace_test"); + Operation operation = createOperation(null, null, parameters); + Mockito.when(operationsHelper.getProcessDefinitionKey(operation)) + .thenReturn("deploy"); + + operationsApiService.startOperation(mockHttpServletRequest(EXAMPLE_USER), SPACE_GUID, operation); + + Mockito.verify(flowableFacade) + .startProcess(ArgumentMatchers.eq("deploy"), ArgumentMatchers.argThat( + map -> map.containsKey(Variables.MTA_ID.getName()) && map.containsKey(Variables.EXT_DESCRIPTOR_FILE_ID.getName()) + && map.containsKey(Variables.NO_START.getName()) && map.containsKey(Variables.MTA_NAMESPACE.getName()))); + } + @Test void testGetOperationLogs() throws Exception { String processId = FINISHED_PROCESS;