From e2720e12005b45f674ccefbdb154683dc28ffd4e Mon Sep 17 00:00:00 2001 From: Kai Helbig Date: Fri, 18 Oct 2024 11:15:04 +0200 Subject: [PATCH] fix differing realm support for custom context paths The original logic using a regex for parsing the realm was replaced by a more straight-forward approach. Every handler that needs realm-specific paths now gets a base url configuration injected, and the url configuration gets a convenience wrapper method to extract realm (and hostname) from the routing context based on the path parameter :realm. Signed-off-by: Kai Helbig --- .../keycloakmock/impl/UrlConfiguration.java | 8 ++++ .../impl/dagger/ServerModule.java | 3 -- .../impl/handler/AuthenticationRoute.java | 10 +++-- .../keycloakmock/impl/handler/LoginRoute.java | 8 ++-- .../impl/handler/LogoutRoute.java | 9 +++-- .../RequestUrlConfigurationHandler.java | 39 ------------------- .../keycloakmock/impl/handler/TokenRoute.java | 16 +++++--- .../impl/handler/WellKnownRoute.java | 10 +++-- .../impl/UrlConfigurationTest.java | 20 ++++++++++ .../impl/handler/AuthenticationRouteTest.java | 24 ++++++------ .../RequestUrlConfigurationHandlerTest.java | 39 ------------------- .../impl/handler/TokenRouteTest.java | 18 +++++---- .../impl/handler/WellKnownRouteTest.java | 25 +++++++----- 13 files changed, 99 insertions(+), 130 deletions(-) delete mode 100644 mock/src/main/java/com/tngtech/keycloakmock/impl/handler/RequestUrlConfigurationHandler.java delete mode 100644 mock/src/test/java/com/tngtech/keycloakmock/impl/handler/RequestUrlConfigurationHandlerTest.java diff --git a/mock/src/main/java/com/tngtech/keycloakmock/impl/UrlConfiguration.java b/mock/src/main/java/com/tngtech/keycloakmock/impl/UrlConfiguration.java index aecc9fc..0cc3c2b 100644 --- a/mock/src/main/java/com/tngtech/keycloakmock/impl/UrlConfiguration.java +++ b/mock/src/main/java/com/tngtech/keycloakmock/impl/UrlConfiguration.java @@ -1,6 +1,7 @@ package com.tngtech.keycloakmock.impl; import com.tngtech.keycloakmock.api.ServerConfig; +import io.vertx.ext.web.RoutingContext; import java.net.URI; import java.net.URISyntaxException; import java.util.Objects; @@ -60,6 +61,13 @@ public UrlConfiguration forRequestContext( return new UrlConfiguration(this, requestHost, requestRealm); } + @Nonnull + public UrlConfiguration forRequestContext(RoutingContext routingContext) { + String requestHostname = routingContext.request().getHeader("Host"); + String requestRealm = routingContext.pathParam("realm"); + return new UrlConfiguration(this, requestHostname, requestRealm); + } + @Nonnull URI getBaseUrl() { try { diff --git a/mock/src/main/java/com/tngtech/keycloakmock/impl/dagger/ServerModule.java b/mock/src/main/java/com/tngtech/keycloakmock/impl/dagger/ServerModule.java index 3de9052..a580412 100644 --- a/mock/src/main/java/com/tngtech/keycloakmock/impl/dagger/ServerModule.java +++ b/mock/src/main/java/com/tngtech/keycloakmock/impl/dagger/ServerModule.java @@ -12,7 +12,6 @@ import com.tngtech.keycloakmock.impl.handler.LogoutRoute; import com.tngtech.keycloakmock.impl.handler.OptionalBasicAuthHandler; import com.tngtech.keycloakmock.impl.handler.OutOfBandLoginRoute; -import com.tngtech.keycloakmock.impl.handler.RequestUrlConfigurationHandler; import com.tngtech.keycloakmock.impl.handler.ResourceFileHandler; import com.tngtech.keycloakmock.impl.handler.TokenRoute; import com.tngtech.keycloakmock.impl.handler.WellKnownRoute; @@ -134,7 +133,6 @@ HttpServerOptions provideHttpServerOptions( Router provideRouter( @Nonnull UrlConfiguration defaultConfiguration, @Nonnull Vertx vertx, - @Nonnull RequestUrlConfigurationHandler requestUrlConfigurationHandler, @Nonnull CommonHandler commonHandler, @Nonnull FailureHandler failureHandler, @Nonnull JwksRoute jwksRoute, @@ -154,7 +152,6 @@ Router provideRouter( Router router = Router.router(vertx); router .route() - .handler(requestUrlConfigurationHandler) .handler(commonHandler) .failureHandler(failureHandler) .failureHandler(ErrorHandler.create(vertx)); diff --git a/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/AuthenticationRoute.java b/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/AuthenticationRoute.java index f5bee15..6e0b2b0 100644 --- a/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/AuthenticationRoute.java +++ b/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/AuthenticationRoute.java @@ -1,7 +1,5 @@ package com.tngtech.keycloakmock.impl.handler; -import static com.tngtech.keycloakmock.impl.handler.RequestUrlConfigurationHandler.CTX_REQUEST_CONFIGURATION; - import com.tngtech.keycloakmock.impl.UrlConfiguration; import com.tngtech.keycloakmock.impl.helper.RedirectHelper; import com.tngtech.keycloakmock.impl.helper.UserInputSanitizer; @@ -30,12 +28,16 @@ public class AuthenticationRoute implements Handler { @Nonnull private final SessionRepository sessionRepository; @Nonnull private final RedirectHelper redirectHelper; + @Nonnull private final UrlConfiguration baseConfiguration; @Inject AuthenticationRoute( - @Nonnull SessionRepository sessionRepository, @Nonnull RedirectHelper redirectHelper) { + @Nonnull SessionRepository sessionRepository, + @Nonnull RedirectHelper redirectHelper, + @Nonnull UrlConfiguration baseConfiguration) { this.sessionRepository = sessionRepository; this.redirectHelper = redirectHelper; + this.baseConfiguration = baseConfiguration; } @Override @@ -59,7 +61,7 @@ public void handle(@Nonnull RoutingContext routingContext) { .map(s -> Arrays.asList(s.split(","))) .orElseGet(Collections::emptyList); - UrlConfiguration requestConfiguration = routingContext.get(CTX_REQUEST_CONFIGURATION); + UrlConfiguration requestConfiguration = baseConfiguration.forRequestContext(routingContext); PersistentSession session = request.toSession( diff --git a/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/LoginRoute.java b/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/LoginRoute.java index cc53b7d..a81dafa 100644 --- a/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/LoginRoute.java +++ b/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/LoginRoute.java @@ -1,6 +1,5 @@ package com.tngtech.keycloakmock.impl.handler; -import static com.tngtech.keycloakmock.impl.handler.RequestUrlConfigurationHandler.CTX_REQUEST_CONFIGURATION; import static com.tngtech.keycloakmock.impl.helper.RedirectHelper.KEYCLOAK_SESSION_COOKIE; import com.tngtech.keycloakmock.impl.UrlConfiguration; @@ -35,15 +34,18 @@ public class LoginRoute implements Handler { @Nonnull private final SessionRepository sessionRepository; @Nonnull private final RedirectHelper redirectHelper; @Nonnull private final TemplateEngine engine; + @Nonnull private final UrlConfiguration baseConfiguration; @Inject LoginRoute( @Nonnull SessionRepository sessionRepository, @Nonnull RedirectHelper redirectHelper, - @Nonnull TemplateEngine engine) { + @Nonnull TemplateEngine engine, + @Nonnull UrlConfiguration baseConfiguration) { this.sessionRepository = sessionRepository; this.redirectHelper = redirectHelper; this.engine = engine; + this.baseConfiguration = baseConfiguration; } @Override @@ -73,7 +75,7 @@ public void handle(@Nonnull RoutingContext routingContext) { .setResponseMode(routingContext.queryParams().get(RESPONSE_MODE)) .build(); - UrlConfiguration requestConfiguration = routingContext.get(CTX_REQUEST_CONFIGURATION); + UrlConfiguration requestConfiguration = baseConfiguration.forRequestContext(routingContext); if (existingSession.isPresent()) { PersistentSession oldSession = existingSession.get(); PersistentSession newSession = diff --git a/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/LogoutRoute.java b/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/LogoutRoute.java index 6fbe99d..7590ae8 100644 --- a/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/LogoutRoute.java +++ b/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/LogoutRoute.java @@ -1,6 +1,5 @@ package com.tngtech.keycloakmock.impl.handler; -import static com.tngtech.keycloakmock.impl.handler.RequestUrlConfigurationHandler.CTX_REQUEST_CONFIGURATION; import static com.tngtech.keycloakmock.impl.helper.RedirectHelper.KEYCLOAK_SESSION_COOKIE; import com.tngtech.keycloakmock.impl.UrlConfiguration; @@ -30,12 +29,16 @@ public class LogoutRoute implements Handler { @Nonnull private final SessionRepository sessionRepository; @Nonnull private final RedirectHelper redirectHelper; + @Nonnull private final UrlConfiguration baseConfiguration; @Inject LogoutRoute( - @Nonnull SessionRepository sessionRepository, @Nonnull RedirectHelper redirectHelper) { + @Nonnull SessionRepository sessionRepository, + @Nonnull RedirectHelper redirectHelper, + @Nonnull UrlConfiguration baseConfiguration) { this.sessionRepository = sessionRepository; this.redirectHelper = redirectHelper; + this.baseConfiguration = baseConfiguration; } @Override @@ -44,7 +47,7 @@ public void handle(@Nonnull RoutingContext routingContext) { if (redirectUri == null) { // for backwards compatibility: redirectUri = routingContext.queryParams().get(LEGACY_REDIRECT_URI); } - UrlConfiguration requestConfiguration = routingContext.get(CTX_REQUEST_CONFIGURATION); + UrlConfiguration requestConfiguration = baseConfiguration.forRequestContext(routingContext); invalidateSession(routingContext); routingContext .response() diff --git a/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/RequestUrlConfigurationHandler.java b/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/RequestUrlConfigurationHandler.java deleted file mode 100644 index 794bc47..0000000 --- a/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/RequestUrlConfigurationHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tngtech.keycloakmock.impl.handler; - -import com.tngtech.keycloakmock.impl.UrlConfiguration; -import io.vertx.core.Handler; -import io.vertx.ext.web.RoutingContext; -import java.util.Objects; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import javax.annotation.Nonnull; -import javax.inject.Inject; -import javax.inject.Singleton; - -@Singleton -public class RequestUrlConfigurationHandler implements Handler { - public static final String CTX_REQUEST_CONFIGURATION = "requestConfiguration"; - - private static final Pattern REALM_PATTERN = Pattern.compile("/auth/realms/([^/]*)(?:$|/.*)"); - - @Nonnull private final UrlConfiguration baseConfiguration; - - @Inject - RequestUrlConfigurationHandler(@Nonnull UrlConfiguration baseConfiguration) { - this.baseConfiguration = Objects.requireNonNull(baseConfiguration); - } - - @Override - public void handle(@Nonnull RoutingContext routingContext) { - String requestHostname = routingContext.request().getHeader("Host"); - String requestRealm = null; - Matcher matcher = REALM_PATTERN.matcher(routingContext.normalizedPath()); - if (matcher.matches()) { - requestRealm = matcher.group(1); - } - routingContext.put( - CTX_REQUEST_CONFIGURATION, - baseConfiguration.forRequestContext(requestHostname, requestRealm)); - routingContext.next(); - } -} diff --git a/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/TokenRoute.java b/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/TokenRoute.java index 869315b..c6a3524 100644 --- a/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/TokenRoute.java +++ b/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/TokenRoute.java @@ -1,7 +1,5 @@ package com.tngtech.keycloakmock.impl.handler; -import static com.tngtech.keycloakmock.impl.handler.RequestUrlConfigurationHandler.CTX_REQUEST_CONFIGURATION; - import com.tngtech.keycloakmock.impl.UrlConfiguration; import com.tngtech.keycloakmock.impl.helper.TokenHelper; import com.tngtech.keycloakmock.impl.session.AdHocSession; @@ -27,11 +25,16 @@ public class TokenRoute implements Handler { @Nonnull private final SessionRepository sessionRepository; @Nonnull private final TokenHelper tokenHelper; + @Nonnull private final UrlConfiguration baseConfiguration; @Inject - TokenRoute(@Nonnull SessionRepository sessionRepository, @Nonnull TokenHelper tokenHelper) { + TokenRoute( + @Nonnull SessionRepository sessionRepository, + @Nonnull TokenHelper tokenHelper, + @Nonnull UrlConfiguration baseConfiguration) { this.sessionRepository = sessionRepository; this.tokenHelper = tokenHelper; + this.baseConfiguration = baseConfiguration; } @Override @@ -58,7 +61,7 @@ public void handle(@Nonnull RoutingContext routingContext) { private void handleAuthorizationCodeFlow(RoutingContext routingContext) { // here again we use the equality of authorization code and session ID String sessionId = routingContext.request().getFormAttribute(CODE); - UrlConfiguration requestConfiguration = routingContext.get(CTX_REQUEST_CONFIGURATION); + UrlConfiguration requestConfiguration = baseConfiguration.forRequestContext(routingContext); String token = Optional.ofNullable(sessionRepository.getSession(sessionId)) .map(s -> tokenHelper.getToken(s, requestConfiguration)) @@ -105,7 +108,7 @@ private void handlePasswordFlow(RoutingContext routingContext) { routingContext.fail(400); return; } - UrlConfiguration requestConfiguration = routingContext.get(CTX_REQUEST_CONFIGURATION); + UrlConfiguration requestConfiguration = baseConfiguration.forRequestContext(routingContext); String password = routingContext.request().getFormAttribute("password"); Session session = @@ -142,7 +145,8 @@ private void handleClientCredentialsFlow(RoutingContext routingContext) { return; } - final UrlConfiguration requestConfiguration = routingContext.get(CTX_REQUEST_CONFIGURATION); + final UrlConfiguration requestConfiguration = + baseConfiguration.forRequestContext(routingContext); final Session session = AdHocSession.fromClientIdUsernameAndPassword( diff --git a/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/WellKnownRoute.java b/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/WellKnownRoute.java index b349a67..09b13a3 100644 --- a/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/WellKnownRoute.java +++ b/mock/src/main/java/com/tngtech/keycloakmock/impl/handler/WellKnownRoute.java @@ -1,7 +1,5 @@ package com.tngtech.keycloakmock.impl.handler; -import static com.tngtech.keycloakmock.impl.handler.RequestUrlConfigurationHandler.CTX_REQUEST_CONFIGURATION; - import com.tngtech.keycloakmock.impl.UrlConfiguration; import io.vertx.core.Handler; import io.vertx.core.json.JsonArray; @@ -16,12 +14,16 @@ @Singleton public class WellKnownRoute implements Handler { + @Nonnull private final UrlConfiguration baseConfiguration; + @Inject - WellKnownRoute() {} + WellKnownRoute(@Nonnull UrlConfiguration baseConfiguration) { + this.baseConfiguration = baseConfiguration; + } @Override public void handle(@Nonnull RoutingContext routingContext) { - UrlConfiguration requestConfiguration = routingContext.get(CTX_REQUEST_CONFIGURATION); + UrlConfiguration requestConfiguration = baseConfiguration.forRequestContext(routingContext); routingContext .response() .putHeader("content-type", "application/json") diff --git a/mock/src/test/java/com/tngtech/keycloakmock/impl/UrlConfigurationTest.java b/mock/src/test/java/com/tngtech/keycloakmock/impl/UrlConfigurationTest.java index cc78641..be002aa 100644 --- a/mock/src/test/java/com/tngtech/keycloakmock/impl/UrlConfigurationTest.java +++ b/mock/src/test/java/com/tngtech/keycloakmock/impl/UrlConfigurationTest.java @@ -2,8 +2,12 @@ import static com.tngtech.keycloakmock.api.ServerConfig.aServerConfig; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import com.tngtech.keycloakmock.api.ServerConfig; +import io.vertx.core.http.HttpServerRequest; +import io.vertx.ext.web.RoutingContext; import java.util.stream.Stream; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -118,6 +122,22 @@ void context_parameters_are_used_correctly( assertThat(urlConfiguration.getIssuer()).hasToString(expected); } + @ParameterizedTest + @MethodSource("request_host_and_realm_and_expected") + void context_parameters_are_extracted_correctly( + String requestHost, String requestRealm, String expected) { + RoutingContext routingContext = mock(); + HttpServerRequest httpServerRequest = mock(); + when(routingContext.request()).thenReturn(httpServerRequest); + when(httpServerRequest.getHeader("Host")).thenReturn(requestHost); + when(routingContext.pathParam("realm")).thenReturn(requestRealm); + + urlConfiguration = + new UrlConfiguration(aServerConfig().build()).forRequestContext(routingContext); + + assertThat(urlConfiguration.getIssuer()).hasToString(expected); + } + @ParameterizedTest @MethodSource("request_host_and_realm_and_expected_with_no_context_path") void context_parameters_are_used_correctly_for_server_config_with_no_context_path( diff --git a/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/AuthenticationRouteTest.java b/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/AuthenticationRouteTest.java index 5003fd8..bf738eb 100644 --- a/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/AuthenticationRouteTest.java +++ b/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/AuthenticationRouteTest.java @@ -1,6 +1,5 @@ package com.tngtech.keycloakmock.impl.handler; -import static com.tngtech.keycloakmock.impl.handler.RequestUrlConfigurationHandler.CTX_REQUEST_CONFIGURATION; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -46,7 +45,8 @@ class AuthenticationRouteTest { @Mock private RoutingContext routingContext; @Mock private HttpServerRequest request; @Mock private HttpServerResponse response; - @Mock private UrlConfiguration urlConfiguration; + @Mock private UrlConfiguration baseConfiguration; + @Mock private UrlConfiguration contextConfiguration; @Mock private SessionRequest sessionRequest; @Mock private PersistentSession session; @Mock private Cookie cookie; @@ -62,13 +62,14 @@ void setup() { @Test void missing_session_causes_error() { - uut = new AuthenticationRoute(sessionRepository, redirectHelper); + uut = new AuthenticationRoute(sessionRepository, redirectHelper, baseConfiguration); uut.handle(routingContext); verify(sessionRepository).getRequest(SESSION_ID); verify(routingContext).fail(404); - verifyNoMoreInteractions(urlConfiguration, sessionRepository, redirectHelper); + verifyNoMoreInteractions( + baseConfiguration, contextConfiguration, sessionRepository, redirectHelper); } @Test @@ -76,19 +77,20 @@ void missing_username_causes_error() { doReturn(sessionRequest).when(sessionRepository).getRequest(SESSION_ID); doReturn(request).when(routingContext).request(); - uut = new AuthenticationRoute(sessionRepository, redirectHelper); + uut = new AuthenticationRoute(sessionRepository, redirectHelper, baseConfiguration); uut.handle(routingContext); verify(sessionRepository).getRequest(SESSION_ID); verify(routingContext).fail(400); - verifyNoMoreInteractions(urlConfiguration, sessionRepository, redirectHelper); + verifyNoMoreInteractions( + baseConfiguration, contextConfiguration, sessionRepository, redirectHelper); } @Test void correct_token_is_created() { setupValidRequest(); - uut = new AuthenticationRoute(sessionRepository, redirectHelper); + uut = new AuthenticationRoute(sessionRepository, redirectHelper, baseConfiguration); uut.handle(routingContext); @@ -108,13 +110,13 @@ private void setupValidRequest() { doReturn(request).when(routingContext).request(); doReturn(sessionRequest).when(sessionRepository).getRequest(SESSION_ID); doReturn(session).when(sessionRequest).toSession(eq(USER), anyList()); - doReturn(urlConfiguration).when(routingContext).get(CTX_REQUEST_CONFIGURATION); - doReturn(HOSTNAME).when(urlConfiguration).getHostname(); + doReturn(contextConfiguration).when(baseConfiguration).forRequestContext(routingContext); + doReturn(HOSTNAME).when(contextConfiguration).getHostname(); doReturn(response).when(routingContext).response(); doReturn(response).when(response).addCookie(any(Cookie.class)); doReturn(response).when(response).putHeader(eq("location"), anyString()); doReturn(response).when(response).setStatusCode(anyInt()); - doReturn(cookie).when(redirectHelper).getSessionCookie(session, urlConfiguration); - doReturn(REDIRECT_URI).when(redirectHelper).getRedirectLocation(session, urlConfiguration); + doReturn(cookie).when(redirectHelper).getSessionCookie(session, contextConfiguration); + doReturn(REDIRECT_URI).when(redirectHelper).getRedirectLocation(session, contextConfiguration); } } diff --git a/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/RequestUrlConfigurationHandlerTest.java b/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/RequestUrlConfigurationHandlerTest.java deleted file mode 100644 index 67d24d7..0000000 --- a/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/RequestUrlConfigurationHandlerTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tngtech.keycloakmock.impl.handler; - -import static com.tngtech.keycloakmock.impl.handler.RequestUrlConfigurationHandler.CTX_REQUEST_CONFIGURATION; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.verify; - -import com.tngtech.keycloakmock.impl.UrlConfiguration; -import io.vertx.core.http.HttpServerRequest; -import io.vertx.ext.web.RoutingContext; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -@ExtendWith(MockitoExtension.class) -class RequestUrlConfigurationHandlerTest { - private static final String REQUEST_HOST = "requestHost"; - private static final String REQUEST_REALM = "requestRealm"; - - @Mock private RoutingContext routingContext; - @Mock private HttpServerRequest httpServerRequest; - @Mock private UrlConfiguration baseConfiguration; - @Mock private UrlConfiguration requestConfiguration; - - @Test - void request_configuration_is_added_correctly() { - doReturn(REQUEST_HOST).when(httpServerRequest).getHeader("Host"); - doReturn(httpServerRequest).when(routingContext).request(); - doReturn("/auth/realms/" + REQUEST_REALM).when(routingContext).normalizedPath(); - doReturn(requestConfiguration) - .when(baseConfiguration) - .forRequestContext(REQUEST_HOST, REQUEST_REALM); - RequestUrlConfigurationHandler uut = new RequestUrlConfigurationHandler(baseConfiguration); - - uut.handle(routingContext); - - verify(routingContext).put(CTX_REQUEST_CONFIGURATION, requestConfiguration); - } -} diff --git a/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/TokenRouteTest.java b/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/TokenRouteTest.java index 049fe0d..23fff18 100644 --- a/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/TokenRouteTest.java +++ b/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/TokenRouteTest.java @@ -4,6 +4,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; +import com.tngtech.keycloakmock.impl.UrlConfiguration; import com.tngtech.keycloakmock.impl.helper.TokenHelper; import com.tngtech.keycloakmock.impl.session.SessionRepository; import io.vertx.core.http.HttpServerRequest; @@ -28,6 +29,7 @@ class TokenRouteTest { @Mock private RoutingContext routingContext; @Mock private HttpServerRequest request; + @Mock private UrlConfiguration baseConfiguration; private TokenRoute uut; @@ -36,7 +38,7 @@ void missing_grant_type_causes_error() { doReturn(request).when(routingContext).request(); doReturn(null).when(request).getFormAttribute("grant_type"); - uut = new TokenRoute(sessionRepository, tokenHelper); + uut = new TokenRoute(sessionRepository, tokenHelper, baseConfiguration); uut.handle(routingContext); @@ -50,7 +52,7 @@ void missing_authorization_code_causes_error_for_type_authorization_code() { doReturn(AUTH_CODE_GRANT_TYPE).when(request).getFormAttribute("grant_type"); doReturn(null).when(request).getFormAttribute("code"); - uut = new TokenRoute(sessionRepository, tokenHelper); + uut = new TokenRoute(sessionRepository, tokenHelper, baseConfiguration); uut.handle(routingContext); @@ -65,7 +67,7 @@ void unknown_authorization_code_causes_error_for_type_authorization_code() { doReturn(UNKNOWN_SESSION).when(request).getFormAttribute("code"); doReturn(null).when(sessionRepository).getSession(UNKNOWN_SESSION); - uut = new TokenRoute(sessionRepository, tokenHelper); + uut = new TokenRoute(sessionRepository, tokenHelper, baseConfiguration); uut.handle(routingContext); @@ -79,7 +81,7 @@ void missing_token_causes_error_for_type_refresh_token() { doReturn(REFRESH_TOKEN_GRANT_TYPE).when(request).getFormAttribute("grant_type"); doReturn(null).when(request).getFormAttribute("refresh_token"); - uut = new TokenRoute(sessionRepository, tokenHelper); + uut = new TokenRoute(sessionRepository, tokenHelper, baseConfiguration); uut.handle(routingContext); @@ -93,7 +95,7 @@ void missing_client_id_causes_error_for_type_password() { doReturn(PASSWORD_GRANT_TYPE).when(request).getFormAttribute("grant_type"); doReturn(null).when(request).getFormAttribute("client_id"); - uut = new TokenRoute(sessionRepository, tokenHelper); + uut = new TokenRoute(sessionRepository, tokenHelper, baseConfiguration); uut.handle(routingContext); @@ -108,7 +110,7 @@ void missing_username_causes_error_for_type_password() { doReturn("myclient").when(request).getFormAttribute("client_id"); doReturn(null).when(request).getFormAttribute("username"); - uut = new TokenRoute(sessionRepository, tokenHelper); + uut = new TokenRoute(sessionRepository, tokenHelper, baseConfiguration); uut.handle(routingContext); @@ -122,7 +124,7 @@ void missing_basic_authorization_token_causes_error_for_type_client_credentials( doReturn(CLIENT_CREDENTIALS_GRANT_TYPE).when(request).getFormAttribute("grant_type"); doReturn(null).when(routingContext).user(); - uut = new TokenRoute(sessionRepository, tokenHelper); + uut = new TokenRoute(sessionRepository, tokenHelper, baseConfiguration); uut.handle(routingContext); @@ -137,7 +139,7 @@ void missing_clientId_in_basic_authorization_token_causes_error_for_type_client_ final User user = User.fromName(""); doReturn(user).when(routingContext).user(); - uut = new TokenRoute(sessionRepository, tokenHelper); + uut = new TokenRoute(sessionRepository, tokenHelper, baseConfiguration); uut.handle(routingContext); diff --git a/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/WellKnownRouteTest.java b/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/WellKnownRouteTest.java index ce887df..99bdffd 100644 --- a/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/WellKnownRouteTest.java +++ b/mock/src/test/java/com/tngtech/keycloakmock/impl/handler/WellKnownRouteTest.java @@ -1,6 +1,5 @@ package com.tngtech.keycloakmock.impl.handler; -import static com.tngtech.keycloakmock.impl.handler.RequestUrlConfigurationHandler.CTX_REQUEST_CONFIGURATION; import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; @@ -11,9 +10,9 @@ import java.net.URISyntaxException; import java.util.Arrays; import java.util.Collections; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -25,18 +24,24 @@ class WellKnownRouteTest extends HandlerTestBase { private static final String JWKS_URI = "jwksUri"; private static final String TOKEN_ENDPOINT = "tokenEndpoint"; - @Mock private UrlConfiguration urlConfiguration; + @Mock private UrlConfiguration baseConfiguration; + @Mock private UrlConfiguration contextConfiguration; - @InjectMocks private WellKnownRoute wellKnownRoute; + private WellKnownRoute wellKnownRoute; + + @BeforeEach + void setup() { + wellKnownRoute = new WellKnownRoute(baseConfiguration); + } @Test void well_known_configuration_is_complete() throws URISyntaxException { - doReturn(urlConfiguration).when(routingContext).get(CTX_REQUEST_CONFIGURATION); - doReturn(new URI(ISSUER)).when(urlConfiguration).getIssuer(); - doReturn(new URI(AUTHORIZATION_ENDPOINT)).when(urlConfiguration).getAuthorizationEndpoint(); - doReturn(new URI(END_SESSION_ENDPOINT)).when(urlConfiguration).getEndSessionEndpoint(); - doReturn(new URI(JWKS_URI)).when(urlConfiguration).getJwksUri(); - doReturn(new URI(TOKEN_ENDPOINT)).when(urlConfiguration).getTokenEndpoint(); + doReturn(contextConfiguration).when(baseConfiguration).forRequestContext(routingContext); + doReturn(new URI(ISSUER)).when(contextConfiguration).getIssuer(); + doReturn(new URI(AUTHORIZATION_ENDPOINT)).when(contextConfiguration).getAuthorizationEndpoint(); + doReturn(new URI(END_SESSION_ENDPOINT)).when(contextConfiguration).getEndSessionEndpoint(); + doReturn(new URI(JWKS_URI)).when(contextConfiguration).getJwksUri(); + doReturn(new URI(TOKEN_ENDPOINT)).when(contextConfiguration).getTokenEndpoint(); wellKnownRoute.handle(routingContext);