From 4040aa2439c35cd5b5a62a66a68fffe4c7277ef4 Mon Sep 17 00:00:00 2001 From: Ankit Tiwari Date: Tue, 6 Feb 2024 11:02:45 +0530 Subject: [PATCH 01/22] fix: remove db password from logs (#181) * fix: remove db password from logs * fix: Update version * fix: mask db password * fix: Add tests * fix: Add more tests * fix: PR changes * fix: PR changes --- CHANGELOG.md | 4 + build.gradle | 2 +- .../postgresql/config/PostgreSQLConfig.java | 14 +- .../postgresql/output/CustomLayout.java | 4 +- .../storage/postgresql/output/Logging.java | 11 +- .../storage/postgresql/utils/Utils.java | 17 ++ .../storage/postgresql/test/LoggingTest.java | 274 ++++++++++++++++++ 7 files changed, 315 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41189171..7ab4f065 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [5.0.7] - 2024-01-25 + +- Fixes the issue where passwords were inadvertently logged in the logs. + ## [5.0.6] - 2023-12-05 - Validates db config types in `canBeUsed` function diff --git a/build.gradle b/build.gradle index 754f70d7..f98f1df7 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id 'java-library' } -version = "5.0.6" +version = "5.0.7" repositories { mavenCentral() diff --git a/src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java b/src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java index e8bc81d6..cbfac0ab 100644 --- a/src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java +++ b/src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java @@ -548,10 +548,18 @@ public String getConnectionPoolId() { StringBuilder connectionPoolId = new StringBuilder(); for (Field field : PostgreSQLConfig.class.getDeclaredFields()) { if (field.isAnnotationPresent(ConnectionPoolProperty.class)) { - connectionPoolId.append("|"); try { - if (field.get(this) != null) { - connectionPoolId.append(field.get(this).toString()); + String fieldName = field.getName(); + String fieldValue = field.get(this) != null ? field.get(this).toString() : null; + if(fieldValue == null) { + continue; + } + // To ensure a unique connectionPoolId we include the database password and use the "|db_pass|" identifier. + // This facilitates easy removal of the password from logs when necessary. + if (fieldName.equals("postgresql_password")) { + connectionPoolId.append("|db_pass|" + fieldValue + "|db_pass"); + } else { + connectionPoolId.append("|" + fieldValue); } } catch (IllegalAccessException e) { throw new RuntimeException(e); diff --git a/src/main/java/io/supertokens/storage/postgresql/output/CustomLayout.java b/src/main/java/io/supertokens/storage/postgresql/output/CustomLayout.java index 6b8a57a1..003558e7 100644 --- a/src/main/java/io/supertokens/storage/postgresql/output/CustomLayout.java +++ b/src/main/java/io/supertokens/storage/postgresql/output/CustomLayout.java @@ -20,7 +20,7 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.CoreConstants; import ch.qos.logback.core.LayoutBase; -import io.supertokens.storage.postgresql.Start; +import io.supertokens.storage.postgresql.utils.Utils; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -58,7 +58,7 @@ public String doLayout(ILoggingEvent event) { sbuf.append(event.getCallerData()[1]); sbuf.append(" | "); - sbuf.append(event.getFormattedMessage()); + sbuf.append(Utils.maskDBPassword(event.getFormattedMessage())); sbuf.append(CoreConstants.LINE_SEPARATOR); sbuf.append(CoreConstants.LINE_SEPARATOR); diff --git a/src/main/java/io/supertokens/storage/postgresql/output/Logging.java b/src/main/java/io/supertokens/storage/postgresql/output/Logging.java index 19547def..716f888c 100644 --- a/src/main/java/io/supertokens/storage/postgresql/output/Logging.java +++ b/src/main/java/io/supertokens/storage/postgresql/output/Logging.java @@ -37,10 +37,10 @@ public class Logging extends ResourceDistributor.SingletonResource { private Logging(Start start, String infoLogPath, String errorLogPath) { this.infoLogger = infoLogPath.equals("null") - ? createLoggerForConsole(start, "io.supertokens.storage.postgresql.Info") + ? createLoggerForConsole(start, "io.supertokens.storage.postgresql.Info", LOG_LEVEL.INFO) : createLoggerForFile(start, infoLogPath, "io.supertokens.storage.postgresql.Info"); this.errorLogger = errorLogPath.equals("null") - ? createLoggerForConsole(start, "io.supertokens.storage.postgresql.Error") + ? createLoggerForConsole(start, "io.supertokens.storage.postgresql.Error", LOG_LEVEL.ERROR) : createLoggerForFile(start, errorLogPath, "io.supertokens.storage.postgresql.Error"); } @@ -154,12 +154,12 @@ public static void error(Start start, String message, boolean toConsoleAsWell, E private static void systemOut(String msg) { if (!Start.silent) { - System.out.println(msg); + System.out.println(Utils.maskDBPassword(msg)); } } private static void systemErr(String err) { - System.err.println(err); + System.err.println(Utils.maskDBPassword(err)); } public static void stopLogging(Start start) { @@ -198,7 +198,7 @@ private Logger createLoggerForFile(Start start, String file, String name) { return logger; } - private Logger createLoggerForConsole(Start start, String name) { + private Logger createLoggerForConsole(Start start, String name, LOG_LEVEL logLevel) { Logger logger = (Logger) LoggerFactory.getLogger(name); if (logger.iteratorForAppenders().hasNext()) { @@ -210,6 +210,7 @@ private Logger createLoggerForConsole(Start start, String name) { ple.setContext(lc); ple.start(); ConsoleAppender logConsoleAppender = new ConsoleAppender<>(); + logConsoleAppender.setTarget(logLevel == LOG_LEVEL.ERROR ? "System.err" : "System.out"); logConsoleAppender.setEncoder(ple); logConsoleAppender.setContext(lc); logConsoleAppender.start(); diff --git a/src/main/java/io/supertokens/storage/postgresql/utils/Utils.java b/src/main/java/io/supertokens/storage/postgresql/utils/Utils.java index 91a58735..7e662f8f 100644 --- a/src/main/java/io/supertokens/storage/postgresql/utils/Utils.java +++ b/src/main/java/io/supertokens/storage/postgresql/utils/Utils.java @@ -19,6 +19,8 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class Utils { public static String exceptionStacktraceToString(Exception e) { @@ -53,4 +55,19 @@ public static String generateCommaSeperatedQuestionMarks(int size) { } return builder.toString(); } + + public static String maskDBPassword(String log) { + String regex = "(\\|db_pass\\|)(.*?)(\\|db_pass\\|)"; + + Matcher matcher = Pattern.compile(regex).matcher(log); + StringBuffer maskedLog = new StringBuffer(); + + while (matcher.find()) { + String maskedPassword = "*".repeat(8); + matcher.appendReplacement(maskedLog, "|" + maskedPassword + "|"); + } + + matcher.appendTail(maskedLog); + return maskedLog.toString(); + } } diff --git a/src/test/java/io/supertokens/storage/postgresql/test/LoggingTest.java b/src/test/java/io/supertokens/storage/postgresql/test/LoggingTest.java index b27c1ac5..6e2f792c 100644 --- a/src/test/java/io/supertokens/storage/postgresql/test/LoggingTest.java +++ b/src/test/java/io/supertokens/storage/postgresql/test/LoggingTest.java @@ -21,6 +21,8 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.Appender; import com.google.gson.JsonObject; + +import io.supertokens.Main; import io.supertokens.ProcessState; import io.supertokens.config.Config; import io.supertokens.featureflag.EE_FEATURES; @@ -28,6 +30,7 @@ import io.supertokens.multitenancy.Multitenancy; import io.supertokens.pluginInterface.multitenancy.*; import io.supertokens.storage.postgresql.Start; +import io.supertokens.storage.postgresql.config.PostgreSQLConfig; import io.supertokens.storage.postgresql.output.Logging; import io.supertokens.storageLayer.StorageLayer; import org.apache.tomcat.util.http.fileupload.FileUtils; @@ -309,6 +312,277 @@ public void confirmHikariLoggerClosedOnlyWhenProcessEnds() throws Exception { assertFalse(hikariLogger.iteratorForAppenders().hasNext()); } + @Test + public void testDBPasswordMaskingOnDBConnectionFailUsingConnectionUri() throws Exception { + String[] args = { "../" }; + + String dbUser = "db_user"; + String dbPassword = "db_password"; + String dbName = "db_does_not_exist"; + String dbConnectionUri = "postgresql://" + dbUser + ":" + dbPassword + "@localhost:5432/" + dbName; + + Utils.setValueInConfig("postgresql_connection_uri", dbConnectionUri); + Utils.setValueInConfig("error_log_path", "null"); + + ByteArrayOutputStream errorOutput = new ByteArrayOutputStream(); + System.setErr(new PrintStream(errorOutput)); + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); + try { + process.startProcess(); + process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.INIT_FAILURE); + + assertTrue(fileContainsString(errorOutput, dbUser)); + assertTrue(fileContainsString(errorOutput, dbName)); + assertTrue(fileContainsString(errorOutput, "********")); + assertFalse(fileContainsString(errorOutput, dbPassword)); + + } finally { + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + System.setErr(new PrintStream(new FileOutputStream(FileDescriptor.err))); + } + } + + @Test + public void testDBPasswordMaskingOnDBConnectionFailUsingCredentials() throws Exception { + String[] args = { "../" }; + + String dbUser = "db_user"; + String dbPassword = "db_password"; + String dbName = "db_does_not_exist"; + + Utils.commentConfigValue("postgresql_connection_uri"); + Utils.setValueInConfig("postgresql_user", dbUser); + Utils.setValueInConfig("postgresql_password", dbPassword); + Utils.setValueInConfig("postgresql_database_name", dbName); + Utils.setValueInConfig("error_log_path", "null"); + + ByteArrayOutputStream errorOutput = new ByteArrayOutputStream(); + System.setErr(new PrintStream(errorOutput)); + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); + try { + process.startProcess(); + process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.INIT_FAILURE); + + assertTrue(fileContainsString(errorOutput, dbUser)); + assertTrue(fileContainsString(errorOutput, dbName)); + assertTrue(fileContainsString(errorOutput, "********")); + assertFalse(fileContainsString(errorOutput, dbPassword)); + + } finally { + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + System.setErr(new PrintStream(new FileOutputStream(FileDescriptor.err))); + } + } + + @Test + public void testDBPasswordMasking() throws Exception { + String[] args = { "../" }; + + ByteArrayOutputStream stdOutput = new ByteArrayOutputStream(); + ByteArrayOutputStream errorOutput = new ByteArrayOutputStream(); + + Utils.setValueInConfig("info_log_path", "null"); + Utils.setValueInConfig("error_log_path", "null"); + Utils.setValueInConfig("postgresql_password", "db_password"); + + System.setOut(new PrintStream(stdOutput)); + System.setErr(new PrintStream(errorOutput)); + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args); + + try { + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + Logging.info((Start) StorageLayer.getStorage(process.getProcess()), "INFO LOG: |db_pass|password|db_pass|", + false); + Logging.error((Start) StorageLayer.getStorage(process.getProcess()), + "ERROR LOG: |db_pass|password|db_pass|", false); + + assertTrue(fileContainsString(stdOutput, "INFO LOG: |********|")); + assertTrue(fileContainsString(errorOutput, "ERROR LOG: |********|")); + + } finally { + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out))); + System.setErr(new PrintStream(new FileOutputStream(FileDescriptor.err))); + } + } + + @Test + public void testDBPasswordIsNotLoggedWhenProcessStartsEnds() throws Exception { + String[] args = { "../" }; + + Utils.setValueInConfig("error_log_path", "null"); + Utils.setValueInConfig("info_log_path", "null"); + + ByteArrayOutputStream stdOutput = new ByteArrayOutputStream(); + ByteArrayOutputStream errorOutput = new ByteArrayOutputStream(); + + System.setOut(new PrintStream(stdOutput)); + System.setErr(new PrintStream(errorOutput)); + + try { + // Case 1: DB Password shouldn't be logged after starting/stopping the process with correct credentials + { + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args); + + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + Start start = (Start) StorageLayer.getStorage(process.getProcess()); + PostgreSQLConfig userConfig = io.supertokens.storage.postgresql.config.Config.getConfig(start); + String dbPasswordFromConfig = userConfig.getPassword(); + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + + assertFalse(fileContainsString(stdOutput, dbPasswordFromConfig)); + assertFalse(fileContainsString(errorOutput, dbPasswordFromConfig)); + } + + // Case 2: DB Password shouldn't be logged after starting/stopping the process with incorrect credentials + { + String dbUser = "db_user"; + String dbPassword = "db_password"; + String dbName = "db_does_not_exist"; + String dbConnectionUri = "postgresql://" + dbUser + ":" + dbPassword + "@localhost:5432/" + dbName; + + Utils.setValueInConfig("postgresql_connection_uri", dbConnectionUri); + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args); + + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.INIT_FAILURE)); + + Start start = (Start) StorageLayer.getStorage(process.getProcess()); + PostgreSQLConfig userConfig = io.supertokens.storage.postgresql.config.Config.getConfig(start); + String dbPasswordFromConfig = userConfig.getPassword(); + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + + assertFalse(fileContainsString(stdOutput, dbPasswordFromConfig)); + assertFalse(fileContainsString(errorOutput, dbPasswordFromConfig)); + } + + } finally { + System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out))); + System.setErr(new PrintStream(new FileOutputStream(FileDescriptor.err))); + } + } + + @Test + public void testDBPasswordIsNotLoggedWhenTenantIsCreated() throws Exception { + String[] args = { "../" }; + + Utils.setValueInConfig("error_log_path", "null"); + Utils.setValueInConfig("info_log_path", "null"); + + ByteArrayOutputStream stdOutput = new ByteArrayOutputStream(); + ByteArrayOutputStream errorOutput = new ByteArrayOutputStream(); + + System.setOut(new PrintStream(stdOutput)); + System.setErr(new PrintStream(errorOutput)); + + try { + // Case 1: DB Password shouldn't be logged when tenant is created with valid credentials + { + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args); + + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + Start start = (Start) StorageLayer.getStorage(process.getProcess()); + PostgreSQLConfig userConfig = io.supertokens.storage.postgresql.config.Config.getConfig(start); + String dbPasswordFromConfig = userConfig.getPassword(); + + Main main = process.getProcess(); + + FeatureFlagTestContent.getInstance(main) + .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[] { + EE_FEATURES.ACCOUNT_LINKING, EE_FEATURES.MULTI_TENANCY }); + + JsonObject config = new JsonObject(); + TenantIdentifier tenantIdentifier = new TenantIdentifier(null, "a1", null); + StorageLayer.getBaseStorage(process.getProcess()).modifyConfigToAddANewUserPoolForTesting(config, 1); + Multitenancy.addNewOrUpdateAppOrTenant( + main, + new TenantIdentifier(null, null, null), + new TenantConfig( + tenantIdentifier, + new EmailPasswordConfig(true), + new ThirdPartyConfig(true, null), + new PasswordlessConfig(true), + config + )); + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + + assertFalse(fileContainsString(stdOutput, dbPasswordFromConfig)); + assertFalse(fileContainsString(errorOutput, dbPasswordFromConfig)); + } + + // Case 2: DB Password shouldn't be logged when tenant is created with invalid credentials + { + String dbUser = "db_user"; + String dbPassword = "db_password"; + String dbName = "db_does_not_exist"; + String dbConnectionUri = "postgresql://" + dbUser + ":" + dbPassword + "@localhost:5432/" + dbName; + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args); + + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + Start start = (Start) StorageLayer.getStorage(process.getProcess()); + PostgreSQLConfig userConfig = io.supertokens.storage.postgresql.config.Config.getConfig(start); + String dbPasswordFromConfig = userConfig.getPassword(); + + Main main = process.getProcess(); + + FeatureFlagTestContent.getInstance(main) + .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[] { + EE_FEATURES.ACCOUNT_LINKING, EE_FEATURES.MULTI_TENANCY }); + + TenantIdentifier tenantIdentifier = new TenantIdentifier(null, "a1", null); + JsonObject config = new JsonObject(); + config.addProperty("postgresql_connection_uri", dbConnectionUri); + StorageLayer.getBaseStorage(process.getProcess()).modifyConfigToAddANewUserPoolForTesting(config, 1); + try { + Multitenancy.addNewOrUpdateAppOrTenant( + main, + new TenantIdentifier(null, null, null), + new TenantConfig( + tenantIdentifier, + new EmailPasswordConfig(true), + new ThirdPartyConfig(true, null), + new PasswordlessConfig(true), + new JsonObject())); + + } catch (Exception e) { + + } + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + + assertFalse(fileContainsString(stdOutput, dbPasswordFromConfig)); + assertFalse(fileContainsString(errorOutput, dbPasswordFromConfig)); + } + + } finally { + System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out))); + System.setErr(new PrintStream(new FileOutputStream(FileDescriptor.err))); + } + } + private static int countAppenders(ch.qos.logback.classic.Logger logger) { int count = 0; Iterator> appenderIter = logger.iteratorForAppenders(); From 13753ddea071074870768f1f4da3555d7a679944 Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Tue, 6 Feb 2024 17:15:23 +0530 Subject: [PATCH 02/22] fix: Connection pool issue (#182) * fix: test connection pool * fix: changelog * fix: test for downtime during connection pool change * fix: assert that there should be down time * fix: cleanup --- CHANGELOG.md | 1 + .../supertokens/storage/postgresql/Start.java | 15 ++ .../postgresql/test/DbConnectionPoolTest.java | 213 ++++++++++++++++++ 3 files changed, 229 insertions(+) create mode 100644 src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ab4f065..5f552711 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [5.0.7] - 2024-01-25 - Fixes the issue where passwords were inadvertently logged in the logs. +- Adds tests to check connection pool behaviour. ## [5.0.6] - 2023-12-05 diff --git a/src/main/java/io/supertokens/storage/postgresql/Start.java b/src/main/java/io/supertokens/storage/postgresql/Start.java index 91940ee0..73bc1597 100644 --- a/src/main/java/io/supertokens/storage/postgresql/Start.java +++ b/src/main/java/io/supertokens/storage/postgresql/Start.java @@ -106,6 +106,8 @@ import java.util.List; import java.util.Set; +import static io.supertokens.storage.postgresql.QueryExecutorTemplate.execute; + public class Start implements SessionSQLStorage, EmailPasswordSQLStorage, EmailVerificationSQLStorage, ThirdPartySQLStorage, JWTRecipeSQLStorage, PasswordlessSQLStorage, UserMetadataSQLStorage, UserRolesSQLStorage, UserIdMappingStorage, @@ -2990,4 +2992,17 @@ public UserIdMapping[] getUserIdMapping_Transaction(TransactionConnection con, A throw new StorageQueryException(e); } } + + @TestOnly + public int getDbActivityCount(String dbname) throws SQLException, StorageQueryException { + String QUERY = "SELECT COUNT(*) as c FROM pg_stat_activity WHERE datname = ?;"; + return execute(this, QUERY, pst -> { + pst.setString(1, dbname); + }, result -> { + if (result.next()) { + return result.getInt("c"); + } + return -1; + }); + } } diff --git a/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java b/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java new file mode 100644 index 00000000..6917e01e --- /dev/null +++ b/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java @@ -0,0 +1,213 @@ +/* + * Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package io.supertokens.storage.postgresql.test; + +import com.google.gson.JsonObject; +import io.supertokens.ProcessState; +import io.supertokens.emailpassword.exceptions.EmailChangeNotAllowedException; +import io.supertokens.featureflag.EE_FEATURES; +import io.supertokens.featureflag.FeatureFlagTestContent; +import io.supertokens.multitenancy.Multitenancy; +import io.supertokens.multitenancy.exception.BadPermissionException; +import io.supertokens.pluginInterface.exceptions.StorageQueryException; +import io.supertokens.pluginInterface.multitenancy.*; +import io.supertokens.pluginInterface.multitenancy.exceptions.TenantOrAppNotFoundException; +import io.supertokens.storage.postgresql.Start; +import io.supertokens.storageLayer.StorageLayer; +import io.supertokens.thirdparty.ThirdParty; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TestRule; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +import static org.junit.Assert.*; + +public class DbConnectionPoolTest { + @Rule + public TestRule watchman = Utils.getOnFailure(); + + @AfterClass + public static void afterTesting() { + Utils.afterTesting(); + } + + @Before + public void beforeEach() { + Utils.reset(); + } + + @Test + public void testActiveConnectionsWithTenants() throws Exception { + String[] args = {"../"}; + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); + FeatureFlagTestContent.getInstance(process.getProcess()) + .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + Start start = (Start) StorageLayer.getBaseStorage(process.getProcess()); + assertEquals(10, start.getDbActivityCount("supertokens")); + + JsonObject config = new JsonObject(); + start.modifyConfigToAddANewUserPoolForTesting(config, 1); + + Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( + new TenantIdentifier(null, null, "t1"), + new EmailPasswordConfig(true), + new ThirdPartyConfig(true, null), + new PasswordlessConfig(true), + config + ), false); + + Thread.sleep(1000); // let the new tenant be ready + + assertEquals(10, start.getDbActivityCount("st1")); + + // change connection pool size + config.addProperty("postgresql_connection_pool_size", 20); + + Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( + new TenantIdentifier(null, null, "t1"), + new EmailPasswordConfig(true), + new ThirdPartyConfig(true, null), + new PasswordlessConfig(true), + config + ), false); + + Thread.sleep(2000); // let the new tenant be ready + + assertEquals(20, start.getDbActivityCount("st1")); + + // delete tenant + Multitenancy.deleteTenant(new TenantIdentifier(null, null, "t1"), process.getProcess()); + Thread.sleep(2000); // let the tenant be deleted + + assertEquals(0, start.getDbActivityCount("st1")); + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + } + + @Test + public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { + String[] args = {"../"}; + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); + FeatureFlagTestContent.getInstance(process.getProcess()) + .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + Start start = (Start) StorageLayer.getBaseStorage(process.getProcess()); + assertEquals(10, start.getDbActivityCount("supertokens")); + + JsonObject config = new JsonObject(); + start.modifyConfigToAddANewUserPoolForTesting(config, 1); + config.addProperty("postgresql_connection_pool_size", 300); + AtomicLong firstErrorTime = new AtomicLong(-1); + AtomicLong successAfterErrorTime = new AtomicLong(-1); + AtomicInteger errorCount = new AtomicInteger(0); + + Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( + new TenantIdentifier(null, null, "t1"), + new EmailPasswordConfig(true), + new ThirdPartyConfig(true, null), + new PasswordlessConfig(true), + config + ), false); + + Thread.sleep(3000); // let the new tenant be ready + + assertEquals(300, start.getDbActivityCount("st1")); + + ExecutorService es = Executors.newFixedThreadPool(100); + + for (int i = 0; i < 10000; i++) { + int finalI = i; + es.execute(() -> { + try { + TenantIdentifier t1 = new TenantIdentifier(null, null, "t1"); + TenantIdentifierWithStorage t1WithStorage = t1.withStorage(StorageLayer.getStorage(t1, process.getProcess())); + ThirdParty.signInUp(t1WithStorage, process.getProcess(), "google", "googleid"+ finalI, "user" + + finalI + "@example.com"); + + if (firstErrorTime.get() != -1 && successAfterErrorTime.get() == -1) { + successAfterErrorTime.set(System.currentTimeMillis()); + } + } catch (StorageQueryException e) { + if (e.getMessage().contains("Connection is closed")) { + if (firstErrorTime.get() == -1) { + firstErrorTime.set(System.currentTimeMillis()); + } + } else { + errorCount.incrementAndGet(); + throw new RuntimeException(e); + } + } catch (EmailChangeNotAllowedException e) { + errorCount.incrementAndGet(); + throw new RuntimeException(e); + } catch (TenantOrAppNotFoundException e) { + errorCount.incrementAndGet(); + throw new RuntimeException(e); + } catch (BadPermissionException e) { + errorCount.incrementAndGet(); + throw new RuntimeException(e); + } + }); + } + + // change connection pool size + config.addProperty("postgresql_connection_pool_size", 200); + + Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( + new TenantIdentifier(null, null, "t1"), + new EmailPasswordConfig(true), + new ThirdPartyConfig(true, null), + new PasswordlessConfig(true), + config + ), false); + + Thread.sleep(3000); // let the new tenant be ready + + es.shutdown(); + es.awaitTermination(2, TimeUnit.MINUTES); + + assertEquals(0, errorCount.get()); + + assertEquals(200, start.getDbActivityCount("st1")); + + // delete tenant + Multitenancy.deleteTenant(new TenantIdentifier(null, null, "t1"), process.getProcess()); + Thread.sleep(3000); // let the tenant be deleted + + assertEquals(0, start.getDbActivityCount("st1")); + + System.out.println(successAfterErrorTime.get() - firstErrorTime.get() + "ms"); + assertTrue(successAfterErrorTime.get() - firstErrorTime.get() < 250); + assertTrue(successAfterErrorTime.get() - firstErrorTime.get() > 0); + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + } +} From 0377d03c5e73f0af3737260e7aad45c2a2ce2af1 Mon Sep 17 00:00:00 2001 From: rishabhpoddar Date: Tue, 6 Feb 2024 17:57:14 +0530 Subject: [PATCH 03/22] adding dev-v5.0.7 tag to this commit to ensure building --- ...-5.0.6.jar => postgresql-plugin-5.0.7.jar} | Bin 211671 -> 213155 bytes 1 file changed, 0 insertions(+), 0 deletions(-) rename jar/{postgresql-plugin-5.0.6.jar => postgresql-plugin-5.0.7.jar} (76%) diff --git a/jar/postgresql-plugin-5.0.6.jar b/jar/postgresql-plugin-5.0.7.jar similarity index 76% rename from jar/postgresql-plugin-5.0.6.jar rename to jar/postgresql-plugin-5.0.7.jar index e1cc4cccec93082e06a684117033f53d3444bc35..5b50a8447c8cf10be955747fd2a258ee9837b2b3 100644 GIT binary patch delta 44556 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 delta 43129 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 QhDeYF6JC1*uz^7T2cR;)5dZ)H From 53b83c99a868db4f9951438a41e4cdcf4cc5d49b Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Thu, 8 Feb 2024 12:36:45 +0530 Subject: [PATCH 04/22] fix: cicd tests (#185) --- .../postgresql/test/DbConnectionPoolTest.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java b/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java index 6917e01e..4bdbc707 100644 --- a/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java +++ b/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java @@ -138,7 +138,7 @@ public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { config ), false); - Thread.sleep(3000); // let the new tenant be ready + Thread.sleep(5000); // let the new tenant be ready assertEquals(300, start.getDbActivityCount("st1")); @@ -157,7 +157,7 @@ public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { successAfterErrorTime.set(System.currentTimeMillis()); } } catch (StorageQueryException e) { - if (e.getMessage().contains("Connection is closed")) { + if (e.getMessage().contains("Connection is closed") || e.getMessage().contains("has been closed")) { if (firstErrorTime.get() == -1) { firstErrorTime.set(System.currentTimeMillis()); } @@ -174,6 +174,15 @@ public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { } catch (BadPermissionException e) { errorCount.incrementAndGet(); throw new RuntimeException(e); + } catch (IllegalStateException e) { + if (e.getMessage().contains("Please call initPool before getConnection")) { + if (firstErrorTime.get() == -1) { + firstErrorTime.set(System.currentTimeMillis()); + } + } else { + errorCount.incrementAndGet(); + throw e; + } } }); } @@ -210,4 +219,4 @@ public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { process.kill(); assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); } -} +} \ No newline at end of file From f29d7c18b2831065d0b6444bd49bdde5021c1f54 Mon Sep 17 00:00:00 2001 From: Ankit Tiwari Date: Thu, 8 Feb 2024 14:11:09 +0530 Subject: [PATCH 05/22] fix: logging test (#187) --- .../java/io/supertokens/storage/postgresql/test/LoggingTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/io/supertokens/storage/postgresql/test/LoggingTest.java b/src/test/java/io/supertokens/storage/postgresql/test/LoggingTest.java index 6e2f792c..1e027162 100644 --- a/src/test/java/io/supertokens/storage/postgresql/test/LoggingTest.java +++ b/src/test/java/io/supertokens/storage/postgresql/test/LoggingTest.java @@ -387,7 +387,6 @@ public void testDBPasswordMasking() throws Exception { Utils.setValueInConfig("info_log_path", "null"); Utils.setValueInConfig("error_log_path", "null"); - Utils.setValueInConfig("postgresql_password", "db_password"); System.setOut(new PrintStream(stdOutput)); System.setErr(new PrintStream(errorOutput)); From 5f2dc1d357bb3e84ac12e8b55912766dab1f021f Mon Sep 17 00:00:00 2001 From: rishabhpoddar Date: Thu, 8 Feb 2024 14:30:15 +0530 Subject: [PATCH 06/22] adding dev-v5.0.7 tag to this commit to ensure building --- jar/postgresql-plugin-5.0.7.jar | Bin 213155 -> 213155 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/jar/postgresql-plugin-5.0.7.jar b/jar/postgresql-plugin-5.0.7.jar index 5b50a8447c8cf10be955747fd2a258ee9837b2b3..088261dfb046472cb5de46843064fe871d0f9f5a 100644 GIT binary patch delta 1739 zcmYL|dr(w$6vyxHcVHuAA%r4!c|TU3%kmac!Gw~dbt1rY>aA6GQxf#F@6<-ur9 zJY1Qxvzow?p2c*w(;Kucj|FNrR{_gf0o&poSiB6WP%zn<|G|BQ8Y=nG;Bw)1Sykn&# zP1$9C&TY!=uh>f~k$U|tR-}#L=pD9~P{j8xJN5*;Cm*o)aKFmBhwOru)xh~V?QkFa z@Yi#o%h?bPWrN!>Ym?PhO>#&!1u5ZG zd>LV4;Wi*=T@7#7#^Bbc-5gZb$Hz4CIL0fr$!vG?M>J{}GZ9`v z`BxL+9hBqDWEB&o#J9|}8J5HldLGahLKT2tLTCq|ERnFdHO||gn|cIrIv^JD0WtnsTWcFr7=U0oJXd4#3nJJz?rvYD2i?MJ{zdHTjh1#(pY delta 1739 zcmY+DdrXyO9LL}1`N4^h10fV~4)@EE>)~)0^uRF$GK?f}fGmqHTm(Ej7DnL(LJ6IC z*%`cRl+ze&UYZ!RH`e(Oo$}H_4X@*w?leOX)MA5Q2%suF|6#xpi!c1fk0yQR4aI4zWjeSorI$i@G^4Qs zu)Akk_?Gv@1^IhiYP^SpuZ;oohbI0*1B4(gPVJ*|Tl;LjT1t#v%Y0#QUe5X_DlVNHu+ z>yT9IjAt%Ee)`=Nt3z=-I zFEVZ_V8KFj6|tOU&`y>!w;#w+$6N-`L_NC|0UGRL4pI519`c5m?s}$pQa#qi(zTh-S%Pp``htxR1|2k7b=I+5QKsx_Am=vi=GW|{ zT2<`W0 zxK#}J@n`vI5piK7Uts9N6go4o=xOz$!R?r_sh(C%YFI9XXpuF131Rxel^|zB9q$lh zns4OmMJ8Jd?-u<`I5`&qlP+G20Je=ciGbE!+=;oWH}~)|7*qE025g5m(97Ee8T)v> zAlE+rvY>1G`F7ENML!=C?GMA6?i{gq+r}BQ20DCkY08B?yH(*1I^f?zpy->86sqf@c zJ?#JH$_sI>l$EcoBo|EU^QaQ=ejdF7@Xe>qfR=o!1zgCd*8yu*Q72$(l}wnvn%be9 tSS=N^oi;(~u*+KWc6n(P1+t%y3gpH`6;cPBhYG0%@Mj^}0XYt8`wxjV7~cQ@ From f540b86874c54bfa1538eba0a19f2cb58c2f1f1b Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Thu, 8 Feb 2024 19:14:21 +0530 Subject: [PATCH 07/22] fix: flaky test (#188) --- .../postgresql/test/DbConnectionPoolTest.java | 193 ++++++++++-------- 1 file changed, 103 insertions(+), 90 deletions(-) diff --git a/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java b/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java index 4bdbc707..18d123d5 100644 --- a/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java +++ b/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java @@ -114,109 +114,122 @@ public void testActiveConnectionsWithTenants() throws Exception { public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { String[] args = {"../"}; - TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); - FeatureFlagTestContent.getInstance(process.getProcess()) - .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); - process.startProcess(); - assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); - - Start start = (Start) StorageLayer.getBaseStorage(process.getProcess()); - assertEquals(10, start.getDbActivityCount("supertokens")); - - JsonObject config = new JsonObject(); - start.modifyConfigToAddANewUserPoolForTesting(config, 1); - config.addProperty("postgresql_connection_pool_size", 300); - AtomicLong firstErrorTime = new AtomicLong(-1); - AtomicLong successAfterErrorTime = new AtomicLong(-1); - AtomicInteger errorCount = new AtomicInteger(0); - - Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( - new TenantIdentifier(null, null, "t1"), - new EmailPasswordConfig(true), - new ThirdPartyConfig(true, null), - new PasswordlessConfig(true), - config - ), false); - - Thread.sleep(5000); // let the new tenant be ready - - assertEquals(300, start.getDbActivityCount("st1")); - - ExecutorService es = Executors.newFixedThreadPool(100); - - for (int i = 0; i < 10000; i++) { - int finalI = i; - es.execute(() -> { - try { - TenantIdentifier t1 = new TenantIdentifier(null, null, "t1"); - TenantIdentifierWithStorage t1WithStorage = t1.withStorage(StorageLayer.getStorage(t1, process.getProcess())); - ThirdParty.signInUp(t1WithStorage, process.getProcess(), "google", "googleid"+ finalI, "user" + - finalI + "@example.com"); - - if (firstErrorTime.get() != -1 && successAfterErrorTime.get() == -1) { - successAfterErrorTime.set(System.currentTimeMillis()); - } - } catch (StorageQueryException e) { - if (e.getMessage().contains("Connection is closed") || e.getMessage().contains("has been closed")) { - if (firstErrorTime.get() == -1) { - firstErrorTime.set(System.currentTimeMillis()); + for (int t = 0; t < 5; t++) { + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); + FeatureFlagTestContent.getInstance(process.getProcess()) + .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + Start start = (Start) StorageLayer.getBaseStorage(process.getProcess()); + assertEquals(10, start.getDbActivityCount("supertokens")); + + JsonObject config = new JsonObject(); + start.modifyConfigToAddANewUserPoolForTesting(config, 1); + config.addProperty("postgresql_connection_pool_size", 300); + AtomicLong firstErrorTime = new AtomicLong(-1); + AtomicLong successAfterErrorTime = new AtomicLong(-1); + AtomicInteger errorCount = new AtomicInteger(0); + + Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( + new TenantIdentifier(null, null, "t1"), + new EmailPasswordConfig(true), + new ThirdPartyConfig(true, null), + new PasswordlessConfig(true), + config + ), false); + + Thread.sleep(5000); // let the new tenant be ready + + assertEquals(300, start.getDbActivityCount("st1")); + + ExecutorService es = Executors.newFixedThreadPool(100); + + for (int i = 0; i < 10000; i++) { + int finalI = i; + es.execute(() -> { + try { + TenantIdentifier t1 = new TenantIdentifier(null, null, "t1"); + TenantIdentifierWithStorage t1WithStorage = t1.withStorage(StorageLayer.getStorage(t1, process.getProcess())); + ThirdParty.signInUp(t1WithStorage, process.getProcess(), "google", "googleid"+ finalI, "user" + + finalI + "@example.com"); + + if (firstErrorTime.get() != -1 && successAfterErrorTime.get() == -1) { + successAfterErrorTime.set(System.currentTimeMillis()); + } + } catch (StorageQueryException e) { + if (e.getMessage().contains("Connection is closed") || e.getMessage().contains("has been closed")) { + if (firstErrorTime.get() == -1) { + firstErrorTime.set(System.currentTimeMillis()); + } + } else { + errorCount.incrementAndGet(); + throw new RuntimeException(e); } - } else { + } catch (EmailChangeNotAllowedException e) { errorCount.incrementAndGet(); throw new RuntimeException(e); - } - } catch (EmailChangeNotAllowedException e) { - errorCount.incrementAndGet(); - throw new RuntimeException(e); - } catch (TenantOrAppNotFoundException e) { - errorCount.incrementAndGet(); - throw new RuntimeException(e); - } catch (BadPermissionException e) { - errorCount.incrementAndGet(); - throw new RuntimeException(e); - } catch (IllegalStateException e) { - if (e.getMessage().contains("Please call initPool before getConnection")) { - if (firstErrorTime.get() == -1) { - firstErrorTime.set(System.currentTimeMillis()); - } - } else { + } catch (TenantOrAppNotFoundException e) { + errorCount.incrementAndGet(); + throw new RuntimeException(e); + } catch (BadPermissionException e) { errorCount.incrementAndGet(); - throw e; + throw new RuntimeException(e); + } catch (IllegalStateException e) { + if (e.getMessage().contains("Please call initPool before getConnection")) { + if (firstErrorTime.get() == -1) { + firstErrorTime.set(System.currentTimeMillis()); + } + } else { + errorCount.incrementAndGet(); + throw e; + } } - } - }); - } + }); + } - // change connection pool size - config.addProperty("postgresql_connection_pool_size", 200); + // change connection pool size + config.addProperty("postgresql_connection_pool_size", 200); - Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( - new TenantIdentifier(null, null, "t1"), - new EmailPasswordConfig(true), - new ThirdPartyConfig(true, null), - new PasswordlessConfig(true), - config - ), false); + Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( + new TenantIdentifier(null, null, "t1"), + new EmailPasswordConfig(true), + new ThirdPartyConfig(true, null), + new PasswordlessConfig(true), + config + ), false); - Thread.sleep(3000); // let the new tenant be ready + Thread.sleep(3000); // let the new tenant be ready - es.shutdown(); - es.awaitTermination(2, TimeUnit.MINUTES); + es.shutdown(); + es.awaitTermination(2, TimeUnit.MINUTES); - assertEquals(0, errorCount.get()); + assertEquals(0, errorCount.get()); - assertEquals(200, start.getDbActivityCount("st1")); + assertEquals(200, start.getDbActivityCount("st1")); - // delete tenant - Multitenancy.deleteTenant(new TenantIdentifier(null, null, "t1"), process.getProcess()); - Thread.sleep(3000); // let the tenant be deleted + // delete tenant + Multitenancy.deleteTenant(new TenantIdentifier(null, null, "t1"), process.getProcess()); + Thread.sleep(3000); // let the tenant be deleted - assertEquals(0, start.getDbActivityCount("st1")); + assertEquals(0, start.getDbActivityCount("st1")); - System.out.println(successAfterErrorTime.get() - firstErrorTime.get() + "ms"); - assertTrue(successAfterErrorTime.get() - firstErrorTime.get() < 250); - assertTrue(successAfterErrorTime.get() - firstErrorTime.get() > 0); - process.kill(); - assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + System.out.println(successAfterErrorTime.get() - firstErrorTime.get() + "ms"); + assertTrue(successAfterErrorTime.get() - firstErrorTime.get() < 250); + + if (successAfterErrorTime.get() - firstErrorTime.get() == 0) { + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + continue; // retry + } + + assertTrue(successAfterErrorTime.get() - firstErrorTime.get() > 0); + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + + return; + } + + fail(); // tried 5 times } } \ No newline at end of file From abe531269fef0f742a780e0a7282ed9046f4a309 Mon Sep 17 00:00:00 2001 From: rishabhpoddar Date: Thu, 8 Feb 2024 19:14:55 +0530 Subject: [PATCH 08/22] adding dev-v5.0.7 tag to this commit to ensure building --- jar/postgresql-plugin-5.0.7.jar | Bin 213155 -> 213155 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/jar/postgresql-plugin-5.0.7.jar b/jar/postgresql-plugin-5.0.7.jar index 088261dfb046472cb5de46843064fe871d0f9f5a..3af418895e8c5f597a53f0fd448099410197678a 100644 GIT binary patch delta 1527 zcmY+De@xV69LMi@K60YmkpjgyjvoTYPmen|4&?VKj!;60luoZ!>J(25hzgR7_@Rb6 zHr;W3HK&8IZsfG2YkirUG|gQ8s9?!xR~F4|u0L8f-9lUI`+gq(>9+g6K0n^i=lMLJ z=ldP)HIDWg4fVCOV6jdY9$D%oL;I2T_qN(d_doduR>*HU zwWlwFxikdp*qH?y6|;vI_-y)U#8&H#vEXwFrHjBL=@HNbPiB7`2DaEYGmXA$c{Olj z@^?N9cK3fRWOW0U=twjacEW29X&pVU_x&m!6G_rLX)yPQJ1fklwghipUdN_uS7-8h5 zu(hbAc3D`vF#gD7=b=$fTiHfrST4JRQ>k|ytaUMrO%?1(5oxPpMG=U6xQ-1OU{rco zyB8jQsA?4(FtxWHz}h>7_3-tyenCUROC?qPZA z)J2vl6b~=60EwAJ2R4kmqI9~?%ax^^+tr`GV%wrnt?CC>BMvwCGwT+MjJMg*r;r++ zXQxEU^)LHEq{28qC(fc8cvmqrj%q%R%T#|`&uwB_u?_sJ5MSBIe`jKIQ{0sQp4Q$~ zz0WmeSG4v_in)kl)g(86ghhBwo<^1J9==CRWUh(Vi7K{c-Y1#}wsI2MiC1~Grv0p) zdxf;Qo3~+j%B_9;85GIc&zo?w>d*n+Aq>L+-zto@gM7O%W)JaB(Qf@99~TB4;cl_x zi#{GMjHdVauTP*(U4UN`Hy3w?9}vq&&T{u|?D;5;?4Z>|?|>hf2%mv+$3*xJl#FK)20dZrx+`lVb>gLm_1#xeNtoK(2^}>H6QyZ$rg;}%>+?_?AfXUg^4Gw41 z5LlQ)hrmlYv=6LVP66=G<@7qZ!%98iU90S;F;~vx%UpU3@l`gNzx#dc6s>b zm19M;75t}2&bMWS+-G(LwIg0zOdG(FV%h;NDxsIaT_v;`yi!7Mg05293r?2GI`%T^ vfIn6yeN#Dk;CGhG`g7%S{`D1d|4%FAdy-U1d!T#2k~V=4Dyaf=x~SzpvTj-w delta 1527 zcmYL|e@xV69LMi@K5(LNq(Cu_<3Ql}>2U|gaq{~VM<{_rO6b)}o#F`rK|zucKh#ji zCIkAqoDRmik<*f{^<{3-G{gK+!IIG^i)J?0A1#}1p{@12pKn{Y-S_qR@qRwf=lML} z?^w5CtlJP$RZambbh@A*-PP8CkYp~N&T`9iYgw&M{5T%sN8;~ovXSn8`E={R`&KTV zx13_pU@&tF$6vwD1_&x956>R7>BAA*pf^N<&&A{~7gGQ6q+n?Lr_#O&1RL$!8A@Ew zEJHdXYwxoNclLf20KcNo5*~_%0#ADF3!tx~YdfCQRh$IZNr9{!EYQDfu$<)P*Y>o_9#YBb=-1a;W z6FH-dbg@iz<`PShibq$Nk3yjc_idSQhv{^m6)LMZx2r#X$##XIY{~bmOdhWPC)P=* zZ@9w-o&)5~wo>4KmC{m5B<&UulugTM>vfIP=%ZV)3@d{bRR?mB66aFSn zQakx7FBRHPTew$B>pOWfhNs*<$e%%x^h3N3H>(aE=55jl>Ek=4(R_sOW;oLPQQppB zRQ2--Y0zBz5SWHEr(@l;40#3j*3IG5A From 5e27c9e7a839000dec770ee827e8d92eaf4c47b9 Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Fri, 9 Feb 2024 12:43:01 +0530 Subject: [PATCH 09/22] fix: adds idle timeout and minimum idle configs (#184) * fix: adds idle timeout and minimum idle configs * fix: protected props * fix: changelog * fix: test protected config --- CHANGELOG.md | 1 + config.yaml | 8 + devConfig.yaml | 8 + .../storage/postgresql/ConnectionPool.java | 2 + .../supertokens/storage/postgresql/Start.java | 3 +- .../postgresql/config/PostgreSQLConfig.java | 27 +++ .../postgresql/test/DbConnectionPoolTest.java | 196 ++++++++++++++++-- .../test/SuperTokensSaaSSecretTest.java | 6 +- 8 files changed, 233 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f552711..5ebae7eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Fixes the issue where passwords were inadvertently logged in the logs. - Adds tests to check connection pool behaviour. +- Adds `postgresql_idle_connection_timeout` and `postgresql_minimum_idle_connections` configs to control active connections to the database. ## [5.0.6] - 2023-12-05 diff --git a/config.yaml b/config.yaml index 36459b8d..81032770 100644 --- a/config.yaml +++ b/config.yaml @@ -67,3 +67,11 @@ postgresql_config_version: 0 # (DIFFERENT_ACROSS_TENANTS | OPTIONAL | Default: "thirdparty_users") string value. Specify the name of the table # that will store the thirdparty recipe users. # postgresql_thirdparty_users_table_name + +# (DIFFERENT_ACROSS_TENANTS | OPTIONAL | Default: 60000) long value. Timeout in milliseconds for the idle connections +# to be closed. +# postgresql_idle_connection_timeout: + +# (DIFFERENT_ACROSS_TENANTS | OPTIONAL | Default: 1) integer value. Minimum number of idle connections to be kept +# active. +# postgresql_minimum_idle_connections: diff --git a/devConfig.yaml b/devConfig.yaml index 39d0d5ed..3af330ff 100644 --- a/devConfig.yaml +++ b/devConfig.yaml @@ -69,3 +69,11 @@ postgresql_password: "root" # (DIFFERENT_ACROSS_TENANTS | OPTIONAL | Default: "thirdparty_users") string value. Specify the name of the table # that will store the thirdparty recipe users. # postgresql_thirdparty_users_table_name + +# (DIFFERENT_ACROSS_TENANTS | OPTIONAL | Default: 60000) long value. Timeout in milliseconds for the idle connections +# to be closed. +# postgresql_idle_connection_timeout: + +# (DIFFERENT_ACROSS_TENANTS | OPTIONAL | Default: 1) integer value. Minimum number of idle connections to be kept +# active. +# postgresql_minimum_idle_connections: diff --git a/src/main/java/io/supertokens/storage/postgresql/ConnectionPool.java b/src/main/java/io/supertokens/storage/postgresql/ConnectionPool.java index f7dbc287..4f5cc53a 100644 --- a/src/main/java/io/supertokens/storage/postgresql/ConnectionPool.java +++ b/src/main/java/io/supertokens/storage/postgresql/ConnectionPool.java @@ -81,6 +81,8 @@ private synchronized void initialiseHikariDataSource() throws SQLException { } config.setMaximumPoolSize(userConfig.getConnectionPoolSize()); config.setConnectionTimeout(5000); + config.setIdleTimeout(userConfig.getIdleConnectionTimeout()); + config.setMinimumIdle(userConfig.getMinimumIdleConnections()); config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); diff --git a/src/main/java/io/supertokens/storage/postgresql/Start.java b/src/main/java/io/supertokens/storage/postgresql/Start.java index 73bc1597..86a7e876 100644 --- a/src/main/java/io/supertokens/storage/postgresql/Start.java +++ b/src/main/java/io/supertokens/storage/postgresql/Start.java @@ -117,7 +117,8 @@ public class Start // SaaS. If the core is not running in SuperTokens SaaS, this array has no effect. private static String[] PROTECTED_DB_CONFIG = new String[]{"postgresql_connection_pool_size", "postgresql_connection_uri", "postgresql_host", "postgresql_port", "postgresql_user", "postgresql_password", - "postgresql_database_name", "postgresql_table_schema"}; + "postgresql_database_name", "postgresql_table_schema", "postgresql_idle_connection_timeout", + "postgresql_minimum_idle_connections"}; private static final Object appenderLock = new Object(); public static boolean silent = false; private ResourceDistributor resourceDistributor = new ResourceDistributor(); diff --git a/src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java b/src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java index cbfac0ab..1e57cc2a 100644 --- a/src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java +++ b/src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java @@ -112,6 +112,14 @@ public class PostgreSQLConfig { @ConnectionPoolProperty private String postgresql_connection_scheme = "postgresql"; + @JsonProperty + @ConnectionPoolProperty + private long postgresql_idle_connection_timeout = 60000; + + @JsonProperty + @ConnectionPoolProperty + private int postgresql_minimum_idle_connections = 1; + @IgnoreForAnnotationCheck boolean isValidAndNormalised = false; @@ -234,6 +242,14 @@ public String getThirdPartyUsersTable() { return postgresql_thirdparty_users_table_name; } + public long getIdleConnectionTimeout() { + return postgresql_idle_connection_timeout; + } + + public int getMinimumIdleConnections() { + return postgresql_minimum_idle_connections; + } + public String getThirdPartyUserToTenantTable() { return addSchemaAndPrefixToTableName("thirdparty_user_to_tenant"); } @@ -340,6 +356,17 @@ public void validateAndNormalise() throws InvalidConfigException { "'postgresql_connection_pool_size' in the config.yaml file must be > 0"); } + if (postgresql_minimum_idle_connections <= 0) { + throw new InvalidConfigException( + "'postgresql_minimum_idle_connections' must be a positive value"); + } + + if (postgresql_minimum_idle_connections > postgresql_connection_pool_size) { + throw new InvalidConfigException( + "'postgresql_minimum_idle_connections' must be less than or equal to " + + "'postgresql_connection_pool_size'"); + } + // Normalisation if (postgresql_connection_uri != null) { { // postgresql_connection_attributes diff --git a/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java b/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java index 18d123d5..94434670 100644 --- a/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java +++ b/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java @@ -16,7 +16,23 @@ package io.supertokens.storage.postgresql.test; +import static org.junit.Assert.*; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +import io.supertokens.pluginInterface.multitenancy.*; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TestRule; + import com.google.gson.JsonObject; + import io.supertokens.ProcessState; import io.supertokens.emailpassword.exceptions.EmailChangeNotAllowedException; import io.supertokens.featureflag.EE_FEATURES; @@ -24,24 +40,10 @@ import io.supertokens.multitenancy.Multitenancy; import io.supertokens.multitenancy.exception.BadPermissionException; import io.supertokens.pluginInterface.exceptions.StorageQueryException; -import io.supertokens.pluginInterface.multitenancy.*; import io.supertokens.pluginInterface.multitenancy.exceptions.TenantOrAppNotFoundException; import io.supertokens.storage.postgresql.Start; import io.supertokens.storageLayer.StorageLayer; import io.supertokens.thirdparty.ThirdParty; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TestRule; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; - -import static org.junit.Assert.*; public class DbConnectionPoolTest { @Rule @@ -64,6 +66,7 @@ public void testActiveConnectionsWithTenants() throws Exception { TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); FeatureFlagTestContent.getInstance(process.getProcess()) .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); + Utils.setValueInConfig("postgresql_minimum_idle_connections", "10"); process.startProcess(); assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); @@ -87,6 +90,7 @@ public void testActiveConnectionsWithTenants() throws Exception { // change connection pool size config.addProperty("postgresql_connection_pool_size", 20); + config.addProperty("postgresql_minimum_idle_connections", 20); Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( new TenantIdentifier(null, null, "t1"), @@ -119,6 +123,7 @@ public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { FeatureFlagTestContent.getInstance(process.getProcess()) .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); process.startProcess(); + Utils.setValueInConfig("postgresql_minimum_idle_connections", "10"); assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); Start start = (Start) StorageLayer.getBaseStorage(process.getProcess()); @@ -127,6 +132,7 @@ public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { JsonObject config = new JsonObject(); start.modifyConfigToAddANewUserPoolForTesting(config, 1); config.addProperty("postgresql_connection_pool_size", 300); + config.addProperty("postgresql_minimum_idle_connections", 300); AtomicLong firstErrorTime = new AtomicLong(-1); AtomicLong successAfterErrorTime = new AtomicLong(-1); AtomicInteger errorCount = new AtomicInteger(0); @@ -190,6 +196,7 @@ public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { // change connection pool size config.addProperty("postgresql_connection_pool_size", 200); + config.addProperty("postgresql_minimum_idle_connections", 200); Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( new TenantIdentifier(null, null, "t1"), @@ -232,4 +239,165 @@ public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { fail(); // tried 5 times } + + + @Test + public void testMinimumIdleConnections() throws Exception { + String[] args = {"../"}; + { + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); + FeatureFlagTestContent.getInstance(process.getProcess()) + .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); + Utils.setValueInConfig("postgresql_connection_pool_size", "20"); + Utils.setValueInConfig("postgresql_minimum_idle_connections", "10"); + Utils.setValueInConfig("postgresql_idle_connection_timeout", "30000"); + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + Thread.sleep(65000); // let the idle connections time out + + Start start = (Start) StorageLayer.getBaseStorage(process.getProcess()); + assertEquals(10, start.getDbActivityCount("supertokens")); + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + } + } + + @Test + public void testMinimumIdleConnectionForTenants() throws Exception { + String[] args = {"../"}; + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); + FeatureFlagTestContent.getInstance(process.getProcess()) + .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); + Utils.setValueInConfig("postgresql_minimum_idle_connections", "10"); + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + Start start = (Start) StorageLayer.getBaseStorage(process.getProcess()); + assertEquals(10, start.getDbActivityCount("supertokens")); + + JsonObject config = new JsonObject(); + start.modifyConfigToAddANewUserPoolForTesting(config, 1); + + Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( + new TenantIdentifier(null, null, "t1"), + new EmailPasswordConfig(true), + new ThirdPartyConfig(true, null), + new PasswordlessConfig(true), + config + ), false); + + Thread.sleep(1000); // let the new tenant be ready + + assertEquals(10, start.getDbActivityCount("st1")); + + // change connection pool size + config.addProperty("postgresql_connection_pool_size", 20); + config.addProperty("postgresql_minimum_idle_connections", 5); + + Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( + new TenantIdentifier(null, null, "t1"), + new EmailPasswordConfig(true), + new ThirdPartyConfig(true, null), + new PasswordlessConfig(true), + config + ), false); + + Thread.sleep(2000); // let the new tenant be ready + + assertEquals(5, start.getDbActivityCount("st1")); + + // delete tenant + Multitenancy.deleteTenant(new TenantIdentifier(null, null, "t1"), process.getProcess()); + Thread.sleep(2000); // let the tenant be deleted + + assertEquals(0, start.getDbActivityCount("st1")); + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + } + + @Test + public void testIdleConnectionTimeout() throws Exception { + String[] args = {"../"}; + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); + FeatureFlagTestContent.getInstance(process.getProcess()) + .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); + Utils.setValueInConfig("postgresql_minimum_idle_connections", "10"); + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + Start start = (Start) StorageLayer.getBaseStorage(process.getProcess()); + assertEquals(10, start.getDbActivityCount("supertokens")); + + JsonObject config = new JsonObject(); + start.modifyConfigToAddANewUserPoolForTesting(config, 1); + config.addProperty("postgresql_connection_pool_size", 300); + config.addProperty("postgresql_minimum_idle_connections", 5); + config.addProperty("postgresql_idle_connection_timeout", 30000); + + AtomicLong errorCount = new AtomicLong(0); + + Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( + new TenantIdentifier(null, null, "t1"), + new EmailPasswordConfig(true), + new ThirdPartyConfig(true, null), + new PasswordlessConfig(true), + config + ), false); + + Thread.sleep(3000); // let the new tenant be ready + + assertTrue(10 >= start.getDbActivityCount("st1")); + + ExecutorService es = Executors.newFixedThreadPool(150); + + for (int i = 0; i < 10000; i++) { + int finalI = i; + es.execute(() -> { + try { + TenantIdentifier t1 = new TenantIdentifier(null, null, "t1"); + TenantIdentifierWithStorage t1WithStorage = t1.withStorage(StorageLayer.getStorage(t1, process.getProcess())); + ThirdParty.signInUp(t1WithStorage, process.getProcess(), "google", "googleid"+ finalI, "user" + + finalI + "@example.com"); + + } catch (StorageQueryException e) { + errorCount.incrementAndGet(); + throw new RuntimeException(e); + } catch (EmailChangeNotAllowedException e) { + errorCount.incrementAndGet(); + throw new RuntimeException(e); + } catch (TenantOrAppNotFoundException e) { + errorCount.incrementAndGet(); + throw new RuntimeException(e); + } catch (BadPermissionException e) { + errorCount.incrementAndGet(); + throw new RuntimeException(e); + } + }); + } + + es.shutdown(); + es.awaitTermination(2, TimeUnit.MINUTES); + + assertTrue(5 < start.getDbActivityCount("st1")); + + assertEquals(0, errorCount.get()); + + Thread.sleep(65000); // let the idle connections time out + + assertEquals(5, start.getDbActivityCount("st1")); + + // delete tenant + Multitenancy.deleteTenant(new TenantIdentifier(null, null, "t1"), process.getProcess()); + Thread.sleep(3000); // let the tenant be deleted + + assertEquals(0, start.getDbActivityCount("st1")); + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + } } \ No newline at end of file diff --git a/src/test/java/io/supertokens/storage/postgresql/test/SuperTokensSaaSSecretTest.java b/src/test/java/io/supertokens/storage/postgresql/test/SuperTokensSaaSSecretTest.java index 17b6e437..6693acb1 100644 --- a/src/test/java/io/supertokens/storage/postgresql/test/SuperTokensSaaSSecretTest.java +++ b/src/test/java/io/supertokens/storage/postgresql/test/SuperTokensSaaSSecretTest.java @@ -45,12 +45,12 @@ public class SuperTokensSaaSSecretTest { private final String[] PROTECTED_DB_CONFIG = new String[]{"postgresql_connection_pool_size", "postgresql_connection_uri", "postgresql_host", "postgresql_port", "postgresql_user", - "postgresql_password", - "postgresql_database_name", "postgresql_table_schema"}; + "postgresql_password", "postgresql_database_name", "postgresql_table_schema", + "postgresql_minimum_idle_connections", "postgresql_idle_connection_timeout"}; private final Object[] PROTECTED_DB_CONFIG_VALUES = new Object[]{11, "postgresql://root:root@localhost:5432/supertokens?currentSchema=myschema", "localhost", 5432, "root", - "root", "supertokens", "myschema"}; + "root", "supertokens", "myschema", 5, 120000}; @Rule public TestRule watchman = Utils.getOnFailure(); From 29da546d91df9de711e683019a577ce32f6274b6 Mon Sep 17 00:00:00 2001 From: rishabhpoddar Date: Fri, 9 Feb 2024 12:44:06 +0530 Subject: [PATCH 10/22] adding dev-v5.0.7 tag to this commit to ensure building --- jar/postgresql-plugin-5.0.7.jar | Bin 213155 -> 213487 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/jar/postgresql-plugin-5.0.7.jar b/jar/postgresql-plugin-5.0.7.jar index 3af418895e8c5f597a53f0fd448099410197678a..e0fc1a16bf9e37cfba2f063b24b354ccba1d5783 100644 GIT binary patch delta 42189 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%0D;Ds@#N3*pc|=R8u~-fX=<_CAb(wPM6%m?* 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 g0jm+*qamE&pX6T_GR4d^@Ej%JI%X~nm>Px# From 8383fd66c2ea1cfa074eb242c9ce3e29a45e5a19 Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Fri, 9 Feb 2024 22:59:41 +0530 Subject: [PATCH 11/22] fix: cicd (#189) * fix: cicd * fix: test --- config.yaml | 4 ++-- devConfig.yaml | 4 ++-- .../storage/postgresql/ConnectionPool.java | 4 +++- .../postgresql/config/PostgreSQLConfig.java | 22 ++++++++++--------- .../postgresql/test/DbConnectionPoolTest.java | 7 ------ 5 files changed, 19 insertions(+), 22 deletions(-) diff --git a/config.yaml b/config.yaml index 81032770..38ade78f 100644 --- a/config.yaml +++ b/config.yaml @@ -72,6 +72,6 @@ postgresql_config_version: 0 # to be closed. # postgresql_idle_connection_timeout: -# (DIFFERENT_ACROSS_TENANTS | OPTIONAL | Default: 1) integer value. Minimum number of idle connections to be kept -# active. +# (DIFFERENT_ACROSS_TENANTS | OPTIONAL | Default: null) integer value. Minimum number of idle connections to be kept +# active. If not set, minimum idle connections will be same as the connection pool size. # postgresql_minimum_idle_connections: diff --git a/devConfig.yaml b/devConfig.yaml index 3af330ff..a25dba97 100644 --- a/devConfig.yaml +++ b/devConfig.yaml @@ -74,6 +74,6 @@ postgresql_password: "root" # to be closed. # postgresql_idle_connection_timeout: -# (DIFFERENT_ACROSS_TENANTS | OPTIONAL | Default: 1) integer value. Minimum number of idle connections to be kept -# active. +# (DIFFERENT_ACROSS_TENANTS | OPTIONAL | Default: null) integer value. Minimum number of idle connections to be kept +# active. If not set, minimum idle connections will be same as the connection pool size. # postgresql_minimum_idle_connections: diff --git a/src/main/java/io/supertokens/storage/postgresql/ConnectionPool.java b/src/main/java/io/supertokens/storage/postgresql/ConnectionPool.java index 4f5cc53a..d209411f 100644 --- a/src/main/java/io/supertokens/storage/postgresql/ConnectionPool.java +++ b/src/main/java/io/supertokens/storage/postgresql/ConnectionPool.java @@ -82,7 +82,9 @@ private synchronized void initialiseHikariDataSource() throws SQLException { config.setMaximumPoolSize(userConfig.getConnectionPoolSize()); config.setConnectionTimeout(5000); config.setIdleTimeout(userConfig.getIdleConnectionTimeout()); - config.setMinimumIdle(userConfig.getMinimumIdleConnections()); + if (userConfig.getMinimumIdleConnections() != null) { + config.setMinimumIdle(userConfig.getMinimumIdleConnections()); + } config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); diff --git a/src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java b/src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java index 1e57cc2a..2c464849 100644 --- a/src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java +++ b/src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java @@ -118,7 +118,7 @@ public class PostgreSQLConfig { @JsonProperty @ConnectionPoolProperty - private int postgresql_minimum_idle_connections = 1; + private Integer postgresql_minimum_idle_connections = null; @IgnoreForAnnotationCheck boolean isValidAndNormalised = false; @@ -246,7 +246,7 @@ public long getIdleConnectionTimeout() { return postgresql_idle_connection_timeout; } - public int getMinimumIdleConnections() { + public Integer getMinimumIdleConnections() { return postgresql_minimum_idle_connections; } @@ -356,15 +356,17 @@ public void validateAndNormalise() throws InvalidConfigException { "'postgresql_connection_pool_size' in the config.yaml file must be > 0"); } - if (postgresql_minimum_idle_connections <= 0) { - throw new InvalidConfigException( - "'postgresql_minimum_idle_connections' must be a positive value"); - } + if (postgresql_minimum_idle_connections != null) { + if (postgresql_minimum_idle_connections < 0) { + throw new InvalidConfigException( + "'postgresql_minimum_idle_connections' must be >= 0"); + } - if (postgresql_minimum_idle_connections > postgresql_connection_pool_size) { - throw new InvalidConfigException( - "'postgresql_minimum_idle_connections' must be less than or equal to " - + "'postgresql_connection_pool_size'"); + if (postgresql_minimum_idle_connections > postgresql_connection_pool_size) { + throw new InvalidConfigException( + "'postgresql_minimum_idle_connections' must be less than or equal to " + + "'postgresql_connection_pool_size'"); + } } // Normalisation diff --git a/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java b/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java index 94434670..cdf0c28c 100644 --- a/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java +++ b/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java @@ -66,7 +66,6 @@ public void testActiveConnectionsWithTenants() throws Exception { TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); FeatureFlagTestContent.getInstance(process.getProcess()) .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); - Utils.setValueInConfig("postgresql_minimum_idle_connections", "10"); process.startProcess(); assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); @@ -90,7 +89,6 @@ public void testActiveConnectionsWithTenants() throws Exception { // change connection pool size config.addProperty("postgresql_connection_pool_size", 20); - config.addProperty("postgresql_minimum_idle_connections", 20); Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( new TenantIdentifier(null, null, "t1"), @@ -123,7 +121,6 @@ public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { FeatureFlagTestContent.getInstance(process.getProcess()) .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); process.startProcess(); - Utils.setValueInConfig("postgresql_minimum_idle_connections", "10"); assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); Start start = (Start) StorageLayer.getBaseStorage(process.getProcess()); @@ -132,7 +129,6 @@ public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { JsonObject config = new JsonObject(); start.modifyConfigToAddANewUserPoolForTesting(config, 1); config.addProperty("postgresql_connection_pool_size", 300); - config.addProperty("postgresql_minimum_idle_connections", 300); AtomicLong firstErrorTime = new AtomicLong(-1); AtomicLong successAfterErrorTime = new AtomicLong(-1); AtomicInteger errorCount = new AtomicInteger(0); @@ -196,7 +192,6 @@ public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { // change connection pool size config.addProperty("postgresql_connection_pool_size", 200); - config.addProperty("postgresql_minimum_idle_connections", 200); Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( new TenantIdentifier(null, null, "t1"), @@ -271,7 +266,6 @@ public void testMinimumIdleConnectionForTenants() throws Exception { TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); FeatureFlagTestContent.getInstance(process.getProcess()) .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); - Utils.setValueInConfig("postgresql_minimum_idle_connections", "10"); process.startProcess(); assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); @@ -326,7 +320,6 @@ public void testIdleConnectionTimeout() throws Exception { TestingProcessManager.TestingProcess process = TestingProcessManager.start(args, false); FeatureFlagTestContent.getInstance(process.getProcess()) .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MULTI_TENANCY}); - Utils.setValueInConfig("postgresql_minimum_idle_connections", "10"); process.startProcess(); assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); From 54b4f9ab5c55d1bfe6629dd2c4a27e10c1e76945 Mon Sep 17 00:00:00 2001 From: rishabhpoddar Date: Fri, 9 Feb 2024 23:10:04 +0530 Subject: [PATCH 12/22] adding dev-v5.0.7 tag to this commit to ensure building --- jar/postgresql-plugin-5.0.7.jar | Bin 213487 -> 213543 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/jar/postgresql-plugin-5.0.7.jar b/jar/postgresql-plugin-5.0.7.jar index e0fc1a16bf9e37cfba2f063b24b354ccba1d5783..c9ec73e0f08ea3fffea752597e6407890f9093e0 100644 GIT binary patch delta 13723 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 eoCp+yW=ezU5tki^%O}uzX|O8F0VVtf1N Date: Sat, 10 Feb 2024 01:27:02 +0530 Subject: [PATCH 13/22] fixes tests --- .../java/io/supertokens/storage/postgresql/ConnectionPool.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/supertokens/storage/postgresql/ConnectionPool.java b/src/main/java/io/supertokens/storage/postgresql/ConnectionPool.java index d209411f..d0b8c6f0 100644 --- a/src/main/java/io/supertokens/storage/postgresql/ConnectionPool.java +++ b/src/main/java/io/supertokens/storage/postgresql/ConnectionPool.java @@ -81,9 +81,9 @@ private synchronized void initialiseHikariDataSource() throws SQLException { } config.setMaximumPoolSize(userConfig.getConnectionPoolSize()); config.setConnectionTimeout(5000); - config.setIdleTimeout(userConfig.getIdleConnectionTimeout()); if (userConfig.getMinimumIdleConnections() != null) { config.setMinimumIdle(userConfig.getMinimumIdleConnections()); + config.setIdleTimeout(userConfig.getIdleConnectionTimeout()); } config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); From ae8ce1a5f2afbd4058d06560722c2c2c92eb92c2 Mon Sep 17 00:00:00 2001 From: rishabhpoddar Date: Sat, 10 Feb 2024 01:27:31 +0530 Subject: [PATCH 14/22] adding dev-v5.0.7 tag to this commit to ensure building --- jar/postgresql-plugin-5.0.7.jar | Bin 213543 -> 213545 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/jar/postgresql-plugin-5.0.7.jar b/jar/postgresql-plugin-5.0.7.jar index c9ec73e0f08ea3fffea752597e6407890f9093e0..7b06ce4531bcebe886c9b5d9b1335948014ff1b9 100644 GIT binary patch delta 5927 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 delta 5957 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 From 15be5e8e591a40bcf2dce4566250a95d09cb671f Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Wed, 21 Feb 2024 15:38:47 +0530 Subject: [PATCH 15/22] fix: vulnerability fix (#192) * fix: vulnerability fix * fix: vulnerability fix --- CHANGELOG.md | 4 ++++ build.gradle | 18 +++++++++--------- implementationDependencies.json | 6 +++--- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ebae7eb..0f3aa6c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [5.0.8] - 2024-02-19 + +- Fixes vulnerabilities in dependencies + ## [5.0.7] - 2024-01-25 - Fixes the issue where passwords were inadvertently logged in the logs. diff --git a/build.gradle b/build.gradle index f98f1df7..3295a3d7 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id 'java-library' } -version = "5.0.7" +version = "5.0.8" repositories { mavenCentral() @@ -17,16 +17,16 @@ dependencies { implementation group: 'com.zaxxer', name: 'HikariCP', version: '3.4.1' // https://mvnrepository.com/artifact/org.postgresql/postgresql - implementation group: 'org.postgresql', name: 'postgresql', version: '42.2.10' + implementation group: 'org.postgresql', name: 'postgresql', version: '42.7.1' // https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml - compileOnly group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.14.0' + compileOnly group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.14.2' // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core - compileOnly group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.14.0' + compileOnly group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.16.1' // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic - compileOnly group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3' + compileOnly group: 'ch.qos.logback', name: 'logback-classic', version: '1.4.14' // https://mvnrepository.com/artifact/com.google.code.findbugs/jsr305 compileOnly group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2' @@ -43,10 +43,10 @@ dependencies { testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.1.0' // https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-core - testImplementation group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '10.1.1' + testImplementation group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '10.1.18' // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic - testImplementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3' + testImplementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.4.14' // https://mvnrepository.com/artifact/com.google.code.gson/gson testImplementation group: 'com.google.code.gson', name: 'gson', version: '2.3.1' @@ -54,10 +54,10 @@ dependencies { testImplementation 'com.tngtech.archunit:archunit-junit4:0.22.0' // https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml - testImplementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.14.0' + testImplementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.14.2' // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core - testImplementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.14.0' + testImplementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.16.1' } jar { diff --git a/implementationDependencies.json b/implementationDependencies.json index 6c885fc4..9986f3fb 100644 --- a/implementationDependencies.json +++ b/implementationDependencies.json @@ -2,9 +2,9 @@ "_comment": "Contains list of implementation dependencies URL for this project", "list": [ { - "jar": "https://repo1.maven.org/maven2/org/postgresql/postgresql/42.2.10/postgresql-42.2.10.jar", - "name": "PostgreSQL JDBC Driver 4.2", - "src": "https://repo1.maven.org/maven2/org/postgresql/postgresql/42.2.10/postgresql-42.2.10-sources.jar" + "jar": "https://repo1.maven.org/maven2/org/postgresql/postgresql/42.7.1/postgresql-42.7.1.jar", + "name": "PostgreSQL JDBC Driver 42.7.1", + "src": "https://repo1.maven.org/maven2/org/postgresql/postgresql/42.7.1/postgresql-42.7.1-sources.jar" }, { "jar": "https://repo1.maven.org/maven2/com/zaxxer/HikariCP/3.4.1/HikariCP-3.4.1.jar", From 79f6ef7b3835ca55d758a7a86b01e161ac5c63f7 Mon Sep 17 00:00:00 2001 From: rishabhpoddar Date: Wed, 21 Feb 2024 15:45:32 +0530 Subject: [PATCH 16/22] adding dev-v5.0.8 tag to this commit to ensure building --- ...-5.0.7.jar => postgresql-plugin-5.0.8.jar} | Bin 213545 -> 213545 bytes 1 file changed, 0 insertions(+), 0 deletions(-) rename jar/{postgresql-plugin-5.0.7.jar => postgresql-plugin-5.0.8.jar} (95%) diff --git a/jar/postgresql-plugin-5.0.7.jar b/jar/postgresql-plugin-5.0.8.jar similarity index 95% rename from jar/postgresql-plugin-5.0.7.jar rename to jar/postgresql-plugin-5.0.8.jar index 7b06ce4531bcebe886c9b5d9b1335948014ff1b9..0fec0bfef5aca54e129343006e4e9047f60f2e30 100644 GIT binary patch delta 1721 zcmYL}eNa?Y7{>28FKmP?wt{84upr1c?D8or!Y(DEq2>o9AcJ9rU?`!Hs1U9q1{uk$ zc>l->XA%ZYfq|Kuedvr%8IlD}DpY9BG}HJ;qo&PNHr2h)IZivXdw=sh@7I0rx!d1r z?r$}lR~3?vzoPj0DFe;LUFIkETekEd8wnqj9>LDe*@6eN9BRey~j_fA(d? z!b+bQ7mDANF#%U6?{ip}f4GOv!xyGK!B7f*Yp@!io(p6v4A5rIWL1dP8ZFF%CfdQ- ztj7%39>JEOsJ1(b)eE{E%g!K9J(6-M%9goUu+Zukvy2(gPCU!J0U&odt2cp0HnJO`pd%jU7VW26*-{I% z$Rq5JNRaIlc2u}$&$92xY|PZ%G`;@5zRDA7kB22|K*|5WDF7i8YJ7z@OQn$Kf9Pi@ht{ynoqw;hKmKh@1P!%y(uX zF0FtM;#6qAtl~*x%X8N94@Jhs=lCs#Ip#h&-hEdeb=2f_PdHS4)Vb=0IGUlJ%A^3z zR>~hB*Eo7hP`Ij`H;P@|tmex_IY%w`h@nPa;ant~*~ascz_#;hkx<*h>#$t)`hH#r zGog)F;hbpQ2Y7=Zb33mTRNuj06g2rJe~laOhPJws4+`?>;_F2Jio^U7f?KWfC69rI z`uM0XsQDD%&p^Hdd{?c}SKT|0?0}JZ^g1BjN_gwkS}VDXX!W#}k^ncX5S>6?z-I~64p^2*`vBi0 z(s96!B-#%6HHlgP`v0MraM~_6w%kFxV2wItOkuKw%gNLMt1N}K0>)D40H8RPRKV?2 zssfax$+b+S$r~(5msz6^!I|;!F=fb6?F;1&KVC?CQOA`jxAA4BeB8Dys)V&KOFoO= zvt-i>C)LCH)=6stG1>GI;7~SI0Pbc}DPYAS+5xz@h;{?=b7Vm+hZ>;Rb9Kcyna6Ue s4De5`?6t|IKQF_&=F;aeAlt1UHUoOy)CdUAqY~6<%A*{>r+KvHKe`QWLI3~& delta 1721 zcmY+EZBSHI7{~894{QW1wt{84upr1g?D8rs0!xXgsQH4qAcJ9rU$xE1}wjUW9(`nRUuPRjoi`Vx_FCEZxO zfh^xxhgY(bJ_e|vdqSWT{nltTKs^`4Rv4hon8B(Ltu_VNa@Jr1jcj5!!azqn%q6y;YGX?*(4vm8 zKcYakPuNl6o;}OHBeT&{PxJJK`}!zPsJ$MRqK%(tu_ENb=j=FP+QEG#L#~;MaxPc3 z5O-+TN7?f;QE<_ZtVqnF>nGMC@`8S5haQJ}>@W6?a0~ur=Y?w`ep)=-M`pe=8*%AH zd=R%n`(+hR7E_+RmVY2JEaEUEH^x(ddMb+oHCriv zfL!D1Ek@z0a^56nb+ei;7v&ta+#{MAd6{#OaAq4XL;~B+t3^U>E3e0J)$99tG0env zUWI$2^&H@hg3KMfQcy!De?idX8~j!A5UacRpdg=azFzEKahN|Ms9NQVA4BD#em*MB zx#bk!FRJ*S=DTVQSKT|8?0}KE^co<;N_gwkS}WnTQ$Ms)GOQa`assTO^c0{nlyHUB zp-|cgB{+;q09(Rn3*cH9JqK{wNNhS_qiQH2;WEY(PV1mdg;NcnFhch8MFiDD$(l#6 z11`*?gMc-Wju(OZD7c-jQG7f(Zg{sd|P#3Ygz@L3{t0G1}vKEO9gbR4iF znYIIdO{P|W{(mSsoVLq}EqBl^SfdUZQ=B5vL^ssQeE zIhLt(`GD>WnKk+loS6@gDO0v;Um$1r@dDb5I{8_08ee9~Q;ED+_A5)Ck3%CzWG)R0idrJh|8A he0g5i@?}3cE_vDdT-1c%hyrp0nhPiw@M!^U{SSIb@EHIA From 3c7c4a4e07777f788abfad0339fd90dc2a7d87cc Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Fri, 23 Feb 2024 10:58:06 +0530 Subject: [PATCH 17/22] fix: dependencies (#195) --- build.gradle | 4 ++-- implementationDependencies.json | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 3295a3d7..6efdb3d4 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ dependencies { implementation group: 'org.postgresql', name: 'postgresql', version: '42.7.1' // https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml - compileOnly group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.14.2' + compileOnly group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.16.1' // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core compileOnly group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.16.1' @@ -54,7 +54,7 @@ dependencies { testImplementation 'com.tngtech.archunit:archunit-junit4:0.22.0' // https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml - testImplementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.14.2' + testImplementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.16.1' // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core testImplementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.16.1' diff --git a/implementationDependencies.json b/implementationDependencies.json index 9986f3fb..f0b780d0 100644 --- a/implementationDependencies.json +++ b/implementationDependencies.json @@ -12,9 +12,9 @@ "src": "https://repo1.maven.org/maven2/com/zaxxer/HikariCP/3.4.1/HikariCP-3.4.1-sources.jar" }, { - "jar": "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar", - "name": "SLF4j API 1.7.25", - "src": "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25-sources.jar" + "jar": "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/2.0.7/slf4j-api-2.0.7.jar", + "name": "SLF4j API 2.0.7", + "src": "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/2.0.7/slf4j-api-2.0.7-sources.jar" } ] } From 404c90527116a7f1750166381ce9df00f3048745 Mon Sep 17 00:00:00 2001 From: rishabhpoddar Date: Fri, 23 Feb 2024 11:05:04 +0530 Subject: [PATCH 18/22] adding dev-v5.0.8 tag to this commit to ensure building --- jar/postgresql-plugin-5.0.8.jar | Bin 213545 -> 213545 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/jar/postgresql-plugin-5.0.8.jar b/jar/postgresql-plugin-5.0.8.jar index 0fec0bfef5aca54e129343006e4e9047f60f2e30..6c72cc5928c827a365151eb1326fc9a3b7dc6d0b 100644 GIT binary patch delta 1721 zcmY+EZBSHI7{~8953GbNwt{84yb1CSySxgEu#1UksQH4iAcJ9rU?`!Hs1U9q1{uk$ zct2=`GYNxc!obYUUUWvM49S8f6)H4mnrZydsA)5mO?B`896z)(yXQCm|MNWOxz9Ow z`&-TZt!DG8BJ%N96hA+u$6eB8jwWNtd?s37+=~9;#*h9X{aaIKBjx`Iy@^P;nr-*b;@@HRm9ITA- zF`@Wf9TjkG;sJ+s<%j#&dFbMlCm2fMZw*!h)boLCg#p@(8LSG?TBC(ou!(kX7V9y? zwMDXJD5~v_X7z&Z#Idu8Q%@zcVvEuCaBALLPx~s$s{xAA<{h6(Qtu{EpxTo}7OmXI zIxq7A&;-#Vm6=w3E*=ZveOR5%$7N6kPlxD-^Tn{E0P-yuhE?p(o%T|BJmN-28vp1>u^ApAirDk(uwzMqGL! zAHc29ep$tn#gu2Sl(MKdaHBP4e>NxJ)K1XT39K6 zh+O09EkWU`a^5Irb*q{$7v=1=+#{MAeuZ<9aCRFnKmyy&t3^U>3$Md))f@YH5zNFk zUWI$2bsyjjg3Rr_Qc!&de^JoHoBTEL5UV@+fFPePULy9dILxOBs#f`u$5DB(kB^9R zZa&TTiz>cn_^w*RRrk&%8(?@Yy$;B*65cws)=GHo)DNwc4C|(q8~|$wEdo@A5U#K~ z7(yGM1cg#DU~?#K23!xN=K+o|5}WpiQ8kp{a2ewXr*%*!!>I;P5Fz{dB7*9mWX+>D z02k-cLBN_w@&K+y%9y25)COfdN~W)wFSDlRQxmN6XnGlNIa=` zOxpp!CQ}PQ|34HRPTAzdmfL9;tP#76DN2!WC51X*m8H^Fz-THR0IW+R6>ukwssQeE zIhM(E`GD>WnKkkV9GQ=fDO0v;TOeon@dDb5I?gOPjW4t0affA7C9Hkf@+^MOmYY^M zs2Q;6D+_A5)BwenCza!QR0idrJh|5< hr#!FgPT5b6OJ25K7d0X{BA?uVrhLi;e40;N{sV{GO&|aO delta 1721 zcmYL}eNa?Y7{>28FKmP?wt{84upr1c?D8or!Y(DEq2>o9AcJ9rU?`!Hs1U9q1{uk$ zc>l->XA%ZYfq|Kuedvr%8IlD}DpY9BG}HJ;qo&PNHr2h)IZivXdw=sh@7I0rx!d1r z?r$}lR~3?vzoPj0DFe;LUFIkETekEd8wnqj9>LDe*@6eN9BRey~j_fA(d? z!b+bQ7mDANF#%U6?{ip}f4GOv!xyGK!B7f*Yp@!io(p6v4A5rIWL1dP8ZFF%CfdQ- ztj7%39>JEOsJ1(b)eE{E%g!K9J(6-M%9goUu+Zukvy2(gPCU!J0U&odt2cp0HnJO`pd%jU7VW26*-{I% z$Rq5JNRaIlc2u}$&$92xY|PZ%G`;@5zRDA7kB22|K*|5WDF7i8YJ7z@OQn$Kf9Pi@ht{ynoqw;hKmKh@1P!%y(uX zF0FtM;#6qAtl~*x%X8N94@Jhs=lCs#Ip#h&-hEdeb=2f_PdHS4)Vb=0IGUlJ%A^3z zR>~hB*Eo7hP`Ij`H;P@|tmex_IY%w`h@nPa;ant~*~ascz_#;hkx<*h>#$t)`hH#r zGog)F;hbpQ2Y7=Zb33mTRNuj06g2rJe~laOhPJws4+`?>;_F2Jio^U7f?KWfC69rI z`uM0XsQDD%&p^Hdd{?c}SKT|0?0}JZ^g1BjN_gwkS}VDXX!W#}k^ncX5S>6?z-I~64p^2*`vBi0 z(s96!B-#%6HHlgP`v0MraM~_6w%kFxV2wItOkuKw%gNLMt1N}K0>)D40H8RPRKV?2 zssfax$+b+S$r~(5msz6^!I|;!F=fb6?F;1&KVC?CQOA`jxAA4BeB8Dys)V&KOFoO= zvt-i>C)LCH)=6stG1>GI;7~SI0Pbc}DPYAS+5xz@h;{?=b7Vm+hZ>;Rb9Kcyna6Ue s4De5`?6t|IKQF_&=F;aeAlt1UHUoOy)CdUAqY~6<%A*{>r+KvHKe`QWLI3~& From aa783d47eaa4f39828392ab1c1fac33bd7d619d5 Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Tue, 27 Feb 2024 13:07:17 +0530 Subject: [PATCH 19/22] fix: version update (#198) --- build.gradle | 2 +- implementationDependencies.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 6efdb3d4..713fefbe 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ dependencies { implementation group: 'com.zaxxer', name: 'HikariCP', version: '3.4.1' // https://mvnrepository.com/artifact/org.postgresql/postgresql - implementation group: 'org.postgresql', name: 'postgresql', version: '42.7.1' + implementation group: 'org.postgresql', name: 'postgresql', version: '42.7.2' // https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml compileOnly group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.16.1' diff --git a/implementationDependencies.json b/implementationDependencies.json index f0b780d0..a3b16e26 100644 --- a/implementationDependencies.json +++ b/implementationDependencies.json @@ -2,9 +2,9 @@ "_comment": "Contains list of implementation dependencies URL for this project", "list": [ { - "jar": "https://repo1.maven.org/maven2/org/postgresql/postgresql/42.7.1/postgresql-42.7.1.jar", - "name": "PostgreSQL JDBC Driver 42.7.1", - "src": "https://repo1.maven.org/maven2/org/postgresql/postgresql/42.7.1/postgresql-42.7.1-sources.jar" + "jar": "https://repo1.maven.org/maven2/org/postgresql/postgresql/42.7.2/postgresql-42.7.2.jar", + "name": "PostgreSQL JDBC Driver 42.7.2", + "src": "https://repo1.maven.org/maven2/org/postgresql/postgresql/42.7.2/postgresql-42.7.2-sources.jar" }, { "jar": "https://repo1.maven.org/maven2/com/zaxxer/HikariCP/3.4.1/HikariCP-3.4.1.jar", From 969b9451b0099e7b1d500f7d7dd1ce14c5810d7e Mon Sep 17 00:00:00 2001 From: rishabhpoddar Date: Tue, 27 Feb 2024 13:08:15 +0530 Subject: [PATCH 20/22] adding dev-v5.0.8 tag to this commit to ensure building --- jar/postgresql-plugin-5.0.8.jar | Bin 213545 -> 213545 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/jar/postgresql-plugin-5.0.8.jar b/jar/postgresql-plugin-5.0.8.jar index 6c72cc5928c827a365151eb1326fc9a3b7dc6d0b..d1a855bd6fe0aa5d60dd5df094cced1d43cfef0b 100644 GIT binary patch delta 1721 zcmYL}dr(wW9LMiDKiCLaYz517c?m9Wc7X+95m-z_^N|lsUV~wUtf7QPqC&We7-S@~ z;{78loJklo69#5(_RtxfG9(L{RH)FLX{PayMopWkY^r;|=Q!=m?)l93_q@OJyW8Jt z?r$}lS1lvIKt%}%Q2agRU1l2@N9NNuKTmmyqJOyYqkl;Mdg|0*g*IVy_@*8Ka{%EQf7c}G_452 z%=AsG0WGax3E!3NF(JXaONsy69>@23f9p-Yn-h+qfum0lJTJYc3D4H|w+ZFXzU+9I zGRDV*5^!Zyz}1QS9Hz@Z+(YG|3sc@uC`G?DSPf9m1+x_fXw#>&YItjn7G^;a?chw- zV}{ip&6Xmmw%f+)1>KHkXW*xvOku?qqwV3eyf>fnSCm(R6s65KK9#KANu*%4Cz&i- zg`IU^5ZWy#+Zu?pW%(>rX!VO&<}_$0o?*Tqkh_A_n?S=G*^O|}5ifI#@{_G>i3M8B z5%xz6DB=@#R9MfRW#5t6=&8GDs{Fn_$`fjjm!)cB=UJR^dGI+qPMCH`Z}FgehN7Iy zRV~CF+Vv6k{0t;q^dl=0v*`SZHH*05pV^_uVLkR2dq-Fc{$=Nd)kOTXc({+ud}lWN zoJD*9TcQ23il>Mv&sxhr5D^!j<+m96nEm8f_g%f!5tGk7?ojnsXR8|$XqtK|i-NR> zQvLw3#_BCb;_3?CC}wrDhA$WC9JSmlni_tYa}jW68!tov+s`?>z2 z=qr%a#;dU>TK56oAjsU#s|3||@D~J4yun`;53#zF4+!$>;_F5I%ESB-K{YC0{1`G1 z_VE#M&&{X!ev!rhG~ZQgyprnPIb;V6&!N`<8CG%vYORFVPW{kIDMl*whLv0ZYZxsA zRD}^%SRD+b4NyYDsTi<1oHhflh0}8YR|M4p`Xi_Y5E?0cypgmH%48&Y0EJO{KSt3n zqNom#HJ4roT$oD-0c)bk3%D9BeU`*f86Jr&M-;%Ey@cj9E`o$<5>%HQ$y7N9eMHUjP?&>)~Mk(vRqN#p~3mPGA~dnu9kdIk5r_0ymMYgP$J0hE^VA_{0 z@8b7tS+vqc^)P+wqP2jy9C{IOD2FNmcXOx|uwnu209;%^y8(r{GNG1B4N&ZPQaP4K pWl;XfleISG%lo>PFZ;=H%Vq0zQzM+C3aA7d-c&%jfKLl(%YVwY^K$?I delta 1721 zcmY+EZBSHI7{~8953GbNwt{84yb1CSySxgEu#1UksQH4iAcJ9rU?`!Hs1U9q1{uk$ zct2=`GYNxc!obYUUUWvM49S8f6)H4mnrZydsA)5mO?B`896z)(yXQCm|MNWOxz9Ow z`&-TZt!DG8BJ%N96hA+u$6eB8jwWNtd?s37+=~9;#*h9X{aaIKBjx`Iy@^P;nr-*b;@@HRm9ITA- zF`@Wf9TjkG;sJ+s<%j#&dFbMlCm2fMZw*!h)boLCg#p@(8LSG?TBC(ou!(kX7V9y? zwMDXJD5~v_X7z&Z#Idu8Q%@zcVvEuCaBALLPx~s$s{xAA<{h6(Qtu{EpxTo}7OmXI zIxq7A&;-#Vm6=w3E*=ZveOR5%$7N6kPlxD-^Tn{E0P-yuhE?p(o%T|BJmN-28vp1>u^ApAirDk(uwzMqGL! zAHc29ep$tn#gu2Sl(MKdaHBP4e>NxJ)K1XT39K6 zh+O09EkWU`a^5Irb*q{$7v=1=+#{MAeuZ<9aCRFnKmyy&t3^U>3$Md))f@YH5zNFk zUWI$2bsyjjg3Rr_Qc!&de^JoHoBTEL5UV@+fFPePULy9dILxOBs#f`u$5DB(kB^9R zZa&TTiz>cn_^w*RRrk&%8(?@Yy$;B*65cws)=GHo)DNwc4C|(q8~|$wEdo@A5U#K~ z7(yGM1cg#DU~?#K23!xN=K+o|5}WpiQ8kp{a2ewXr*%*!!>I;P5Fz{dB7*9mWX+>D z02k-cLBN_w@&K+y%9y25)COfdN~W)wFSDlRQxmN6XnGlNIa=` zOxpp!CQ}PQ|34HRPTAzdmfL9;tP#76DN2!WC51X*m8H^Fz-THR0IW+R6>ukwssQeE zIhM(E`GD>WnKkkV9GQ=fDO0v;TOeon@dDb5I?gOPjW4t0affA7C9Hkf@+^MOmYY^M zs2Q;6D+_A5)BwenCza!QR0idrJh|5< hr#!FgPT5b6OJ25K7d0X{BA?uVrhLi;e40;N{sV{GO&|aO From 4bf90e0a037cf5312b8f6e3aed76258c6fbcf061 Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Tue, 5 Mar 2024 13:09:25 +0530 Subject: [PATCH 21/22] fix: fixes storage handling for non-auth recipes (#203) * fix: tests * fix: user role table constraint * fix: pr comments * fix: according to updated interface * fix: user roles * fix: version and changelog * fix: plugin interface version --- CHANGELOG.md | 11 ++++++++ build.gradle | 2 +- pluginInterfaceSupported.json | 2 +- .../supertokens/storage/postgresql/Start.java | 15 ++++++++--- .../postgresql/queries/UserRolesQueries.java | 18 ++++++++++--- .../postgresql/test/AccountLinkingTests.java | 4 +-- .../postgresql/test/DbConnectionPoolTest.java | 9 ++++--- .../test/multitenancy/StorageLayerTest.java | 6 ++--- .../TestUserPoolIdChangeBehaviour.java | 27 ++++++++++--------- 9 files changed, 63 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f3aa6c8..8508712a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,17 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [6.0.0] - 2024-03-05 + +- Implements `deleteAllUserRoleAssociationsForRole` +- Drops `(app_id, role)` foreign key constraint on `user_roles` table + +### Migration + +```sql +ALTER TABLE user_roles DROP CONSTRAINT IF EXISTS user_roles_role_fkey; +``` + ## [5.0.8] - 2024-02-19 - Fixes vulnerabilities in dependencies diff --git a/build.gradle b/build.gradle index 713fefbe..baafed34 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id 'java-library' } -version = "5.0.8" +version = "6.0.0" repositories { mavenCentral() diff --git a/pluginInterfaceSupported.json b/pluginInterfaceSupported.json index a5fdc62c..e9d4c148 100644 --- a/pluginInterfaceSupported.json +++ b/pluginInterfaceSupported.json @@ -1,6 +1,6 @@ { "_comment": "contains a list of plugin interfaces branch names that this core supports", "versions": [ - "4.0" + "5.0" ] } \ No newline at end of file diff --git a/src/main/java/io/supertokens/storage/postgresql/Start.java b/src/main/java/io/supertokens/storage/postgresql/Start.java index 86a7e876..796d3027 100644 --- a/src/main/java/io/supertokens/storage/postgresql/Start.java +++ b/src/main/java/io/supertokens/storage/postgresql/Start.java @@ -1930,7 +1930,7 @@ public int deleteUserMetadata(AppIdentifier appIdentifier, String userId) throws @Override public void addRoleToUser(TenantIdentifier tenantIdentifier, String userId, String role) - throws StorageQueryException, UnknownRoleException, DuplicateUserRoleMappingException, + throws StorageQueryException, DuplicateUserRoleMappingException, TenantOrAppNotFoundException { try { UserRolesQueries.addRoleToUser(this, tenantIdentifier, userId, role); @@ -1938,9 +1938,6 @@ public void addRoleToUser(TenantIdentifier tenantIdentifier, String userId, Stri if (e instanceof PSQLException) { PostgreSQLConfig config = Config.getConfig(this); ServerErrorMessage serverErrorMessage = ((PSQLException) e).getServerErrorMessage(); - if (isForeignKeyConstraintError(serverErrorMessage, config.getUserRolesTable(), "role")) { - throw new UnknownRoleException(); - } if (isPrimaryKeyError(serverErrorMessage, config.getUserRolesTable())) { throw new DuplicateUserRoleMappingException(); } @@ -2012,6 +2009,16 @@ public boolean deleteRole(AppIdentifier appIdentifier, String role) throws Stora } } + @Override + public boolean deleteAllUserRoleAssociationsForRole(AppIdentifier appIdentifier, String role) + throws StorageQueryException { + try { + return UserRolesQueries.deleteAllUserRoleAssociationsForRole(this, appIdentifier, role); + } catch (SQLException e) { + throw new StorageQueryException(e); + } + } + @Override public String[] getRoles(AppIdentifier appIdentifier) throws StorageQueryException { try { diff --git a/src/main/java/io/supertokens/storage/postgresql/queries/UserRolesQueries.java b/src/main/java/io/supertokens/storage/postgresql/queries/UserRolesQueries.java index 549cac86..10fcb1a7 100644 --- a/src/main/java/io/supertokens/storage/postgresql/queries/UserRolesQueries.java +++ b/src/main/java/io/supertokens/storage/postgresql/queries/UserRolesQueries.java @@ -17,8 +17,10 @@ package io.supertokens.storage.postgresql.queries; import io.supertokens.pluginInterface.exceptions.StorageQueryException; +import io.supertokens.pluginInterface.exceptions.StorageTransactionLogicException; import io.supertokens.pluginInterface.multitenancy.AppIdentifier; import io.supertokens.pluginInterface.multitenancy.TenantIdentifier; +import io.supertokens.pluginInterface.sqlStorage.TransactionConnection; import io.supertokens.storage.postgresql.Start; import io.supertokens.storage.postgresql.config.Config; import io.supertokens.storage.postgresql.utils.Utils; @@ -91,9 +93,6 @@ public static String getQueryToCreateUserRolesTable(Start start) { + "role VARCHAR(255) NOT NULL," + "CONSTRAINT " + Utils.getConstraintName(schema, tableName, null, "pkey") + " PRIMARY KEY(app_id, tenant_id, user_id, role)," - + "CONSTRAINT " + Utils.getConstraintName(schema, tableName, "role", "fkey") - + " FOREIGN KEY(app_id, role)" - + " REFERENCES " + getConfig(start).getRolesTable() + "(app_id, role) ON DELETE CASCADE," + "CONSTRAINT " + Utils.getConstraintName(schema, tableName, "tenant_id", "fkey") + " FOREIGN KEY (app_id, tenant_id)" + " REFERENCES " + Config.getConfig(start).getTenantsTable() + "(app_id, tenant_id) ON DELETE CASCADE" @@ -142,7 +141,8 @@ public static void addPermissionToRoleOrDoNothingIfExists_Transaction(Start star }); } - public static boolean deleteRole(Start start, AppIdentifier appIdentifier, String role) + public static boolean deleteRole(Start start, AppIdentifier appIdentifier, + String role) throws SQLException, StorageQueryException { String QUERY = "DELETE FROM " + getConfig(start).getRolesTable() + " WHERE app_id = ? AND role = ? ;"; @@ -353,4 +353,14 @@ public static int deleteAllRolesForUser_Transaction(Connection con, Start start, pst.setString(2, userId); }); } + + public static boolean deleteAllUserRoleAssociationsForRole(Start start, AppIdentifier appIdentifier, String role) + throws SQLException, StorageQueryException { + String QUERY = "DELETE FROM " + getConfig(start).getUserRolesTable() + + " WHERE app_id = ? AND role = ? ;"; + return update(start, QUERY, pst -> { + pst.setString(1, appIdentifier.getAppId()); + pst.setString(2, role); + }) >= 1; + } } diff --git a/src/test/java/io/supertokens/storage/postgresql/test/AccountLinkingTests.java b/src/test/java/io/supertokens/storage/postgresql/test/AccountLinkingTests.java index 4f26a52c..580cc049 100644 --- a/src/test/java/io/supertokens/storage/postgresql/test/AccountLinkingTests.java +++ b/src/test/java/io/supertokens/storage/postgresql/test/AccountLinkingTests.java @@ -97,7 +97,7 @@ public void canLinkFailsIfTryingToLinkUsersAcrossDifferentStorageLayers() throws AuthRecipe.createPrimaryUser(process.main, user1.getSupertokensUserId()); AuthRecipeUserInfo user2 = EmailPassword.signUp( - tenantIdentifier.withStorage(StorageLayer.getStorage(tenantIdentifier, process.main)), + tenantIdentifier, (StorageLayer.getStorage(tenantIdentifier, process.main)), process.getProcess(), "test2@example.com", "abcd1234"); try { @@ -135,7 +135,7 @@ public void canLinkFailsIfTryingToLinkUsersAcrossDifferentStorageLayers() throws ); AuthRecipeUserInfo user3 = EmailPassword.signUp( - tenantIdentifier.withStorage(StorageLayer.getStorage(tenantIdentifier, process.main)), + tenantIdentifier, (StorageLayer.getStorage(tenantIdentifier, process.main)), process.getProcess(), "test2@example.com", "abcd1234"); Map params = new HashMap<>(); diff --git a/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java b/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java index cdf0c28c..c89a5ac4 100644 --- a/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java +++ b/src/test/java/io/supertokens/storage/postgresql/test/DbConnectionPoolTest.java @@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import io.supertokens.pluginInterface.Storage; import io.supertokens.pluginInterface.multitenancy.*; import org.junit.AfterClass; import org.junit.Before; @@ -152,8 +153,8 @@ public void testDownTimeWhenChangingConnectionPoolSize() throws Exception { es.execute(() -> { try { TenantIdentifier t1 = new TenantIdentifier(null, null, "t1"); - TenantIdentifierWithStorage t1WithStorage = t1.withStorage(StorageLayer.getStorage(t1, process.getProcess())); - ThirdParty.signInUp(t1WithStorage, process.getProcess(), "google", "googleid"+ finalI, "user" + + Storage t1Storage = (StorageLayer.getStorage(t1, process.getProcess())); + ThirdParty.signInUp(t1, t1Storage, process.getProcess(), "google", "googleid"+ finalI, "user" + finalI + "@example.com"); if (firstErrorTime.get() != -1 && successAfterErrorTime.get() == -1) { @@ -353,8 +354,8 @@ public void testIdleConnectionTimeout() throws Exception { es.execute(() -> { try { TenantIdentifier t1 = new TenantIdentifier(null, null, "t1"); - TenantIdentifierWithStorage t1WithStorage = t1.withStorage(StorageLayer.getStorage(t1, process.getProcess())); - ThirdParty.signInUp(t1WithStorage, process.getProcess(), "google", "googleid"+ finalI, "user" + + Storage t1Storage = (StorageLayer.getStorage(t1, process.getProcess())); + ThirdParty.signInUp(t1, t1Storage, process.getProcess(), "google", "googleid"+ finalI, "user" + finalI + "@example.com"); } catch (StorageQueryException e) { diff --git a/src/test/java/io/supertokens/storage/postgresql/test/multitenancy/StorageLayerTest.java b/src/test/java/io/supertokens/storage/postgresql/test/multitenancy/StorageLayerTest.java index afce4e11..7bca0a99 100644 --- a/src/test/java/io/supertokens/storage/postgresql/test/multitenancy/StorageLayerTest.java +++ b/src/test/java/io/supertokens/storage/postgresql/test/multitenancy/StorageLayerTest.java @@ -788,7 +788,7 @@ public void testTenantCreationAndThenDbDownDbThrowsErrorInRecipesAndDoesntAffect MultitenancyHelper.getInstance(process.getProcess()).refreshTenantsInCoreBasedOnChangesInCoreConfigOrIfTenantListChanged(true); try { - EmailPassword.signIn(tid.withStorage(StorageLayer.getStorage(tid, process.getProcess())), + EmailPassword.signIn(tid, (StorageLayer.getStorage(tid, process.getProcess())), process.getProcess(), "", ""); fail(); } catch (StorageQueryException e) { @@ -801,7 +801,7 @@ public void testTenantCreationAndThenDbDownDbThrowsErrorInRecipesAndDoesntAffect // we do this again just to check that if this function is called again, it fails again and there is no // side effect of calling the above function try { - EmailPassword.signIn(tid.withStorage(StorageLayer.getStorage(tid, process.getProcess())), + EmailPassword.signIn(tid, (StorageLayer.getStorage(tid, process.getProcess())), process.getProcess(), "", ""); fail(); } catch (StorageQueryException e) { @@ -830,7 +830,7 @@ public void testTenantCreationAndThenDbDownDbThrowsErrorInRecipesAndDoesntAffect TenantIdentifier tid = new TenantIdentifier("abc", null, null); try { - EmailPassword.signIn(tid.withStorage(StorageLayer.getStorage(tid, process.getProcess())), + EmailPassword.signIn(tid, (StorageLayer.getStorage(tid, process.getProcess())), process.getProcess(), "", ""); fail(); } catch (StorageQueryException e) { diff --git a/src/test/java/io/supertokens/storage/postgresql/test/multitenancy/TestUserPoolIdChangeBehaviour.java b/src/test/java/io/supertokens/storage/postgresql/test/multitenancy/TestUserPoolIdChangeBehaviour.java index 5a1d7a1f..bc5a791e 100644 --- a/src/test/java/io/supertokens/storage/postgresql/test/multitenancy/TestUserPoolIdChangeBehaviour.java +++ b/src/test/java/io/supertokens/storage/postgresql/test/multitenancy/TestUserPoolIdChangeBehaviour.java @@ -25,6 +25,7 @@ import io.supertokens.multitenancy.Multitenancy; import io.supertokens.multitenancy.exception.BadPermissionException; import io.supertokens.multitenancy.exception.CannotModifyBaseConfigException; +import io.supertokens.pluginInterface.Storage; import io.supertokens.pluginInterface.authRecipe.AuthRecipeUserInfo; import io.supertokens.pluginInterface.exceptions.InvalidConfigException; import io.supertokens.pluginInterface.exceptions.StorageQueryException; @@ -86,13 +87,13 @@ public void testUsersWorkAfterUserPoolIdChanges() throws Exception { coreConfig ), false); - TenantIdentifierWithStorage tenantIdentifierWithStorage = tenantIdentifier.withStorage( + Storage storage = ( StorageLayer.getStorage(tenantIdentifier, process.getProcess())); - String userPoolId = tenantIdentifierWithStorage.getStorage().getUserPoolId(); + String userPoolId = storage.getUserPoolId(); AuthRecipeUserInfo userInfo = EmailPassword.signUp( - tenantIdentifierWithStorage, process.getProcess(), "user@example.com", "password"); + tenantIdentifier, storage, process.getProcess(), "user@example.com", "password"); coreConfig.addProperty("postgresql_host", "127.0.0.1"); Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( @@ -103,12 +104,13 @@ public void testUsersWorkAfterUserPoolIdChanges() throws Exception { coreConfig ), false); - tenantIdentifierWithStorage = tenantIdentifier.withStorage( + storage = ( StorageLayer.getStorage(tenantIdentifier, process.getProcess())); - String userPoolId2 = tenantIdentifierWithStorage.getStorage().getUserPoolId(); + String userPoolId2 = storage.getUserPoolId(); assertNotEquals(userPoolId, userPoolId2); - AuthRecipeUserInfo user2 = EmailPassword.signIn(tenantIdentifierWithStorage, process.getProcess(), + AuthRecipeUserInfo user2 = EmailPassword.signIn( + tenantIdentifier, storage, process.getProcess(), "user@example.com", "password"); assertEquals(userInfo, user2); @@ -130,13 +132,13 @@ public void testUsersWorkAfterUserPoolIdChangesAndServerRestart() throws Excepti coreConfig ), false); - TenantIdentifierWithStorage tenantIdentifierWithStorage = tenantIdentifier.withStorage( + Storage storage = ( StorageLayer.getStorage(tenantIdentifier, process.getProcess())); - String userPoolId = tenantIdentifierWithStorage.getStorage().getUserPoolId(); + String userPoolId = storage.getUserPoolId(); AuthRecipeUserInfo userInfo = EmailPassword.signUp( - tenantIdentifierWithStorage, process.getProcess(), "user@example.com", "password"); + tenantIdentifier, storage, process.getProcess(), "user@example.com", "password"); coreConfig.addProperty("postgresql_host", "127.0.0.1"); Multitenancy.addNewOrUpdateAppOrTenant(process.getProcess(), new TenantConfig( @@ -153,12 +155,13 @@ public void testUsersWorkAfterUserPoolIdChangesAndServerRestart() throws Excepti this.process = TestingProcessManager.start(args); assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); - tenantIdentifierWithStorage = tenantIdentifier.withStorage( + storage = ( StorageLayer.getStorage(tenantIdentifier, process.getProcess())); - String userPoolId2 = tenantIdentifierWithStorage.getStorage().getUserPoolId(); + String userPoolId2 = storage.getUserPoolId(); assertNotEquals(userPoolId, userPoolId2); - AuthRecipeUserInfo user2 = EmailPassword.signIn(tenantIdentifierWithStorage, process.getProcess(), + AuthRecipeUserInfo user2 = EmailPassword.signIn( + tenantIdentifier, storage, process.getProcess(), "user@example.com", "password"); From 7a9cc50b974e0d586e1af14e7e632a87e0784a78 Mon Sep 17 00:00:00 2001 From: rishabhpoddar Date: Tue, 5 Mar 2024 13:40:00 +0530 Subject: [PATCH 22/22] adding dev-v6.0.0 tag to this commit to ensure building --- ...-5.0.8.jar => postgresql-plugin-6.0.0.jar} | Bin 213545 -> 213610 bytes 1 file changed, 0 insertions(+), 0 deletions(-) rename jar/{postgresql-plugin-5.0.8.jar => postgresql-plugin-6.0.0.jar} (79%) diff --git a/jar/postgresql-plugin-5.0.8.jar b/jar/postgresql-plugin-6.0.0.jar similarity index 79% rename from jar/postgresql-plugin-5.0.8.jar rename to jar/postgresql-plugin-6.0.0.jar index d1a855bd6fe0aa5d60dd5df094cced1d43cfef0b..becbc9fa1719dd4cde059d76545a7257bfbfd220 100644 GIT binary patch delta 36179 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 delta 36165 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