From 12a4ffa963845677339ffe92b8a4770f4dab2da0 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Wed, 19 Aug 2026 22:41:14 +0100 Subject: [PATCH] Leave the seeded Classification policy unowned rather than naming a service account --- .../seed/DefaultClassificationPolicySeeder.java | 16 ++++++++-------- .../DefaultClassificationPolicySeederTest.java | 11 +++++------ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/policy/seed/DefaultClassificationPolicySeeder.java b/app/proprietary/src/main/java/stirling/software/proprietary/policy/seed/DefaultClassificationPolicySeeder.java index d7a4e61828..39e5ea447f 100644 --- a/app/proprietary/src/main/java/stirling/software/proprietary/policy/seed/DefaultClassificationPolicySeeder.java +++ b/app/proprietary/src/main/java/stirling/software/proprietary/policy/seed/DefaultClassificationPolicySeeder.java @@ -13,7 +13,6 @@ import org.springframework.transaction.event.TransactionalEventListener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import stirling.software.common.model.enumeration.Role; import stirling.software.proprietary.model.TeamCreatedEvent; import stirling.software.proprietary.policy.model.OutputSpec; import stirling.software.proprietary.policy.model.PipelineStep; @@ -79,18 +78,17 @@ public class DefaultClassificationPolicySeeder { } /** - * Move a policy seeded before the owner was a real identity onto the internal API user. Left - * alone otherwise, so an owner someone deliberately changed is never overwritten. + * Clear an owner seeded as a placeholder name. An owner someone deliberately set is left alone. */ private void repairOwner(Policy policy) { if (!LEGACY_OWNER.equals(policy.owner())) { return; } - policyStore.save(policy.withOwner(Role.INTERNAL_API_USER.getRoleId())); + policyStore.save(policy.withOwner(null)); log.info( - "Re-owned Classification policy {} from '{}' to the internal API user", - policy.id(), - LEGACY_OWNER); + "Cleared placeholder owner '{}' on Classification policy {}", + LEGACY_OWNER, + policy.id()); } private static boolean isClassification(Policy policy) { @@ -110,7 +108,9 @@ public class DefaultClassificationPolicySeeder { return new Policy( null, POLICY_NAME, - Role.INTERNAL_API_USER.getRoleId(), + // Nobody created this - it is seeded. A name here would have to be a real user, and + // every consumer of owner already handles its absence. + null, true, List.of(), List.of(new PipelineStep(CLASSIFY_ENDPOINT, Map.of())), diff --git a/app/proprietary/src/test/java/stirling/software/proprietary/policy/seed/DefaultClassificationPolicySeederTest.java b/app/proprietary/src/test/java/stirling/software/proprietary/policy/seed/DefaultClassificationPolicySeederTest.java index f51f474043..f6e82bd011 100644 --- a/app/proprietary/src/test/java/stirling/software/proprietary/policy/seed/DefaultClassificationPolicySeederTest.java +++ b/app/proprietary/src/test/java/stirling/software/proprietary/policy/seed/DefaultClassificationPolicySeederTest.java @@ -17,7 +17,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import stirling.software.common.model.enumeration.Role; import stirling.software.proprietary.model.Team; import stirling.software.proprietary.model.TeamCreatedEvent; import stirling.software.proprietary.policy.model.OutputSpec; @@ -37,7 +36,7 @@ class DefaultClassificationPolicySeederTest { } private static Policy classificationPolicy(Long teamId) { - return classificationPolicy(teamId, Role.INTERNAL_API_USER.getRoleId()); + return classificationPolicy(teamId, null); } private static Policy classificationPolicy(Long teamId, String owner) { @@ -83,16 +82,16 @@ class DefaultClassificationPolicySeederTest { } @Test - void reOwnsAPolicySeededUnderThePlaceholderName() { + void clearsAPlaceholderOwnerSeededBeforeOwnersHadToBeReal() { when(policyStore.findByTeam(7L)).thenReturn(List.of(classificationPolicy(7L, "system"))); seeder().onTeamCreated(new TeamCreatedEvent(7L, "Acme")); - // "system" was never a user row: a sweep-fired run would fall back to it for output - // ownership, and a step dispatch would authenticate as it. Both need a real identity. + // "system" was never a user row, and a step dispatch authenticates as the owner. Absence + // is handled everywhere; a placeholder name is not. ArgumentCaptor saved = ArgumentCaptor.forClass(Policy.class); verify(policyStore).save(saved.capture()); - assertThat(saved.getValue().owner()).isEqualTo(Role.INTERNAL_API_USER.getRoleId()); + assertThat(saved.getValue().owner()).isNull(); assertThat(saved.getValue().id()).isEqualTo("p1"); }