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]

Reply via email to