From e19d2c3f3f4cd9e1ba7c1cfee1b2cc7007b6d5f6 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 20 May 2026 16:02:06 -0400 Subject: [PATCH 1/4] chore(bqjdbc): log connection properties set by the user --- .../bigquery/jdbc/BigQueryConnection.java | 18 +++++++ .../cloud/bigquery/jdbc/DataSource.java | 2 +- .../bigquery/jdbc/BigQueryConnectionTest.java | 51 +++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 2792991b871f..5af1079fd798 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -152,6 +152,24 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { this.connectionId = UUID.randomUUID().toString(); try (BigQueryJdbcMdc.MdcCloseable mdc = BigQueryJdbcMdc.registerInstance(this.connectionId)) { this.connectionUrl = url; + if (LOG.isLoggable(java.util.logging.Level.INFO)) { + Properties connectionProps = ds.createProperties(); + Properties maskedProps = new Properties(); + for (String name : connectionProps.stringPropertyNames()) { + String value = connectionProps.getProperty(name); + String lowerName = name.toLowerCase(); + if ((lowerName.contains("key") + || lowerName.contains("token") + || lowerName.contains("password") + || lowerName.contains("pwd") + || lowerName.contains("secret")) + && !lowerName.equals("partnertoken")) { + value = "*****"; + } + maskedProps.setProperty(name, value); + } + LOG.info("Connection properties: %s", maskedProps.toString()); + } this.openStatements = ConcurrentHashMap.newKeySet(); this.autoCommit = true; this.sqlWarnings = new ArrayList<>(); diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index 82c14a41fbdb..4ad4e094338c 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -392,7 +392,7 @@ public Connection getConnection() throws SQLException { return DriverManager.getConnection(getURL(), createProperties()); } - private Properties createProperties() { + Properties createProperties() { Properties connectionProperties = new Properties(); if (this.projectId != null) { connectionProperties.setProperty( diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index dd6ceb0deceb..a05747d7c8bf 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -456,4 +456,55 @@ public void testIsReadOnlyTokenProvided(String readonlyProp, boolean expectedIsR assertEquals(expectedIsReadOnly, connection.isReadOnlyTokenUsed()); } } + + @Test + public void testConnectionPropertiesLoggingAndMasking() throws IOException, SQLException { + java.util.logging.Logger rootLogger = BigQueryJdbcRootLogger.getRootLogger(); + java.util.logging.Level originalLevel = rootLogger.getLevel(); + rootLogger.setLevel(java.util.logging.Level.INFO); + + java.util.List records = new java.util.ArrayList<>(); + java.util.logging.Handler handler = + new java.util.logging.Handler() { + @Override + public void publish(java.util.logging.LogRecord record) { + records.add(record); + } + + @Override + public void flush() {} + + @Override + public void close() throws SecurityException {} + }; + rootLogger.addHandler(handler); + + try { + String url = + "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + + "OAuthType=2;ProjectId=MyTestProjectId;" + + "OAuthAccessToken=secretAccessToken;Location=US;" + + "PartnerToken=GPN:secretPartnerToken;"; + try (BigQueryConnection connection = new BigQueryConnection(url)) { + // Just trigger the constructor + } + + boolean foundLog = false; + for (java.util.logging.LogRecord record : records) { + if (record.getMessage().contains("Connection properties:")) { + foundLog = true; + String logMessage = record.getMessage(); + assertTrue(logMessage.contains("ProjectId=MyTestProjectId")); + assertTrue(logMessage.contains("Location=US")); + assertTrue(logMessage.contains("OAuthAccessToken=*****")); + assertTrue(logMessage.contains("PartnerToken= (GPN:secretPartnerToken)")); + assertFalse(logMessage.contains("secretAccessToken")); + } + } + assertTrue(foundLog, "Log message about Connection properties was not found"); + } finally { + rootLogger.removeHandler(handler); + rootLogger.setLevel(originalLevel); + } + } } From 396e6270888eb4da950fb6ae1100ab59d6abe814 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 20 May 2026 16:03:03 -0400 Subject: [PATCH 2/4] nit --- .../com/google/cloud/bigquery/jdbc/BigQueryConnection.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 5af1079fd798..416261983e70 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -152,7 +152,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { this.connectionId = UUID.randomUUID().toString(); try (BigQueryJdbcMdc.MdcCloseable mdc = BigQueryJdbcMdc.registerInstance(this.connectionId)) { this.connectionUrl = url; - if (LOG.isLoggable(java.util.logging.Level.INFO)) { + if (LOG.isLoggable(java.util.logging.Level.CONFIG)) { Properties connectionProps = ds.createProperties(); Properties maskedProps = new Properties(); for (String name : connectionProps.stringPropertyNames()) { @@ -168,7 +168,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { } maskedProps.setProperty(name, value); } - LOG.info("Connection properties: %s", maskedProps.toString()); + LOG.config("Connection properties: %s", maskedProps.toString()); } this.openStatements = ConcurrentHashMap.newKeySet(); this.autoCommit = true; From 331cb3722422808f431e2493b2e334610bb11739 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 21 May 2026 10:41:35 -0400 Subject: [PATCH 3/4] fix --- .../bigquery/jdbc/BigQueryConnection.java | 70 +++++++++++++++++-- .../bigquery/jdbc/BigQueryConnectionTest.java | 3 +- 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 416261983e70..5c4ba83ede6f 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -41,6 +41,7 @@ import com.google.cloud.bigquery.storage.v1.BigQueryWriteClient; import com.google.cloud.bigquery.storage.v1.BigQueryWriteSettings; import com.google.cloud.http.HttpTransportOptions; +import com.google.common.collect.ImmutableSet; import java.io.IOException; import java.io.InputStream; import java.sql.CallableStatement; @@ -76,6 +77,68 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { private final String connectionId; private static final String DEFAULT_JDBC_TOKEN_VALUE = "Google-BigQuery-JDBC-Driver"; private static final String DEFAULT_VERSION = "0.0.0"; + private static final Set SAFE_TO_LOG_PROPERTIES = + ImmutableSet.of( + BigQueryJdbcUrlUtility.PROJECT_ID_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.DEFAULT_DATASET_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.LOCATION_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.HTAPI_MIN_TABLE_SIZE_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.HTAPI_ACTIVATION_RATIO_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.KMS_KEY_NAME_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.QUERY_PROPERTIES_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.LOG_LEVEL_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.LOG_PATH_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.OAUTH_TYPE_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.QUERY_DIALECT_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.LARGE_RESULTS_TABLE_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.LARGE_RESULTS_DATASET_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.DESTINATION_DATASET_EXPIRATION_TIME_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.PROXY_PORT_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.JOB_CREATION_MODE_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.MAX_RESULTS_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.PARTNER_TOKEN_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.ENDPOINT_OVERRIDES_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.PRIVATE_SERVICE_CONNECT_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.RETRY_TIMEOUT_IN_SECS_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.JOB_TIMEOUT_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.RETRY_INITIAL_DELAY_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.RETRY_MAX_DELAY_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.ADDITIONAL_PROJECTS_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.CONNECTION_POOL_SIZE_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.LISTENER_POOL_SIZE_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.SWA_APPEND_ROW_COUNT_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.SWA_ACTIVATION_ROW_COUNT_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.MAX_BYTES_BILLED_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.LABELS_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.REQUEST_REASON_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.HTTP_CONNECT_TIMEOUT_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.HTTP_READ_TIMEOUT_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.BYOID_AUDIENCE_URI_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.BYOID_CREDENTIAL_SOURCE_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.BYOID_POOL_USER_PROJECT_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.BYOID_SA_IMPERSONATION_URI_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.BYOID_SUBJECT_TOKEN_TYPE_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.BYOID_TOKEN_URI_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_EMAIL_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_CHAIN_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_SCOPES_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.OAUTH_SA_EMAIL_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME.toLowerCase(), + BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME.toLowerCase()); private HeaderProvider headerProvider; BigQueryReadClient bigQueryReadClient = null; BigQueryWriteClient bigQueryWriteClient = null; @@ -158,12 +221,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { for (String name : connectionProps.stringPropertyNames()) { String value = connectionProps.getProperty(name); String lowerName = name.toLowerCase(); - if ((lowerName.contains("key") - || lowerName.contains("token") - || lowerName.contains("password") - || lowerName.contains("pwd") - || lowerName.contains("secret")) - && !lowerName.equals("partnertoken")) { + if (!SAFE_TO_LOG_PROPERTIES.contains(lowerName)) { value = "*****"; } maskedProps.setProperty(name, value); diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index a05747d7c8bf..cf7ccfe11ef5 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -461,7 +461,7 @@ public void testIsReadOnlyTokenProvided(String readonlyProp, boolean expectedIsR public void testConnectionPropertiesLoggingAndMasking() throws IOException, SQLException { java.util.logging.Logger rootLogger = BigQueryJdbcRootLogger.getRootLogger(); java.util.logging.Level originalLevel = rootLogger.getLevel(); - rootLogger.setLevel(java.util.logging.Level.INFO); + rootLogger.setLevel(java.util.logging.Level.CONFIG); java.util.List records = new java.util.ArrayList<>(); java.util.logging.Handler handler = @@ -497,7 +497,6 @@ public void close() throws SecurityException {} assertTrue(logMessage.contains("ProjectId=MyTestProjectId")); assertTrue(logMessage.contains("Location=US")); assertTrue(logMessage.contains("OAuthAccessToken=*****")); - assertTrue(logMessage.contains("PartnerToken= (GPN:secretPartnerToken)")); assertFalse(logMessage.contains("secretAccessToken")); } } From fe51c8653dc781c312f5b3df0e27eaebdc1a548f Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 21 May 2026 12:38:59 -0400 Subject: [PATCH 4/4] use ImmutableSortedSet --- .../bigquery/jdbc/BigQueryConnection.java | 129 +++++++++--------- .../bigquery/jdbc/BigQueryConnectionTest.java | 56 +++----- 2 files changed, 86 insertions(+), 99 deletions(-) diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 5c4ba83ede6f..9e40aaa3db5a 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -41,7 +41,7 @@ import com.google.cloud.bigquery.storage.v1.BigQueryWriteClient; import com.google.cloud.bigquery.storage.v1.BigQueryWriteSettings; import com.google.cloud.http.HttpTransportOptions; -import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSortedSet; import java.io.IOException; import java.io.InputStream; import java.sql.CallableStatement; @@ -78,67 +78,69 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { private static final String DEFAULT_JDBC_TOKEN_VALUE = "Google-BigQuery-JDBC-Driver"; private static final String DEFAULT_VERSION = "0.0.0"; private static final Set SAFE_TO_LOG_PROPERTIES = - ImmutableSet.of( - BigQueryJdbcUrlUtility.PROJECT_ID_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.DEFAULT_DATASET_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.LOCATION_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.HTAPI_MIN_TABLE_SIZE_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.HTAPI_ACTIVATION_RATIO_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.KMS_KEY_NAME_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.QUERY_PROPERTIES_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.LOG_LEVEL_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.LOG_PATH_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.OAUTH_TYPE_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.QUERY_DIALECT_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.LARGE_RESULTS_TABLE_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.LARGE_RESULTS_DATASET_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.DESTINATION_DATASET_EXPIRATION_TIME_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.PROXY_PORT_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.JOB_CREATION_MODE_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.MAX_RESULTS_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.PARTNER_TOKEN_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.ENDPOINT_OVERRIDES_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.PRIVATE_SERVICE_CONNECT_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.RETRY_TIMEOUT_IN_SECS_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.JOB_TIMEOUT_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.RETRY_INITIAL_DELAY_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.RETRY_MAX_DELAY_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.ADDITIONAL_PROJECTS_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.CONNECTION_POOL_SIZE_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.LISTENER_POOL_SIZE_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.SWA_APPEND_ROW_COUNT_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.SWA_ACTIVATION_ROW_COUNT_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.MAX_BYTES_BILLED_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.LABELS_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.REQUEST_REASON_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.HTTP_CONNECT_TIMEOUT_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.HTTP_READ_TIMEOUT_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.BYOID_AUDIENCE_URI_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.BYOID_CREDENTIAL_SOURCE_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.BYOID_POOL_USER_PROJECT_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.BYOID_SA_IMPERSONATION_URI_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.BYOID_SUBJECT_TOKEN_TYPE_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.BYOID_TOKEN_URI_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_EMAIL_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_CHAIN_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_SCOPES_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.OAUTH_SA_EMAIL_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME.toLowerCase(), - BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME.toLowerCase()); + ImmutableSortedSet.orderedBy(String.CASE_INSENSITIVE_ORDER) + .add( + BigQueryJdbcUrlUtility.PROJECT_ID_PROPERTY_NAME, + BigQueryJdbcUrlUtility.DEFAULT_DATASET_PROPERTY_NAME, + BigQueryJdbcUrlUtility.LOCATION_PROPERTY_NAME, + BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME, + BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME, + BigQueryJdbcUrlUtility.HTAPI_MIN_TABLE_SIZE_PROPERTY_NAME, + BigQueryJdbcUrlUtility.HTAPI_ACTIVATION_RATIO_PROPERTY_NAME, + BigQueryJdbcUrlUtility.KMS_KEY_NAME_PROPERTY_NAME, + BigQueryJdbcUrlUtility.QUERY_PROPERTIES_NAME, + BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME, + BigQueryJdbcUrlUtility.LOG_LEVEL_PROPERTY_NAME, + BigQueryJdbcUrlUtility.LOG_PATH_PROPERTY_NAME, + BigQueryJdbcUrlUtility.OAUTH_TYPE_PROPERTY_NAME, + BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME, + BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME, + BigQueryJdbcUrlUtility.QUERY_DIALECT_PROPERTY_NAME, + BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME, + BigQueryJdbcUrlUtility.LARGE_RESULTS_TABLE_PROPERTY_NAME, + BigQueryJdbcUrlUtility.LARGE_RESULTS_DATASET_PROPERTY_NAME, + BigQueryJdbcUrlUtility.DESTINATION_DATASET_EXPIRATION_TIME_PROPERTY_NAME, + BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME, + BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME, + BigQueryJdbcUrlUtility.PROXY_PORT_PROPERTY_NAME, + BigQueryJdbcUrlUtility.JOB_CREATION_MODE_PROPERTY_NAME, + BigQueryJdbcUrlUtility.MAX_RESULTS_PROPERTY_NAME, + BigQueryJdbcUrlUtility.PARTNER_TOKEN_PROPERTY_NAME, + BigQueryJdbcUrlUtility.ENDPOINT_OVERRIDES_PROPERTY_NAME, + BigQueryJdbcUrlUtility.PRIVATE_SERVICE_CONNECT_PROPERTY_NAME, + BigQueryJdbcUrlUtility.METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME, + BigQueryJdbcUrlUtility.RETRY_TIMEOUT_IN_SECS_PROPERTY_NAME, + BigQueryJdbcUrlUtility.JOB_TIMEOUT_PROPERTY_NAME, + BigQueryJdbcUrlUtility.RETRY_INITIAL_DELAY_PROPERTY_NAME, + BigQueryJdbcUrlUtility.RETRY_MAX_DELAY_PROPERTY_NAME, + BigQueryJdbcUrlUtility.ADDITIONAL_PROJECTS_PROPERTY_NAME, + BigQueryJdbcUrlUtility.CONNECTION_POOL_SIZE_PROPERTY_NAME, + BigQueryJdbcUrlUtility.LISTENER_POOL_SIZE_PROPERTY_NAME, + BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME, + BigQueryJdbcUrlUtility.SWA_APPEND_ROW_COUNT_PROPERTY_NAME, + BigQueryJdbcUrlUtility.SWA_ACTIVATION_ROW_COUNT_PROPERTY_NAME, + BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME, + BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME, + BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROPERTY_NAME, + BigQueryJdbcUrlUtility.MAX_BYTES_BILLED_PROPERTY_NAME, + BigQueryJdbcUrlUtility.LABELS_PROPERTY_NAME, + BigQueryJdbcUrlUtility.REQUEST_REASON_PROPERTY_NAME, + BigQueryJdbcUrlUtility.HTTP_CONNECT_TIMEOUT_PROPERTY_NAME, + BigQueryJdbcUrlUtility.HTTP_READ_TIMEOUT_PROPERTY_NAME, + BigQueryJdbcUrlUtility.BYOID_AUDIENCE_URI_PROPERTY_NAME, + BigQueryJdbcUrlUtility.BYOID_CREDENTIAL_SOURCE_PROPERTY_NAME, + BigQueryJdbcUrlUtility.BYOID_POOL_USER_PROJECT_PROPERTY_NAME, + BigQueryJdbcUrlUtility.BYOID_SA_IMPERSONATION_URI_PROPERTY_NAME, + BigQueryJdbcUrlUtility.BYOID_SUBJECT_TOKEN_TYPE_PROPERTY_NAME, + BigQueryJdbcUrlUtility.BYOID_TOKEN_URI_PROPERTY_NAME, + BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_EMAIL_PROPERTY_NAME, + BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_CHAIN_PROPERTY_NAME, + BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_SCOPES_PROPERTY_NAME, + BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_PROPERTY_NAME, + BigQueryJdbcUrlUtility.OAUTH_SA_EMAIL_PROPERTY_NAME, + BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME, + BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME) + .build(); private HeaderProvider headerProvider; BigQueryReadClient bigQueryReadClient = null; BigQueryWriteClient bigQueryWriteClient = null; @@ -220,8 +222,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { Properties maskedProps = new Properties(); for (String name : connectionProps.stringPropertyNames()) { String value = connectionProps.getProperty(name); - String lowerName = name.toLowerCase(); - if (!SAFE_TO_LOG_PROPERTIES.contains(lowerName)) { + if (!SAFE_TO_LOG_PROPERTIES.contains(name)) { value = "*****"; } maskedProps.setProperty(name, value); diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index cf7ccfe11ef5..252d252588bc 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -29,13 +29,17 @@ import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; +import java.util.Optional; import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -public class BigQueryConnectionTest { +public class BigQueryConnectionTest extends BigQueryJdbcLoggingBaseTest { private static final String DEFAULT_VERSION = "0.0.0"; private static final String DEFAULT_JDBC_TOKEN_VALUE = "Google-BigQuery-JDBC-Driver"; @@ -459,50 +463,32 @@ public void testIsReadOnlyTokenProvided(String readonlyProp, boolean expectedIsR @Test public void testConnectionPropertiesLoggingAndMasking() throws IOException, SQLException { - java.util.logging.Logger rootLogger = BigQueryJdbcRootLogger.getRootLogger(); - java.util.logging.Level originalLevel = rootLogger.getLevel(); - rootLogger.setLevel(java.util.logging.Level.CONFIG); - - java.util.List records = new java.util.ArrayList<>(); - java.util.logging.Handler handler = - new java.util.logging.Handler() { - @Override - public void publish(java.util.logging.LogRecord record) { - records.add(record); - } - - @Override - public void flush() {} - - @Override - public void close() throws SecurityException {} - }; - rootLogger.addHandler(handler); + Logger rootLogger = BigQueryJdbcRootLogger.getRootLogger(); + Level originalLevel = rootLogger.getLevel(); + rootLogger.setLevel(Level.CONFIG); try { String url = "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + "OAuthType=2;ProjectId=MyTestProjectId;" - + "OAuthAccessToken=secretAccessToken;Location=US;" - + "PartnerToken=GPN:secretPartnerToken;"; + + "OAuthAccessToken=secretAccessToken;Location=US;"; try (BigQueryConnection connection = new BigQueryConnection(url)) { // Just trigger the constructor } - boolean foundLog = false; - for (java.util.logging.LogRecord record : records) { - if (record.getMessage().contains("Connection properties:")) { - foundLog = true; - String logMessage = record.getMessage(); - assertTrue(logMessage.contains("ProjectId=MyTestProjectId")); - assertTrue(logMessage.contains("Location=US")); - assertTrue(logMessage.contains("OAuthAccessToken=*****")); - assertFalse(logMessage.contains("secretAccessToken")); - } - } - assertTrue(foundLog, "Log message about Connection properties was not found"); + Optional connectionPropertiesLog = + capturedLogs.stream() + .filter(r -> r.getMessage().contains("Connection properties:")) + .findFirst(); + assertTrue( + connectionPropertiesLog.isPresent(), + "Log message about Connection properties was not found"); + String logMessage = connectionPropertiesLog.get().getMessage(); + assertTrue(logMessage.contains("ProjectId=MyTestProjectId")); + assertTrue(logMessage.contains("Location=US")); + assertTrue(logMessage.contains("OAuthAccessToken=*****")); + assertFalse(logMessage.contains("secretAccessToken")); } finally { - rootLogger.removeHandler(handler); rootLogger.setLevel(originalLevel); } }