This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 67f879c5975843f4c0ed30775d3b02fee3162aed Author: Felix Auringer <[email protected]> AuthorDate: Mon Jan 5 13:45:24 2026 +0100 refactor(managesieve): rebase on new oidc token validation --- .../org/apache/james/managesieve/api/Session.java | 2 +- .../core/OAUTHAuthenticationProcessor.java | 38 ++------------------ .../james/managesieve/util/SettableSession.java | 2 +- .../org/apache/james/jwt/OidcJwtTokenVerifier.java | 2 +- .../apache/james/jwt/OidcSASLConfiguration.java | 7 ++-- .../org/apache/james/jwt/OidcTokenFixture.java | 1 + .../netty/ManageSieveChannelUpstreamHandler.java | 2 +- .../managesieveserver/netty/ManageSieveServer.java | 2 +- .../james/managesieveserver/ManageSieveClient.java | 4 +-- .../apache/james/managesieveserver/OIDCTest.java | 42 ++++++++++++++++++---- .../src/test/resources/managesieveserver-oidc.xml | 4 +++ 11 files changed, 51 insertions(+), 55 deletions(-) diff --git a/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java b/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java index ca5ed2b2fa..9f1a058f19 100644 --- a/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java +++ b/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java @@ -23,8 +23,8 @@ package org.apache.james.managesieve.api; import java.util.Optional; import org.apache.james.core.Username; +import org.apache.james.jwt.OidcSASLConfiguration; import org.apache.james.managesieve.api.commands.Authenticate; -import org.apache.james.protocols.api.OidcSASLConfiguration; public interface Session { diff --git a/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/OAUTHAuthenticationProcessor.java b/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/OAUTHAuthenticationProcessor.java index ba925141a8..ebdfe25c33 100644 --- a/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/OAUTHAuthenticationProcessor.java +++ b/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/OAUTHAuthenticationProcessor.java @@ -24,16 +24,13 @@ import java.util.Optional; import org.apache.james.core.Username; import org.apache.james.jwt.OidcJwtTokenVerifier; -import org.apache.james.jwt.introspection.IntrospectionEndpoint; +import org.apache.james.jwt.OidcSASLConfiguration; import org.apache.james.managesieve.api.AuthenticationException; import org.apache.james.managesieve.api.AuthenticationProcessor; import org.apache.james.managesieve.api.Session; import org.apache.james.managesieve.api.SyntaxException; import org.apache.james.protocols.api.OIDCSASLParser; import org.apache.james.protocols.api.OIDCSASLParser.OIDCInitialResponse; -import org.apache.james.protocols.api.OidcSASLConfiguration; - -import reactor.core.publisher.Mono; public class OAUTHAuthenticationProcessor implements AuthenticationProcessor { @@ -58,7 +55,7 @@ public class OAUTHAuthenticationProcessor implements AuthenticationProcessor { Optional<Username> authenticatedUserResult = Optional.empty(); try { - authenticatedUserResult = validateToken(oidcInitialResponse.getToken()); + authenticatedUserResult = new OidcJwtTokenVerifier(this.oidcConfiguration).validateToken(oidcInitialResponse.getToken()); } catch (Exception e) { throw new AuthenticationException("Could not validate the JWT"); } @@ -75,35 +72,4 @@ public class OAUTHAuthenticationProcessor implements AuthenticationProcessor { return authenticatedUser; } - - private Optional<Username> validateToken(String token) { - if (this.oidcConfiguration.isCheckTokenByIntrospectionEndpoint()) { - return validTokenWithIntrospection(token); - } else if (this.oidcConfiguration.isCheckTokenByUserinfoEndpoint()) { - return validTokenWithUserInfo(token); - } else { - return OidcJwtTokenVerifier.verifySignatureAndExtractClaim(token, this.oidcConfiguration.getJwksURL(), this.oidcConfiguration.getClaim()) - .map(Username::of); - } - } - - private Optional<Username> validTokenWithUserInfo(String token) { - return Mono.from(OidcJwtTokenVerifier.verifyWithUserinfo(token, - this.oidcConfiguration.getJwksURL(), - this.oidcConfiguration.getClaim(), - this.oidcConfiguration.getUserInfoEndpoint().orElseThrow())) - .blockOptional() - .map(Username::of); - } - - private Optional<Username> validTokenWithIntrospection(String token) { - return Mono.from(OidcJwtTokenVerifier.verifyWithIntrospection(token, - this.oidcConfiguration.getJwksURL(), - this.oidcConfiguration.getClaim(), - this.oidcConfiguration.getIntrospectionEndpoint() - .map(endpoint -> new IntrospectionEndpoint(endpoint, this.oidcConfiguration.getIntrospectionEndpointAuthorization())) - .orElseThrow())) - .blockOptional() - .map(Username::of); - } } diff --git a/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java b/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java index f689ffcc2e..204a39e688 100644 --- a/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java +++ b/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java @@ -23,9 +23,9 @@ package org.apache.james.managesieve.util; import java.util.Optional; import org.apache.james.core.Username; +import org.apache.james.jwt.OidcSASLConfiguration; import org.apache.james.managesieve.api.Session; import org.apache.james.managesieve.api.commands.Authenticate; -import org.apache.james.protocols.api.OidcSASLConfiguration; public class SettableSession implements Session { diff --git a/server/protocols/jwt/src/main/java/org/apache/james/jwt/OidcJwtTokenVerifier.java b/server/protocols/jwt/src/main/java/org/apache/james/jwt/OidcJwtTokenVerifier.java index 7f87132bb7..28af294b64 100644 --- a/server/protocols/jwt/src/main/java/org/apache/james/jwt/OidcJwtTokenVerifier.java +++ b/server/protocols/jwt/src/main/java/org/apache/james/jwt/OidcJwtTokenVerifier.java @@ -104,7 +104,7 @@ public class OidcJwtTokenVerifier { } @VisibleForTesting - Publisher<String> verifyWithUserinfo(String jwtToken, URL userinfoEndpoint) { + Publisher<String> verifyWithUserinfo(String jwtToken, URL userinfoEndpoint) { return Mono.fromCallable(() -> verifySignatureAndExtractClaim(jwtToken)) .flatMap(optional -> optional.map(Mono::just).orElseGet(Mono::empty)) .flatMap(claimResult -> Mono.from(CHECK_TOKEN_CLIENT.userInfo(userinfoEndpoint, jwtToken)) diff --git a/server/protocols/jwt/src/main/java/org/apache/james/jwt/OidcSASLConfiguration.java b/server/protocols/jwt/src/main/java/org/apache/james/jwt/OidcSASLConfiguration.java index cb59ef1811..0fbc52f46e 100644 --- a/server/protocols/jwt/src/main/java/org/apache/james/jwt/OidcSASLConfiguration.java +++ b/server/protocols/jwt/src/main/java/org/apache/james/jwt/OidcSASLConfiguration.java @@ -37,9 +37,6 @@ import com.google.common.base.Preconditions; public class OidcSASLConfiguration { private static final Logger LOGGER = LoggerFactory.getLogger(OidcSASLConfiguration.class); - private static final boolean FORCE_INTROSPECT = Boolean.parseBoolean(System.getProperty("james.sasl.oidc.force.introspect", "true")); - private static final boolean VALIDATE_AUD = Boolean.parseBoolean(System.getProperty("james.sasl.oidc.validate.aud", "true")); - @VisibleForTesting static Builder builder() { return new Builder(); @@ -140,7 +137,7 @@ public class OidcSASLConfiguration { String aud = configuration.getString("aud", null); if (introspectionUrl == null) { - if (FORCE_INTROSPECT) { + if (Boolean.parseBoolean(System.getProperty("james.sasl.oidc.force.introspect", "true"))) { throw new IllegalArgumentException("'introspection.url' is mandatory for secure set up. Disable this check with -Djames.sasl.oidc.force.introspect=false."); } else { LOGGER.warn("'introspection.url' is mandatory for secure set up. This check was disabled with -Djames.sasl.oidc.force.introspect=false."); @@ -148,7 +145,7 @@ public class OidcSASLConfiguration { } if (aud == null) { - if (VALIDATE_AUD) { + if (Boolean.parseBoolean(System.getProperty("james.sasl.oidc.validate.aud", "true"))) { throw new IllegalArgumentException("'aud' is mandatory for secure set up. Disable this check with -Djames.sasl.oidc.validate.aud=false."); } else { LOGGER.warn("'aud' is mandatory for secure set up. This check was disabled with -Djames.sasl.oidc.validate.aud=false."); diff --git a/server/protocols/jwt/src/test/java/org/apache/james/jwt/OidcTokenFixture.java b/server/protocols/jwt/src/test/java/org/apache/james/jwt/OidcTokenFixture.java index dcf09137ba..26b1d186e0 100644 --- a/server/protocols/jwt/src/test/java/org/apache/james/jwt/OidcTokenFixture.java +++ b/server/protocols/jwt/src/test/java/org/apache/james/jwt/OidcTokenFixture.java @@ -108,6 +108,7 @@ public class OidcTokenFixture { public static final String CLAIM = "email_address"; public static final String USER_EMAIL_ADDRESS = "[email protected]"; + public static final String AUDIENCE = "account"; public static final String VALID_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Inc4MFBzNUlhc24tYUdXbXcyVHJ4RGlOY2FocEgyc1h6NXBxZGhBbDlIWGMifQ.eyJleHAiOjM5Mzk1MDYxNjcsImlhdCI6MTYzOTUwNTg2NywiYXV0aF90aW1lIjozNjM5NTA1ODQxLCJqdGkiOiJjMjQ5ZTBkNi1jY2JiLTRmZDAtODI5Yi04OTM1MjczN2YzZGIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvcmVhbG0xIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6IjIwNDUyNzFiLWMxYmItNDJiOC1hMTkwLThlYWI1MmYzYmEwOSIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFjY291bnQtY29uc29sZSIsIm5 [...] public static final String VALID_TOKEN_HAS_NOT_KID = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjM5Mzk1MDYxNjcsImlhdCI6MTYzOTUwNTg2NywiYXV0aF90aW1lIjozNjM5NTA1ODQxLCJqdGkiOiJjMjQ5ZTBkNi1jY2JiLTRmZDAtODI5Yi04OTM1MjczN2YzZGIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvcmVhbG0xIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6IjIwNDUyNzFiLWMxYmItNDJiOC1hMTkwLThlYWI1MmYzYmEwOSIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFjY291bnQtY29uc29sZSIsIm5vbmNlIjoiNWUyOGJjNTAtODE5NS00NjM3LThmMWEtYWUzNWFlYTk0NTc1I [...] public static final String VALID_TOKEN_HAS_NOT_FOUND_KID = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Im5vdEZvdW5kIn0.eyJleHAiOjM5Mzk1MDYxNjcsImlhdCI6MTYzOTUwNTg2NywiYXV0aF90aW1lIjozNjM5NTA1ODQxLCJqdGkiOiJjMjQ5ZTBkNi1jY2JiLTRmZDAtODI5Yi04OTM1MjczN2YzZGIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvcmVhbG0xIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6IjIwNDUyNzFiLWMxYmItNDJiOC1hMTkwLThlYWI1MmYzYmEwOSIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFjY291bnQtY29uc29sZSIsIm5vbmNlIjoiNWUyOGJjNTAtODE5NS00 [...] diff --git a/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java b/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java index 0e6454ad80..134d1b375c 100644 --- a/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java +++ b/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java @@ -23,12 +23,12 @@ import java.io.Closeable; import java.net.InetSocketAddress; import java.util.Optional; +import org.apache.james.jwt.OidcSASLConfiguration; import org.apache.james.managesieve.api.Session; import org.apache.james.managesieve.api.SessionTerminatedException; import org.apache.james.managesieve.transcode.ManageSieveProcessor; import org.apache.james.managesieve.transcode.NotEnoughDataException; import org.apache.james.managesieve.util.SettableSession; -import org.apache.james.protocols.api.OidcSASLConfiguration; import org.apache.james.protocols.api.ProxyInformation; import org.apache.james.protocols.netty.Encryption; import org.slf4j.Logger; diff --git a/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java b/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java index 3c52a0f6c7..7e1f55af7c 100644 --- a/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java +++ b/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java @@ -26,8 +26,8 @@ import java.util.Optional; import org.apache.commons.configuration2.HierarchicalConfiguration; import org.apache.commons.configuration2.ex.ConfigurationException; import org.apache.commons.configuration2.tree.ImmutableNode; +import org.apache.james.jwt.OidcSASLConfiguration; import org.apache.james.managesieve.transcode.ManageSieveProcessor; -import org.apache.james.protocols.api.OidcSASLConfiguration; import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer; import org.apache.james.protocols.netty.AbstractChannelPipelineFactory; import org.apache.james.protocols.netty.AllButStartTlsLineChannelHandlerFactory; diff --git a/server/protocols/protocols-managesieve/src/test/java/org/apache/james/managesieveserver/ManageSieveClient.java b/server/protocols/protocols-managesieve/src/test/java/org/apache/james/managesieveserver/ManageSieveClient.java index c4f042b7ba..0f1e7cb9e1 100644 --- a/server/protocols/protocols-managesieve/src/test/java/org/apache/james/managesieveserver/ManageSieveClient.java +++ b/server/protocols/protocols-managesieve/src/test/java/org/apache/james/managesieveserver/ManageSieveClient.java @@ -92,8 +92,8 @@ public class ManageSieveClient extends SocketClient { response = new ServerResponse(responseType, responseCode, explanation, lines); } else if (tokens[0].equals("+")) { - Optional explanation = Optional.of(tokens[1].substring(1, tokens[1].length() - 1)); - response = new ServerResponse(ResponseType.CONTINUATION, Optional.empty(), explanation, new ArrayList()); + Optional<String> explanation = Optional.of(tokens[1].substring(1, tokens[1].length() - 1)); + response = new ServerResponse(ResponseType.CONTINUATION, Optional.empty(), explanation, new ArrayList<String>()); } else { lines.addLast(line); } diff --git a/server/protocols/protocols-managesieve/src/test/java/org/apache/james/managesieveserver/OIDCTest.java b/server/protocols/protocols-managesieve/src/test/java/org/apache/james/managesieveserver/OIDCTest.java index 87ca3dbffe..fd2cb0b282 100644 --- a/server/protocols/protocols-managesieve/src/test/java/org/apache/james/managesieveserver/OIDCTest.java +++ b/server/protocols/protocols-managesieve/src/test/java/org/apache/james/managesieveserver/OIDCTest.java @@ -30,6 +30,7 @@ import org.apache.james.util.ClassLoaderUtils; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -85,6 +86,12 @@ public class OIDCTest { this.configuration.addProperty("oidc.scope", SCOPE); } + @BeforeAll + void initialSetup() { + System.setProperty("james.sasl.oidc.force.introspect", "false"); + System.setProperty("james.sasl.oidc.validate.aud", "false"); + } + @BeforeEach void setUp() throws Exception { this.testSystem.setUp(this.configuration); @@ -99,8 +106,10 @@ public class OIDCTest { } @AfterAll - void finalTearDown() { + void finalTeardown() { this.authServer.stop(); + System.clearProperty("james.sasl.oidc.force.introspect"); + System.clearProperty("james.sasl.oidc.validate.aud"); } @Test @@ -204,7 +213,7 @@ public class OIDCTest { .when(HttpRequest.request().withPath(INTROSPECTION_URI_PATH)) .respond(HttpResponse.response().withStatusCode(200) .withHeader("Content-Type", "application/json") - .withBody(String.format("{\"active\": true, \"%s\": \"%s\"}", OidcTokenFixture.CLAIM, OidcTokenFixture.USER_EMAIL_ADDRESS), StandardCharsets.UTF_8)); + .withBody(String.format("{\"active\": true, \"%s\": \"%s\", \"aud\": \"%s\"}", OidcTokenFixture.CLAIM, OidcTokenFixture.USER_EMAIL_ADDRESS, OidcTokenFixture.AUDIENCE), StandardCharsets.UTF_8)); this.authServer .when(HttpRequest.request().withPath(JWKS_URI_PATH)) .respond(HttpResponse.response().withStatusCode(200) @@ -216,6 +225,7 @@ public class OIDCTest { configuration.addProperty("oidc.oidcConfigurationURL", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), DISCOVERY_URI_PATH)); configuration.addProperty("oidc.scope", SCOPE); configuration.addProperty("oidc.introspection.url", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), INTROSPECTION_URI_PATH)); + configuration.addProperty("oidc.aud", OidcTokenFixture.AUDIENCE); testSystem.setUp(configuration); ManageSieveClient client = new ManageSieveClient(); @@ -234,7 +244,7 @@ public class OIDCTest { .when(HttpRequest.request().withPath(INTROSPECTION_URI_PATH)) .respond(HttpResponse.response().withStatusCode(200) .withHeader("Content-Type", "application/json") - .withBody(String.format("{\"active\": false, \"%s\": \"%s\"}", OidcTokenFixture.CLAIM, OidcTokenFixture.USER_EMAIL_ADDRESS), StandardCharsets.UTF_8)); + .withBody(String.format("{\"active\": false, \"%s\": \"%s\", \"aud\": \"%s\"}", OidcTokenFixture.CLAIM, OidcTokenFixture.USER_EMAIL_ADDRESS, OidcTokenFixture.AUDIENCE), StandardCharsets.UTF_8)); this.authServer .when(HttpRequest.request().withPath(JWKS_URI_PATH)) .respond(HttpResponse.response().withStatusCode(200) @@ -246,6 +256,7 @@ public class OIDCTest { configuration.addProperty("oidc.oidcConfigurationURL", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), DISCOVERY_URI_PATH)); configuration.addProperty("oidc.scope", SCOPE); configuration.addProperty("oidc.introspection.url", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), INTROSPECTION_URI_PATH)); + configuration.addProperty("oidc.aud", OidcTokenFixture.AUDIENCE); testSystem.setUp(configuration); ManageSieveClient client = new ManageSieveClient(); @@ -264,7 +275,7 @@ public class OIDCTest { .when(HttpRequest.request().withPath(INTROSPECTION_URI_PATH)) .respond(HttpResponse.response().withStatusCode(200) .withHeader("Content-Type", "application/json") - .withBody(String.format("{\"active\": true, \"%s\": \"%s-wrong\"}", OidcTokenFixture.CLAIM, OidcTokenFixture.USER_EMAIL_ADDRESS), StandardCharsets.UTF_8)); + .withBody(String.format("{\"active\": true, \"%s\": \"%s-wrong\", \"aud\": \"%s\"}", OidcTokenFixture.CLAIM, OidcTokenFixture.USER_EMAIL_ADDRESS, OidcTokenFixture.AUDIENCE), StandardCharsets.UTF_8)); this.authServer .when(HttpRequest.request().withPath(JWKS_URI_PATH)) .respond(HttpResponse.response().withStatusCode(200) @@ -276,6 +287,7 @@ public class OIDCTest { configuration.addProperty("oidc.oidcConfigurationURL", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), DISCOVERY_URI_PATH)); configuration.addProperty("oidc.scope", SCOPE); configuration.addProperty("oidc.introspection.url", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), INTROSPECTION_URI_PATH)); + configuration.addProperty("oidc.aud", OidcTokenFixture.AUDIENCE); testSystem.setUp(configuration); ManageSieveClient client = new ManageSieveClient(); @@ -294,7 +306,7 @@ public class OIDCTest { .when(HttpRequest.request().withPath(INTROSPECTION_URI_PATH)) .respond(HttpResponse.response().withStatusCode(200) .withHeader("Content-Type", "application/json") - .withBody(String.format("{\"%s\": \"%s\"}", OidcTokenFixture.CLAIM, OidcTokenFixture.USER_EMAIL_ADDRESS), StandardCharsets.UTF_8)); + .withBody(String.format("{\"%s\": \"%s\", \"aud\": \"%s\"}", OidcTokenFixture.CLAIM, OidcTokenFixture.USER_EMAIL_ADDRESS, OidcTokenFixture.AUDIENCE), StandardCharsets.UTF_8)); this.authServer .when(HttpRequest.request().withPath(JWKS_URI_PATH)) .respond(HttpResponse.response().withStatusCode(200) @@ -306,6 +318,7 @@ public class OIDCTest { configuration.addProperty("oidc.oidcConfigurationURL", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), DISCOVERY_URI_PATH)); configuration.addProperty("oidc.scope", SCOPE); configuration.addProperty("oidc.introspection.url", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), INTROSPECTION_URI_PATH)); + configuration.addProperty("oidc.aud", OidcTokenFixture.AUDIENCE); testSystem.setUp(configuration); ManageSieveClient client = new ManageSieveClient(); @@ -324,7 +337,7 @@ public class OIDCTest { .when(HttpRequest.request().withPath(INTROSPECTION_URI_PATH)) .respond(HttpResponse.response().withStatusCode(200) .withHeader("Content-Type", "application/json") - .withBody("{\"active\": true}", StandardCharsets.UTF_8)); + .withBody(String.format("{\"active\": true, \"aud\": \"%s\"}", OidcTokenFixture.AUDIENCE), StandardCharsets.UTF_8)); this.authServer .when(HttpRequest.request().withPath(JWKS_URI_PATH)) .respond(HttpResponse.response().withStatusCode(200) @@ -336,6 +349,7 @@ public class OIDCTest { configuration.addProperty("oidc.oidcConfigurationURL", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), DISCOVERY_URI_PATH)); configuration.addProperty("oidc.scope", SCOPE); configuration.addProperty("oidc.introspection.url", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), INTROSPECTION_URI_PATH)); + configuration.addProperty("oidc.aud", OidcTokenFixture.AUDIENCE); testSystem.setUp(configuration); ManageSieveClient client = new ManageSieveClient(); @@ -364,6 +378,7 @@ public class OIDCTest { configuration.addProperty("oidc.oidcConfigurationURL", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), DISCOVERY_URI_PATH)); configuration.addProperty("oidc.scope", SCOPE); configuration.addProperty("oidc.introspection.url", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), INTROSPECTION_URI_PATH)); + configuration.addProperty("oidc.aud", OidcTokenFixture.AUDIENCE); testSystem.setUp(configuration); ManageSieveClient client = new ManageSieveClient(); @@ -382,7 +397,7 @@ public class OIDCTest { .when(HttpRequest.request().withPath(INTROSPECTION_URI_PATH)) .respond(HttpResponse.response().withStatusCode(200) .withHeader("Content-Type", "application/json") - .withBody(String.format("{\"active\": true, \"%s\": \"%s\"}", OidcTokenFixture.CLAIM, OidcTokenFixture.USER_EMAIL_ADDRESS), StandardCharsets.UTF_8)); + .withBody(String.format("{\"active\": true, \"%s\": \"%s\", \"aud\": \"%s\"}", OidcTokenFixture.CLAIM, OidcTokenFixture.USER_EMAIL_ADDRESS, OidcTokenFixture.AUDIENCE), StandardCharsets.UTF_8)); this.authServer .when(HttpRequest.request().withPath(JWKS_URI_PATH)) .respond(HttpResponse.response().withStatusCode(500)); @@ -392,6 +407,7 @@ public class OIDCTest { configuration.addProperty("oidc.oidcConfigurationURL", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), DISCOVERY_URI_PATH)); configuration.addProperty("oidc.scope", SCOPE); configuration.addProperty("oidc.introspection.url", String.format("http://127.0.0.1:%s%s", this.authServer.getLocalPort(), INTROSPECTION_URI_PATH)); + configuration.addProperty("oidc.aud", OidcTokenFixture.AUDIENCE); testSystem.setUp(configuration); ManageSieveClient client = new ManageSieveClient(); @@ -413,12 +429,24 @@ public class OIDCTest { this.testSystem = new ManageSieveServerTestSystem(); } + @BeforeAll + static void initialSetup() { + System.setProperty("james.sasl.oidc.force.introspect", "false"); + System.setProperty("james.sasl.oidc.validate.aud", "false"); + } + @AfterEach void tearDown() { this.testSystem.manageSieveServer.destroy(); this.authServer.stop(); } + @AfterAll + static void finalTeardown() { + System.clearProperty("james.sasl.oidc.force.introspect"); + System.clearProperty("james.sasl.oidc.validate.aud"); + } + @Test void oauthbearerShouldSucceedWhenUserinfoClaimMatches() throws Exception { this.authServer = ClientAndServer.startClientAndServer(0); diff --git a/server/protocols/protocols-managesieve/src/test/resources/managesieveserver-oidc.xml b/server/protocols/protocols-managesieve/src/test/resources/managesieveserver-oidc.xml index 9125d16891..9ed26d0140 100644 --- a/server/protocols/protocols-managesieve/src/test/resources/managesieveserver-oidc.xml +++ b/server/protocols/protocols-managesieve/src/test/resources/managesieveserver-oidc.xml @@ -12,5 +12,9 @@ <claim>sub</claim> <oidcConfigurationURL>https://127.0.0.1/realms/test/.well-known/openid-configuration</oidcConfigurationURL> <scope>email</scope> + <introspection> + <url>https://127.0.0.1/oidc/introspect</url> + </introspection> + <aud>james</aud> </oidc> </managesieveserver> --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
