From 267ff2e03f37c6217b95cd55b022736b209ea4aa Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Fri, 6 Mar 2026 11:33:57 +0100 Subject: [PATCH 1/4] [NAE-2389] Actor ref resolution does not includes realmId Moved the logic for validating actor existence into a dedicated `actorExists` method to improve code readability and reduce duplication. This change was applied to both `WorkflowService` and `TaskService` for consistency. --- .../engine/workflow/service/TaskService.java | 26 +++++++++------- .../workflow/service/WorkflowService.java | 31 ++++++++++--------- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java index e0cb97dc73b..94b85fe9c92 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java @@ -859,22 +859,24 @@ private List getExistingActors(ActorListFieldValue actorListFieldValue) return null; } return actorListFieldValue.getActorValues().stream() + .filter(this::actorExists) .map(ActorFieldValue::getId) - .filter(actorId -> { - AbstractUser user = userService.findById(actorId, null); - if (user != null) { - return true; - } - try { - groupService.findById(actorId); - return true; - } catch (IllegalArgumentException ignored) { - return false; - } - }) .collect(Collectors.toList()); } + private boolean actorExists(ActorFieldValue actorFieldValue) { + AbstractUser user = userService.findById(actorFieldValue.getId(), actorFieldValue.getRealmId()); + if (user != null) { + return true; + } + try { + groupService.findById(actorFieldValue.getId()); + return true; + } catch (IllegalArgumentException ignored) { + return false; + } + } + private Task createFromTransition(Transition transition, Case useCase) { final Task task = com.netgrif.application.engine.adapter.spring.workflow.domain.Task.with() .title(transition.getTitle()) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java index 938f38bcc79..036dee2b29f 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java @@ -255,10 +255,9 @@ public Case resolveActorRef(Case useCase, boolean canSaveUseCase) { /** * Resolves actor permissions for the useCase based on the actor list data field. * - * @param useCase useCase where to resolve actor permissions + * @param useCase useCase where to resolve actor permissions * @param actorFieldId field id of the actor list - * @param permission permission associated with the useCase and actor list - * + * @param permission permission associated with the useCase and actor list * @return true if the useCase was modified, false otherwise */ private boolean resolveActorRefPermissions(Case useCase, String actorFieldId, Map permission) { @@ -278,22 +277,24 @@ private List getExistingActors(ActorListFieldValue actorListFieldValue) return null; } return actorListFieldValue.getActorValues().stream() + .filter(this::actorExists) .map(ActorFieldValue::getId) - .filter(actorId -> { - AbstractUser user = userService.findById(actorId, null); - if (user != null) { - return true; - } - try { - groupService.findById(actorId); - return true; - } catch (IllegalArgumentException ignored) { - return false; - } - }) .collect(Collectors.toList()); } + private boolean actorExists(ActorFieldValue actorFieldValue) { + AbstractUser user = userService.findById(actorFieldValue.getId(), actorFieldValue.getRealmId()); + if (user != null) { + return true; + } + try { + groupService.findById(actorFieldValue.getId()); + return true; + } catch (IllegalArgumentException ignored) { + return false; + } + } + public CreateCaseEventOutcome createCase(CreateCaseParams createCaseParams) { fillAndValidateAttributes(createCaseParams); PetriNet petriNet = createCaseParams.getProcess(); From c68380bd0c370230d7a13934a9b50aff7879b63c Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Fri, 6 Mar 2026 12:41:06 +0100 Subject: [PATCH 2/4] Handle null checks for actorFieldValue in actorExists method Added null checks for actorFieldValue and its ID in actorExists methods of WorkflowService and TaskService. This prevents potential NullPointerExceptions and ensures robustness in cases where invalid or null input is provided. --- .../application/engine/workflow/service/TaskService.java | 3 +++ .../application/engine/workflow/service/WorkflowService.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java index 94b85fe9c92..c4e94044c57 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java @@ -865,6 +865,9 @@ private List getExistingActors(ActorListFieldValue actorListFieldValue) } private boolean actorExists(ActorFieldValue actorFieldValue) { + if (actorFieldValue == null || actorFieldValue.getId() == null) { + return false; + } AbstractUser user = userService.findById(actorFieldValue.getId(), actorFieldValue.getRealmId()); if (user != null) { return true; diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java index 036dee2b29f..feebf1247aa 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java @@ -283,6 +283,9 @@ private List getExistingActors(ActorListFieldValue actorListFieldValue) } private boolean actorExists(ActorFieldValue actorFieldValue) { + if (actorFieldValue == null || actorFieldValue.getId() == null) { + return false; + } AbstractUser user = userService.findById(actorFieldValue.getId(), actorFieldValue.getRealmId()); if (user != null) { return true; From f8f36498ab804a6f074ef5ad49164bf7ee79f0ad Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Wed, 8 Apr 2026 09:18:14 +0200 Subject: [PATCH 3/4] Validate actor ID format and handle blank IDs. Enhanced the `actorExists` method to check if the actor ID is blank or invalid using `ObjectId.isValid`. This ensures more robust validation and prevents potential errors when processing malformed IDs. --- .../application/engine/workflow/service/WorkflowService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java index feebf1247aa..a16077f5307 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java @@ -283,7 +283,7 @@ private List getExistingActors(ActorListFieldValue actorListFieldValue) } private boolean actorExists(ActorFieldValue actorFieldValue) { - if (actorFieldValue == null || actorFieldValue.getId() == null) { + if (actorFieldValue == null || actorFieldValue.getId() == null || actorFieldValue.getId().isBlank() || !ObjectId.isValid(actorFieldValue.getId())) { return false; } AbstractUser user = userService.findById(actorFieldValue.getId(), actorFieldValue.getRealmId()); From f8f510e4c46e99f7639d0617c99de2764d9d2b41 Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Wed, 8 Apr 2026 13:50:54 +0200 Subject: [PATCH 4/4] Ensure valid actor ID in actorExists method Updated the actorExists method to validate that the actor ID is not blank and adheres to ObjectId format. This prevents invalid or malformed IDs from causing issues during runtime. --- .../application/engine/workflow/service/TaskService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java index c4e94044c57..5a0d5ad766e 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java @@ -865,7 +865,7 @@ private List getExistingActors(ActorListFieldValue actorListFieldValue) } private boolean actorExists(ActorFieldValue actorFieldValue) { - if (actorFieldValue == null || actorFieldValue.getId() == null) { + if (actorFieldValue == null || actorFieldValue.getId() == null || actorFieldValue.getId().isBlank() || !ObjectId.isValid(actorFieldValue.getId())) { return false; } AbstractUser user = userService.findById(actorFieldValue.getId(), actorFieldValue.getRealmId());