From 0d4f45344d3e2d23c8d55d9cbc138e5b152aa44b Mon Sep 17 00:00:00 2001 From: Jelena Furundzic Date: Thu, 25 Jul 2024 02:58:14 -0700 Subject: [PATCH 1/6] Added new connection properties for enabling connection caching. By default connection caching is allowed. --- .../snowflake/client/core/SFLoginInput.java | 21 +++++++++++++++++++ .../net/snowflake/client/core/SFSession.java | 19 ++++++++++++++++- .../client/core/SFSessionProperty.java | 6 +++++- .../snowflake/client/core/SessionUtil.java | 6 ++++-- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/snowflake/client/core/SFLoginInput.java b/src/main/java/net/snowflake/client/core/SFLoginInput.java index 18ebfaa57..93e686d84 100644 --- a/src/main/java/net/snowflake/client/core/SFLoginInput.java +++ b/src/main/java/net/snowflake/client/core/SFLoginInput.java @@ -50,6 +50,8 @@ public class SFLoginInput { private boolean disableConsoleLogin = true; private boolean disableSamlURLCheck = false; + private boolean enableClientStoreTemporaryCredential; + private boolean enableClientRequestMfaToken; // Additional headers to add for Snowsight. Map additionalHttpHeadersForSnowsight; @@ -437,4 +439,23 @@ String getHostFromServerUrl() throws SFException { } return url.getHost(); } + + boolean isEnableClientStoreTemporaryCredential() { + return enableClientStoreTemporaryCredential; + } + + SFLoginInput setEnableClientStoreTemporaryCredential( + boolean enableClientStoreTemporaryCredential) { + this.enableClientStoreTemporaryCredential = enableClientStoreTemporaryCredential; + return this; + } + + boolean isEnableClientRequestMfaToken() { + return enableClientRequestMfaToken; + } + + SFLoginInput setEnableClientRequestMfaToken(boolean enableClientRequestMfaToken) { + this.enableClientRequestMfaToken = enableClientRequestMfaToken; + return this; + } } diff --git a/src/main/java/net/snowflake/client/core/SFSession.java b/src/main/java/net/snowflake/client/core/SFSession.java index b8723dc8d..cc825eacc 100644 --- a/src/main/java/net/snowflake/client/core/SFSession.java +++ b/src/main/java/net/snowflake/client/core/SFSession.java @@ -141,6 +141,9 @@ public class SFSession extends SFBaseSession { */ private int retryTimeout = 300; + private boolean enableClientStoreTemporaryCredential = true; + private boolean enableClientRequestMfaToken = true; + // This constructor is used only by tests with no real connection. // For real connections, the other constructor is always used. @VisibleForTesting @@ -501,6 +504,18 @@ public void addSFSessionProperty(String propertyName, Object propertyValue) thro } break; + case ENABLE_CLIENT_STORE_TEMPORARY_CREDENTIAL: + if (propertyValue != null) { + enableClientStoreTemporaryCredential = getBooleanValue(propertyValue); + } + break; + + case ENABLE_CLIENT_REQUEST_MFA_TOKEN: + if (propertyValue != null) { + enableClientRequestMfaToken = getBooleanValue(propertyValue); + } + break; + default: break; } @@ -632,7 +647,9 @@ public synchronized void open() throws SFException, SnowflakeSQLException { connectionPropertiesMap.get(SFSessionProperty.DISABLE_SAML_URL_CHECK) != null ? getBooleanValue( connectionPropertiesMap.get(SFSessionProperty.DISABLE_SAML_URL_CHECK)) - : false); + : false) + .setEnableClientStoreTemporaryCredential(enableClientStoreTemporaryCredential) + .setEnableClientRequestMfaToken(enableClientRequestMfaToken); logger.info( "Connecting to {} Snowflake domain", diff --git a/src/main/java/net/snowflake/client/core/SFSessionProperty.java b/src/main/java/net/snowflake/client/core/SFSessionProperty.java index 4f99e4616..b279b28ff 100644 --- a/src/main/java/net/snowflake/client/core/SFSessionProperty.java +++ b/src/main/java/net/snowflake/client/core/SFSessionProperty.java @@ -94,7 +94,11 @@ public enum SFSessionProperty { "JDBC_DEFAULT_FORMAT_DATE_WITH_TIMEZONE", false, Boolean.class), // Used as a fix for issue SNOW-354859. Remove with snowflake-jdbc version 4.x with BCR changes. - JDBC_GET_DATE_USE_NULL_TIMEZONE("JDBC_GET_DATE_USE_NULL_TIMEZONE", false, Boolean.class); + JDBC_GET_DATE_USE_NULL_TIMEZONE("JDBC_GET_DATE_USE_NULL_TIMEZONE", false, Boolean.class), + + ENABLE_CLIENT_STORE_TEMPORARY_CREDENTIAL("clientStoreTemporaryCredential", false, Boolean.class), + + ENABLE_CLIENT_REQUEST_MFA_TOKEN("clientRequestMfaToken", false, Boolean.class); // property key in string private String propertyKey; diff --git a/src/main/java/net/snowflake/client/core/SessionUtil.java b/src/main/java/net/snowflake/client/core/SessionUtil.java index 6a9db988f..892c5715c 100644 --- a/src/main/java/net/snowflake/client/core/SessionUtil.java +++ b/src/main/java/net/snowflake/client/core/SessionUtil.java @@ -278,7 +278,8 @@ static SFLoginOutput openSession( "missing token or password for opening session"); } if (authenticator.equals(ClientAuthnDTO.AuthenticatorType.EXTERNALBROWSER)) { - if (Constants.getOS() == Constants.OS.MAC || Constants.getOS() == Constants.OS.WINDOWS) { + if ((Constants.getOS() == Constants.OS.MAC || Constants.getOS() == Constants.OS.WINDOWS) + && loginInput.isEnableClientStoreTemporaryCredential()) { // force to set the flag for Mac/Windows users loginInput.getSessionParameters().put(CLIENT_STORE_TEMPORARY_CREDENTIAL, true); } else { @@ -299,7 +300,8 @@ static SFLoginOutput openSession( } if (authenticator.equals(ClientAuthnDTO.AuthenticatorType.USERNAME_PASSWORD_MFA)) { - if (Constants.getOS() == Constants.OS.MAC || Constants.getOS() == Constants.OS.WINDOWS) { + if ((Constants.getOS() == Constants.OS.MAC || Constants.getOS() == Constants.OS.WINDOWS) + && loginInput.isEnableClientRequestMfaToken()) { loginInput.getSessionParameters().put(CLIENT_REQUEST_MFA_TOKEN, true); } } From 9bd05404f4836568902707f429dcb7b46ea30e3c Mon Sep 17 00:00:00 2001 From: Jelena Furundzic Date: Tue, 30 Jul 2024 17:02:01 -0700 Subject: [PATCH 2/6] Added manual tests --- .../client/jdbc/SnowflakeBasicDataSource.java | 15 +++++++++- .../core/SessionUtilExternalBrowserTest.java | 30 +++++++++++++++++++ .../client/core/SnowflakeMFACacheTest.java | 30 +++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/snowflake/client/jdbc/SnowflakeBasicDataSource.java b/src/main/java/net/snowflake/client/jdbc/SnowflakeBasicDataSource.java index a88e48c61..16c19c8d5 100644 --- a/src/main/java/net/snowflake/client/jdbc/SnowflakeBasicDataSource.java +++ b/src/main/java/net/snowflake/client/jdbc/SnowflakeBasicDataSource.java @@ -23,6 +23,7 @@ public class SnowflakeBasicDataSource implements DataSource, Serializable { private static final long serialversionUID = 1L; private static final String AUTHENTICATOR_SNOWFLAKE_JWT = "SNOWFLAKE_JWT"; private static final String AUTHENTICATOR_OAUTH = "OAUTH"; + private static final String AUTHENTICATOR_EXTERNAL_BROWSER = "EXTERNALBROWSER"; private static final String AUTHENTICATOR_USERNAME_PASSWORD_MFA = "USERNAME_PASSWORD_MFA"; private String url; @@ -94,7 +95,8 @@ public Connection getConnection(String username, String password) throws SQLExce } // The driver needs password for OAUTH as part of SNOW-533673 feature request. - if (!AUTHENTICATOR_SNOWFLAKE_JWT.equalsIgnoreCase(authenticator)) { + if (!AUTHENTICATOR_SNOWFLAKE_JWT.equalsIgnoreCase(authenticator) + && !AUTHENTICATOR_EXTERNAL_BROWSER.equalsIgnoreCase(authenticator)) { properties.put(SFSessionProperty.PASSWORD.getPropertyKey(), password); } @@ -380,4 +382,15 @@ public void setJDBCDefaultFormatDateWithTimezone(Boolean jdbcDefaultFormatDateWi public void setGetDateUseNullTimezone(Boolean getDateUseNullTimezone) { this.properties.put("JDBC_GET_DATE_USE_NULL_TIMEZONE", getDateUseNullTimezone); } + + public void setEnableClientRequestMfaToken(boolean enableClientRequestMfaToken) { + this.setAuthenticator(AUTHENTICATOR_USERNAME_PASSWORD_MFA); + this.properties.put("clientRequestMfaToken", enableClientRequestMfaToken); + } + + public void setEnableClientStoreTemporaryCredential( + boolean enableClientStoreTemporaryCredential) { + this.setAuthenticator(AUTHENTICATOR_EXTERNAL_BROWSER); + this.properties.put("clientStoreTemporaryCredential", enableClientStoreTemporaryCredential); + } } diff --git a/src/test/java/net/snowflake/client/core/SessionUtilExternalBrowserTest.java b/src/test/java/net/snowflake/client/core/SessionUtilExternalBrowserTest.java index 15ac840d8..fe9260bc2 100644 --- a/src/test/java/net/snowflake/client/core/SessionUtilExternalBrowserTest.java +++ b/src/test/java/net/snowflake/client/core/SessionUtilExternalBrowserTest.java @@ -22,10 +22,17 @@ import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Map; +import net.snowflake.client.AbstractDriverIT; +import net.snowflake.client.jdbc.SnowflakeBasicDataSource; import net.snowflake.client.jdbc.SnowflakeSQLException; import net.snowflake.common.core.ClientAuthnDTO; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; +import org.junit.Ignore; import org.junit.Test; import org.mockito.MockedStatic; import org.mockito.Mockito; @@ -237,4 +244,27 @@ private SFLoginInput initMockLoginInput() { when(loginInput.getDisableConsoleLogin()).thenReturn(true); return loginInput; } + + // Run this test manually to test disabling storing temporary credetials with external browser + // auth. This is valid for versions after 3.18.0. + @Test + @Ignore + public void testEnableClientStoreTemporaryCredential() throws Exception { + Map params = AbstractDriverIT.getConnectionParameters(); + SnowflakeBasicDataSource ds = new SnowflakeBasicDataSource(); + ds.setServerName(params.get("host")); + ds.setAccount(params.get("account")); + ds.setPortNumber(Integer.parseInt(params.get("port"))); + ds.setUser(params.get("user")); + ds.setEnableClientStoreTemporaryCredential(false); + + try (Connection con = ds.getConnection()) { + Statement stmt = con.createStatement(); + for (int i = 0; i < 3; i++) { + try (ResultSet rs = stmt.executeQuery("SELECT CURRENT_USER()")) { + assertTrue(rs.next()); + } + } + } + } } diff --git a/src/test/java/net/snowflake/client/core/SnowflakeMFACacheTest.java b/src/test/java/net/snowflake/client/core/SnowflakeMFACacheTest.java index 0dd691ed3..0e3792fa9 100644 --- a/src/test/java/net/snowflake/client/core/SnowflakeMFACacheTest.java +++ b/src/test/java/net/snowflake/client/core/SnowflakeMFACacheTest.java @@ -20,12 +20,18 @@ import java.io.StringWriter; import java.sql.Connection; import java.sql.DriverManager; +import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; +import java.util.Map; import java.util.Properties; +import net.snowflake.client.AbstractDriverIT; +import net.snowflake.client.jdbc.SnowflakeBasicDataSource; import net.snowflake.client.jdbc.SnowflakeSQLException; import org.apache.commons.io.IOUtils; import org.apache.http.client.methods.HttpPost; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import org.mockito.MockedStatic; import org.mockito.Mockito; @@ -327,4 +333,28 @@ public void testUnavailableLocalSecureStorage() throws SQLException { CredentialManager.getInstance().resetSecureStorageManager(); } } + + // Run this test manually to test disabling the client request MFA token. Use an MFA + // authentication enabled user. This is valid for versions after 3.18.0. + @Test + @Ignore + public void testEnableClientRequestMfaToken() throws SQLException { + Map params = AbstractDriverIT.getConnectionParameters(); + SnowflakeBasicDataSource ds = new SnowflakeBasicDataSource(); + ds.setServerName(params.get("host")); + ds.setAccount(params.get("account")); + ds.setPortNumber(Integer.parseInt(params.get("port"))); + ds.setUser(params.get("user")); + ds.setPassword(params.get("password")); + ds.setEnableClientRequestMfaToken(false); + + try (Connection con = ds.getConnection()) { + for (int i = 0; i < 3; i++) { + try (Statement stmt = con.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT CURRENT_USER()")) { + assertTrue(rs.next()); + } + } + } + } } From c665821ba03fe6a092ab60bd9600276e237fdca6 Mon Sep 17 00:00:00 2001 From: Jelena Furundzic Date: Tue, 13 Aug 2024 15:02:19 -0700 Subject: [PATCH 3/6] Fix merge --- .../net/snowflake/client/core/SFSession.java | 4 +- .../client/jdbc/SnowflakeBasicDataSource.java | 4 -- .../core/SessionUtilExternalBrowserTest.java | 38 +++++++++---------- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/main/java/net/snowflake/client/core/SFSession.java b/src/main/java/net/snowflake/client/core/SFSession.java index d7f9a918f..097860f50 100644 --- a/src/main/java/net/snowflake/client/core/SFSession.java +++ b/src/main/java/net/snowflake/client/core/SFSession.java @@ -141,17 +141,15 @@ public class SFSession extends SFBaseSession { */ private int retryTimeout = 300; -<<<<<<< HEAD private boolean enableClientStoreTemporaryCredential = true; private boolean enableClientRequestMfaToken = true; -======= + /** * Max timeout for external browser authentication in seconds * *

Default: 120 */ private Duration browserResponseTimeout = Duration.ofSeconds(120); ->>>>>>> master // This constructor is used only by tests with no real connection. // For real connections, the other constructor is always used. diff --git a/src/main/java/net/snowflake/client/jdbc/SnowflakeBasicDataSource.java b/src/main/java/net/snowflake/client/jdbc/SnowflakeBasicDataSource.java index 45605c360..55c911451 100644 --- a/src/main/java/net/snowflake/client/jdbc/SnowflakeBasicDataSource.java +++ b/src/main/java/net/snowflake/client/jdbc/SnowflakeBasicDataSource.java @@ -23,13 +23,9 @@ public class SnowflakeBasicDataSource implements DataSource, Serializable { private static final long serialversionUID = 1L; private static final String AUTHENTICATOR_SNOWFLAKE_JWT = "SNOWFLAKE_JWT"; private static final String AUTHENTICATOR_OAUTH = "OAUTH"; -<<<<<<< HEAD - private static final String AUTHENTICATOR_EXTERNAL_BROWSER = "EXTERNALBROWSER"; -======= private static final String AUTHENTICATOR_EXTERNAL_BROWSER = "EXTERNALBROWSER"; ->>>>>>> master private static final String AUTHENTICATOR_USERNAME_PASSWORD_MFA = "USERNAME_PASSWORD_MFA"; private String url; diff --git a/src/test/java/net/snowflake/client/core/SessionUtilExternalBrowserTest.java b/src/test/java/net/snowflake/client/core/SessionUtilExternalBrowserTest.java index bc16250c8..5b7ff4140 100644 --- a/src/test/java/net/snowflake/client/core/SessionUtilExternalBrowserTest.java +++ b/src/test/java/net/snowflake/client/core/SessionUtilExternalBrowserTest.java @@ -269,24 +269,24 @@ public void testEnableClientStoreTemporaryCredential() throws Exception { } } - // Run this test manually to confirm external browser timeout is working. When test runs it will - // open a browser window for authentication, close the window, and you should get the expected - // error message within the set timeout. Valid for driver versions after 3.18.0. - @Test - @Ignore - public void testExternalBrowserTimeout() throws Exception { - Map params = AbstractDriverIT.getConnectionParameters(); - SnowflakeBasicDataSource ds = new SnowflakeBasicDataSource(); - ds.setServerName(params.get("host")); - ds.setAccount(params.get("account")); - ds.setPortNumber(Integer.parseInt(params.get("port"))); - ds.setUser(params.get("user")); - ds.setBrowserResponseTimeout(10); - try { - ds.getConnection(); - fail(); - } catch (SnowflakeSQLLoggedException e) { - assertTrue(e.getMessage().contains("External browser authentication failed")); - } + // Run this test manually to confirm external browser timeout is working. When test runs it will + // open a browser window for authentication, close the window, and you should get the expected + // error message within the set timeout. Valid for driver versions after 3.18.0. + @Test + @Ignore + public void testExternalBrowserTimeout() throws Exception { + Map params = AbstractDriverIT.getConnectionParameters(); + SnowflakeBasicDataSource ds = new SnowflakeBasicDataSource(); + ds.setServerName(params.get("host")); + ds.setAccount(params.get("account")); + ds.setPortNumber(Integer.parseInt(params.get("port"))); + ds.setUser(params.get("user")); + ds.setBrowserResponseTimeout(10); + try { + ds.getConnection(); + fail(); + } catch (SnowflakeSQLLoggedException e) { + assertTrue(e.getMessage().contains("External browser authentication failed")); } + } } From 663949da12a3ea1e44aee0b58afa5abda3ef26db Mon Sep 17 00:00:00 2001 From: Jelena Furundzic Date: Tue, 13 Aug 2024 19:22:41 -0700 Subject: [PATCH 4/6] Code review changes --- .../client/jdbc/SnowflakeBasicDataSource.java | 8 ++++++-- .../client/core/SessionUtilExternalBrowserTest.java | 11 ++++------- .../snowflake/client/core/SnowflakeMFACacheTest.java | 11 ++++------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/snowflake/client/jdbc/SnowflakeBasicDataSource.java b/src/main/java/net/snowflake/client/jdbc/SnowflakeBasicDataSource.java index 55c911451..d6e7b4fe0 100644 --- a/src/main/java/net/snowflake/client/jdbc/SnowflakeBasicDataSource.java +++ b/src/main/java/net/snowflake/client/jdbc/SnowflakeBasicDataSource.java @@ -388,13 +388,17 @@ public void setGetDateUseNullTimezone(Boolean getDateUseNullTimezone) { public void setEnableClientRequestMfaToken(boolean enableClientRequestMfaToken) { this.setAuthenticator(AUTHENTICATOR_USERNAME_PASSWORD_MFA); - this.properties.put("clientRequestMfaToken", enableClientRequestMfaToken); + this.properties.put( + SFSessionProperty.ENABLE_CLIENT_REQUEST_MFA_TOKEN.getPropertyKey(), + enableClientRequestMfaToken); } public void setEnableClientStoreTemporaryCredential( boolean enableClientStoreTemporaryCredential) { this.setAuthenticator(AUTHENTICATOR_EXTERNAL_BROWSER); - this.properties.put("clientStoreTemporaryCredential", enableClientStoreTemporaryCredential); + this.properties.put( + SFSessionProperty.ENABLE_CLIENT_STORE_TEMPORARY_CREDENTIAL.getPropertyKey(), + enableClientStoreTemporaryCredential); } public void setBrowserResponseTimeout(int seconds) { diff --git a/src/test/java/net/snowflake/client/core/SessionUtilExternalBrowserTest.java b/src/test/java/net/snowflake/client/core/SessionUtilExternalBrowserTest.java index 5b7ff4140..2ba00f378 100644 --- a/src/test/java/net/snowflake/client/core/SessionUtilExternalBrowserTest.java +++ b/src/test/java/net/snowflake/client/core/SessionUtilExternalBrowserTest.java @@ -24,7 +24,6 @@ import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.ResultSet; -import java.sql.Statement; import java.util.Map; import net.snowflake.client.AbstractDriverIT; import net.snowflake.client.jdbc.SnowflakeBasicDataSource; @@ -259,12 +258,10 @@ public void testEnableClientStoreTemporaryCredential() throws Exception { ds.setUser(params.get("user")); ds.setEnableClientStoreTemporaryCredential(false); - try (Connection con = ds.getConnection()) { - Statement stmt = con.createStatement(); - for (int i = 0; i < 3; i++) { - try (ResultSet rs = stmt.executeQuery("SELECT CURRENT_USER()")) { - assertTrue(rs.next()); - } + for (int i = 0; i < 3; i++) { + try (Connection con = ds.getConnection(); + ResultSet rs = con.createStatement().executeQuery("SELECT 1")) { + assertTrue(rs.next()); } } } diff --git a/src/test/java/net/snowflake/client/core/SnowflakeMFACacheTest.java b/src/test/java/net/snowflake/client/core/SnowflakeMFACacheTest.java index 0e3792fa9..f1f0a3e73 100644 --- a/src/test/java/net/snowflake/client/core/SnowflakeMFACacheTest.java +++ b/src/test/java/net/snowflake/client/core/SnowflakeMFACacheTest.java @@ -22,7 +22,6 @@ import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Statement; import java.util.Map; import java.util.Properties; import net.snowflake.client.AbstractDriverIT; @@ -348,12 +347,10 @@ public void testEnableClientRequestMfaToken() throws SQLException { ds.setPassword(params.get("password")); ds.setEnableClientRequestMfaToken(false); - try (Connection con = ds.getConnection()) { - for (int i = 0; i < 3; i++) { - try (Statement stmt = con.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT CURRENT_USER()")) { - assertTrue(rs.next()); - } + for (int i = 0; i < 3; i++) { + try (Connection con = ds.getConnection(); + ResultSet rs = con.createStatement().executeQuery("SELECT 1")) { + assertTrue(rs.next()); } } } From 313f224457535331dd6994139b9fe4925e83b4db Mon Sep 17 00:00:00 2001 From: Jelena Furundzic Date: Wed, 28 Aug 2024 14:10:51 -0700 Subject: [PATCH 5/6] Added TODO comment to eventually remove Ignore from test case --- src/test/java/net/snowflake/client/jdbc/ConnectionIT.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/net/snowflake/client/jdbc/ConnectionIT.java b/src/test/java/net/snowflake/client/jdbc/ConnectionIT.java index 58a1a8426..c63b78034 100644 --- a/src/test/java/net/snowflake/client/jdbc/ConnectionIT.java +++ b/src/test/java/net/snowflake/client/jdbc/ConnectionIT.java @@ -1022,6 +1022,7 @@ private Properties setCommonConnectionParameters(boolean validateDefaultParamete return kvMap2Properties(params, validateDefaultParameters); } + // TODO: This is a temporary Ignore to unblock merging PRs until ORG account is unlocked. @Ignore @Test public void testFailOverOrgAccount() throws SQLException { From 3797534403bb138c3d7cf4d277c97d77628c2b8e Mon Sep 17 00:00:00 2001 From: Jelena Furundzic Date: Wed, 28 Aug 2024 14:21:08 -0700 Subject: [PATCH 6/6] Fix accidental delete --- src/main/java/net/snowflake/client/core/SFSessionProperty.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/net/snowflake/client/core/SFSessionProperty.java b/src/main/java/net/snowflake/client/core/SFSessionProperty.java index b1eac03c1..97c0adbc2 100644 --- a/src/main/java/net/snowflake/client/core/SFSessionProperty.java +++ b/src/main/java/net/snowflake/client/core/SFSessionProperty.java @@ -104,6 +104,8 @@ public enum SFSessionProperty { // Used as a fix for issue SNOW-354859. Remove with snowflake-jdbc version 4.x with BCR changes. JDBC_GET_DATE_USE_NULL_TIMEZONE("JDBC_GET_DATE_USE_NULL_TIMEZONE", false, Boolean.class), + BROWSER_RESPONSE_TIMEOUT("BROWSER_RESPONSE_TIMEOUT", false, Integer.class), + ENABLE_CLIENT_STORE_TEMPORARY_CREDENTIAL("clientStoreTemporaryCredential", false, Boolean.class), ENABLE_CLIENT_REQUEST_MFA_TOKEN("clientRequestMfaToken", false, Boolean.class),