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 0f9adc382f8f21a4fb488d2bcc8b801028efa2cd
Author: Quan Tran <hqt...@linagora.com>
AuthorDate: Wed Aug 23 17:03:53 2023 +0700

    JAMES-3936 RegexMappingRoutes should not decode request param 2 times
    
    Once has been handled by Spark.
---
 .../james/webadmin/routes/RegexMappingRoutes.java  |  7 ++----
 .../webadmin/routes/RegexMappingRoutesTest.java    | 26 ++++++++++++++++++----
 2 files changed, 24 insertions(+), 9 deletions(-)

diff --git 
a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/RegexMappingRoutes.java
 
b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/RegexMappingRoutes.java
index 1df59788ad..aac6f6d308 100644
--- 
a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/RegexMappingRoutes.java
+++ 
b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/RegexMappingRoutes.java
@@ -22,9 +22,6 @@ package org.apache.james.webadmin.routes;
 import static org.apache.james.webadmin.Constants.SEPARATOR;
 import static spark.Spark.halt;
 
-import java.net.URLDecoder;
-import java.nio.charset.StandardCharsets;
-
 import javax.inject.Inject;
 
 import org.apache.james.core.Username;
@@ -75,7 +72,7 @@ public class RegexMappingRoutes implements Routes {
     private HaltException addRegexMapping(Request request, Response response) 
throws Exception {
         try {
             MappingSource mappingSource = extractMappingSource(request);
-            String regex = URLDecoder.decode(request.params(REGEX_PARAM), 
StandardCharsets.UTF_8.toString());
+            String regex = request.params(REGEX_PARAM);
             recipientRewriteTable.addRegexMapping(mappingSource, regex);
         } catch (InvalidRegexException e) {
             throw ErrorResponder.builder()
@@ -90,7 +87,7 @@ public class RegexMappingRoutes implements Routes {
     private HaltException removeRegexMapping(Request request, Response 
response) throws Exception {
         try {
             MappingSource mappingSource = 
MappingSource.parse(request.params(MAPPING_SOURCE_PARAM));
-            String regex = URLDecoder.decode(request.params(REGEX_PARAM), 
StandardCharsets.UTF_8.toString());
+            String regex = request.params(REGEX_PARAM);
             recipientRewriteTable.removeRegexMapping(mappingSource, regex);
         } catch (RecipientRewriteTableException e) {
             throw ErrorResponder.builder()
diff --git 
a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/RegexMappingRoutesTest.java
 
b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/RegexMappingRoutesTest.java
index b1abf71dc4..dd4c8d8293 100644
--- 
a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/RegexMappingRoutesTest.java
+++ 
b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/RegexMappingRoutesTest.java
@@ -24,10 +24,11 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.core.Is.is;
 import static org.mockito.Mockito.mock;
 
+import java.net.URLEncoder;
+
 import org.apache.james.core.Domain;
 import org.apache.james.core.Username;
 import org.apache.james.dnsservice.api.DNSService;
-import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.lib.DomainListConfiguration;
 import org.apache.james.domainlist.memory.MemoryDomainList;
 import org.apache.james.rrt.lib.Mapping;
@@ -41,7 +42,6 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import io.restassured.RestAssured;
-import io.restassured.filter.log.LogDetail;
 import io.restassured.http.ContentType;
 
 class RegexMappingRoutesTest {
@@ -63,6 +63,7 @@ class RegexMappingRoutesTest {
 
         RestAssured.requestSpecification = 
WebAdminUtils.buildRequestSpecification(webAdminServer)
             .setBasePath(RegexMappingRoutes.BASE_PATH)
+            .setUrlEncodingEnabled(false) // no further automatically encoding 
by Rest Assured client
             .build();
     }
 
@@ -136,7 +137,7 @@ class RegexMappingRoutesTest {
     @Test
     void addRegexMappingShouldReturnBadRequestWhenRegexIsInvalid() {
         with()
-            .post("ja...@domain.tld/targets/O.*[]")
+            .post("ja...@domain.tld/targets/"+ URLEncoder.encode("O.*[]"))
         .then()
             .statusCode(HttpStatus.BAD_REQUEST_400)
             .contentType(ContentType.JSON)
@@ -148,7 +149,7 @@ class RegexMappingRoutesTest {
     @Test
     void addRegexMappingShouldReturnNoContentWhenRegexContainsQuestionMark() {
         with()
-            .post("ja...@domain.tld/targets/^[aei%3Fou].*ja...@domain.tld")
+            .post("ja...@domain.tld/targets/" + 
URLEncoder.encode("^[aei?ou].*ja...@domain.tld"))
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204)
             .contentType(ContentType.JSON);
@@ -158,6 +159,23 @@ class RegexMappingRoutesTest {
             .containsOnly(Mapping.regex("^[aei?ou].*ja...@domain.tld"));
     }
 
+    @Test
+    void addRegexMappingShouldJustDecodeOneTime() {
+        String originalRegex = "^[aei?ou].*ja...@domain.tld";
+        String onceEncodedRegex = URLEncoder.encode(originalRegex);
+        String twiceEncodedRegex = URLEncoder.encode(onceEncodedRegex);
+
+        with()
+            .post("ja...@domain.tld/targets/" + twiceEncodedRegex)
+        .then()
+            .statusCode(HttpStatus.NO_CONTENT_204)
+            .contentType(ContentType.JSON);
+
+        assertThat(memoryRecipientRewriteTable
+            
.getStoredMappings(MappingSource.fromUser(Username.of("ja...@domain.tld"))))
+            .containsOnly(Mapping.regex(onceEncodedRegex));
+    }
+
     @Test
     void removeRegexMappingShouldReturnNoContentWhenSuccess() throws Exception 
{
         MappingSource mappingSource = 
MappingSource.fromUser(Username.of("a...@domain.tld"));


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to