diff --git a/CHANGELOG.md b/CHANGELOG.md index 6323c4e7..79fa1172 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,17 @@ on [Keep a CHANGELOG](http://keepachangelog.com/). This project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] - +# [17.103.10] - 2026-03-31 +## Changed +- framework-stream-rest-resources dependency is added to expose `/internal` endpoints + +# [17.103.9] - 2026-03-24 +## Changed +- event-store bumped to 17.103.8-M2 to + - Notification-based event linking and publishing via CDI events, enabled via JNDI: + - pre.publish.worker.notified (linking) + - event.publishing.worker.notified (publishing) + # [17.103.8] - 2025-12-09 ### Changed - Used JsonFactory instead of Json.create methods diff --git a/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccess.java b/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccess.java index 5e28314c..0d9215f9 100644 --- a/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccess.java +++ b/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccess.java @@ -1,38 +1,51 @@ package uk.gov.moj.cpp.accesscontrol.sjp.providers; +import java.util.List; + import org.apache.commons.lang3.StringUtils; public class ProsecutingAuthorityAccess { public static final String ALL_PROSECUTING_AUTHORITIES = "ALL"; - public final static ProsecutingAuthorityAccess NONE = new ProsecutingAuthorityAccess(null); + public final static ProsecutingAuthorityAccess NONE = new ProsecutingAuthorityAccess(null, null); public final static ProsecutingAuthorityAccess ALL = new ProsecutingAuthorityAccess(ALL_PROSECUTING_AUTHORITIES); private String prosecutingAuthority; + private List agentProsecutorAuthorityAccess; + private ProsecutingAuthorityAccess(final String prosecutingAuthority) { this.prosecutingAuthority = prosecutingAuthority; } - public static ProsecutingAuthorityAccess of(final String prosecutingAuthority) { + private ProsecutingAuthorityAccess(final String prosecutingAuthority, final List agentProsecutorAuthorityAccess) { + this.prosecutingAuthority = prosecutingAuthority; + this.agentProsecutorAuthorityAccess = agentProsecutorAuthorityAccess; + } - if (StringUtils.isEmpty(prosecutingAuthority)) { + public static ProsecutingAuthorityAccess of(final String prosecutingAuthority, final List agentProsecutorAuthorityAccess) { + if (StringUtils.isEmpty(prosecutingAuthority) && (agentProsecutorAuthorityAccess == null || agentProsecutorAuthorityAccess.isEmpty())) { return NONE; } else if (prosecutingAuthority.equals(ALL.getProsecutingAuthority())) { return ALL; } - return new ProsecutingAuthorityAccess(prosecutingAuthority); + return new ProsecutingAuthorityAccess(prosecutingAuthority, agentProsecutorAuthorityAccess); } public String getProsecutingAuthority() { return prosecutingAuthority; } + public List getAgentProsecutorAuthorityAccess() { + return agentProsecutorAuthorityAccess; + } + public boolean hasAccess(final String prosecutingAuthority) { return ALL.getProsecutingAuthority().equals(this.getProsecutingAuthority()) || (this.getProsecutingAuthority() != null && - this.getProsecutingAuthority().equals(prosecutingAuthority)); + this.getProsecutingAuthority().equals(prosecutingAuthority)) || + (agentProsecutorAuthorityAccess != null && agentProsecutorAuthorityAccess.contains(prosecutingAuthority)); } } diff --git a/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityProvider.java b/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityProvider.java index f466eb5e..a1cd7c5c 100644 --- a/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityProvider.java +++ b/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityProvider.java @@ -11,12 +11,18 @@ import javax.inject.Inject; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; +import javax.json.JsonString; import javax.json.JsonValue; import static java.lang.Boolean.valueOf; import static uk.gov.moj.cpp.accesscontrol.drools.constants.AccessControlFrameworkComponent.ACCESS_CONTROL; import static uk.gov.moj.cpp.accesscontrol.sjp.providers.SjpProvider.jsonBuilderFactory; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + @Provider @ApplicationScoped public class ProsecutingAuthorityProvider { @@ -62,7 +68,15 @@ public ProsecutingAuthorityAccess getCurrentUsersProsecutingAuthorityAccess(fina private ProsecutingAuthorityAccess buildFromResponseJson(final JsonObject responsePayload) { - return ProsecutingAuthorityAccess.of(responsePayload.getString("prosecutingAuthorityAccess", null)); + List agentProsecutors = Optional + .ofNullable(responsePayload.getJsonArray("agentProsecutorAuthorityAccess")) + .map(arr -> arr.getValuesAs(JsonString.class) + .stream() + .map(JsonString::getString) + .collect(Collectors.toList())) + .orElse(Collections.emptyList()); + + return ProsecutingAuthorityAccess.of(responsePayload.getString("prosecutingAuthorityAccess", null), agentProsecutors); } private JsonValue buildRequestPayload(final JsonEnvelope envelope) { diff --git a/access-control-parent/access-control-providers/access-control-sjp-providers/src/test/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccessTest.java b/access-control-parent/access-control-providers/access-control-sjp-providers/src/test/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccessTest.java index 267409b8..3b98673f 100644 --- a/access-control-parent/access-control-providers/access-control-sjp-providers/src/test/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccessTest.java +++ b/access-control-parent/access-control-providers/access-control-sjp-providers/src/test/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccessTest.java @@ -4,6 +4,8 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; +import java.util.ArrayList; + import org.junit.jupiter.api.Test; public class ProsecutingAuthorityAccessTest { @@ -24,7 +26,7 @@ public void shouldBuildNoProsecutingAuthorityAccess() { @Test public void shouldBuildSingleProsecutingAuthorityAccess() { - ProsecutingAuthorityAccess prosecutingAuthorityAccess = ProsecutingAuthorityAccess.of(PROSECUTOR); + ProsecutingAuthorityAccess prosecutingAuthorityAccess = ProsecutingAuthorityAccess.of(PROSECUTOR, new ArrayList<>()); assertThat(prosecutingAuthorityAccess.getProsecutingAuthority(), is(PROSECUTOR)); assertThat(prosecutingAuthorityAccess.hasAccess(PROSECUTOR), is(true)); @@ -35,7 +37,7 @@ public void shouldBuildSingleProsecutingAuthorityAccess() { @Test public void shouldReturnFalseForInvalidProsecutingAuthorityAccess() { - ProsecutingAuthorityAccess prosecutingAuthorityAccess = ProsecutingAuthorityAccess.of("OTHER_PROSECUTOR"); + ProsecutingAuthorityAccess prosecutingAuthorityAccess = ProsecutingAuthorityAccess.of("OTHER_PROSECUTOR", new ArrayList<>()); assertThat(prosecutingAuthorityAccess.getProsecutingAuthority(), is("OTHER_PROSECUTOR")); assertThat(prosecutingAuthorityAccess.hasAccess(PROSECUTOR), is(false)); diff --git a/access-control-parent/access-control-providers/access-control-sjp-providers/src/test/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityProviderTest.java b/access-control-parent/access-control-providers/access-control-sjp-providers/src/test/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityProviderTest.java index ca67f319..613bee4d 100644 --- a/access-control-parent/access-control-providers/access-control-sjp-providers/src/test/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityProviderTest.java +++ b/access-control-parent/access-control-providers/access-control-sjp-providers/src/test/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityProviderTest.java @@ -1,10 +1,13 @@ package uk.gov.moj.cpp.accesscontrol.sjp.providers; import static java.util.UUID.randomUUID; +import static javax.json.Json.createArrayBuilder; +import static javax.json.Json.createObjectBuilder; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; @@ -16,13 +19,21 @@ import uk.gov.justice.services.core.enveloper.Enveloper; import uk.gov.justice.services.core.requester.Requester; import uk.gov.justice.services.messaging.JsonEnvelope; +import uk.gov.justice.services.messaging.JsonObjects; import uk.gov.justice.services.messaging.spi.DefaultJsonMetadata; import uk.gov.justice.services.test.utils.core.enveloper.EnveloperFactory; import uk.gov.justice.services.test.utils.core.messaging.JsonEnvelopeBuilder; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; -import static org.hamcrest.MatcherAssert.assertThat; + +import java.util.List; +import java.util.Optional; + +import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; + import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; @@ -128,6 +139,17 @@ public void shouldReturnFalseIfUserHasSingleProsecutingAuthorityAccessForOther() assertLogStatement(); } + @Test + public void shouldReturnTrueIfUserHasSingleProsecutingAuthorityAccessForOtherButAgentHasAccess() { + + givenUserHasAgentProsecutingAuthorityAccess("ANOTHER_TEST"); + + assertThat(prosecutingAuthorityProvider.userHasProsecutingAuthorityAccess( + callingEnvelope, PROSECUTING_AUTHORITY), is(true)); + + assertLogStatement(); + } + @Test public void shouldReturnFalseIfUserHasNoProsecutingAuthorityAccess() { @@ -177,6 +199,27 @@ private JsonEnvelope userDetailsResponse(final String prosecutingAuthorityAccess return envelope().withPayloadOf(prosecutingAuthorityAccess, "prosecutingAuthorityAccess").build(); } + private void givenUserHasAgentProsecutingAuthorityAccess(final String prosecutingAuthorityAccess) { + doReturn(userDetailsResponse(prosecutingAuthorityAccess, List.of(PROSECUTING_AUTHORITY))) + .when(requester) + .requestAsAdmin(any()); + } + + private JsonEnvelope userDetailsResponse(final String prosecutingAuthorityAccess, final List agentProsecutorAuthorityAccess) { + final JsonObjectBuilder userObjectBuilder = createObjectBuilder(); + Optional.of(prosecutingAuthorityAccess).ifPresent(s -> userObjectBuilder.add("prosecutingAuthorityAccess", s)); + + final JsonArrayBuilder arrayBuilder = createArrayBuilder(); + + agentProsecutorAuthorityAccess.forEach(arrayBuilder::add); + + userObjectBuilder.add("agentProsecutorAuthorityAccess", arrayBuilder); + + final JsonObject jsonObject = userObjectBuilder.build(); + + return envelope().withPayloadFrom(jsonObject).build(); + } + private void assertLogStatement() { verify(logger).trace("Performing prosecuting authority access control for action: {}", ACTION_NAME); } diff --git a/pom.xml b/pom.xml index 2403f872..987deec8 100644 --- a/pom.xml +++ b/pom.xml @@ -43,17 +43,17 @@ 17.103.2 17.103.1 17.103.2 - 17.103.7 + 17.103.8 17.103.3-M2 ${framework.version} 8.0.5 - 17.0.37 - 17.0.219 - 17.0.144 - 17.0.129 - 17.103.124 + 17.104.50 + 17.0.269 + 17.104.173 + 17.104.180 + 17.104.136 2.3.1 8.4.0 2.15.0 diff --git a/service-components/event/event-indexer/pom.xml b/service-components/event/event-indexer/pom.xml index b038855a..c6c69ba1 100644 --- a/service-components/event/event-indexer/pom.xml +++ b/service-components/event/event-indexer/pom.xml @@ -43,6 +43,10 @@ uk.gov.justice.event-store subscription-event-interceptors + + uk.gov.justice.event-store + framework-stream-rest-resources + uk.gov.justice.event-store subscription-manager diff --git a/service-components/event/event-listener/pom.xml b/service-components/event/event-listener/pom.xml index 9d4ef270..cb0e08a4 100644 --- a/service-components/event/event-listener/pom.xml +++ b/service-components/event/event-listener/pom.xml @@ -32,6 +32,10 @@ uk.gov.justice.framework-api framework-api-event-listener-interceptors + + uk.gov.justice.event-store + framework-stream-rest-resources + uk.gov.justice.event-store subscription-manager