From f70a3123620c0e43a58396a0e0559f01a9cd4b6a Mon Sep 17 00:00:00 2001 From: theghost5800 Date: Fri, 31 Oct 2025 14:58:36 +0200 Subject: [PATCH 1/3] Fix operation resume from another user --- .../process/flowable/AbortProcessAction.java | 8 +++--- .../process/flowable/ProcessAction.java | 27 ++++++++++--------- .../process/flowable/ResumeProcessAction.java | 13 ++++----- .../process/flowable/RetryProcessAction.java | 6 ++--- .../process/flowable/ProcessActionTest.java | 6 +++-- .../flowable/ResumeProcessActionTest.java | 12 ++++----- .../flowable/RetryProcessActionTest.java | 4 +-- .../flowable/StartProcessActionTest.java | 8 +++--- .../api/impl/OperationsApiServiceImpl.java | 8 +++--- .../impl/OperationsApiServiceImplTest.java | 4 ++- 10 files changed, 52 insertions(+), 44 deletions(-) diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/AbortProcessAction.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/AbortProcessAction.java index 810d2fc2ad..39d7f3479a 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/AbortProcessAction.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/AbortProcessAction.java @@ -1,15 +1,13 @@ package org.cloudfoundry.multiapps.controller.process.flowable; -import static java.text.MessageFormat.format; - import java.util.List; import jakarta.inject.Inject; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.controller.api.model.Operation; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; import org.cloudfoundry.multiapps.controller.core.util.SafeExecutor; +import org.cloudfoundry.multiapps.controller.core.util.UserInfo; import org.cloudfoundry.multiapps.controller.persistence.model.HistoricOperationEvent; import org.cloudfoundry.multiapps.controller.persistence.model.ImmutableHistoricOperationEvent; import org.cloudfoundry.multiapps.controller.persistence.model.ProgressMessage; @@ -25,6 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static java.text.MessageFormat.format; + @Named public class AbortProcessAction extends ProcessAction { @@ -47,7 +47,7 @@ public AbortProcessAction(FlowableFacade flowableFacade, List getActiveExecutionIds(String superProcessInstanceId) { return activeHistoricSubProcessIds; } - public void execute(String user, String superProcessInstanceId) { + public void execute(UserInfo userInfo, String superProcessInstanceId) { for (AdditionalProcessAction additionalProcessAction : filterAdditionalActionsForThisAction()) { additionalProcessAction.executeAdditionalProcessAction(superProcessInstanceId); } - executeActualProcessAction(user, superProcessInstanceId); + executeActualProcessAction(userInfo, superProcessInstanceId); } private List filterAdditionalActionsForThisAction() { @@ -50,26 +51,28 @@ private List filterAdditionalActionsForThisAction() { .collect(Collectors.toList()); } - protected abstract void executeActualProcessAction(String user, String superProcessInstanceId); + protected abstract void executeActualProcessAction(UserInfo userInfo, String superProcessInstanceId); public abstract Action getAction(); - protected void updateUserIfNecessary(String user, String executionId, List processIds) { + protected void updateUserIfNecessary(UserInfo userInfo, String executionId, List processIds) { HistoryService historyService = flowableFacade.getProcessEngine() .getHistoryService(); - String currentUser = HistoryUtil.getVariableValue(historyService, executionId, Variables.USER.getName()); - if (!user.equals(currentUser)) { + String currentUserGuid = HistoryUtil.getVariableValue(historyService, executionId, Variables.USER_GUID.getName()); + if (!userInfo.getId() + .equals(currentUserGuid)) { ClientReleaser clientReleaser = new ClientReleaser(clientProvider); clientReleaser.releaseClientFor(historyService, executionId); - updateProcessIds(user, processIds); + updateProcessIds(userInfo, processIds); } } - private void updateProcessIds(String user, List processIds) { + private void updateProcessIds(UserInfo userInfo, List processIds) { + RuntimeService runtimeService = flowableFacade.getProcessEngine() + .getRuntimeService(); for (String processId : processIds) { - flowableFacade.getProcessEngine() - .getRuntimeService() - .setVariable(processId, Variables.USER.getName(), user); + runtimeService.setVariable(processId, Variables.USER.getName(), userInfo.getName()); + runtimeService.setVariable(processId, Variables.USER_GUID.getName(), userInfo.getId()); } } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/ResumeProcessAction.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/ResumeProcessAction.java index ada9f28d96..abcbaff3ea 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/ResumeProcessAction.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/ResumeProcessAction.java @@ -7,9 +7,9 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.controller.api.model.Operation; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; +import org.cloudfoundry.multiapps.controller.core.util.UserInfo; import org.cloudfoundry.multiapps.controller.persistence.services.OperationService; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.flowable.engine.runtime.Execution; @@ -28,27 +28,28 @@ public ResumeProcessAction(FlowableFacade flowableFacade, List activeProcessIds = getActiveExecutionIds(superProcessInstanceId); List processesAtReceiveTask = activeProcessIds.stream() .filter(processId -> !flowableFacade.findExecutionsAtReceiveTask(processId) .isEmpty()) .collect(Collectors.toList()); - updateUserIfNecessary(user, superProcessInstanceId, activeProcessIds); + updateUserIfNecessary(userInfo, superProcessInstanceId, activeProcessIds); for (String processAtReceiveTask : processesAtReceiveTask) { - triggerProcessInstance(user, processAtReceiveTask); + triggerProcessInstance(userInfo, processAtReceiveTask); } updateOperationState(superProcessInstanceId, Operation.State.RUNNING); } - private void triggerProcessInstance(String user, String processId) { + private void triggerProcessInstance(UserInfo userInfo, String processId) { List executionsAtReceiveTask = flowableFacade.findExecutionsAtReceiveTask(processId); if (executionsAtReceiveTask.isEmpty()) { LOGGER.warn(MessageFormat.format("Process with id {0} is in undetermined process state", processId)); return; } for (Execution execution : executionsAtReceiveTask) { - flowableFacade.trigger(execution.getId(), Map.of(Variables.USER.getName(), user)); + flowableFacade.trigger(execution.getId(), + Map.of(Variables.USER.getName(), userInfo.getName(), Variables.USER_GUID.getName(), userInfo.getId())); } } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/RetryProcessAction.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/RetryProcessAction.java index 9d57fdf277..41d7923499 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/RetryProcessAction.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/RetryProcessAction.java @@ -5,9 +5,9 @@ import jakarta.inject.Inject; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.controller.api.model.Operation; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; +import org.cloudfoundry.multiapps.controller.core.util.UserInfo; import org.cloudfoundry.multiapps.controller.persistence.model.HistoricOperationEvent; import org.cloudfoundry.multiapps.controller.persistence.model.ImmutableHistoricOperationEvent; import org.cloudfoundry.multiapps.controller.persistence.services.HistoricOperationEventService; @@ -32,10 +32,10 @@ public RetryProcessAction(FlowableFacade flowableFacade, List subProcessIds = getActiveExecutionIds(superProcessInstanceId); ListIterator subProcessesIdsIterator = subProcessIds.listIterator(subProcessIds.size()); - updateUserIfNecessary(user, superProcessInstanceId, subProcessIds); + updateUserIfNecessary(userInfo, superProcessInstanceId, subProcessIds); while (subProcessesIdsIterator.hasPrevious()) { String subProcessId = subProcessesIdsIterator.previous(); retryProcess(subProcessId); diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/ProcessActionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/ProcessActionTest.java index 1139de7c51..5a2094081c 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/ProcessActionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/ProcessActionTest.java @@ -1,7 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.flowable; -import static org.mockito.ArgumentMatchers.anyString; - import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -10,6 +8,7 @@ import org.cloudfoundry.multiapps.controller.api.model.ImmutableOperation; import org.cloudfoundry.multiapps.controller.api.model.Operation; import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider; +import org.cloudfoundry.multiapps.controller.core.util.UserInfo; import org.cloudfoundry.multiapps.controller.persistence.query.impl.OperationQueryImpl; import org.cloudfoundry.multiapps.controller.persistence.services.OperationService; import org.flowable.engine.HistoryService; @@ -22,6 +21,8 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import static org.mockito.ArgumentMatchers.anyString; + abstract class ProcessActionTest { private static final Supplier RANDOM_UUID_SUPPLIER = () -> UUID.randomUUID() @@ -30,6 +31,7 @@ abstract class ProcessActionTest { static final String PROCESS_GUID = RANDOM_UUID_SUPPLIER.get(); static final String SUBPROCESS_1_ID = RANDOM_UUID_SUPPLIER.get(); static final String SUBPROCESS_2_ID = RANDOM_UUID_SUPPLIER.get(); + static final UserInfo USER_INFO = new UserInfo("fake-user-guid", "fake-user", null); protected ProcessAction processAction; @Mock diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/ResumeProcessActionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/ResumeProcessActionTest.java index e99f2651f9..1454e50915 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/ResumeProcessActionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/ResumeProcessActionTest.java @@ -1,7 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.flowable; -import static org.mockito.Mockito.times; - import java.util.Collections; import java.util.List; import java.util.Map; @@ -12,13 +10,15 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; +import static org.mockito.Mockito.times; + class ResumeProcessActionTest extends ProcessActionTest { @Test void testResumeExecutionWithExecutionsAtReceiveTask() { - processAction.execute("fake-user", PROCESS_GUID); + processAction.execute(USER_INFO, PROCESS_GUID); Mockito.verify(flowableFacade, times(2)) - .trigger(EXECUTION_ID, Map.of(Variables.USER.getName(), "fake-user")); + .trigger(EXECUTION_ID, Map.of(Variables.USER.getName(), "fake-user", Variables.USER_GUID.getName(), "fake-user-guid")); assertStateUpdated(Operation.State.RUNNING); } @@ -28,9 +28,9 @@ void testResumeExecutionWithoutExecutionsAtReceiveTask() { Mockito.when(flowableFacade.findExecutionsAtReceiveTask(PROCESS_GUID)) .thenReturn(mockedExecutions) .thenReturn(Collections.emptyList()); - processAction.execute("fake-user", PROCESS_GUID); + processAction.execute(USER_INFO, PROCESS_GUID); Mockito.verify(flowableFacade) - .trigger(EXECUTION_ID, Map.of(Variables.USER.getName(), "fake-user")); + .trigger(EXECUTION_ID, Map.of(Variables.USER.getName(), "fake-user", Variables.USER_GUID.getName(), "fake-user-guid")); assertStateUpdated(Operation.State.RUNNING); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/RetryProcessActionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/RetryProcessActionTest.java index 2fe31b06cd..5d2a85a1c7 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/RetryProcessActionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/RetryProcessActionTest.java @@ -20,7 +20,7 @@ class RetryProcessActionTest extends ProcessActionTest { @Test void testRetryActionWithoutAnyExceptions() { - processAction.execute("fake-user", PROCESS_GUID); + processAction.execute(USER_INFO, PROCESS_GUID); Mockito.verify(flowableFacade) .executeJob(PROCESS_GUID); verifySubprocessesAreExecuted(); @@ -34,7 +34,7 @@ void testRetryActionWithExceptionForRootProcess() { Mockito.doThrow(new RuntimeException()) .when(flowableFacade) .executeJob(PROCESS_GUID); - processAction.execute("fake-user", PROCESS_GUID); + processAction.execute(USER_INFO, PROCESS_GUID); verifySubprocessesAreExecuted(); Mockito.verify(historicOperationEventService) .add(ImmutableHistoricOperationEvent.of(PROCESS_GUID, HistoricOperationEvent.EventType.RETRIED)); diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/StartProcessActionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/StartProcessActionTest.java index 5b23a810bf..ac33652655 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/StartProcessActionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/StartProcessActionTest.java @@ -1,7 +1,5 @@ package org.cloudfoundry.multiapps.controller.process.flowable; -import static org.mockito.Mockito.times; - import java.util.Collections; import java.util.Map; @@ -10,13 +8,15 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; +import static org.mockito.Mockito.times; + class StartProcessActionTest extends ProcessActionTest { @Test void testResumeExecution() { - processAction.execute("fake-user", PROCESS_GUID); + processAction.execute(USER_INFO, PROCESS_GUID); Mockito.verify(flowableFacade, times(2)) - .trigger(EXECUTION_ID, Map.of(Variables.USER.getName(), "fake-user")); + .trigger(EXECUTION_ID, Map.of(Variables.USER.getName(), "fake-user", Variables.USER_GUID.getName(), "fake-user-guid")); assertStateUpdated(Operation.State.RUNNING); } 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 aad9d710c5..ac444390e3 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 @@ -152,11 +152,11 @@ public ResponseEntity getOperationLogContent(String spaceGuid, String op @Override public ResponseEntity startOperation(HttpServletRequest request, String spaceGuid, Operation operation) { operationsApiServiceAuditLog.logStartOperation(SecurityContextUtil.getUsername(), spaceGuid, operation); - String user = getAuthenticatedUser(request); + UserInfo authenticatedUser = getAuthenticatedUser(request); String processDefinitionKey = operationsHelper.getProcessDefinitionKey(operation); Set predefinedParameters = operationMetadataMapper.getOperationMetadata(operation.getProcessType()) .getParameters(); - operation = addServiceParameters(operation, spaceGuid, user, SecurityContextUtil.getUserGuid()); + operation = addServiceParameters(operation, spaceGuid, authenticatedUser.getName(), authenticatedUser.getId()); operation = addParameterValues(operation, predefinedParameters); ensureRequiredParametersSet(operation, predefinedParameters); ProcessInstance processInstance = flowableFacade.startProcess(processDefinitionKey, operation.getParameters()); @@ -328,12 +328,12 @@ private String getLocationHeader(String processInstanceId, String spaceId) { return "spaces/" + spaceId + "/operations/" + processInstanceId + "?embed=messages"; } - private String getAuthenticatedUser(HttpServletRequest request) { + private UserInfo getAuthenticatedUser(HttpServletRequest request) { Principal principal = request.getUserPrincipal(); if (principal == null) { throw new ResponseStatusException(HttpStatus.UNAUTHORIZED); } - return SecurityContextUtil.getUsername(principal); + return SecurityContextUtil.getUserInfo(); } private CloudSpaceClient getSpaceClient() { 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 a6ee011b3d..4e18f8e339 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 @@ -8,6 +8,7 @@ import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; + import jakarta.persistence.NoResultException; import jakarta.servlet.http.HttpServletRequest; import org.cloudfoundry.multiapps.common.ContentException; @@ -52,6 +53,7 @@ import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.web.server.ResponseStatusException; + import static org.cloudfoundry.multiapps.controller.core.util.SecurityUtil.USER_INFO; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -167,7 +169,7 @@ void testExecuteOperationAction() { operationsApiService.executeOperationAction(mockHttpServletRequest(EXAMPLE_USER), SPACE_GUID, processId, Action.ABORT.getActionId()); Mockito.verify(processAction) - .execute(Mockito.eq(EXAMPLE_USER), Mockito.eq(processId)); + .execute(Mockito.argThat(userInfo -> EXAMPLE_USER.equals(userInfo.getName())), Mockito.eq(processId)); } @Test From 6f19d4b948f4698eab1453712437b5e8559a9245 Mon Sep 17 00:00:00 2001 From: theghost5800 Date: Tue, 4 Nov 2025 13:58:07 +0200 Subject: [PATCH 2/3] Remove leftovers related with username in cache --- .../cf/CloudControllerClientProvider.java | 37 ++++++++----------- .../core/cf/OAuthClientExtended.java | 2 +- .../core/security/token/TokenService.java | 31 +++------------- .../core/security/token/TokenServiceTest.java | 16 ++++---- .../steps/CollectSystemParametersStep.java | 3 +- .../process/steps/CreateOrUpdateAppStep.java | 3 +- .../steps/DeleteApplicationRoutesStep.java | 3 +- .../process/steps/DetectDeployedMtaStep.java | 3 +- ...eApplicationServiceBindingActionsStep.java | 3 +- .../steps/PollExecuteAppStatusExecution.java | 3 +- .../steps/PollExecuteTaskStatusExecution.java | 3 +- .../steps/PollStageAppStatusExecution.java | 3 +- .../steps/PollStartAppStatusExecution.java | 3 +- .../process/steps/ProcessContext.java | 6 +-- .../process/steps/UpdateSubscribersStep.java | 3 +- .../BuildCloudUndeployModelStepTest.java | 2 +- .../PollExecuteAppStatusExecutionTest.java | 2 +- ...viceInProgressOperationsExecutionTest.java | 2 +- .../steps/PollServiceOperationsStepTest.java | 2 +- .../PollStageAppStatusExecutionTest.java | 2 +- .../PollStartAppStatusExecutionTest.java | 2 +- .../steps/RestartSubscribersStepTest.java | 12 +++--- .../process/steps/SyncFlowableStepTest.java | 2 +- .../steps/UpdateSubscribersStepTest.java | 2 +- .../process/util/ApplicationStagerTest.java | 2 +- ...cationWaitAfterStopVariableGetterTest.java | 2 +- .../process/util/ServiceRemoverTest.java | 5 ++- .../web/api/impl/MtasApiServiceImpl.java | 2 +- .../api/impl/OperationsApiServiceImpl.java | 2 +- .../ConfigurationEntriesResource.java | 4 +- .../web/security/AuthorizationChecker.java | 4 +- .../web/api/impl/MtasApiServiceImplTest.java | 2 +- .../security/AuthorizationCheckerTest.java | 2 +- 33 files changed, 71 insertions(+), 104 deletions(-) diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerClientProvider.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerClientProvider.java index 82c3611c65..b6e821b3f5 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerClientProvider.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/CloudControllerClientProvider.java @@ -25,63 +25,58 @@ public class CloudControllerClientProvider implements DisposableBean { /** * Returns a client for the specified user guid and space id by either getting it from the clients cache or creating a new one. * - * @param userName the username associated with the client * @param userGuid the userGuid associated with the client * @param spaceGuid the space guid associated with the client * @param correlationId of the process which is used to tag HTTP requests * @return a CF client for the specified access token, organization, and space */ - public CloudControllerClient getControllerClient(String userName, String userGuid, String spaceGuid, String correlationId) { + public CloudControllerClient getControllerClient(String userGuid, String spaceGuid, String correlationId) { try { - return getClientFromCache(userName, userGuid, spaceGuid, correlationId); + return getClientFromCache(userGuid, spaceGuid, correlationId); } catch (CloudOperationException e) { throw new SLException(e, Messages.CANT_CREATE_CLIENT_FOR_SPACE_ID, spaceGuid); } } /** - * Returns a client for the specified username and space id by either getting it from the clients cache or creating a new one. + * Returns a client for the specified user and space id by either getting it from the clients cache or creating a new one. * - * @param userName the username associated with the client * @param userGuid the userGuid associated with the client * @param spaceGuid the space guid associated with the client * @return a CF client for the specified access token, organization, and space */ - public CloudControllerClient getControllerClientWithNoCorrelation(String userName, String userGuid, String spaceGuid) { + public CloudControllerClient getControllerClientWithNoCorrelation(String userGuid, String spaceGuid) { try { - return getClientFromCacheWithNoCorrelation(userName, userGuid, spaceGuid); + return getClientFromCacheWithNoCorrelation(userGuid, spaceGuid); } catch (CloudOperationException e) { throw new SLException(e, Messages.CANT_CREATE_CLIENT_FOR_SPACE_ID, spaceGuid); } } /** - * Releases the client for the specified username and space id by removing it from the clients cache. + * Releases the client for the specified user and space id by removing it from the clients cache. * * @param userGuid the userGuid associated with the client * @param spaceGuid the space id associated with the client */ public void releaseClient(String userGuid, String spaceGuid) { - clients.remove(getKey(spaceGuid, userGuid, null)); + clients.remove(getKey(spaceGuid, userGuid)); } - private CloudControllerClient getClientFromCacheWithNoCorrelation(String userName, String userGuid, String spaceId) { - String key = getKey(spaceId, userGuid, userName); - return clients.computeIfAbsent(key, () -> clientFactory.createClient(tokenService.getToken(userName, userGuid), spaceId, null)); + private CloudControllerClient getClientFromCacheWithNoCorrelation(String userGuid, String spaceId) { + String key = getKey(spaceId, userGuid); + return clients.computeIfAbsent(key, () -> clientFactory.createClient(tokenService.getToken(userGuid), spaceId, null)); } - private CloudControllerClient getClientFromCache(String userName, String userGuid, String spaceId, String correlationId) { - String key = getKey(spaceId, userGuid, userName); + private CloudControllerClient getClientFromCache(String userGuid, String spaceId, String correlationId) { + String key = getKey(spaceId, userGuid); return clients.computeIfAbsent(key, - () -> clientFactory.createClient(tokenService.getToken(userName, userGuid), spaceId, correlationId)); + () -> clientFactory.createClient(tokenService.getToken(userGuid), spaceId, correlationId)); } - private String getKey(String spaceGuid, String userGuid, String username) { - if (userGuid != null) { - return spaceGuid + "|" + userGuid; - } - // TODO: Remove this branch when userGuid is guaranteed to be non-null(In the next release after introduction of userGuid) - return spaceGuid + "|" + username; + private String getKey(String spaceGuid, String userGuid) { + return spaceGuid + "|" + userGuid; + } @Override diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/OAuthClientExtended.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/OAuthClientExtended.java index 34f3828d8a..71e18baf5e 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/OAuthClientExtended.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/OAuthClientExtended.java @@ -34,7 +34,7 @@ public OAuth2AccessTokenWithAdditionalInfo getToken() { .isBefore(Instant.now() .plus(120, ChronoUnit.SECONDS))) { TokenProperties tokenProperties = TokenProperties.fromToken(token); - token = tokenService.getToken(tokenProperties.getUserName(), tokenProperties.getUserId()); + token = tokenService.getToken(tokenProperties.getUserId()); LOGGER.info( MessageFormat.format(Messages.RETRIEVED_TOKEN_FOR_USER_WITH_GUID_0_WITH_EXPIRATION_TIME_1, tokenProperties.getUserId(), token.getOAuth2AccessToken() diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenService.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenService.java index a29ec50657..df347157ef 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenService.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenService.java @@ -49,20 +49,16 @@ public TokenService(AccessTokenService accessTokenService, TokenParserChain toke /** * Chooses a token among all tokens for this user in the access token table. * - * @param username the username * @param userGuid the userGuid * @return the latest token, or throw an exception if token is not found */ - public OAuth2AccessTokenWithAdditionalInfo getToken(String username, String userGuid) { - if (userGuid != null) { - OAuth2AccessTokenWithAdditionalInfo cachedAccessToken = cachedTokens.get(userGuid); - if (shouldUseCachedToken(cachedAccessToken)) { - return cachedAccessToken; - } - return getLatestAccessTokenByUserGuid(userGuid); + public OAuth2AccessTokenWithAdditionalInfo getToken(String userGuid) { + OAuth2AccessTokenWithAdditionalInfo cachedAccessToken = cachedTokens.get(userGuid); + if (shouldUseCachedToken(cachedAccessToken)) { + return cachedAccessToken; } - // TODO: If no tokens are found for the userGuid, try to find tokens by username. This is temporary and should be removed in the next release. - return getLatestAccessTokenByUsername(username); + return getLatestAccessTokenByUserGuid(userGuid); + } private boolean shouldUseCachedToken(OAuth2AccessTokenWithAdditionalInfo cachedAccessToken) { @@ -97,21 +93,6 @@ private void addTokenToCache(OAuth2AccessTokenWithAdditionalInfo token, List tokensByUsername = getSortedAccessTokensByUsername(username); - if (tokensByUsername.isEmpty()) { - throw new IllegalStateException(MessageFormat.format(Messages.NO_VALID_TOKEN_FOUND, username)); - } - return getLatestToken(tokensByUsername); - } - - private List getSortedAccessTokensByUsername(String username) { - return accessTokenService.createQuery() - .username(username) - .orderByExpiresAt(OrderDirection.DESCENDING) - .list(); - } - private OAuth2AccessTokenWithAdditionalInfo getLatestToken(List accessTokens) { AccessToken latestAccessToken = accessTokens.get(0); return tokenParserChain.parse(new String(latestAccessToken.getValue(), StandardCharsets.UTF_8)); diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenServiceTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenServiceTest.java index 47ec937361..b8577d41e0 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenServiceTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/security/token/TokenServiceTest.java @@ -47,7 +47,7 @@ void setUp() throws Exception { void testGetTokenWhenThereAreNoTokensForUser() { AccessTokenQuery accessTokenQuery = Mockito.mock(AccessTokenQuery.class); mockAccessTokenService(accessTokenQuery); - Exception exception = assertThrows(IllegalStateException.class, () -> tokenService.getToken("deploy-service-user", "123")); + Exception exception = assertThrows(IllegalStateException.class, () -> tokenService.getToken("123")); assertEquals("No valid access token was found for user guid \"123\"", exception.getMessage()); } @@ -62,10 +62,10 @@ void testGetTokenWhenThereIsOnlyOneTokenInDb() { mockAccessTokenService(accessTokenQuery); OAuth2AccessTokenWithAdditionalInfo mockedToken = Mockito.mock(OAuth2AccessTokenWithAdditionalInfo.class); Mockito.when(mockedToken.getAdditionalInfo()) - .thenReturn(Map.of(TokenProperties.USER_NAME_KEY, "deploy-service-user", TokenProperties.USER_ID_KEY, "123")); + .thenReturn(Map.of(TokenProperties.USER_ID_KEY, "123")); Mockito.when(tokenParserChain.parse(any())) .thenReturn(mockedToken); - OAuth2AccessTokenWithAdditionalInfo token = tokenService.getToken("deploy-service-user", "123"); + OAuth2AccessTokenWithAdditionalInfo token = tokenService.getToken("123"); assertEquals(mockedToken, token); } @@ -75,10 +75,10 @@ void testGetTokenWhenThereIsNewerTokenInDb() { mockAccessTokenService(accessTokenQuery); OAuth2AccessTokenWithAdditionalInfo mockedToken = Mockito.mock(OAuth2AccessTokenWithAdditionalInfo.class); Mockito.when(mockedToken.getAdditionalInfo()) - .thenReturn(Map.of(TokenProperties.USER_NAME_KEY, "deploy-service-user", TokenProperties.USER_ID_KEY, "123")); + .thenReturn(Map.of(TokenProperties.USER_ID_KEY, "123")); Mockito.when(tokenParserChain.parse(any())) .thenReturn(mockedToken); - OAuth2AccessTokenWithAdditionalInfo token = tokenService.getToken("deploy-service-user", "123"); + OAuth2AccessTokenWithAdditionalInfo token = tokenService.getToken("123"); assertEquals(mockedToken, token); } @@ -94,11 +94,11 @@ void testGetTokenWhenCachedIsAvailable() { Mockito.when(mockedToken.getOAuth2AccessToken()) .thenReturn(oAuth2AccessToken); Mockito.when(mockedToken.getAdditionalInfo()) - .thenReturn(Map.of(TokenProperties.USER_NAME_KEY, "deploy-service-user", TokenProperties.USER_ID_KEY, "123")); + .thenReturn(Map.of(TokenProperties.USER_ID_KEY, "123")); Mockito.when(tokenParserChain.parse(any())) .thenReturn(mockedToken); - tokenService.getToken("deploy-service-user", "123"); - OAuth2AccessTokenWithAdditionalInfo token = tokenService.getToken("deploy-service-user", "123"); + tokenService.getToken("123"); + OAuth2AccessTokenWithAdditionalInfo token = tokenService.getToken("123"); assertEquals(mockedToken, token); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStep.java index 220eff5dc0..5f982c9bc9 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CollectSystemParametersStep.java @@ -171,9 +171,8 @@ protected boolean shouldStartApplications(ProcessContext context) { } protected AuthorizationEndpointGetter getAuthorizationEndpointGetter(ProcessContext context) { - String user = context.getVariable(Variables.USER); String userGuid = context.getVariable(Variables.USER_GUID); - var token = tokenService.getToken(user, userGuid); + var token = tokenService.getToken(userGuid); var creds = new CloudCredentials(token, true); return new AuthorizationEndpointGetter(webClientFactory.getWebClient(creds)); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStep.java index cb190b0b61..8198bfbe8f 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStep.java @@ -87,10 +87,9 @@ protected String getStepErrorMessage(ProcessContext context) { } protected AppBoundServiceInstanceNamesGetter getAppBoundServiceInstanceNamesGetter(ProcessContext context) { - String user = context.getVariable(Variables.USER); String userGuid = context.getVariable(Variables.USER_GUID); String correlationId = context.getVariable(Variables.CORRELATION_ID); - var token = tokenService.getToken(user, userGuid); + var token = tokenService.getToken(userGuid); var credentials = new CloudCredentials(token, true); return new AppBoundServiceInstanceNamesGetter(configuration, webClientFactory, credentials, correlationId); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationRoutesStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationRoutesStep.java index 3b53ee4d9d..40d5171e91 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationRoutesStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DeleteApplicationRoutesStep.java @@ -62,10 +62,9 @@ protected ServiceInstanceRoutesGetter getServiceRoutesGetter(CloudCredentials cr } private List getApplicationRoutes(CloudControllerClient client, CloudApplication app, ProcessContext context) { - String user = context.getVariable(Variables.USER); String userGuid = context.getVariable(Variables.USER_GUID); String correlationId = context.getVariable(Variables.CORRELATION_ID); - var token = tokenService.getToken(user, userGuid); + var token = tokenService.getToken(userGuid); var credentials = new CloudCredentials(token, true); var serviceInstanceRoutesGetter = getServiceRoutesGetter(credentials, correlationId); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetectDeployedMtaStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetectDeployedMtaStep.java index 2125e00c23..4cfea644df 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetectDeployedMtaStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetectDeployedMtaStep.java @@ -108,9 +108,8 @@ private List detectDeployedServiceKeys(String mtaId, Stri .map(DeployedMta::getServices) .orElse(List.of()); String spaceGuid = context.getVariable(Variables.SPACE_GUID); - String user = context.getVariable(Variables.USER); String userGuid = context.getVariable(Variables.USER_GUID); - var token = tokenService.getToken(user, userGuid); + var token = tokenService.getToken(userGuid); var creds = new CloudCredentials(token, true); CustomServiceKeysClient serviceKeysClient = getCustomServiceKeysClient(creds, context.getVariable(Variables.CORRELATION_ID)); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineApplicationServiceBindingActionsStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineApplicationServiceBindingActionsStep.java index 33ac5a1a20..89b8179557 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineApplicationServiceBindingActionsStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/DetermineApplicationServiceBindingActionsStep.java @@ -143,10 +143,9 @@ protected AppBoundServiceInstanceNamesGetter getAppServicesGetter(CloudCredentia } private boolean doesServiceBindingExist(String serviceName, UUID appGuid, ProcessContext context) { - String user = context.getVariable(Variables.USER); String userGuid = context.getVariable(Variables.USER_GUID); String correlationId = context.getVariable(Variables.CORRELATION_ID); - var token = tokenService.getToken(user, userGuid); + var token = tokenService.getToken(userGuid); var creds = new CloudCredentials(token, true); var serviceNamesGetter = getAppServicesGetter(creds, correlationId); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecution.java index 42cef59ed4..3ad349d46e 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecution.java @@ -79,10 +79,9 @@ public AsyncExecutionState execute(ProcessContext context) { ApplicationAttributes appAttributes = ApplicationAttributes.fromApplication(app, app.getEnv()); LocalDateTime logsOffset = context.getVariable(Variables.LOGS_OFFSET_FOR_APP_EXECUTION); - var user = context.getVariable(Variables.USER); var userGuid = context.getVariable(Variables.USER_GUID); var correlationId = context.getVariable(Variables.CORRELATION_ID); - var logCacheClient = clientFactory.createLogCacheClient(tokenService.getToken(user, userGuid), correlationId); + var logCacheClient = clientFactory.createLogCacheClient(tokenService.getToken(userGuid), correlationId); UUID appGuid = client.getApplicationGuid(app.getName()); List recentLogs = logCacheClient.getRecentLogs(appGuid, logsOffset); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteTaskStatusExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteTaskStatusExecution.java index e52e205445..cc214da344 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteTaskStatusExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteTaskStatusExecution.java @@ -45,10 +45,9 @@ public AsyncExecutionState execute(ProcessContext context) { ProcessLoggerProvider processLoggerProvider = context.getStepLogger() .getProcessLoggerProvider(); - var user = context.getVariable(Variables.USER); var userGuid = context.getVariable(Variables.USER_GUID); var correlationId = context.getVariable(Variables.CORRELATION_ID); - var logCacheClient = clientFactory.createLogCacheClient(tokenService.getToken(user, userGuid), correlationId); + var logCacheClient = clientFactory.createLogCacheClient(tokenService.getToken(userGuid), correlationId); UUID appGuid = client.getApplicationGuid(app.getName()); StepsUtil.saveAppLogs(context, logCacheClient, appGuid, app.getName(), LOGGER, processLoggerProvider); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStageAppStatusExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStageAppStatusExecution.java index 87aebb5b0a..e057ed7b89 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStageAppStatusExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStageAppStatusExecution.java @@ -44,10 +44,9 @@ public AsyncExecutionState execute(ProcessContext context) { ProcessLoggerProvider processLoggerProvider = stepLogger.getProcessLoggerProvider(); - var user = context.getVariable(Variables.USER); var userGuid = context.getVariable(Variables.USER_GUID); var correlationId = context.getVariable(Variables.CORRELATION_ID); - var logCacheClient = clientFactory.createLogCacheClient(tokenService.getToken(user, userGuid), correlationId); + var logCacheClient = clientFactory.createLogCacheClient(tokenService.getToken(userGuid), correlationId); UUID appGuid = client.getApplicationGuid(application.getName()); StepsUtil.saveAppLogs(context, logCacheClient, appGuid, application.getName(), LOGGER, processLoggerProvider); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppStatusExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppStatusExecution.java index f20e55e651..a0012d229e 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppStatusExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollStartAppStatusExecution.java @@ -47,10 +47,9 @@ public AsyncExecutionState execute(ProcessContext context) { ProcessLoggerProvider processLoggerProvider = context.getStepLogger() .getProcessLoggerProvider(); - var user = context.getVariable(Variables.USER); var userGuid = context.getVariable(Variables.USER_GUID); var correlationId = context.getVariable(Variables.CORRELATION_ID); - var logCacheClient = clientFactory.createLogCacheClient(tokenService.getToken(user, userGuid), correlationId); + var logCacheClient = clientFactory.createLogCacheClient(tokenService.getToken(userGuid), correlationId); StepsUtil.saveAppLogs(context, logCacheClient, app.getGuid(), app.getName(), LOGGER, processLoggerProvider); return checkStartupStatus(context, app, status); diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ProcessContext.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ProcessContext.java index 616b58e551..820d69a093 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ProcessContext.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/ProcessContext.java @@ -32,19 +32,17 @@ public StepLogger getStepLogger() { } public CloudControllerClient getControllerClient() { - String userName = StepsUtil.determineCurrentUser(execution); String userGuid = StepsUtil.determineCurrentUserGuid(execution); String spaceGuid = getVariable(Variables.SPACE_GUID); String correlationId = getVariable(Variables.CORRELATION_ID); - CloudControllerClient delegate = clientProvider.getControllerClient(userName, userGuid, spaceGuid, correlationId); + CloudControllerClient delegate = clientProvider.getControllerClient(userGuid, spaceGuid, correlationId); return new LoggingCloudControllerClient(delegate, stepLogger); } public CloudControllerClient getControllerClient(String spaceGuid) { - String userName = StepsUtil.determineCurrentUser(execution); String userGuid = StepsUtil.determineCurrentUserGuid(execution); String correlationId = getVariable(Variables.CORRELATION_ID); - CloudControllerClient delegate = clientProvider.getControllerClient(userName, userGuid, spaceGuid, correlationId); + CloudControllerClient delegate = clientProvider.getControllerClient(userGuid, spaceGuid, correlationId); return new LoggingCloudControllerClient(delegate, stepLogger); } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStep.java index d0f007db15..1bdd8536d8 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStep.java @@ -133,9 +133,8 @@ protected String getStepErrorMessage(ProcessContext context) { } private CloudSpaceClient createSpaceClient(ProcessContext context) { - var user = context.getVariable(Variables.USER); var userGuid = context.getVariable(Variables.USER_GUID); - var token = tokenService.getToken(user, userGuid); + var token = tokenService.getToken(userGuid); return clientFactory.createSpaceClient(token); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudUndeployModelStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudUndeployModelStepTest.java index 40a131a453..83c6942a5f 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudUndeployModelStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/BuildCloudUndeployModelStepTest.java @@ -122,7 +122,7 @@ private void prepareClient() { Mockito.when(client.getApplication(application.getName(), false)) .thenReturn(application); } - Mockito.when(clientProvider.getControllerClient(anyString(), anyString(), anyString(), anyString())) + Mockito.when(clientProvider.getControllerClient(anyString(), anyString(), anyString())) .thenReturn(client); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecutionTest.java index 008346657d..e9efd4546c 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollExecuteAppStatusExecutionTest.java @@ -185,7 +185,7 @@ private void prepareClients(ApplicationLog applicationLog) { when(logCacheClient.getRecentLogs(any(), any())).thenReturn(List.of(applicationLog)); when(clientFactory.createLogCacheClient(any(), any())).thenReturn(logCacheClient); when(client.getApplicationGuid(eq(APPLICATION_NAME))).thenReturn(UUID.fromString(APPLICATION_GUID)); - when(clientProvider.getControllerClient(any(), any(), any(), any())).thenReturn(client); + when(clientProvider.getControllerClient(any(), any(), any())).thenReturn(client); } @Test diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceInProgressOperationsExecutionTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceInProgressOperationsExecutionTest.java index e44d08242b..31656dcf91 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceInProgressOperationsExecutionTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceInProgressOperationsExecutionTest.java @@ -113,7 +113,7 @@ private void initializeParameters(List serviceNames, List instancesStates) { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RestartSubscribersStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RestartSubscribersStepTest.java index 9c0f5a86f1..5afe6f0d93 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RestartSubscribersStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/RestartSubscribersStepTest.java @@ -39,9 +39,9 @@ void testClientsForCorrectSpacesAreRequested() { // Then: Mockito.verify(clientProvider, Mockito.atLeastOnce()) - .getControllerClient(eq(USER_NAME), eq(USER_GUID), eq(FOO_SPACE_GUID.toString()), anyString()); + .getControllerClient(eq(USER_GUID), eq(FOO_SPACE_GUID.toString()), anyString()); Mockito.verify(clientProvider, Mockito.atLeastOnce()) - .getControllerClient(eq(USER_NAME), eq(USER_GUID), eq(BAR_SPACE_GUID.toString()), anyString()); + .getControllerClient(eq(USER_GUID), eq(BAR_SPACE_GUID.toString()), anyString()); } @Test @@ -51,9 +51,9 @@ void testSubscribersAreRestartedWhenClientExtensionsAreNotSupported() { CloudControllerClient clientForSpaceFoo = Mockito.mock(CloudControllerClient.class); CloudControllerClient clientForSpaceBar = Mockito.mock(CloudControllerClient.class); - Mockito.when(clientProvider.getControllerClient(eq(USER_NAME), eq(USER_GUID), eq(FOO_SPACE_GUID.toString()), anyString())) + Mockito.when(clientProvider.getControllerClient(eq(USER_GUID), eq(FOO_SPACE_GUID.toString()), anyString())) .thenReturn(clientForSpaceFoo); - Mockito.when(clientProvider.getControllerClient(eq(USER_NAME), eq(USER_GUID), eq(BAR_SPACE_GUID.toString()), anyString())) + Mockito.when(clientProvider.getControllerClient(eq(USER_GUID), eq(BAR_SPACE_GUID.toString()), anyString())) .thenReturn(clientForSpaceBar); // When: @@ -79,9 +79,9 @@ void testSubscribersAreRestartedWhenClientExtensionsAreSupported() { CloudControllerClient clientForSpaceFoo = Mockito.mock(CloudControllerClient.class); CloudControllerClient clientForSpaceBar = Mockito.mock(CloudControllerClient.class); - Mockito.when(clientProvider.getControllerClient(eq(USER_NAME), eq(USER_GUID), eq(FOO_SPACE_GUID.toString()), anyString())) + Mockito.when(clientProvider.getControllerClient(eq(USER_GUID), eq(FOO_SPACE_GUID.toString()), anyString())) .thenReturn(clientForSpaceFoo); - Mockito.when(clientProvider.getControllerClient(eq(USER_NAME), eq(USER_GUID), eq(BAR_SPACE_GUID.toString()), anyString())) + Mockito.when(clientProvider.getControllerClient(eq(USER_GUID), eq(BAR_SPACE_GUID.toString()), anyString())) .thenReturn(clientForSpaceBar); // When: diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/SyncFlowableStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/SyncFlowableStepTest.java index 02bd20c43f..370a465745 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/SyncFlowableStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/SyncFlowableStepTest.java @@ -122,7 +122,7 @@ public void initMocks() throws Exception { context.setVariable(Variables.USER, USER_NAME); context.setVariable(Variables.USER_GUID, USER_GUID); context.setVariable(Variables.ORGANIZATION_NAME, ORG_NAME); - when(clientProvider.getControllerClient(any(), any(), any(), any())).thenReturn(client); + when(clientProvider.getControllerClient(any(), any(), any())).thenReturn(client); execution.setVariable("correlationId", getCorrelationId()); execution.setVariable("__TASK_ID", getTaskId()); prepareProcessEngineConfiguration(); diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStepTest.java index e800aa5604..a12a7c3b5d 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateSubscribersStepTest.java @@ -201,7 +201,7 @@ private void prepareClients() { private void prepareClientProvider(CloudSpace space, CloudControllerClient clientMock) { String spaceName = space.getName(); - when(clientProvider.getControllerClient(eq(USER), eq(USER_GUID), eq(spaceName), anyString())).thenReturn(clientMock); + when(clientProvider.getControllerClient(eq(USER_GUID), eq(spaceName), anyString())).thenReturn(clientMock); } private Map createClientsForSpacesOfSubscribedApps() { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationStagerTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationStagerTest.java index 62a290ed0b..0a1c1e1c30 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationStagerTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationStagerTest.java @@ -62,7 +62,7 @@ public void setUp() throws Exception { this.context = new ProcessContext(MockDelegateExecution.createSpyInstance(), stepLogger, clientProvider); context.setVariable(Variables.USER, "whatever"); context.setVariable(Variables.USER_GUID, "123-456-789"); - Mockito.when(clientProvider.getControllerClient(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())) + Mockito.when(clientProvider.getControllerClient(Mockito.any(), Mockito.any(), Mockito.any())) .thenReturn(client); this.applicationStager = new ApplicationStager(context); setCloudPackage(); diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationWaitAfterStopVariableGetterTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationWaitAfterStopVariableGetterTest.java index 0ad1fcab48..b35313444f 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationWaitAfterStopVariableGetterTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ApplicationWaitAfterStopVariableGetterTest.java @@ -48,7 +48,7 @@ void setup() throws Exception { .close(); Mockito.when(client.getApplicationEnvironment(Mockito.any(UUID.class))) .thenReturn(Collections.emptyMap()); - Mockito.when(clientProvider.getControllerClient(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString())) + Mockito.when(clientProvider.getControllerClient(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())) .thenReturn(client); context = new ProcessContext(MockDelegateExecution.createSpyInstance(), stepLogger, clientProvider); context.setVariable(Variables.USER, "user"); diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceRemoverTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceRemoverTest.java index 642b5f0065..b8131590ca 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceRemoverTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/ServiceRemoverTest.java @@ -43,6 +43,8 @@ class ServiceRemoverTest { private static final String TEST_USER = "test-user"; private static final String TEST_USER_GUID = UUID.randomUUID() .toString(); + private static final String TEST_CORRELATION_ID = UUID.randomUUID() + .toString(); private static final String TEST_SPACE = "test-space"; private static final String SERVICE_NAME = "test-service"; private static final String SERVICE_LABEL = "test-label"; @@ -71,10 +73,11 @@ void setUp() throws Exception { } private void prepareExecution() { - when(clientProvider.getControllerClient(anyString(), anyString(), anyString(), any())).thenReturn(client); + when(clientProvider.getControllerClient(anyString(), anyString(), anyString())).thenReturn(client); context = new ProcessContext(execution, stepLogger, clientProvider); context.setVariable(Variables.USER, TEST_USER); context.setVariable(Variables.USER_GUID, TEST_USER_GUID); + context.setVariable(Variables.CORRELATION_ID, TEST_CORRELATION_ID); execution.setVariable(org.cloudfoundry.multiapps.controller.persistence.Constants.VARIABLE_NAME_SPACE_ID, TEST_SPACE); } diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImpl.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImpl.java index 5f6ba786e5..3f0ce39840 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImpl.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImpl.java @@ -130,7 +130,7 @@ protected ResponseEntity> getMtasByName(String spaceGuid, String name) private CloudControllerClient getCloudFoundryClient(String spaceGuid) { UserInfo userInfo = SecurityContextUtil.getUserInfo(); - return clientProvider.getControllerClientWithNoCorrelation(userInfo.getName(), userInfo.getId(), spaceGuid); + return clientProvider.getControllerClientWithNoCorrelation(userInfo.getId(), spaceGuid); } private List getMtas(List deployedMtas, CloudControllerClient client) { 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 ac444390e3..1378204049 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 @@ -338,7 +338,7 @@ private UserInfo getAuthenticatedUser(HttpServletRequest request) { private CloudSpaceClient getSpaceClient() { UserInfo userInfo = SecurityContextUtil.getUserInfo(); - return clientFactory.createSpaceClient(tokenService.getToken(userInfo.getName(), userInfo.getId())); + return clientFactory.createSpaceClient(tokenService.getToken(userInfo.getId())); } private List getOperationMessages(Operation operation) { diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/ConfigurationEntriesResource.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/ConfigurationEntriesResource.java index b552f21b39..7a2a36dddd 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/ConfigurationEntriesResource.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/ConfigurationEntriesResource.java @@ -49,11 +49,11 @@ public class ConfigurationEntriesResource { public ResponseEntity purgeConfigurationRegistry(@RequestParam(REQUEST_PARAM_ORGANIZATION) String organization, @RequestParam(REQUEST_PARAM_SPACE) String space) { UserInfo user = SecurityContextUtil.getUserInfo(); - var spaceClient = clientFactory.createSpaceClient(tokenService.getToken(user.getName(), user.getId())); + var spaceClient = clientFactory.createSpaceClient(tokenService.getToken(user.getId())); var cloudSpace = spaceClient.getSpace(organization, space); - CloudControllerClient client = clientProvider.getControllerClientWithNoCorrelation(user.getName(), user.getId(), + CloudControllerClient client = clientProvider.getControllerClientWithNoCorrelation(user.getId(), cloudSpace.getGuid() .toString()); MtaConfigurationPurger configurationPurger = new MtaConfigurationPurger(client, spaceClient, configurationEntryService, diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationChecker.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationChecker.java index 425ffbd75f..dd45de2888 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationChecker.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationChecker.java @@ -92,7 +92,7 @@ boolean checkPermissions(UserInfo userInfo, String orgName, String spaceName, bo if (hasAdminScope(userInfo)) { return true; } - var userToken = tokenService.getToken(userInfo.getName(), userInfo.getId()); + var userToken = tokenService.getToken(userInfo.getId()); var spaceClient = clientFactory.createSpaceClient(userToken); var space = spaceClient.getSpace(orgName, spaceName); @@ -109,7 +109,7 @@ boolean checkPermissions(UserInfo userInfo, String spaceId, boolean readOnly) { if (hasAdminScope(userInfo)) { return true; } - var userToken = tokenService.getToken(userInfo.getName(), userInfo.getId()); + var userToken = tokenService.getToken(userInfo.getId()); CfRolesGetter rolesGetter = getRolesGetter(userToken); UUID userGuid = UUID.fromString(userInfo.getId()); UUID spaceGuid = convertSpaceIdToUUID(spaceId); diff --git a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImplTest.java b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImplTest.java index bf6ae6f123..c6dcb2d16b 100644 --- a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImplTest.java +++ b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/api/impl/MtasApiServiceImplTest.java @@ -191,7 +191,7 @@ private void mockClient() { .thenReturn(auth); Mockito.when(client.getApplicationRoutes(Mockito.any(UUID.class))) .thenReturn(Collections.emptyList()); - Mockito.when(clientProvider.getControllerClientWithNoCorrelation(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())) + Mockito.when(clientProvider.getControllerClientWithNoCorrelation(Mockito.anyString(), Mockito.anyString())) .thenReturn(client); } diff --git a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationCheckerTest.java b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationCheckerTest.java index ba13a5fe26..3d568aa369 100644 --- a/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationCheckerTest.java +++ b/multiapps-controller-web/src/test/java/org/cloudfoundry/multiapps/controller/web/security/AuthorizationCheckerTest.java @@ -153,7 +153,7 @@ void testCheckPermissionsWithNonUUIDSpaceIDString() { private void setUpMocks(Set spaceRoles, Exception exception) { var token = Mockito.mock(OAuth2AccessTokenWithAdditionalInfo.class); - when(tokenService.getToken(anyString(), anyString())).thenReturn(token); + when(tokenService.getToken(anyString())).thenReturn(token); if (exception != null) { when(rolesGetter.getRoles(SPACE_ID, USER_ID)).thenThrow(exception); } else { From 3c18959e500ed63fcd0a84f3b226831ba205e3f2 Mon Sep 17 00:00:00 2001 From: theghost5800 Date: Mon, 10 Nov 2025 14:46:41 +0200 Subject: [PATCH 3/3] Remove usage of HttpServletRequest parameter --- .../controller/api/OperationsApiService.java | 6 +- .../controller/api/v1/OperationsApi.java | 29 ++++----- .../api/impl/OperationsApiServiceImpl.java | 18 +++--- .../impl/OperationsApiServiceImplTest.java | 63 ++++++++++--------- 4 files changed, 57 insertions(+), 59 deletions(-) diff --git a/multiapps-controller-api/src/main/java/org/cloudfoundry/multiapps/controller/api/OperationsApiService.java b/multiapps-controller-api/src/main/java/org/cloudfoundry/multiapps/controller/api/OperationsApiService.java index 7c8573626a..6c11ab0074 100644 --- a/multiapps-controller-api/src/main/java/org/cloudfoundry/multiapps/controller/api/OperationsApiService.java +++ b/multiapps-controller-api/src/main/java/org/cloudfoundry/multiapps/controller/api/OperationsApiService.java @@ -2,8 +2,6 @@ import java.util.List; -import jakarta.servlet.http.HttpServletRequest; - import org.cloudfoundry.multiapps.controller.api.model.Log; import org.cloudfoundry.multiapps.controller.api.model.Operation; import org.springframework.http.ResponseEntity; @@ -12,7 +10,7 @@ public interface OperationsApiService { ResponseEntity> getOperationActions(String spaceGuid, String operationId); - ResponseEntity executeOperationAction(HttpServletRequest request, String spaceGuid, String operationId, String actionId); + ResponseEntity executeOperationAction(String spaceGuid, String operationId, String actionId); ResponseEntity> getOperations(String spaceGuid, String mtaId, List states, Integer last); @@ -22,6 +20,6 @@ public interface OperationsApiService { ResponseEntity getOperationLogContent(String spaceGuid, String operationId, String logId); - ResponseEntity startOperation(HttpServletRequest request, String spaceGuid, Operation operation); + ResponseEntity startOperation(String spaceGuid, Operation operation); } diff --git a/multiapps-controller-api/src/main/java/org/cloudfoundry/multiapps/controller/api/v1/OperationsApi.java b/multiapps-controller-api/src/main/java/org/cloudfoundry/multiapps/controller/api/v1/OperationsApi.java index 408e56d513..5b807d3abd 100644 --- a/multiapps-controller-api/src/main/java/org/cloudfoundry/multiapps/controller/api/v1/OperationsApi.java +++ b/multiapps-controller-api/src/main/java/org/cloudfoundry/multiapps/controller/api/v1/OperationsApi.java @@ -2,9 +2,13 @@ import java.util.List; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import io.swagger.annotations.Authorization; import jakarta.inject.Inject; -import jakarta.servlet.http.HttpServletRequest; - import org.cloudfoundry.multiapps.controller.api.Constants.Endpoints; import org.cloudfoundry.multiapps.controller.api.Constants.PathVariables; import org.cloudfoundry.multiapps.controller.api.Constants.QueryVariables; @@ -23,13 +27,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.Authorization; - @Api @RestController @RequestMapping(Resources.OPERATIONS) @@ -44,10 +41,10 @@ public class OperationsApi { }) }, tags = {}) @ApiResponses(value = { @ApiResponse(code = 202, message = "Accepted") }) - public ResponseEntity executeOperationAction(HttpServletRequest request, @PathVariable(PathVariables.SPACE_GUID) String spaceGuid, + public ResponseEntity executeOperationAction(@PathVariable(PathVariables.SPACE_GUID) String spaceGuid, @PathVariable(PathVariables.OPERATION_ID) String operationId, @RequestParam(PathVariables.ACTION_ID) String actionId) { - return delegate.executeOperationAction(request, spaceGuid, operationId, actionId); + return delegate.executeOperationAction(spaceGuid, operationId, actionId); } @GetMapping(path = Endpoints.OPERATION, produces = MediaType.APPLICATION_JSON_VALUE) @@ -57,9 +54,9 @@ public ResponseEntity executeOperationAction(HttpServletRequest request, @ }) }, tags = {}) @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Operation.class) }) public ResponseEntity - getOperation(@PathVariable(PathVariables.SPACE_GUID) String spaceGuid, - @PathVariable(PathVariables.OPERATION_ID) String operationId, - @ApiParam(value = "Adds the specified property in the response body ") @RequestParam(name = "embed", required = false) String embed) { + getOperation(@PathVariable(PathVariables.SPACE_GUID) String spaceGuid, + @PathVariable(PathVariables.OPERATION_ID) String operationId, + @ApiParam(value = "Adds the specified property in the response body ") @RequestParam(name = "embed", required = false) String embed) { return delegate.getOperation(spaceGuid, operationId, embed); } @@ -116,9 +113,9 @@ public ResponseEntity> getOperationActions(@PathVariable(PathVariab }) }, tags = {}) @ApiResponses(value = { @ApiResponse(code = 202, message = "Accepted") }) - public ResponseEntity startOperation(HttpServletRequest request, @PathVariable(PathVariables.SPACE_GUID) String spaceGuid, + public ResponseEntity startOperation(@PathVariable(PathVariables.SPACE_GUID) String spaceGuid, @RequestBody Operation operation) { - return delegate.startOperation(request, spaceGuid, operation); + return delegate.startOperation(spaceGuid, operation); } } 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 1378204049..3bd31cee34 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 @@ -1,6 +1,5 @@ package org.cloudfoundry.multiapps.controller.web.api.impl; -import java.security.Principal; import java.text.MessageFormat; import java.time.ZoneId; import java.time.ZonedDateTime; @@ -18,7 +17,6 @@ import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.persistence.NoResultException; -import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.collections4.ListUtils; import org.cloudfoundry.multiapps.common.ContentException; import org.cloudfoundry.multiapps.common.NotFoundException; @@ -101,7 +99,7 @@ public ResponseEntity> getOperations(String spaceGuid, String mt } @Override - public ResponseEntity executeOperationAction(HttpServletRequest request, String spaceGuid, String operationId, String actionId) { + public ResponseEntity executeOperationAction(String spaceGuid, String operationId, String actionId) { operationsApiServiceAuditLog.logExecuteOperationAction(SecurityContextUtil.getUsername(), spaceGuid, operationId, actionId); Operation operation = getOperationByOperationGuidAndSpaceGuid(operationId, spaceGuid); List availableOperations = getAvailableActions(operation); @@ -111,7 +109,7 @@ public ResponseEntity executeOperationAction(HttpServletRequest request, S operation.getState())); } ProcessAction action = processActionRegistry.getAction(Action.fromString(actionId)); - action.execute(getAuthenticatedUser(request), operationId); + action.execute(getAuthenticatedUser(), operationId); return ResponseEntity.accepted() .header("Location", getLocationHeader(operationId, spaceGuid)) .build(); @@ -150,9 +148,9 @@ public ResponseEntity getOperationLogContent(String spaceGuid, String op } @Override - public ResponseEntity startOperation(HttpServletRequest request, String spaceGuid, Operation operation) { + public ResponseEntity startOperation(String spaceGuid, Operation operation) { operationsApiServiceAuditLog.logStartOperation(SecurityContextUtil.getUsername(), spaceGuid, operation); - UserInfo authenticatedUser = getAuthenticatedUser(request); + UserInfo authenticatedUser = getAuthenticatedUser(); String processDefinitionKey = operationsHelper.getProcessDefinitionKey(operation); Set predefinedParameters = operationMetadataMapper.getOperationMetadata(operation.getProcessType()) .getParameters(); @@ -328,12 +326,12 @@ private String getLocationHeader(String processInstanceId, String spaceId) { return "spaces/" + spaceId + "/operations/" + processInstanceId + "?embed=messages"; } - private UserInfo getAuthenticatedUser(HttpServletRequest request) { - Principal principal = request.getUserPrincipal(); - if (principal == null) { + private UserInfo getAuthenticatedUser() { + UserInfo userInfo = SecurityContextUtil.getUserInfo(); + if (userInfo == null) { throw new ResponseStatusException(HttpStatus.UNAUTHORIZED); } - return SecurityContextUtil.getUserInfo(); + return userInfo; } private CloudSpaceClient getSpaceClient() { 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 4e18f8e339..055b21a337 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 @@ -122,7 +122,7 @@ public void initialize() throws Exception { setupOperationsHelperMock(); mockProcessActionRegistry(); mockFlowableFacade(); - mockClientProvider(EXAMPLE_USER); + mockClientProvider(true); } @Test @@ -166,31 +166,28 @@ void testGetOperationMissing() { @Test void testExecuteOperationAction() { String processId = RUNNING_PROCESS; - operationsApiService.executeOperationAction(mockHttpServletRequest(EXAMPLE_USER), SPACE_GUID, processId, - Action.ABORT.getActionId()); + operationsApiService.executeOperationAction(SPACE_GUID, processId, Action.ABORT.getActionId()); Mockito.verify(processAction) .execute(Mockito.argThat(userInfo -> EXAMPLE_USER.equals(userInfo.getName())), Mockito.eq(processId)); } @Test void testExecuteOperationActionMissingProcess() { - Assertions.assertThrows(NotFoundException.class, - () -> operationsApiService.executeOperationAction(mockHttpServletRequest(EXAMPLE_USER), SPACE_GUID, - "notavalidpprocess", Action.ABORT.getActionId())); + Assertions.assertThrows(NotFoundException.class, () -> operationsApiService.executeOperationAction(SPACE_GUID, "notavalidpprocess", + Action.ABORT.getActionId())); } @Test void testExecuteOperationActionInvalidAction() { assertThrows(IllegalArgumentException.class, - () -> operationsApiService.executeOperationAction(mockHttpServletRequest(EXAMPLE_USER), SPACE_GUID, RUNNING_PROCESS, - Action.START.getActionId())); + () -> operationsApiService.executeOperationAction(SPACE_GUID, RUNNING_PROCESS, Action.START.getActionId())); } @Test void testExecuteOperationActionUnauthorized() { + mockClientProvider(false); Assertions.assertThrows(ResponseStatusException.class, - () -> operationsApiService.executeOperationAction(mockHttpServletRequest(null), SPACE_GUID, RUNNING_PROCESS, - Action.ABORT.getActionId())); + () -> operationsApiService.executeOperationAction(SPACE_GUID, RUNNING_PROCESS, Action.ABORT.getActionId())); } @Test @@ -199,7 +196,7 @@ void testStartOperation() { Operation operation = createOperation(null, null, parameters); Mockito.when(operationsHelper.getProcessDefinitionKey(operation)) .thenReturn("deploy"); - operationsApiService.startOperation(mockHttpServletRequest(EXAMPLE_USER), SPACE_GUID, operation); + operationsApiService.startOperation(SPACE_GUID, operation); Mockito.verify(flowableFacade) .startProcess(Mockito.any(), Mockito.anyMap()); } @@ -213,7 +210,7 @@ void testStartOperationWithInvalidParametersForTheProcess() { Mockito.when(operationsHelper.getProcessDefinitionKey(operation)) .thenReturn("deploy"); - operationsApiService.startOperation(mockHttpServletRequest(EXAMPLE_USER), SPACE_GUID, operation); + operationsApiService.startOperation(SPACE_GUID, operation); Mockito.verify(flowableFacade) .startProcess(ArgumentMatchers.eq("deploy"), ArgumentMatchers.argThat( @@ -224,13 +221,12 @@ void testStartOperationWithInvalidParametersForTheProcess() { @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"); + 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); + operationsApiService.startOperation(SPACE_GUID, operation); Mockito.verify(flowableFacade) .startProcess(ArgumentMatchers.eq("deploy"), ArgumentMatchers.argThat( @@ -325,24 +321,33 @@ private void mockFlowableFacade() { .thenReturn(Mockito.mock(ProcessInstance.class)); } - private void mockClientProvider(String user) { - org.cloudfoundry.multiapps.controller.core.util.UserInfo userInfo = new org.cloudfoundry.multiapps.controller.core.util.UserInfo( - USER_GUID, user, new OAuth2AccessTokenWithAdditionalInfo(null, Map.of(TokenProperties.USER_ID_KEY, USER_GUID))); - OAuth2AuthenticationToken auth = Mockito.mock(OAuth2AuthenticationToken.class); - Map attributes = Map.of(USER_INFO, userInfo); - OAuth2User principal = Mockito.mock(OAuth2User.class); - Mockito.when(principal.getAttributes()) - .thenReturn(attributes); - Mockito.when(auth.getPrincipal()) - .thenReturn(principal); + private void mockClientProvider(boolean shouldReturnAuthorizedClient) { + mockClientAuth(shouldReturnAuthorizedClient); + CloudSpaceClient mockedClient = mockClient(); + Mockito.when(clientFactory.createSpaceClient(Mockito.any())) + .thenReturn(mockedClient); + } + + private void mockClientAuth(boolean shouldReturnAuthorizedClient) { org.springframework.security.core.context.SecurityContext securityContextMock = Mockito.mock( org.springframework.security.core.context.SecurityContext.class); SecurityContextHolder.setContext(securityContextMock); + if (shouldReturnAuthorizedClient) { + org.cloudfoundry.multiapps.controller.core.util.UserInfo userInfo = new org.cloudfoundry.multiapps.controller.core.util.UserInfo( + USER_GUID, EXAMPLE_USER, new OAuth2AccessTokenWithAdditionalInfo(null, Map.of(TokenProperties.USER_ID_KEY, USER_GUID))); + OAuth2AuthenticationToken auth = Mockito.mock(OAuth2AuthenticationToken.class); + Map attributes = Map.of(USER_INFO, userInfo); + OAuth2User principal = Mockito.mock(OAuth2User.class); + Mockito.when(principal.getAttributes()) + .thenReturn(attributes); + Mockito.when(auth.getPrincipal()) + .thenReturn(principal); + Mockito.when(securityContextMock.getAuthentication()) + .thenReturn(auth); + return; + } Mockito.when(securityContextMock.getAuthentication()) - .thenReturn(auth); - CloudSpaceClient mockedClient = mockClient(); - Mockito.when(clientFactory.createSpaceClient(Mockito.any())) - .thenReturn(mockedClient); + .thenReturn(null); } private CloudSpaceClient mockClient() {