From e20380e32015ada94e7e1de1e56915358b34fc3c Mon Sep 17 00:00:00 2001 From: Tanish Date: Sun, 15 Oct 2023 19:41:36 +0530 Subject: [PATCH] normalized input of parseStringOrThrowError method (#830) * normalized input of parseStringOrThrowError method * cr * added throws * fixed code * cr * fixed tests * added tests for getQueryParamOrThrowError * added process killing in tests * fixed tests * jar * added latest jar build * removed old jar * reverted date --- CHANGELOG.md | 6 ++- build.gradle | 3 +- jar/{core-7.0.5.jar => core-7.0.6.jar} | Bin 728450 -> 728809 bytes .../io/supertokens/webserver/InputParser.java | 28 ++++++++-- .../io/supertokens/test/InputParserTest.java | 49 ++++++++++++++++++ 5 files changed, 78 insertions(+), 8 deletions(-) rename jar/{core-7.0.5.jar => core-7.0.6.jar} (92%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81fed96d3..0b9023899 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [7.0.6] - 2023-10-10 + +- normalized input in few methods of InputParser - https://github.com/supertokens/supertokens-core/issues/594 + ## [7.0.5] - 2023-10-13 - Adds postgres testing to the CICD @@ -2513,4 +2517,4 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Changed - Allow for an unlimited number of SuperTokens instances in production mode -- License changes to reflect the above \ No newline at end of file +- License changes to reflect the above diff --git a/build.gradle b/build.gradle index b1a265136..4937651e6 100644 --- a/build.gradle +++ b/build.gradle @@ -19,8 +19,7 @@ compileTestJava { options.encoding = "UTF-8" } // } //} -version = "7.0.5" - +version = "7.0.6" repositories { mavenCentral() diff --git a/jar/core-7.0.5.jar b/jar/core-7.0.6.jar similarity index 92% rename from jar/core-7.0.5.jar rename to jar/core-7.0.6.jar index 5d6d6ea776d8e8a02fb08006b2d2dcced21b726c..3787cdfaf30f0191e230e74b34f7894bc7a59c68 100644 GIT binary patch delta 20634 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 oKo|nEBYOc&&_wVBfL1^@s6 delta 20490 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 diff --git a/src/main/java/io/supertokens/webserver/InputParser.java b/src/main/java/io/supertokens/webserver/InputParser.java index ebf1e86ee..1d97329f5 100644 --- a/src/main/java/io/supertokens/webserver/InputParser.java +++ b/src/main/java/io/supertokens/webserver/InputParser.java @@ -29,6 +29,8 @@ import java.util.Arrays; public class InputParser { + private static final String EMAIL_REGEX = "^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$"; + public static JsonObject parseJsonObjectOrThrowError(HttpServletRequest request) throws ServletException, IOException { StringBuilder sb = new StringBuilder(); @@ -52,23 +54,34 @@ public static String getQueryParamOrThrowError(HttpServletRequest request, Strin throw new ServletException( new WebserverAPI.BadRequestException("Field name '" + fieldName + "' is missing in GET request")); } + + value = value.trim(); + if (value.matches(EMAIL_REGEX)) { + value = value.toLowerCase(); + } return value; } public static String[] getCommaSeparatedStringArrayQueryParamOrThrowError(HttpServletRequest request, String fieldName, boolean nullable) throws ServletException { - String[] value = null; + String[] values = null; // expect val1,val2,val3 and so on... String queryParamValue = getQueryParamOrThrowError(request, fieldName, nullable); if (queryParamValue != null) { - value = Arrays.stream(queryParamValue.trim().split(",")).map(String::trim).filter(s -> !s.equals("")) + values = Arrays.stream(queryParamValue.trim().split(",")).map(String::trim).filter(s -> !s.equals("")) .toArray(String[]::new); } - if (!nullable && value == null) { + if (!nullable && values == null) { throw new ServletException( new WebserverAPI.BadRequestException("Field name '" + fieldName + "' is missing in GET request")); } - return value; + + return Arrays.stream(values).map(value -> { + if (value.matches(EMAIL_REGEX)) { + return value.toLowerCase(); + } + return value; + }).toArray(String[]::new); } public static Integer getIntQueryParamOrThrowError(HttpServletRequest request, String fieldName, boolean nullable) @@ -137,7 +150,12 @@ public static String parseStringOrThrowError(JsonObject element, String fieldNam if (!stringified.contains("\"")) { throw new Exception(); } - return ((JsonObject) element).get(fieldName).getAsString(); + + String s = element.get(fieldName).getAsString().trim(); + if (s.matches(EMAIL_REGEX)) { + s = s.toLowerCase(); + } + return s; } catch (Exception e) { throw new ServletException( new WebserverAPI.BadRequestException("Field name '" + fieldName + "' is invalid in JSON input")); diff --git a/src/test/java/io/supertokens/test/InputParserTest.java b/src/test/java/io/supertokens/test/InputParserTest.java index 40ea78c7c..5c7e276fb 100644 --- a/src/test/java/io/supertokens/test/InputParserTest.java +++ b/src/test/java/io/supertokens/test/InputParserTest.java @@ -21,6 +21,7 @@ import io.supertokens.pluginInterface.STORAGE_TYPE; import io.supertokens.storageLayer.StorageLayer; import io.supertokens.webserver.InputParser; +import jakarta.servlet.http.HttpServletRequest; import org.junit.AfterClass; import org.junit.Before; import org.junit.Rule; @@ -30,6 +31,7 @@ import jakarta.servlet.ServletException; import static org.junit.Assert.*; +import static org.mockito.Mockito.*; public class InputParserTest { @Rule @@ -104,4 +106,51 @@ public void testParseStringOrJSONNullOrThrowError() throws Exception { process.kill(); assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); } + + @Test + public void testParseStringOrThrowError() throws Exception { + String[] args = { "../" }; + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + JsonObject json = new JsonObject(); + json.addProperty("untrimed mixedcase email", "userName@DoMaIn.com "); + json.addProperty("email", "username@domain.com"); + json.addProperty("untrimed mixedcase text", " TexT "); + json.addProperty("mixedcase text", "TeXt"); + + assertEquals(InputParser.parseStringOrThrowError(json, "untrimed mixedcase email", false), "username@domain.com"); + assertEquals(InputParser.parseStringOrThrowError(json, "email", false), "username@domain.com"); + assertEquals(InputParser.parseStringOrThrowError(json, "untrimed mixedcase text", false), "TexT"); + assertEquals(InputParser.parseStringOrThrowError(json, "mixedcase text", false), "TeXt"); + assertNull(InputParser.parseStringOrThrowError(json, "undefined", true)); + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + } + + @Test + public void testGetQueryParamOrThrowError() throws Exception { + String[] args = { "../" }; + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + HttpServletRequest request = mock(HttpServletRequest.class); + + when(request.getParameter("untrimed mixedcase email")).thenReturn("userName@DoMaIn.com "); + when(request.getParameter("email")).thenReturn("username@domain.com"); + when(request.getParameter("untrimed mixedcase text")).thenReturn(" TexT "); + when(request.getParameter("mixedcase text")).thenReturn("TeXt"); + + assertEquals(InputParser.getQueryParamOrThrowError(request, "untrimed mixedcase email", false), "username@domain.com"); + assertEquals(InputParser.getQueryParamOrThrowError(request, "email", false), "username@domain.com"); + assertEquals(InputParser.getQueryParamOrThrowError(request, "untrimed mixedcase text", false), "TexT"); + assertEquals(InputParser.getQueryParamOrThrowError(request, "mixedcase text", false), "TeXt"); + assertThrows(ServletException.class, () -> InputParser.getQueryParamOrThrowError(request, "undefined", false)); + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + } }