You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/11/04 11:24:04 UTC
[james-project] 28/30: JAMES-2959 SieveQuotaRoutes should return
bad request when invalid body
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 <dt...@linagora.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org