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