diff --git a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/utils/DatasourceUtils.java b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/utils/DatasourceUtils.java index 9f7644f8b9..22447bd93d 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/utils/DatasourceUtils.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/utils/DatasourceUtils.java @@ -9,6 +9,7 @@ import com.appsmith.external.models.Endpoint; import com.appsmith.external.models.Property; import com.appsmith.external.models.SSLDetails; import com.external.plugins.exceptions.MongoPluginErrorMessages; +import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.util.StringUtils; import java.util.ArrayList; @@ -131,23 +132,23 @@ public class DatasourceUtils { } private static String buildURITail(String tailInfo) { - Map optionsMap = new HashMap<>(); - + // case-insensitive match and preserves order of keys, hence the params ordering in the url remains unchanged + Map optionsMap = new LinkedCaseInsensitiveMap<>(); for (final String part : tailInfo.split("[&;]")) { if (part.isEmpty()) { continue; } int idx = part.indexOf('='); if (idx >= 0) { - String key = part.substring(0, idx).toLowerCase(); + String key = part.substring(0, idx); String value = part.substring(idx + 1); optionsMap.put(key, value); } else { - optionsMap.put(part.toLowerCase(), ""); + optionsMap.put(part, ""); } } optionsMap.putIfAbsent("authsource", "admin"); - optionsMap.put("minpoolsize", "0"); + optionsMap.putIfAbsent("minpoolsize", "0"); return optionsMap.entrySet().stream() .map(entry -> { if (StringUtils.hasLength(entry.getValue())) { diff --git a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/utils/DatasourceUtilsTest.java b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/utils/DatasourceUtilsTest.java index 3516815e2a..a3aeb2b92c 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/utils/DatasourceUtilsTest.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/utils/DatasourceUtilsTest.java @@ -45,7 +45,22 @@ public class DatasourceUtilsTest { public void testBuildClientURI_withUserInfoAndAuthSource() { final String testUri = "mongodb://user:pass@host:port/db?param&authSource=notAdmin"; - final String resultUri = "mongodb://user:newPass@host:port/db?param&authsource=notAdmin&minpoolsize=0"; + final String resultUri = "mongodb://user:newPass@host:port/db?param&authSource=notAdmin&minpoolsize=0"; + + DatasourceConfiguration datasourceConfiguration = new DatasourceConfiguration(); + final DBAuth dbAuth = new DBAuth(); + dbAuth.setPassword("newPass"); + datasourceConfiguration.setAuthentication(dbAuth); + datasourceConfiguration.setProperties(List.of(new Property("0", "Yes"), new Property("1", testUri))); + final String clientURI = buildClientURI(datasourceConfiguration); + assertEquals(resultUri, clientURI); + } + + @Test + public void testBuildClientURI_withUpperCaseCharacters_CaseRemainsUnchanged() { + + final String testUri = "mongodb://user:pass@host:port/db?Param&authSource=notAdmin"; + final String resultUri = "mongodb://user:newPass@host:port/db?Param&authSource=notAdmin&minpoolsize=0"; DatasourceConfiguration datasourceConfiguration = new DatasourceConfiguration(); final DBAuth dbAuth = new DBAuth();