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 66fa9210507fed343b167e28f4b7962bbc0baeae Author: Tran Tien Duc <[email protected]> AuthorDate: Fri Nov 1 17:14:57 2019 +0700 JAMES-2959 SieveQuotaRoutes should return bad request when invalid body - Invalid body: invalid number format, invalid integer format - Remove the unnecessary json extraction of a single long value. Just use Long.parseLong() directly --- .../james/webadmin/routes/SieveQuotaRoutes.java | 56 ++++++++-------------- .../webadmin/routes/SieveQuotaRoutesTest.java | 31 ++++++++++-- 2 files changed, 48 insertions(+), 39 deletions(-) diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java index 5ae5def..de6f71c 100644 --- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java +++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java @@ -34,13 +34,9 @@ import org.apache.james.sieverepository.api.SieveQuotaRepository; import org.apache.james.sieverepository.api.exception.QuotaNotFoundException; import org.apache.james.webadmin.Routes; import org.apache.james.webadmin.utils.ErrorResponder; -import org.apache.james.webadmin.utils.JsonExtractException; -import org.apache.james.webadmin.utils.JsonExtractor; import org.apache.james.webadmin.utils.JsonTransformer; import org.apache.james.webadmin.utils.Responses; import org.eclipse.jetty.http.HttpStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.google.common.base.Joiner; @@ -63,17 +59,14 @@ public class SieveQuotaRoutes implements Routes { private static final String USER_ID = "userId"; private static final String USER_SIEVE_QUOTA_PATH = Joiner.on(SEPARATOR).join(ROOT_PATH, "users", ":" + USER_ID); private static final String REQUESTED_SIZE = "requestedSize"; - private static final Logger LOGGER = LoggerFactory.getLogger(SieveQuotaRoutes.class); private final SieveQuotaRepository sieveQuotaRepository; private final JsonTransformer jsonTransformer; - private final JsonExtractor<Long> jsonExtractor; @Inject public SieveQuotaRoutes(SieveQuotaRepository sieveQuotaRepository, JsonTransformer jsonTransformer) { this.sieveQuotaRepository = sieveQuotaRepository; this.jsonTransformer = jsonTransformer; - this.jsonExtractor = new JsonExtractor<>(Long.class); } @Override @@ -123,19 +116,9 @@ public class SieveQuotaRoutes implements Routes { }) public void defineUpdateGlobalSieveQuota(Service service) { service.put(DEFAULT_QUOTA_PATH, (request, response) -> { - try { - QuotaSize requestedSize = extractRequestedQuotaSizeFromRequest(request); - sieveQuotaRepository.setDefaultQuota(requestedSize); - return Responses.returnNoContent(response); - } catch (JsonExtractException e) { - LOGGER.info("Malformed JSON", e); - throw ErrorResponder.builder() - .type(ErrorResponder.ErrorType.INVALID_ARGUMENT) - .statusCode(HttpStatus.BAD_REQUEST_400) - .message("Malformed JSON") - .cause(e) - .haltError(); - } + QuotaSize requestedSize = extractRequestedQuotaSizeFromRequest(request); + sieveQuotaRepository.setDefaultQuota(requestedSize); + return Responses.returnNoContent(response); }, jsonTransformer); } @@ -193,19 +176,9 @@ public class SieveQuotaRoutes implements Routes { public void defineUpdatePerUserSieveQuota(Service service) { service.put(USER_SIEVE_QUOTA_PATH, (request, response) -> { User userId = User.fromUsername(request.params(USER_ID)); - try { - QuotaSize requestedSize = extractRequestedQuotaSizeFromRequest(request); - sieveQuotaRepository.setQuota(userId, requestedSize); - return Responses.returnNoContent(response); - } catch (JsonExtractException e) { - LOGGER.info("Malformed JSON", e); - throw ErrorResponder.builder() - .type(ErrorResponder.ErrorType.INVALID_ARGUMENT) - .statusCode(HttpStatus.BAD_REQUEST_400) - .message("Malformed JSON") - .cause(e) - .haltError(); - } + QuotaSize requestedSize = extractRequestedQuotaSizeFromRequest(request); + sieveQuotaRepository.setQuota(userId, requestedSize); + return Responses.returnNoContent(response); }, jsonTransformer); } @@ -230,8 +203,8 @@ public class SieveQuotaRoutes implements Routes { }); } - private QuotaSize extractRequestedQuotaSizeFromRequest(Request request) throws JsonExtractException { - Long requestedSize = jsonExtractor.parse(request.body()); + private QuotaSize extractRequestedQuotaSizeFromRequest(Request request) { + long requestedSize = extractNumberFromRequestBody(request); if (requestedSize < 0) { throw ErrorResponder.builder() .type(ErrorResponder.ErrorType.INVALID_ARGUMENT) @@ -241,4 +214,17 @@ public class SieveQuotaRoutes implements Routes { } return QuotaSize.size(requestedSize); } + + private long extractNumberFromRequestBody(Request request) { + String body = request.body(); + try { + return Long.parseLong(body); + } catch (NumberFormatException e) { + throw ErrorResponder.builder() + .type(ErrorResponder.ErrorType.INVALID_ARGUMENT) + .statusCode(HttpStatus.BAD_REQUEST_400) + .message(String.format("unrecognized integer number '%s'", body)) + .haltError(); + } + } } diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java index 1bb159b..863cfb6 100644 --- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java +++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java @@ -21,6 +21,7 @@ package org.apache.james.webadmin.routes; import static io.restassured.RestAssured.given; import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.is; import org.apache.james.core.User; import org.apache.james.core.quota.QuotaSize; @@ -99,12 +100,23 @@ class SieveQuotaRoutesTest { } @Test - void updateGlobalSieveQuotaShouldReturn400WhenMalformedJSON() { + void updateGlobalSieveQuotaShouldReturn400WhenInvalidNumberFormatInTheBody() { given() .body("invalid") .put("/sieve/quota/default") .then() - .statusCode(HttpStatus.BAD_REQUEST_400); + .statusCode(HttpStatus.BAD_REQUEST_400) + .body("message", is("unrecognized integer number 'invalid'")); + } + + @Test + void updateGlobalSieveQuotaShouldReturn400WhenInvalidIntegerFormatInTheBody() { + given() + .body("1900.999") + .put("/sieve/quota/default") + .then() + .statusCode(HttpStatus.BAD_REQUEST_400) + .body("message", is("unrecognized integer number '1900.999'")); } @Test @@ -174,12 +186,23 @@ class SieveQuotaRoutesTest { } @Test - void updatePerUserSieveQuotaShouldReturn400WhenMalformedJSON() { + void updatePerUserSieveQuotaShouldReturn400WhenInvalidNumberFormatInTheBody() { given() .body("invalid") .put("/sieve/quota/users/" + USER_A.asString()) .then() - .statusCode(HttpStatus.BAD_REQUEST_400); + .statusCode(HttpStatus.BAD_REQUEST_400) + .body("message", is("unrecognized integer number 'invalid'")); + } + + @Test + void updatePerUserSieveQuotaShouldReturn400WhenInvalidIntegerFormatInTheBody() { + given() + .body("89884743.9999") + .put("/sieve/quota/users/" + USER_A.asString()) + .then() + .statusCode(HttpStatus.BAD_REQUEST_400) + .body("message", is("unrecognized integer number '89884743.9999'")); } @Test --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
