Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SNOW-847342: Add connection property for setting browser timeout value #1824

Merged
10 changes: 10 additions & 0 deletions src/main/java/net/snowflake/client/core/SFLoginInput.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,21 @@ public class SFLoginInput {
private boolean disableConsoleLogin = true;
private boolean disableSamlURLCheck = false;

private Duration browserResponseTimeout;

// Additional headers to add for Snowsight.
Map<String, String> additionalHttpHeadersForSnowsight;

SFLoginInput() {}

public Duration getBrowserResponseTimeout() {
sfc-gh-dprzybysz marked this conversation as resolved.
Show resolved Hide resolved
return browserResponseTimeout;
}

public void setBrowserResponseTimeout(int browserResponseTimeout) {
this.browserResponseTimeout = Duration.ofSeconds(browserResponseTimeout);
}

public String getServerUrl() {
return serverUrl;
}
Expand Down
19 changes: 16 additions & 3 deletions src/main/java/net/snowflake/client/core/SFSession.java
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,13 @@ public class SFSession extends SFBaseSession {
*/
private int retryTimeout = 300;

/**
* Max timeout for external browser authentication in seconds
*
* <p>Default: 120
*/
private int browserResponseTimeout = 120;
sfc-gh-dprzybysz marked this conversation as resolved.
Show resolved Hide resolved

// This constructor is used only by tests with no real connection.
// For real connections, the other constructor is always used.
@VisibleForTesting
Expand Down Expand Up @@ -485,6 +492,10 @@ public void addSFSessionProperty(String propertyName, Object propertyValue) thro
setJdbcArrowTreatDecimalAsInt(getBooleanValue(propertyValue));
}
break;
case BROWSER_RESPONSE_TIMEOUT:
if (propertyValue != null) {
browserResponseTimeout = (Integer) propertyValue;
sfc-gh-dprzybysz marked this conversation as resolved.
Show resolved Hide resolved
}
sfc-gh-dprzybysz marked this conversation as resolved.
Show resolved Hide resolved

default:
break;
Expand Down Expand Up @@ -527,7 +538,7 @@ public synchronized void open() throws SFException, SnowflakeSQLException {
+ " application: {}, app id: {}, app version: {}, login timeout: {}, retry timeout: {}, network timeout: {},"
+ " query timeout: {}, tracing: {}, private key file: {}, private key file pwd is {},"
+ " enable_diagnostics: {}, diagnostics_allowlist_path: {},"
+ " session parameters: client store temporary credential: {}, gzip disabled: {}",
+ " session parameters: client store temporary credential: {}, gzip disabled: {}, browser response timeout: {}",
connectionPropertiesMap.get(SFSessionProperty.SERVER_URL),
connectionPropertiesMap.get(SFSessionProperty.ACCOUNT),
connectionPropertiesMap.get(SFSessionProperty.USER),
Expand Down Expand Up @@ -559,7 +570,8 @@ public synchronized void open() throws SFException, SnowflakeSQLException {
connectionPropertiesMap.get(SFSessionProperty.ENABLE_DIAGNOSTICS),
connectionPropertiesMap.get(SFSessionProperty.DIAGNOSTICS_ALLOWLIST_FILE),
sessionParametersMap.get(CLIENT_STORE_TEMPORARY_CREDENTIAL),
connectionPropertiesMap.get(SFSessionProperty.GZIP_DISABLED));
connectionPropertiesMap.get(SFSessionProperty.GZIP_DISABLED),
connectionPropertiesMap.get(SFSessionProperty.BROWSER_RESPONSE_TIMEOUT));

HttpClientSettingsKey httpClientSettingsKey = getHttpClientKey();
logger.debug(
Expand Down Expand Up @@ -617,7 +629,8 @@ 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)
.setBrowserResponseTimeout(browserResponseTimeout);

// Enable or disable OOB telemetry based on connection parameter. Default is disabled.
// The value may still change later when session parameters from the server are read.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,9 @@ public enum SFSessionProperty {
DISABLE_GCS_DEFAULT_CREDENTIALS("disableGcsDefaultCredentials", false, Boolean.class),

JDBC_ARROW_TREAT_DECIMAL_AS_INT("JDBC_ARROW_TREAT_DECIMAL_AS_INT", false, Boolean.class),
DISABLE_SAML_URL_CHECK("disableSamlURLCheck", false, Boolean.class);
DISABLE_SAML_URL_CHECK("disableSamlURLCheck", false, Boolean.class),

BROWSER_RESPONSE_TIMEOUT("BROWSER_RESPONSE_TIMEOUT", false, Integer.class);
sfc-gh-dprzybysz marked this conversation as resolved.
Show resolved Hide resolved

// property key in string
private String propertyKey;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,10 @@ private String generateProofKey() {
return Base64.getEncoder().encodeToString(randomness);
}

private int getBrowserResponseTimeout() {
return (int) loginInput.getBrowserResponseTimeout().toMillis();
}

/**
* Authenticate
*
Expand All @@ -265,6 +269,7 @@ private String generateProofKey() {
void authenticate() throws SFException, SnowflakeSQLException {
ServerSocket ssocket = this.getServerSocket();
try {
ssocket.setSoTimeout(getBrowserResponseTimeout());
sfc-gh-dprzybysz marked this conversation as resolved.
Show resolved Hide resolved
sfc-gh-dprzybysz marked this conversation as resolved.
Show resolved Hide resolved
// main procedure
int port = this.getLocalPort(ssocket);
logger.debug("Listening localhost: {}", port);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,4 +231,16 @@ public void setPrivateKeyFile(String location, String password) {
public void setTracing(String tracing) {
this.properties.put("tracing", tracing);
}

public void setBrowserResponseTimeout(int seconds) {
this.properties.put("BROWSER_RESPONSE_TIMEOUT", Integer.toString(seconds));
}

public int getBrowserResponseTimeout() {
sfc-gh-dprzybysz marked this conversation as resolved.
Show resolved Hide resolved
try {
return Integer.parseInt(properties.getProperty("BROWSER_RESPONSE_TIMEOUT"));
} catch (NumberFormatException e) {
return 0;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,12 @@ public void testSetLoginTimeout() throws SQLException {
ds.setLoginTimeout(10);
assertThat(ds.getLoginTimeout(), is(10));
}

@Test
public void testSetBrowserResponseTimeout() throws SQLException {
SnowflakeBasicDataSource ds = new SnowflakeBasicDataSource();

ds.setBrowserResponseTimeout(10);
assertThat(ds.getBrowserResponseTimeout(), is(10));
}
}
Loading