From 1b1a6847ab856935adc5d7dfdfc09479e4a2a543 Mon Sep 17 00:00:00 2001 From: Simon Marty Date: Wed, 23 Aug 2023 10:28:07 -0700 Subject: [PATCH 1/3] FindBugs is unmaintained, switch to SpotBugs --- pom.xml | 9 +++++---- .../secretsmanager/sql/AWSSecretsManagerDriver.java | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 7e82bfb..8e01fb0 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ 3.4.0 3.2.1 3.1.2 - 3.0.5 + 4.7.3.5 UTF-8 @@ -125,6 +125,7 @@ ${powermock.version} test + org.jacoco org.jacoco.agent @@ -194,9 +195,9 @@ - org.codehaus.mojo - findbugs-maven-plugin - ${findbugs.plugin.version} + com.github.spotbugs + spotbugs-maven-plugin + ${spotbugs.plugin.version} Max Low diff --git a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDriver.java b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDriver.java index bf0d4a6..6f52744 100644 --- a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDriver.java +++ b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDriver.java @@ -342,7 +342,7 @@ private Connection connectWithSecret(String unwrappedUrl, Properties info, Strin JsonNode jsonObject = mapper.readTree(secretString); updatedInfo.setProperty("user", jsonObject.get("username").asText()); updatedInfo.setProperty("password", jsonObject.get("password").asText()); - } catch (IOException | NullPointerException e) { + } catch (IOException e) { // Most likely to occur in the event that the data is not JSON. // Or the secret's username and/or password fields have been // removed entirely. Either scenario is most often a user error. @@ -391,7 +391,7 @@ public Connection connect(String url, Properties info) throws SQLException { JsonNode dbnameNode = jsonObject.get("dbname"); String dbname = dbnameNode == null ? null : dbnameNode.asText(); unwrappedUrl = constructUrlFromEndpointPortDatabase(endpoint, port, dbname); - } catch (IOException | NullPointerException e) { + } catch (IOException e) { // Most likely to occur in the event that the data is not JSON. // Or the secret has been modified and is no longer valid. // Either scenario is most often a user error. From 874531c14f462fd910dcbe5065c0df131a4d6685 Mon Sep 17 00:00:00 2001 From: Simon Marty Date: Tue, 18 Jul 2023 15:49:46 -0700 Subject: [PATCH 2/3] v2 --- .github/workflows/CI.yml | 5 +- .github/workflows/codeql-analysis.yml | 4 +- .gitignore | 1 + README.md | 4 +- pom.xml | 106 +++----- .../sql/AWSSecretsManagerDriver.java | 31 ++- .../AWSSecretsManagerMSSQLServerDriver.java | 16 +- .../sql/AWSSecretsManagerMariaDBDriver.java | 15 +- .../sql/AWSSecretsManagerMySQLDriver.java | 15 +- .../sql/AWSSecretsManagerOracleDriver.java | 16 +- .../AWSSecretsManagerPostgreSQLDriver.java | 17 +- .../sql/AWSSecretsManagerRedshiftDriver.java | 15 +- .../amazonaws/secretsmanager/util/Config.java | 8 +- .../util/JDBCSecretCacheBuilderProvider.java | 29 ++- .../sql/AWSSecretsManagerDriverTest.java | 22 +- .../sql/AWSSecretsManagerDummyDriver.java | 10 +- ...WSSecretsManagerMSSQLServerDriverTest.java | 9 +- .../AWSSecretsManagerMariaDBDriverTest.java | 9 +- .../sql/AWSSecretsManagerMySQLDriverTest.java | 9 +- .../AWSSecretsManagerOracleDriverTest.java | 9 +- ...AWSSecretsManagerPostgreSQLDriverTest.java | 9 +- .../AWSSecretsManagerRedshiftDriverTest.java | 8 +- .../secretsmanager/util/ConfigTest.java | 5 +- .../JDBCSecretCacheBuilderProviderTest.java | 239 +++++++++--------- .../util/SQLExceptionUtilsTest.java | 10 +- .../secretsmanager/util/TestClass.java | 51 ++-- 26 files changed, 338 insertions(+), 334 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 499992a..79a02af 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -2,6 +2,9 @@ name: Java Build on: [push, pull_request] +env: + AWS_DEFAULT_REGION: us-west-2 + jobs: build: runs-on: ubuntu-latest @@ -16,4 +19,4 @@ jobs: - name: Build with Maven run: mvn --batch-mode --update-snapshots package - name: Codecov - uses: codecov/codecov-action@v3.1.0 + uses: codecov/codecov-action@v3.1.4 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 0e1db2a..d487a4b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,9 +13,9 @@ name: "CodeQL" on: push: - branches: [ "master" ] + branches: ["master", "v2"] pull_request: - branches: [ "master" ] + branches: ["master", "v2"] schedule: - cron: '38 2 * * 1' diff --git a/.gitignore b/.gitignore index b071817..4df5624 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ jacoco.exec # Eclipse m2e generated files # Eclipse Core .project +.settings # JDT-specific (Eclipse Java Development Tools) .classpath diff --git a/README.md b/README.md index 76acfb6..c66ff00 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # AWS Secrets Manager JDBC Library [![Java Build](https://github.com/aws/aws-secretsmanager-jdbc/actions/workflows/CI.yml/badge.svg?event=push)](https://github.com/aws/aws-secretsmanager-jdbc/actions/workflows/CI.yml) -[![Coverage](https://codecov.io/gh/aws/aws-secretsmanager-jdbc/branch/master/graph/badge.svg?token=hCl7eBaSwn)](https://codecov.io/gh/aws/aws-secretsmanager-jdbc) +[![Coverage](https://codecov.io/gh/aws/aws-secretsmanager-jdbc/branch/v2/graph/badge.svg?token=hCl7eBaSwn)](https://codecov.io/gh/aws/aws-secretsmanager-jdbc) The **AWS Secrets Manager JDBC Library** enables Java developers to easily connect to SQL databases using secrets stored in AWS Secrets Manager. @@ -25,7 +25,7 @@ The recommended way to use the SQL Connection Library is to consume it from Mave com.amazonaws.secretsmanager aws-secretsmanager-jdbc - 1.0.12 + 2.0.0 ``` diff --git a/pom.xml b/pom.xml index 8e01fb0..3cef483 100644 --- a/pom.xml +++ b/pom.xml @@ -16,25 +16,13 @@ aws-secretsmanager-jdbc jar AWS Secrets Manager SQL Connection Library - 1.0.12 + 2.0.0 The AWS Secrets Manager SQL Connection Library for Java enables Java developers to easily connect to SQL databases using secrets stored in AWS Secrets Manager. https://aws.amazon.com/secrets-manager - 1.12.252 - 1.0.2 - 1.18.24 - 2.14.1 - 4.13.2 - 1.10.19 - 1.7.0 - 3.10.1 - 3.4.0 - 3.2.1 - 3.1.2 - 4.7.3.5 UTF-8 @@ -76,61 +64,67 @@ com.amazonaws.secretsmanager aws-secretsmanager-caching-java - ${aws-secretsmanager-cache.version} + 2.0.0 - com.amazonaws - aws-java-sdk-secretsmanager - ${aws-java-sdk.version} + software.amazon.awssdk + secretsmanager + 2.20.93 org.projectlombok lombok - ${lombok.version} + 1.18.28 provided com.fasterxml.jackson.core jackson-databind - ${jackson.version} + 2.15.2 + + + + com.github.spotbugs + spotbugs-annotations + 4.7.3 junit junit - ${junit.version} + 4.13.2 test - org.mockito - mockito-all - ${mockito.version} + com.github.stefanbirkner + system-rules + 1.19.0 test - org.powermock - powermock-module-junit4 - ${powermock.version} + org.mockito + mockito-inline + 3.12.4 test org.powermock - powermock-api-mockito - ${powermock.version} + powermock-module-junit4 + 2.0.9 test - org.jacoco - org.jacoco.agent - runtime - 0.8.8 + org.powermock + powermock-api-mockito2 + 2.0.9 + test @@ -139,17 +133,17 @@ org.apache.maven.plugins maven-compiler-plugin - ${compiler.plugin.version} + 3.11.0 - 1.8 - 1.8 + 11 + 11 UTF-8 org.apache.maven.plugins maven-source-plugin - ${source.plugin.version} + 3.3.0 attach-sources @@ -162,7 +156,7 @@ org.apache.maven.plugins maven-javadoc-plugin - ${javadoc.plugin.version} + 3.5.0 attach-javadocs @@ -175,10 +169,9 @@ org.apache.maven.plugins maven-checkstyle-plugin - ${checkstyle.plugin.version} + 3.3.0 ${basedir}/config/checkstyle/checkstyle.xml - UTF-8 true true false @@ -197,7 +190,7 @@ com.github.spotbugs spotbugs-maven-plugin - ${spotbugs.plugin.version} + 4.7.3.5 Max Low @@ -216,45 +209,22 @@ org.jacoco jacoco-maven-plugin - 0.8.8 + 0.8.10 - default-instrument - instrument - - - - default-restore-instrumented-classes - - restore-instrumented-classes + prepare-agent report - prepare-package + test report - - default-check - - check - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.22.2 - - - target/jacoco.exec - - - @@ -266,7 +236,7 @@ org.apache.maven.plugins maven-gpg-plugin - 3.0.1 + 3.1.0 sign-artifacts @@ -292,4 +262,4 @@ - + \ No newline at end of file diff --git a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDriver.java b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDriver.java index 6f52744..ec07ab2 100644 --- a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDriver.java +++ b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDriver.java @@ -12,16 +12,6 @@ */ package com.amazonaws.secretsmanager.sql; -import com.amazonaws.secretsmanager.util.Config; -import com.amazonaws.secretsmanager.caching.SecretCache; -import com.amazonaws.secretsmanager.caching.SecretCacheConfiguration; -import com.amazonaws.secretsmanager.util.JDBCSecretCacheBuilderProvider; -import com.amazonaws.services.secretsmanager.AWSSecretsManager; -import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; -import com.amazonaws.util.StringUtils; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - import java.io.IOException; import java.sql.Connection; import java.sql.Driver; @@ -33,6 +23,19 @@ import java.util.Properties; import java.util.logging.Logger; +import com.amazonaws.secretsmanager.caching.SecretCache; +import com.amazonaws.secretsmanager.caching.SecretCacheConfiguration; +import com.amazonaws.secretsmanager.util.Config; +import com.amazonaws.secretsmanager.util.JDBCSecretCacheBuilderProvider; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; +import software.amazon.awssdk.utils.StringUtils; + /** *

* Provides support for accessing SQL databases using credentials stored within AWS Secrets Manager. If this @@ -130,6 +133,7 @@ protected AWSSecretsManagerDriver() { * * @param cache Secret cache to use to retrieve secrets */ + @SuppressFBWarnings("MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR") protected AWSSecretsManagerDriver(SecretCache cache) { this.secretCache = cache; @@ -143,7 +147,7 @@ protected AWSSecretsManagerDriver(SecretCache cache) { * * @param builder Builder used to instantiate cache */ - protected AWSSecretsManagerDriver(AWSSecretsManagerClientBuilder builder) { + protected AWSSecretsManagerDriver(SecretsManagerClientBuilder builder) { this(new SecretCache(builder)); } @@ -153,7 +157,7 @@ protected AWSSecretsManagerDriver(AWSSecretsManagerClientBuilder builder) { * * @param client AWS Secrets Manager client to instantiate cache */ - protected AWSSecretsManagerDriver(AWSSecretsManager client) { + protected AWSSecretsManagerDriver(SecretsManagerClient client) { this(new SecretCache(client)); } @@ -380,7 +384,7 @@ public Connection connect(String url, Properties info) throws SQLException { } else { // Else, assume this is a secret ID and try to retrieve it try { String secretString = secretCache.getSecretString(url); - if (StringUtils.isNullOrEmpty(secretString)) { + if (StringUtils.isBlank(secretString)) { throw new IllegalArgumentException("URL " + url + " is not a valid URL starting with scheme " + SCHEME + " or a valid retrievable secret ID "); } @@ -437,4 +441,3 @@ public boolean jdbcCompliant() { return getWrappedDriver().jdbcCompliant(); } } - diff --git a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMSSQLServerDriver.java b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMSSQLServerDriver.java index a53e715..1a44728 100644 --- a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMSSQLServerDriver.java +++ b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMSSQLServerDriver.java @@ -16,9 +16,10 @@ import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.caching.SecretCacheConfiguration; -import com.amazonaws.services.secretsmanager.AWSSecretsManager; -import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; -import com.amazonaws.util.StringUtils; + +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; +import software.amazon.awssdk.utils.StringUtils; /** *

@@ -74,7 +75,7 @@ public AWSSecretsManagerMSSQLServerDriver(SecretCache cache) { * * @param builder Builder used to instantiate cache */ - public AWSSecretsManagerMSSQLServerDriver(AWSSecretsManagerClientBuilder builder) { + public AWSSecretsManagerMSSQLServerDriver(SecretsManagerClientBuilder builder) { super(builder); } @@ -84,7 +85,7 @@ public AWSSecretsManagerMSSQLServerDriver(AWSSecretsManagerClientBuilder builder * * @param client AWS Secrets Manager client to instantiate cache */ - public AWSSecretsManagerMSSQLServerDriver(AWSSecretsManager client) { + public AWSSecretsManagerMSSQLServerDriver(SecretsManagerClient client) { super(client); } @@ -116,10 +117,10 @@ public boolean isExceptionDueToAuthenticationError(Exception e) { @Override public String constructUrlFromEndpointPortDatabase(String endpoint, String port, String dbname) { String url = "jdbc:sqlserver://" + endpoint; - if (!StringUtils.isNullOrEmpty(port)) { + if (StringUtils.isNotBlank(port)) { url += ":" + port; } - if (!StringUtils.isNullOrEmpty(dbname)) { + if (StringUtils.isNotBlank(dbname)) { url += ";databaseName=" + dbname + ";"; } return url; @@ -130,4 +131,3 @@ public String getDefaultDriverClass() { return "com.microsoft.sqlserver.jdbc.SQLServerDriver"; } } - diff --git a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMariaDBDriver.java b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMariaDBDriver.java index 954c872..e151b86 100644 --- a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMariaDBDriver.java +++ b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMariaDBDriver.java @@ -15,9 +15,10 @@ import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.caching.SecretCacheConfiguration; import com.amazonaws.secretsmanager.util.SQLExceptionUtils; -import com.amazonaws.services.secretsmanager.AWSSecretsManager; -import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; -import com.amazonaws.util.StringUtils; + +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; +import software.amazon.awssdk.utils.StringUtils; /** *

@@ -74,7 +75,7 @@ public AWSSecretsManagerMariaDBDriver(SecretCache cache) { * * @param builder Builder used to instantiate cache */ - public AWSSecretsManagerMariaDBDriver(AWSSecretsManagerClientBuilder builder) { + public AWSSecretsManagerMariaDBDriver(SecretsManagerClientBuilder builder) { super(builder); } @@ -84,7 +85,7 @@ public AWSSecretsManagerMariaDBDriver(AWSSecretsManagerClientBuilder builder) { * * @param client AWS Secrets Manager client to instantiate cache */ - public AWSSecretsManagerMariaDBDriver(AWSSecretsManager client) { + public AWSSecretsManagerMariaDBDriver(SecretsManagerClient client) { super(client); } @@ -111,10 +112,10 @@ public boolean isExceptionDueToAuthenticationError(Exception e) { @Override public String constructUrlFromEndpointPortDatabase(String endpoint, String port, String dbname) { String url = "jdbc:mariadb://" + endpoint; - if (!StringUtils.isNullOrEmpty(port)) { + if (StringUtils.isNotBlank(port)) { url += ":" + port; } - if (!StringUtils.isNullOrEmpty(dbname)) { + if (StringUtils.isNotBlank(dbname)) { url += "/" + dbname; } return url; diff --git a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMySQLDriver.java b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMySQLDriver.java index 51b111d..975f4ce 100644 --- a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMySQLDriver.java +++ b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMySQLDriver.java @@ -15,9 +15,10 @@ import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.caching.SecretCacheConfiguration; import com.amazonaws.secretsmanager.util.SQLExceptionUtils; -import com.amazonaws.services.secretsmanager.AWSSecretsManager; -import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; -import com.amazonaws.util.StringUtils; + +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; +import software.amazon.awssdk.utils.StringUtils; /** *

@@ -74,7 +75,7 @@ public AWSSecretsManagerMySQLDriver(SecretCache cache) { * * @param builder Builder used to instantiate cache */ - public AWSSecretsManagerMySQLDriver(AWSSecretsManagerClientBuilder builder) { + public AWSSecretsManagerMySQLDriver(SecretsManagerClientBuilder builder) { super(builder); } @@ -84,7 +85,7 @@ public AWSSecretsManagerMySQLDriver(AWSSecretsManagerClientBuilder builder) { * * @param client AWS Secrets Manager client to instantiate cache */ - public AWSSecretsManagerMySQLDriver(AWSSecretsManager client) { + public AWSSecretsManagerMySQLDriver(SecretsManagerClient client) { super(client); } @@ -111,10 +112,10 @@ public boolean isExceptionDueToAuthenticationError(Exception e) { @Override public String constructUrlFromEndpointPortDatabase(String endpoint, String port, String dbname) { String url = "jdbc:mysql://" + endpoint; - if (!StringUtils.isNullOrEmpty(port)) { + if (StringUtils.isNotBlank(port)) { url += ":" + port; } - if (!StringUtils.isNullOrEmpty(dbname)) { + if (StringUtils.isNotBlank(dbname)) { url += "/" + dbname; } return url; diff --git a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerOracleDriver.java b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerOracleDriver.java index 834fe27..a8f1d96 100644 --- a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerOracleDriver.java +++ b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerOracleDriver.java @@ -16,9 +16,10 @@ import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.caching.SecretCacheConfiguration; -import com.amazonaws.services.secretsmanager.AWSSecretsManager; -import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; -import com.amazonaws.util.StringUtils; + +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; +import software.amazon.awssdk.utils.StringUtils; /** *

@@ -89,7 +90,7 @@ public AWSSecretsManagerOracleDriver(SecretCache cache) { * * @param builder Builder used to instantiate cache */ - public AWSSecretsManagerOracleDriver(AWSSecretsManagerClientBuilder builder) { + public AWSSecretsManagerOracleDriver(SecretsManagerClientBuilder builder) { super(builder); } @@ -99,7 +100,7 @@ public AWSSecretsManagerOracleDriver(AWSSecretsManagerClientBuilder builder) { * * @param client AWS Secrets Manager client to instantiate cache */ - public AWSSecretsManagerOracleDriver(AWSSecretsManager client) { + public AWSSecretsManagerOracleDriver(SecretsManagerClient client) { super(client); } @@ -133,10 +134,10 @@ public boolean isExceptionDueToAuthenticationError(Exception e) { @Override public String constructUrlFromEndpointPortDatabase(String endpoint, String port, String dbname) { String url = "jdbc:oracle:thin:@//" + endpoint; - if (!StringUtils.isNullOrEmpty(port)) { + if (StringUtils.isNotBlank(port)) { url += ":" + port; } - if (!StringUtils.isNullOrEmpty(dbname)) { + if (StringUtils.isNotBlank(dbname)) { url += "/" + dbname; } return url; @@ -147,4 +148,3 @@ public String getDefaultDriverClass() { return "oracle.jdbc.OracleDriver"; } } - diff --git a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerPostgreSQLDriver.java b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerPostgreSQLDriver.java index 8af0071..5f6e05e 100644 --- a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerPostgreSQLDriver.java +++ b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerPostgreSQLDriver.java @@ -16,9 +16,10 @@ import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.caching.SecretCacheConfiguration; -import com.amazonaws.services.secretsmanager.AWSSecretsManager; -import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; -import com.amazonaws.util.StringUtils; + +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; +import software.amazon.awssdk.utils.StringUtils; /** *

@@ -71,7 +72,7 @@ public AWSSecretsManagerPostgreSQLDriver(SecretCache cache) { * * @param builder Builder used to instantiate cache */ - public AWSSecretsManagerPostgreSQLDriver(AWSSecretsManagerClientBuilder builder) { + public AWSSecretsManagerPostgreSQLDriver(SecretsManagerClientBuilder builder) { super(builder); } @@ -81,7 +82,7 @@ public AWSSecretsManagerPostgreSQLDriver(AWSSecretsManagerClientBuilder builder) * * @param client AWS Secrets Manager client to instantiate cache */ - public AWSSecretsManagerPostgreSQLDriver(AWSSecretsManager client) { + public AWSSecretsManagerPostgreSQLDriver(SecretsManagerClient client) { super(client); } @@ -113,15 +114,16 @@ public boolean isExceptionDueToAuthenticationError(Exception e) { @Override public String constructUrlFromEndpointPortDatabase(String endpoint, String port, String dbname) { String url = "jdbc:postgresql://" + endpoint; - if (!StringUtils.isNullOrEmpty(port)) { + if (StringUtils.isNotBlank(port)) { url += ":" + port; } url += "/"; - if (!StringUtils.isNullOrEmpty(dbname)) { + if (StringUtils.isNotBlank(dbname)) { url += dbname; } + return url; } @@ -130,4 +132,3 @@ public String getDefaultDriverClass() { return "org.postgresql.Driver"; } } - diff --git a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerRedshiftDriver.java b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerRedshiftDriver.java index e0e8dae..4b84dc6 100644 --- a/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerRedshiftDriver.java +++ b/src/main/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerRedshiftDriver.java @@ -16,9 +16,10 @@ import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.caching.SecretCacheConfiguration; -import com.amazonaws.services.secretsmanager.AWSSecretsManager; -import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; -import com.amazonaws.util.StringUtils; + +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; +import software.amazon.awssdk.utils.StringUtils; /** *

@@ -74,7 +75,7 @@ public AWSSecretsManagerRedshiftDriver(SecretCache cache) { * * @param builder Builder used to instantiate cache */ - public AWSSecretsManagerRedshiftDriver(AWSSecretsManagerClientBuilder builder) { + public AWSSecretsManagerRedshiftDriver(SecretsManagerClientBuilder builder) { super(builder); } @@ -85,7 +86,7 @@ public AWSSecretsManagerRedshiftDriver(AWSSecretsManagerClientBuilder builder) { * * @param client AWS Secrets Manager client to instantiate cache */ - public AWSSecretsManagerRedshiftDriver(AWSSecretsManager client) { + public AWSSecretsManagerRedshiftDriver(SecretsManagerClient client) { super(client); } @@ -118,10 +119,10 @@ public boolean isExceptionDueToAuthenticationError(Exception e) { @Override public String constructUrlFromEndpointPortDatabase(String endpoint, String port, String dbname) { String url = "jdbc:redshift://" + endpoint; - if (!StringUtils.isNullOrEmpty(port)) { + if (StringUtils.isNotBlank(port)) { url += ":" + port; } - if (!StringUtils.isNullOrEmpty(dbname)) { + if (StringUtils.isNotBlank(dbname)) { url += "/" + dbname; } return url; diff --git a/src/main/java/com/amazonaws/secretsmanager/util/Config.java b/src/main/java/com/amazonaws/secretsmanager/util/Config.java index b5d17eb..5ee797a 100644 --- a/src/main/java/com/amazonaws/secretsmanager/util/Config.java +++ b/src/main/java/com/amazonaws/secretsmanager/util/Config.java @@ -12,9 +12,8 @@ */ package com.amazonaws.secretsmanager.util; -import java.io.InputStream; import java.io.IOException; - +import java.io.InputStream; import java.util.Enumeration; import java.util.NoSuchElementException; import java.util.Properties; @@ -138,6 +137,7 @@ private String getSubproperty(String fullPropertyName, String subprefix) { * * @return Config Configuration properties for the subprefix */ + @SuppressWarnings("unchecked") public Config getSubconfig(String subprefix) { Enumeration propertyNames = (Enumeration) config.propertyNames(); Properties subconfig = null; @@ -257,7 +257,7 @@ public long getLongPropertyWithDefault(String propertyName, long defaultValue) { * * @throws PropertyException If the class name does not exist in this class loader. */ - public Class getClassPropertyWithDefault(String propertyName, Class defaultValue) { + public Class getClassPropertyWithDefault(String propertyName, Class defaultValue) { String propertyValue = config.getProperty(propertyName); if (propertyValue == null) { return defaultValue; @@ -348,7 +348,7 @@ public long getRequiredLongProperty(String propertyName) { * @throws PropertyException If the class name does not exist in this class loader. * @throws NoSuchElementException If the property is not set. */ - public Class getRequiredClassProperty(String propertyName) { + public Class getRequiredClassProperty(String propertyName) { throwIfPropertyIsNotSet(propertyName); return getClassPropertyWithDefault(propertyName, null); } diff --git a/src/main/java/com/amazonaws/secretsmanager/util/JDBCSecretCacheBuilderProvider.java b/src/main/java/com/amazonaws/secretsmanager/util/JDBCSecretCacheBuilderProvider.java index deca79b..be774a4 100644 --- a/src/main/java/com/amazonaws/secretsmanager/util/JDBCSecretCacheBuilderProvider.java +++ b/src/main/java/com/amazonaws/secretsmanager/util/JDBCSecretCacheBuilderProvider.java @@ -1,10 +1,13 @@ package com.amazonaws.secretsmanager.util; -import com.amazonaws.client.builder.AwsClientBuilder; +import java.net.URI; + import com.amazonaws.secretsmanager.sql.AWSSecretsManagerDriver; -import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; -import static com.amazonaws.util.StringUtils.isNullOrEmpty; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; +import software.amazon.awssdk.utils.StringUtils; /** *

@@ -30,10 +33,8 @@ public class JDBCSecretCacheBuilderProvider { static final String REGION_ENVIRONMENT_VARIABLE = "AWS_SECRET_JDBC_REGION"; - private Config configFile; - public JDBCSecretCacheBuilderProvider() { this(Config.loadMainConfig()); } @@ -52,9 +53,9 @@ public JDBCSecretCacheBuilderProvider(Config config) { * * @return the built secret cache. */ - public AWSSecretsManagerClientBuilder build() { + public SecretsManagerClientBuilder build() { - AWSSecretsManagerClientBuilder builder = AWSSecretsManagerClientBuilder.standard(); + SecretsManagerClientBuilder builder = SecretsManagerClient.builder(); //Retrieve data from information sources. String vpcEndpointUrl = configFile.getStringPropertyWithDefault(AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+PROPERTY_VPC_ENDPOINT_URL, null); @@ -63,13 +64,13 @@ public AWSSecretsManagerClientBuilder build() { String configRegion = configFile.getStringPropertyWithDefault(AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+PROPERTY_REGION, null); - //Apply settings to our builder configuration. - if ( !isNullOrEmpty(vpcEndpointUrl) && !isNullOrEmpty(vpcEndpointRegion) ) { - builder.setEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(vpcEndpointUrl, vpcEndpointRegion)); - } else if ( !isNullOrEmpty(envRegion) ) { - builder.withRegion(envRegion); - } else if ( !isNullOrEmpty(configRegion) ) { - builder.withRegion(configRegion); + // Apply settings to our builder configuration. + if (StringUtils.isNotBlank(vpcEndpointUrl) && StringUtils.isNotBlank(vpcEndpointRegion)) { + builder.endpointOverride(URI.create(vpcEndpointUrl)).region(Region.of(vpcEndpointRegion)); + } else if (StringUtils.isNotBlank(envRegion)) { + builder.region(Region.of(envRegion)); + } else if (StringUtils.isNotBlank(configRegion)) { + builder.region(Region.of(configRegion)); } return builder; diff --git a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDriverTest.java b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDriverTest.java index 27af579..fda47f1 100644 --- a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDriverTest.java +++ b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDriverTest.java @@ -12,14 +12,18 @@ */ package com.amazonaws.secretsmanager.sql; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; -import static org.junit.Assert.*; - +import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -30,13 +34,13 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; -import org.junit.Before; import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.caching.SecretCacheConfiguration; import com.amazonaws.secretsmanager.util.TestClass; -import com.amazonaws.services.secretsmanager.AWSSecretsManager; -import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; + +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; /** * Tests for AWSSecretsManagerDriver. Uses a config file in the resources folder just to make sure it can read from @@ -127,13 +131,13 @@ public Boolean answer(InvocationOnMock invocation) throws Throwable { @Test public void test_init_constructor_null_params() { try { - new AWSSecretsManagerDummyDriver((AWSSecretsManagerClientBuilder)null); + new AWSSecretsManagerDummyDriver((SecretsManagerClientBuilder) null); } catch (Exception e) {} try { - new AWSSecretsManagerDummyDriver((SecretCacheConfiguration)null); + new AWSSecretsManagerDummyDriver((SecretCacheConfiguration) null); } catch (Exception e) {} try { - new AWSSecretsManagerDummyDriver((AWSSecretsManager)null); + new AWSSecretsManagerDummyDriver((SecretsManagerClient) null); } catch (Exception e) {} } @@ -343,7 +347,7 @@ public void test_getParentLogger_propagatesToRealDriver() { public void test_getPropertyInfo_propagatesToRealDriver() { String param1 = "jdbc-secretsmanager:expectedUrl"; Properties param2 = new Properties(); - assertNotThrows(() -> assertEquals(null, sut.getPropertyInfo(param1, param2))); + assertNotThrows(() -> Assert.assertNull(sut.getPropertyInfo(param1, param2))); assertEquals(1, DummyDriver.getPropertyInfoCallCount); String param1Expected = "jdbc:expectedUrl"; assertEquals(param1Expected, DummyDriver.getPropertyInfoParam1); diff --git a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDummyDriver.java b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDummyDriver.java index 5e59520..170b8c4 100644 --- a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDummyDriver.java +++ b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerDummyDriver.java @@ -14,8 +14,9 @@ import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.caching.SecretCacheConfiguration; -import com.amazonaws.services.secretsmanager.AWSSecretsManager; -import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; + +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; /** * Dummy database driver wrapper. @@ -46,7 +47,7 @@ public AWSSecretsManagerDummyDriver(SecretCache cache) { * * @param builder Builder used to instantiate cache */ - public AWSSecretsManagerDummyDriver(AWSSecretsManagerClientBuilder builder) { + public AWSSecretsManagerDummyDriver(SecretsManagerClientBuilder builder) { super(builder); } @@ -56,7 +57,7 @@ public AWSSecretsManagerDummyDriver(AWSSecretsManagerClientBuilder builder) { * * @param client AWS Secrets Manager client to instantiate cache */ - public AWSSecretsManagerDummyDriver(AWSSecretsManager client) { + public AWSSecretsManagerDummyDriver(SecretsManagerClient client) { super(client); } @@ -76,6 +77,7 @@ public String getPropertySubprefix() { } public boolean exceptionIsDueToAuth; + @Override public boolean isExceptionDueToAuthenticationError(Exception e) { return exceptionIsDueToAuth; diff --git a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMSSQLServerDriverTest.java b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMSSQLServerDriverTest.java index e2f644a..e98b5c9 100644 --- a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMSSQLServerDriverTest.java +++ b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMSSQLServerDriverTest.java @@ -12,10 +12,13 @@ */ package com.amazonaws.secretsmanager.sql; -import java.sql.SQLException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; -import static org.junit.Assert.*; +import java.sql.SQLException; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -23,7 +26,6 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; -import org.junit.Before; import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.util.TestClass; @@ -103,4 +105,3 @@ public void test_getDefaultDriverClass() { assertEquals(getFieldFrom(sut2, "realDriverClass"), sut2.getDefaultDriverClass()); } } - diff --git a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMariaDBDriverTest.java b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMariaDBDriverTest.java index 6baad6a..fff739d 100644 --- a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMariaDBDriverTest.java +++ b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMariaDBDriverTest.java @@ -12,10 +12,13 @@ */ package com.amazonaws.secretsmanager.sql; -import java.sql.SQLException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; -import static org.junit.Assert.*; +import java.sql.SQLException; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -23,7 +26,6 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; -import org.junit.Before; import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.util.TestClass; @@ -103,4 +105,3 @@ public void test_getDefaultDriverClass() { assertEquals(getFieldFrom(sut2, "realDriverClass"), sut2.getDefaultDriverClass()); } } - diff --git a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMySQLDriverTest.java b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMySQLDriverTest.java index 55e34df..382a3ea 100644 --- a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMySQLDriverTest.java +++ b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerMySQLDriverTest.java @@ -12,10 +12,13 @@ */ package com.amazonaws.secretsmanager.sql; -import java.sql.SQLException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; -import static org.junit.Assert.*; +import java.sql.SQLException; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -23,7 +26,6 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; -import org.junit.Before; import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.util.TestClass; @@ -103,4 +105,3 @@ public void test_getDefaultDriverClass() { assertEquals(getFieldFrom(sut2, "realDriverClass"), sut2.getDefaultDriverClass()); } } - diff --git a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerOracleDriverTest.java b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerOracleDriverTest.java index 510ac84..59a6ab6 100644 --- a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerOracleDriverTest.java +++ b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerOracleDriverTest.java @@ -12,10 +12,13 @@ */ package com.amazonaws.secretsmanager.sql; -import java.sql.SQLException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; -import static org.junit.Assert.*; +import java.sql.SQLException; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -23,7 +26,6 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; -import org.junit.Before; import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.util.TestClass; @@ -108,4 +110,3 @@ public void test_getDefaultDriverClass() { assertEquals(getFieldFrom(sut2, "realDriverClass"), sut2.getDefaultDriverClass()); } } - diff --git a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerPostgreSQLDriverTest.java b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerPostgreSQLDriverTest.java index a7ecf4b..a07579e 100644 --- a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerPostgreSQLDriverTest.java +++ b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerPostgreSQLDriverTest.java @@ -12,10 +12,13 @@ */ package com.amazonaws.secretsmanager.sql; -import java.sql.SQLException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; -import static org.junit.Assert.*; +import java.sql.SQLException; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -23,7 +26,6 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; -import org.junit.Before; import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.util.TestClass; @@ -103,4 +105,3 @@ public void test_getDefaultDriverClass() { assertEquals(getFieldFrom(sut2, "realDriverClass"), sut2.getDefaultDriverClass()); } } - diff --git a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerRedshiftDriverTest.java b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerRedshiftDriverTest.java index ac70def..600d8d6 100644 --- a/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerRedshiftDriverTest.java +++ b/src/test/java/com/amazonaws/secretsmanager/sql/AWSSecretsManagerRedshiftDriverTest.java @@ -12,10 +12,13 @@ */ package com.amazonaws.secretsmanager.sql; -import java.sql.SQLException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; -import static org.junit.Assert.*; +import java.sql.SQLException; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -23,7 +26,6 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; -import org.junit.Before; import com.amazonaws.secretsmanager.caching.SecretCache; import com.amazonaws.secretsmanager.util.TestClass; diff --git a/src/test/java/com/amazonaws/secretsmanager/util/ConfigTest.java b/src/test/java/com/amazonaws/secretsmanager/util/ConfigTest.java index 6fdd541..65262d1 100644 --- a/src/test/java/com/amazonaws/secretsmanager/util/ConfigTest.java +++ b/src/test/java/com/amazonaws/secretsmanager/util/ConfigTest.java @@ -12,11 +12,12 @@ */ package com.amazonaws.secretsmanager.util; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + import java.util.NoSuchElementException; import java.util.Properties; -import static org.junit.Assert.*; - import org.junit.Test; /** diff --git a/src/test/java/com/amazonaws/secretsmanager/util/JDBCSecretCacheBuilderProviderTest.java b/src/test/java/com/amazonaws/secretsmanager/util/JDBCSecretCacheBuilderProviderTest.java index 283c4cb..e05d033 100644 --- a/src/test/java/com/amazonaws/secretsmanager/util/JDBCSecretCacheBuilderProviderTest.java +++ b/src/test/java/com/amazonaws/secretsmanager/util/JDBCSecretCacheBuilderProviderTest.java @@ -1,75 +1,77 @@ package com.amazonaws.secretsmanager.util; - -import com.amazonaws.secretsmanager.sql.AWSSecretsManagerDriver; -import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder; -import org.junit.Test; +import static com.amazonaws.secretsmanager.util.JDBCSecretCacheBuilderProvider.PROPERTY_VPC_ENDPOINT_REGION; +import static com.amazonaws.secretsmanager.util.JDBCSecretCacheBuilderProvider.PROPERTY_VPC_ENDPOINT_URL; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.junit.Assert.*; - -import org.junit.runner.RunWith; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; +import org.junit.Rule; +import org.junit.Test; +import org.junit.contrib.java.lang.system.EnvironmentVariables; -import static com.amazonaws.secretsmanager.util.JDBCSecretCacheBuilderProvider.*; +import com.amazonaws.secretsmanager.sql.AWSSecretsManagerDriver; +import software.amazon.awssdk.core.exception.SdkClientException; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; -@RunWith(PowerMockRunner.class) -@PowerMockIgnore("jdk.internal.reflect.*") -@PrepareForTest({Config.class, System.class, JDBCSecretCacheBuilderProvider.class}) public class JDBCSecretCacheBuilderProviderTest { + @Rule + public final EnvironmentVariables environmentVariables = new EnvironmentVariables(); + /** * SetRegion Tests. */ @Test public void test_setRegion_configFileProperty() { - Config configProvider = PowerMockito.mock(Config.class); - String regionName = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+ JDBCSecretCacheBuilderProvider.PROPERTY_REGION; - when(configProvider.getStringPropertyWithDefault(regionName, null)).thenReturn("asdf"); + Config configProvider = mock(Config.class); + String regionName = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + + JDBCSecretCacheBuilderProvider.PROPERTY_REGION; + when(configProvider.getStringPropertyWithDefault(regionName, null)).thenReturn("us-west-2"); - AWSSecretsManagerClientBuilder builder = new JDBCSecretCacheBuilderProvider(configProvider).build(); + SecretsManagerClient client = new JDBCSecretCacheBuilderProvider(configProvider).build().build(); - assertEquals("asdf", builder.getRegion()); + assertEquals(client.serviceClientConfiguration().region(), Region.US_WEST_2); } - @Test public void test_setRegion_environmentVariable() { - Config configProvider = PowerMockito.mock(Config.class); - PowerMockito.mockStatic(System.class); + Config configProvider = mock(Config.class); String environmentRegionName = JDBCSecretCacheBuilderProvider.REGION_ENVIRONMENT_VARIABLE; - when(System.getenv(environmentRegionName)).thenReturn("asdf"); - assertEquals("asdf", System.getenv(environmentRegionName)); + environmentVariables.set(environmentRegionName, "us-east-1"); + assertEquals("us-east-1", System.getenv(environmentRegionName)); - AWSSecretsManagerClientBuilder builder = new JDBCSecretCacheBuilderProvider(configProvider).build(); - assertEquals("asdf", builder.getRegion()); + SecretsManagerClient client = new JDBCSecretCacheBuilderProvider(configProvider).build().build(); + assertEquals(client.serviceClientConfiguration().region(), Region.US_EAST_1); } - @Test public void test_setRegion_vpcEndpoint() { - Config configProvider = PowerMockito.mock(Config.class); - String vpcEndpointUrlName = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+PROPERTY_VPC_ENDPOINT_URL; - String vpcEndpointRegion = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+PROPERTY_VPC_ENDPOINT_REGION; - when(configProvider.getStringPropertyWithDefault(vpcEndpointUrlName, null)).thenReturn("asdf"); - when(configProvider.getStringPropertyWithDefault(vpcEndpointRegion, null)).thenReturn("qwerty"); + Config configProvider = mock(Config.class); + String vpcEndpointUrlName = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + PROPERTY_VPC_ENDPOINT_URL; + String vpcEndpointRegion = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + PROPERTY_VPC_ENDPOINT_REGION; + String vpcEndpointUrlString = "https://asdf.us-west-2.amazonaws.com"; + when(configProvider.getStringPropertyWithDefault(vpcEndpointUrlName, null)).thenReturn(vpcEndpointUrlString); + when(configProvider.getStringPropertyWithDefault(vpcEndpointRegion, null)).thenReturn("ap-southeast-3"); - AWSSecretsManagerClientBuilder builder = new JDBCSecretCacheBuilderProvider(configProvider).build(); + SecretsManagerClient client = new JDBCSecretCacheBuilderProvider(configProvider).build().build(); - assertEquals("asdf", builder.getEndpoint().getServiceEndpoint()); - assertEquals("qwerty", builder.getEndpoint().getSigningRegion()); + assertEquals(client.serviceClientConfiguration().endpointOverride().get().toString(), vpcEndpointUrlString); + assertEquals(client.serviceClientConfiguration().region(), Region.AP_SOUTHEAST_3); } - @Test - public void test_setRegion_defaultsToNull() { - AWSSecretsManagerClientBuilder builder = new JDBCSecretCacheBuilderProvider().build(); - assertNull(builder.getRegion()); + public void test_setRegion_defaultsToEnv() { + try { + new JDBCSecretCacheBuilderProvider().build().build(); + } catch (SdkClientException e) { + assertTrue(e.getMessage().startsWith("Unable to load region from any of the providers in the chain")); + } } /** @@ -78,137 +80,146 @@ public void test_setRegion_defaultsToNull() { @Test public void test_regionSelectionOrder_prefersVpcEndpointOverEverything() { - Config configProvider = PowerMockito.mock(Config.class); - PowerMockito.mockStatic(System.class); + Config configProvider = mock(Config.class); - //Arrange so all properties return something valid. - String regionName = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+ JDBCSecretCacheBuilderProvider.PROPERTY_REGION; - String vpcEndpointUrlName = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+PROPERTY_VPC_ENDPOINT_URL; - String vpcEndpointRegion = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+PROPERTY_VPC_ENDPOINT_REGION; + // Arrange so all properties return something valid. + String regionName = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + + JDBCSecretCacheBuilderProvider.PROPERTY_REGION; + String vpcEndpointUrlName = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + PROPERTY_VPC_ENDPOINT_URL; + String vpcEndpointRegion = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + PROPERTY_VPC_ENDPOINT_REGION; String environmentRegionName = JDBCSecretCacheBuilderProvider.REGION_ENVIRONMENT_VARIABLE; - - //Arrange the return values when the properties are requested. - when(System.getenv(environmentRegionName)).thenReturn("0"); - when(configProvider.getStringPropertyWithDefault(regionName, null)).thenReturn("1"); - when(configProvider.getStringPropertyWithDefault(vpcEndpointUrlName, null)).thenReturn("2"); - when(configProvider.getStringPropertyWithDefault(vpcEndpointRegion, null)).thenReturn("3"); - - //Act: Build our clientbuilder. - AWSSecretsManagerClientBuilder builder = new JDBCSecretCacheBuilderProvider(configProvider).build(); - - //Assert: Make sure the endpoint was configured properly. - assertEquals("3", builder.getEndpoint().getSigningRegion()); - assertEquals("2", builder.getEndpoint().getServiceEndpoint()); - assertNotEquals("1", builder.getRegion()); - assertNotEquals("0", builder.getRegion()); + String vpcEndpointUrlString = "https://1234.secretsmanager.amazonaws.com"; + + // Arrange the return values when the properties are requested. + environmentVariables.set(environmentRegionName, "us-east-2"); + when(configProvider.getStringPropertyWithDefault(regionName, null)).thenReturn("us-east-1"); + when(configProvider.getStringPropertyWithDefault(vpcEndpointUrlName, null)) + .thenReturn(vpcEndpointUrlString); + when(configProvider.getStringPropertyWithDefault(vpcEndpointRegion, null)).thenReturn("us-west-2"); + + // Act: Build our client + SecretsManagerClient client = new JDBCSecretCacheBuilderProvider(configProvider).build().build(); + + // Assert: Make sure the endpoint was configured properly. + assertNotEquals(client.serviceClientConfiguration().region(), Region.US_EAST_2); + assertNotEquals(client.serviceClientConfiguration().region(), Region.US_EAST_1); + assertEquals(client.serviceClientConfiguration().region(), Region.US_WEST_2); + assertEquals(client.serviceClientConfiguration().endpointOverride().get().toString(), + vpcEndpointUrlString); } - - @Test public void test_regionSelectionOrder_prefersEnvironmentVarOverConfig() { - Config configProvider = PowerMockito.mock(Config.class); - PowerMockito.mockStatic(System.class); + Config configProvider = mock(Config.class); - String regionName = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+ JDBCSecretCacheBuilderProvider.PROPERTY_REGION; + String regionName = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + + JDBCSecretCacheBuilderProvider.PROPERTY_REGION; String environmentRegionName = JDBCSecretCacheBuilderProvider.REGION_ENVIRONMENT_VARIABLE; - when(System.getenv(environmentRegionName)).thenReturn("0"); - when(configProvider.getStringPropertyWithDefault(regionName, null)).thenReturn("1"); + environmentVariables.set(environmentRegionName, "eu-west-3"); + when(configProvider.getStringPropertyWithDefault(regionName, null)).thenReturn("us-east-2"); - AWSSecretsManagerClientBuilder builder = new JDBCSecretCacheBuilderProvider(configProvider).build(); + SecretsManagerClient client = new JDBCSecretCacheBuilderProvider(configProvider).build().build(); - assertNotEquals("1", builder.getRegion()); - assertEquals("0", builder.getRegion()); + assertNotEquals(client.serviceClientConfiguration().region(), Region.US_EAST_2); + assertEquals(client.serviceClientConfiguration().region(), Region.EU_WEST_3); } - /** * Variables must be correctly set */ @Test public void test_settingValidation_emptyConfigPropertyIgnored() { - Config configProvider = PowerMockito.mock(Config.class); - String regionName = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+ JDBCSecretCacheBuilderProvider.PROPERTY_REGION; + Config configProvider = mock(Config.class); + String regionName = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + + JDBCSecretCacheBuilderProvider.PROPERTY_REGION; when(configProvider.getStringPropertyWithDefault(regionName, null)).thenReturn(""); - AWSSecretsManagerClientBuilder builder = new JDBCSecretCacheBuilderProvider(configProvider).build(); - - assertNull(builder.getRegion()); + try { + new JDBCSecretCacheBuilderProvider(configProvider).build().build(); + } catch (SdkClientException e) { + assertTrue(e.getMessage().startsWith("Unable to load region from any of the providers in the chain")); + } } @Test public void test_settingValidation_nullConfigPropertyIgnored() { - Config configProvider = PowerMockito.mock(Config.class); - String regionName = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+ JDBCSecretCacheBuilderProvider.PROPERTY_REGION; + Config configProvider = mock(Config.class); + String regionName = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + + JDBCSecretCacheBuilderProvider.PROPERTY_REGION; when(configProvider.getStringPropertyWithDefault(regionName, null)).thenReturn(""); - AWSSecretsManagerClientBuilder builder = new JDBCSecretCacheBuilderProvider(configProvider).build(); - - assertNull(builder.getRegion()); + try { + new JDBCSecretCacheBuilderProvider(configProvider).build().build(); + } catch (SdkClientException e) { + assertTrue(e.getMessage().startsWith("Unable to load region from any of the providers in the chain")); + } } @Test public void test_settingValidation_emptyEnvironmentVariableIgnored() { - Config configProvider = PowerMockito.mock(Config.class); - PowerMockito.mockStatic(System.class); + Config configProvider = mock(Config.class); String environmentRegionName = JDBCSecretCacheBuilderProvider.REGION_ENVIRONMENT_VARIABLE; - when(System.getenv(environmentRegionName)).thenReturn(""); - - AWSSecretsManagerClientBuilder builder = new JDBCSecretCacheBuilderProvider(configProvider).build(); + environmentVariables.set(environmentRegionName, ""); - assertNull(builder.getRegion()); + try { + new JDBCSecretCacheBuilderProvider(configProvider).build().build(); + } catch (SdkClientException e) { + assertTrue(e.getMessage().startsWith("Unable to load region from any of the providers in the chain")); + } } - @Test public void test_settingValidation_nullEnvironmentVariableIgnored() { - Config configProvider = PowerMockito.mock(Config.class); - PowerMockito.mockStatic(System.class); + Config configProvider = mock(Config.class); String environmentRegionName = JDBCSecretCacheBuilderProvider.REGION_ENVIRONMENT_VARIABLE; - when(System.getenv(environmentRegionName)).thenReturn(null); - - AWSSecretsManagerClientBuilder builder = new JDBCSecretCacheBuilderProvider(configProvider).build(); + environmentVariables.clear(environmentRegionName); - assertNull(builder.getRegion()); + try { + new JDBCSecretCacheBuilderProvider(configProvider).build().build(); + } catch (SdkClientException e) { + assertTrue(e.getMessage().startsWith("Unable to load region from any of the providers in the chain")); + } } - - - @Test public void test_settingValidation_emptyVpcIgnored() { - Config configProvider = PowerMockito.mock(Config.class); - String vpcEndpointUrlName = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+PROPERTY_VPC_ENDPOINT_URL; - String vpcEndpointRegion = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+PROPERTY_VPC_ENDPOINT_REGION; + Config configProvider = mock(Config.class); + String vpcEndpointUrlName = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + PROPERTY_VPC_ENDPOINT_URL; + String vpcEndpointRegion = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + PROPERTY_VPC_ENDPOINT_REGION; when(configProvider.getStringPropertyWithDefault(vpcEndpointUrlName, null)).thenReturn(""); when(configProvider.getStringPropertyWithDefault(vpcEndpointRegion, null)).thenReturn(""); - AWSSecretsManagerClientBuilder builder = new JDBCSecretCacheBuilderProvider(configProvider).build(); - - assertNull(builder.getEndpoint()); + try { + SecretsManagerClient client = new JDBCSecretCacheBuilderProvider(configProvider).build().build(); + assertTrue(client.serviceClientConfiguration().endpointOverride().isEmpty()); + } catch (SdkClientException e) { + assertTrue(e.getMessage().startsWith("Unable to load region from any of the providers in the chain")); + } } - @Test public void test_settingValidation_nullVpcIgnored() { - Config configProvider = PowerMockito.mock(Config.class); - String vpcEndpointUrlName = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+PROPERTY_VPC_ENDPOINT_URL; - String vpcEndpointRegion = AWSSecretsManagerDriver.PROPERTY_PREFIX+"."+PROPERTY_VPC_ENDPOINT_REGION; - when(configProvider.getStringPropertyWithDefault(vpcEndpointUrlName, null)).thenReturn(""); - when(configProvider.getStringPropertyWithDefault(vpcEndpointRegion, null)).thenReturn(""); - - AWSSecretsManagerClientBuilder builder = new JDBCSecretCacheBuilderProvider(configProvider).build(); - - assertNull(builder.getEndpoint()); + Config configProvider = mock(Config.class); + String vpcEndpointUrlName = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + PROPERTY_VPC_ENDPOINT_URL; + String vpcEndpointRegion = AWSSecretsManagerDriver.PROPERTY_PREFIX + "." + PROPERTY_VPC_ENDPOINT_REGION; + when(configProvider.getStringPropertyWithDefault(vpcEndpointUrlName, null)).thenReturn(null); + when(configProvider.getStringPropertyWithDefault(vpcEndpointRegion, null)).thenReturn(null); + + try { + SecretsManagerClient client = new JDBCSecretCacheBuilderProvider(configProvider).build().build(); + assertTrue(client.serviceClientConfiguration().endpointOverride().isEmpty()); + } catch (SdkClientException e) { + assertTrue(e.getMessage().startsWith("Unable to load region from any of the providers in the chain")); + } } } diff --git a/src/test/java/com/amazonaws/secretsmanager/util/SQLExceptionUtilsTest.java b/src/test/java/com/amazonaws/secretsmanager/util/SQLExceptionUtilsTest.java index 426eff5..0315018 100644 --- a/src/test/java/com/amazonaws/secretsmanager/util/SQLExceptionUtilsTest.java +++ b/src/test/java/com/amazonaws/secretsmanager/util/SQLExceptionUtilsTest.java @@ -1,22 +1,19 @@ package com.amazonaws.secretsmanager.util; -import org.junit.Test; - -import java.sql.SQLException; - import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import java.sql.SQLException; + +import org.junit.Test; public class SQLExceptionUtilsTest { - @Test public void test_unwrapAndCheckForCode_nullReturnsFalse() { assertFalse(SQLExceptionUtils.unwrapAndCheckForCode(null, 1045)); } - @Test public void test_unwrapAndCheckForCode_wrappedException_returnsTrue() { SQLException e = new SQLException("", "", 1045); @@ -33,7 +30,6 @@ public void test_unwrapAndCheckForCode_wrappedException_returnsFalse() { assertFalse(SQLExceptionUtils.unwrapAndCheckForCode(wrapper, 1045)); } - @Test public void test_unwrapAndCheckForCode_loopInWrappedExceptions_returnsFalse() { SQLException e1 = new SQLException("", "", 42); diff --git a/src/test/java/com/amazonaws/secretsmanager/util/TestClass.java b/src/test/java/com/amazonaws/secretsmanager/util/TestClass.java index fa6cdd7..65bb4d9 100644 --- a/src/test/java/com/amazonaws/secretsmanager/util/TestClass.java +++ b/src/test/java/com/amazonaws/secretsmanager/util/TestClass.java @@ -12,17 +12,17 @@ */ package com.amazonaws.secretsmanager.util; -import com.amazonaws.services.secretsmanager.model.GetSecretValueRequest; - import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; - import java.util.Arrays; import java.util.LinkedList; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest; + /** - * A class that holds some helper methods for running tests that test classes should inherit from. + * A class that holds some helper methods for running tests that test classes + * should inherit from. */ public class TestClass { @@ -33,7 +33,7 @@ public Object getFieldFrom(Object o, String fieldName, Class clazz) throws Ex } public Object getFieldFrom(Object o, String fieldName) { - Class clazz = o.getClass(); + Class clazz = o.getClass(); boolean isDone = false; while (!isDone) { try { @@ -61,7 +61,7 @@ public void setFieldFrom(Object o, String fieldName, Object value, Class claz } public void setFieldFrom(Object o, String fieldName, Object value) { - Class clazz = o.getClass(); + Class clazz = o.getClass(); boolean isDone = false; while (!isDone) { try { @@ -81,9 +81,9 @@ public void setFieldFrom(Object o, String fieldName, Object value) { } } - public Constructor getConstructorWithNArguments(Class clazz, int n) { - Constructor[] ctors = clazz.getDeclaredConstructors(); - Constructor ctor = null; + public Constructor getConstructorWithNArguments(Class clazz, int n) { + Constructor[] ctors = clazz.getDeclaredConstructors(); + Constructor ctor = null; for (int i = 0; i < ctors.length; i++) { ctor = ctors[i]; if (ctor.getGenericParameterTypes().length == n) { @@ -93,36 +93,36 @@ public Constructor getConstructorWithNArguments(Class clazz, int n) { return ctor; } - public Object newInstance(Constructor ctor, Object... initargs) { + public Object newInstance(Constructor ctor, Object... initargs) { try { ctor.setAccessible(true); return ctor.newInstance(initargs); } catch (RuntimeException e) { throw e; - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); return null; } } - public Object callConstructorWithArguments(Class clazz, Object... initargs) { - Constructor ctor = getConstructorWithNArguments(clazz, initargs.length); + public Object callConstructorWithArguments(Class clazz, Object... initargs) { + Constructor ctor = getConstructorWithNArguments(clazz, initargs.length); return newInstance(ctor, initargs); } - public Object callConstructorWithArguments(int argsOffset, Class clazz, Object... initargs) { - Constructor ctor = getConstructorWithNArguments(clazz, initargs.length + argsOffset); + public Object callConstructorWithArguments(int argsOffset, Class clazz, Object... initargs) { + Constructor ctor = getConstructorWithNArguments(clazz, initargs.length + argsOffset); return newInstance(ctor, initargs); } public GetSecretValueRequest requestWithName(String secretName) { - return new GetSecretValueRequest().withSecretId(secretName); + return GetSecretValueRequest.builder().secretId(secretName).build(); } public Object callMethodWithArguments(Object object, String methodName, Object... args) { try { LinkedList allMethods = new LinkedList<>(); - Class clazz = object.getClass(); + Class clazz = object.getClass(); while (!clazz.equals(Object.class)) { Method[] methods = clazz.getDeclaredMethods(); allMethods.addAll(Arrays.asList(methods)); @@ -140,9 +140,9 @@ public Object callMethodWithArguments(Object object, String methodName, Object.. } correctMethod.setAccessible(true); return correctMethod.invoke(object, args); - } catch(RuntimeException e) { + } catch (RuntimeException e) { throw e; - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); return null; } @@ -153,31 +153,33 @@ public interface throwingRunnable { } public void assertThrows(Class exception, throwingRunnable code) { - try { + try { code.run(); throw new RuntimeException("Should have thrown a " + exception.getName() + " but threw nothing."); } catch (Exception e) { if (!exception.isAssignableFrom(e.getClass())) { e.printStackTrace(); - throw new RuntimeException("Should have thrown a " + exception.getName() + " but threw " + e.getClass().getName()); + throw new RuntimeException( + "Should have thrown a " + exception.getName() + " but threw " + e.getClass().getName()); } } } public void assertThrows(Exception exception, throwingRunnable code) { - try { + try { code.run(); throw new RuntimeException("Should have thrown a " + exception.getMessage() + " but threw nothing."); } catch (Exception e) { if (!exception.equals(e)) { e.printStackTrace(); - throw new RuntimeException("Should have thrown a " + exception.getMessage() + " but threw " + e.getClass().getName()); + throw new RuntimeException( + "Should have thrown a " + exception.getMessage() + " but threw " + e.getClass().getName()); } } } public void assertNotThrows(throwingRunnable code) { - try { + try { code.run(); } catch (Exception e) { e.printStackTrace(); @@ -185,4 +187,3 @@ public void assertNotThrows(throwingRunnable code) { } } } - From 78b869ffd11cbb65a2d2dd6bc60ea08ef53b14e9 Mon Sep 17 00:00:00 2001 From: Simon Marty Date: Tue, 29 Aug 2023 13:30:56 -0700 Subject: [PATCH 3/3] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c66ff00..c4f3350 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ The secret being used should be in the JSON format we use for our rotation lambd ## Credentials -This library uses the [Default Credential Provider Chain](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html). The following options exist to override some of the defaults: +This library uses the [Default Credential Provider Chain](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials.html). The following options exist to override some of the defaults: 1) Set a PrivateLink DNS endpoint URL and a region in the secretsmanager.properties file: ```text