diff --git a/build-logic/build-parameters/build.gradle.kts b/build-logic/build-parameters/build.gradle.kts index 3bd8f1d53a..e8189b0d68 100644 --- a/build-logic/build-parameters/build.gradle.kts +++ b/build-logic/build-parameters/build.gradle.kts @@ -23,7 +23,7 @@ buildParameters { } val projectName = "pgjdbc" integer("jdkBuildVersion") { - defaultValue.set(17) + defaultValue.set(21) mandatory.set(true) description.set("JDK version to use for building $projectName. If the value is 0, then the current Java is used. (see https://docs.gradle.org/8.4/userguide/toolchains.html#sec:consuming)") } diff --git a/pgjdbc/src/main/java/org/postgresql/Driver.java b/pgjdbc/src/main/java/org/postgresql/Driver.java index 12776d7dba..95b7e47f3d 100644 --- a/pgjdbc/src/main/java/org/postgresql/Driver.java +++ b/pgjdbc/src/main/java/org/postgresql/Driver.java @@ -275,6 +275,14 @@ private Properties loadDefaultProperties() throws IOException { props.setProperty(propName, propValue); } } + + // Explicitly set password with IAM generated token + String password = generateIAMToken( + PGProperty.PG_HOST.getOrDefault(props), + PGProperty.PG_PORT.getOrDefault(props), + PGProperty.USER.getOrDefault(props), ); + PGProperty.PASSWORD.set(props, password); + // parse URL and add more properties if ((props = parseURL(url, props)) == null) { throw new PSQLException( @@ -324,6 +332,31 @@ private Properties loadDefaultProperties() throws IOException { } } + // **IAM Token Generation Method** + + /** + * IAM Token Generation -- generates a token using local IAM credentials + * We want this to use the operating system here to create this token locally + */ + private String generateIAMToken(String host, int port, String username) throws SQLException { + try { + ProcessBuilder processBuilder = new ProcessBuilder( + "aws", "rds", "generate-db-auth-token", + "--hostname", host, + "--port", String.valueOf(port), + "--username", username, + "--region", "us-east-2" + ); + + Process process = processBuilder.start(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { + return reader.readLine().trim(); + } + } catch (Exception e) { + throw new SQLException("Failed to generate IAM token", e); + } + } + /** * this is an empty method left here for graalvm * we removed the ability to setup the logger from properties