From 24a4235bf86e31904f76d5012a3ac2b1c33541df Mon Sep 17 00:00:00 2001 From: Dusan Jakub Date: Mon, 18 Sep 2023 19:04:56 +0200 Subject: [PATCH] DAG authorization pending - test mistakenly accepting HTML instead of JSON --- .../ysoft/geecon/error/ExceptionMappers.java | 27 +++++++ .../ysoft/geecon/error/OAuthException.java | 24 +++++- .../templates/ExceptionMappers/error.html | 76 +++++++++++++++++++ .../com/ysoft/geecon/DeviceAuthGrantTest.java | 2 +- .../helpers/DeviceAuthorizationGrantFlow.java | 15 ++++ 5 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/ysoft/geecon/error/ExceptionMappers.java create mode 100644 src/main/resources/templates/ExceptionMappers/error.html diff --git a/src/main/java/com/ysoft/geecon/error/ExceptionMappers.java b/src/main/java/com/ysoft/geecon/error/ExceptionMappers.java new file mode 100644 index 0000000..91e6b68 --- /dev/null +++ b/src/main/java/com/ysoft/geecon/error/ExceptionMappers.java @@ -0,0 +1,27 @@ +package com.ysoft.geecon.error; + +import io.quarkus.qute.CheckedTemplate; +import io.quarkus.qute.TemplateInstance; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.jboss.resteasy.reactive.server.ServerExceptionMapper; + +class ExceptionMappers { + @ServerExceptionMapper + @Produces(MediaType.APPLICATION_JSON) + public Response mapJson(OAuthException exception) { + return Response.status(Response.Status.BAD_REQUEST).entity(exception.getResponse()).build(); + } + + @ServerExceptionMapper + @Produces(MediaType.APPLICATION_JSON) + public Response mapHtml(OAuthException exception) { + return Response.status(Response.Status.BAD_REQUEST).entity(Templates.error(exception.getResponse())).build(); + } + + @CheckedTemplate + public static class Templates { + public static native TemplateInstance error(OAuthException.ErrorResponse response); + } +} \ No newline at end of file diff --git a/src/main/java/com/ysoft/geecon/error/OAuthException.java b/src/main/java/com/ysoft/geecon/error/OAuthException.java index 7e5779d..ed511a3 100644 --- a/src/main/java/com/ysoft/geecon/error/OAuthException.java +++ b/src/main/java/com/ysoft/geecon/error/OAuthException.java @@ -1,8 +1,30 @@ package com.ysoft.geecon.error; +import com.fasterxml.jackson.annotation.JsonProperty; + public class OAuthException extends RuntimeException { + private final ErrorResponse response; + // https://www.ietf.org/archive/id/draft-ietf-oauth-v2-1-09.html#name-error-response-2 + public OAuthException(ErrorResponse response) { + super("OAuth error: " + response.error() + " " + response.description()); + this.response = response; + } + + public OAuthException(String error, String description) { + this(new ErrorResponse(error, description)); + } + + @Deprecated public OAuthException(String message) { - super(message); + this(message, message); + } + + public ErrorResponse getResponse() { + return response; + } + + public record ErrorResponse(@JsonProperty("error") String error, + @JsonProperty("error_description") String description) { } } diff --git a/src/main/resources/templates/ExceptionMappers/error.html b/src/main/resources/templates/ExceptionMappers/error.html new file mode 100644 index 0000000..6d4494e --- /dev/null +++ b/src/main/resources/templates/ExceptionMappers/error.html @@ -0,0 +1,76 @@ + + + + + + Login Page + + + +
+

Error

+
{response.error}
+
+ + diff --git a/src/test/java/com/ysoft/geecon/DeviceAuthGrantTest.java b/src/test/java/com/ysoft/geecon/DeviceAuthGrantTest.java index 88cb1fe..38b8094 100644 --- a/src/test/java/com/ysoft/geecon/DeviceAuthGrantTest.java +++ b/src/test/java/com/ysoft/geecon/DeviceAuthGrantTest.java @@ -71,6 +71,6 @@ public class DeviceAuthGrantTest { public void deviceAuthGrant_authorizationPending() throws IOException { DeviceAuthorizationGrantFlow flow = new DeviceAuthorizationGrantFlow(deviceUri, CLIENT); flow.start(); - flow.exchangeDeviceCode(); + System.err.println(flow.exchangeDeviceCodeError()); } } \ No newline at end of file diff --git a/src/test/java/com/ysoft/geecon/helpers/DeviceAuthorizationGrantFlow.java b/src/test/java/com/ysoft/geecon/helpers/DeviceAuthorizationGrantFlow.java index 5ea158f..abcf22b 100644 --- a/src/test/java/com/ysoft/geecon/helpers/DeviceAuthorizationGrantFlow.java +++ b/src/test/java/com/ysoft/geecon/helpers/DeviceAuthorizationGrantFlow.java @@ -54,4 +54,19 @@ public class DeviceAuthorizationGrantFlow { .body("refresh_token", is(notNullValue())) .extract().as(AccessTokenResponse.class); } + + public String exchangeDeviceCodeError() { + return given() + .formParam("grant_type", "urn:ietf:params:oauth:grant-type:device_code") + .formParam("client_id", client.clientId()) + .formParam("device_code", deviceResponse.deviceCode()) + .when() + .post("/auth/token") + .then() + .statusCode(400).extract().asString(); +// .contentType(JSON) +// .body("error", is(notNullValue())) +// .body("error_detail", is(notNullValue())) +// .extract().as(OAuthException.ErrorResponse.class); + } }