From 2f178188d113a482422572ffcc1b2dbe2206d615 Mon Sep 17 00:00:00 2001 From: He Zean Date: Fri, 10 Jan 2025 20:51:58 +0800 Subject: [PATCH 1/2] Add support for empty password in bitnami/postgresql See gh-43771 Signed-off-by: He Zean --- ...poseConnectionDetailsFactoryIntegrationTests.java | 11 +++++++++++ ...poseConnectionDetailsFactoryIntegrationTests.java | 12 ++++++++++++ .../postgres-bitnami-empty-password-compose.yaml | 9 +++++++++ .../connection/postgres/PostgresEnvironment.java | 6 ++++-- .../postgres/PostgresEnvironmentTests.java | 6 ++++++ 5 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/postgres/postgres-bitnami-empty-password-compose.yaml diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index fa2d96b66a4..9c4f670c8db 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -35,6 +35,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Andy Wilkinson * @author Phillip Webb * @author Scott Frederick + * @author He Zean */ class PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests { @@ -60,6 +61,16 @@ class PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests { checkDatabaseAccess(connectionDetails); } + @DockerComposeTest(composeFile = "postgres-bitnami-empty-password-compose.yaml", + image = TestImage.BITNAMI_POSTGRESQL) + void runWithBitnamiImageCreatesConnectionDetailsWithAllowEmptyPassword(JdbcConnectionDetails connectionDetails) + throws ClassNotFoundException { + assertThat(connectionDetails.getUsername()).isEqualTo("myuser"); + assertThat(connectionDetails.getPassword()).isEmpty(); + assertThat(connectionDetails.getJdbcUrl()).startsWith("jdbc:postgresql://").endsWith("/mydatabase"); + checkDatabaseAccess(connectionDetails); + } + @DockerComposeTest(composeFile = "postgres-application-name-compose.yaml", image = TestImage.POSTGRESQL) void runCreatesConnectionDetailsApplicationName(JdbcConnectionDetails connectionDetails) throws ClassNotFoundException { diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index b6e0e2e604e..f11c4652240 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -37,6 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Andy Wilkinson * @author Phillip Webb * @author Scott Frederick + * @author He Zean */ class PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests { @@ -63,6 +64,17 @@ class PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests { checkDatabaseAccess(connectionDetails); } + @DockerComposeTest(composeFile = "postgres-bitnami-empty-password-compose.yaml", + image = TestImage.BITNAMI_POSTGRESQL) + void runWithBitnamiImageCreatesConnectionDetailsWithAllowEmptyPassword(R2dbcConnectionDetails connectionDetails) { + ConnectionFactoryOptions connectionFactoryOptions = connectionDetails.getConnectionFactoryOptions(); + assertThat(connectionFactoryOptions.getRequiredValue(ConnectionFactoryOptions.USER)).isEqualTo("myuser"); + assertThat(connectionFactoryOptions.getValue(ConnectionFactoryOptions.PASSWORD)).isNull(); + assertThat(connectionFactoryOptions.getRequiredValue(ConnectionFactoryOptions.DATABASE)) + .isEqualTo("mydatabase"); + checkDatabaseAccess(connectionDetails); + } + @DockerComposeTest(composeFile = "postgres-application-name-compose.yaml", image = TestImage.POSTGRESQL) void runCreatesConnectionDetailsApplicationName(R2dbcConnectionDetails connectionDetails) { assertConnectionDetails(connectionDetails); diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/postgres/postgres-bitnami-empty-password-compose.yaml b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/postgres/postgres-bitnami-empty-password-compose.yaml new file mode 100644 index 00000000000..96779634160 --- /dev/null +++ b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/postgres/postgres-bitnami-empty-password-compose.yaml @@ -0,0 +1,9 @@ +services: + database: + image: '{imageName}' + ports: + - '5432' + environment: + - 'POSTGRESQL_USERNAME=myuser' + - 'POSTGRESQL_DATABASE=mydatabase' + - 'ALLOW_EMPTY_PASSWORD=yes' diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java index 220dbbf3e55..07c1ce583bc 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java +++ b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java @@ -17,6 +17,7 @@ package org.springframework.boot.docker.compose.service.connection.postgres; import java.util.Map; +import java.util.Objects; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -67,8 +68,9 @@ class PostgresEnvironment { return null; } String password = env.getOrDefault("POSTGRES_PASSWORD", env.get("POSTGRESQL_PASSWORD")); - Assert.state(StringUtils.hasLength(password), "PostgreSQL password must be provided"); - return password; + boolean allowEmpty = env.containsKey("ALLOW_EMPTY_PASSWORD"); + Assert.state(allowEmpty || StringUtils.hasLength(password), "PostgreSQL password must be provided"); + return Objects.requireNonNullElse(password, ""); } private boolean isUsingTrustHostAuthMethod(Map env) { diff --git a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java index 24ce50bc11d..519d217b99d 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java @@ -93,6 +93,12 @@ class PostgresEnvironmentTests { assertThat(environment.getPassword()).isNull(); } + @Test + void getPasswordWhenHasNoPasswordAndAllowEmptyPassword() { + PostgresEnvironment environment = new PostgresEnvironment(Map.of("ALLOW_EMPTY_PASSWORD", "yes")); + assertThat(environment.getPassword()).isEmpty(); + } + @Test void getDatabaseWhenNoPostgresDbOrPostgresUser() { PostgresEnvironment environment = new PostgresEnvironment(Map.of("POSTGRES_PASSWORD", "secret")); From b601282b57f22db03b960c31e06b05c08ca7a6d9 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 15 Jan 2025 11:32:27 +0000 Subject: [PATCH 2/2] Polish "Add support for empty password in bitnami/postgresql" See gh-43771 --- ...mposeConnectionDetailsFactoryIntegrationTests.java | 10 ---------- ...mposeConnectionDetailsFactoryIntegrationTests.java | 11 ----------- .../postgres-bitnami-empty-password-compose.yaml | 9 --------- .../connection/postgres/PostgresEnvironment.java | 5 ++--- .../connection/postgres/PostgresEnvironmentTests.java | 2 +- 5 files changed, 3 insertions(+), 34 deletions(-) delete mode 100644 spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/postgres/postgres-bitnami-empty-password-compose.yaml diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index 9c4f670c8db..403b3be9191 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -61,16 +61,6 @@ class PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests { checkDatabaseAccess(connectionDetails); } - @DockerComposeTest(composeFile = "postgres-bitnami-empty-password-compose.yaml", - image = TestImage.BITNAMI_POSTGRESQL) - void runWithBitnamiImageCreatesConnectionDetailsWithAllowEmptyPassword(JdbcConnectionDetails connectionDetails) - throws ClassNotFoundException { - assertThat(connectionDetails.getUsername()).isEqualTo("myuser"); - assertThat(connectionDetails.getPassword()).isEmpty(); - assertThat(connectionDetails.getJdbcUrl()).startsWith("jdbc:postgresql://").endsWith("/mydatabase"); - checkDatabaseAccess(connectionDetails); - } - @DockerComposeTest(composeFile = "postgres-application-name-compose.yaml", image = TestImage.POSTGRESQL) void runCreatesConnectionDetailsApplicationName(JdbcConnectionDetails connectionDetails) throws ClassNotFoundException { diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index f11c4652240..29df612dab8 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -64,17 +64,6 @@ class PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests { checkDatabaseAccess(connectionDetails); } - @DockerComposeTest(composeFile = "postgres-bitnami-empty-password-compose.yaml", - image = TestImage.BITNAMI_POSTGRESQL) - void runWithBitnamiImageCreatesConnectionDetailsWithAllowEmptyPassword(R2dbcConnectionDetails connectionDetails) { - ConnectionFactoryOptions connectionFactoryOptions = connectionDetails.getConnectionFactoryOptions(); - assertThat(connectionFactoryOptions.getRequiredValue(ConnectionFactoryOptions.USER)).isEqualTo("myuser"); - assertThat(connectionFactoryOptions.getValue(ConnectionFactoryOptions.PASSWORD)).isNull(); - assertThat(connectionFactoryOptions.getRequiredValue(ConnectionFactoryOptions.DATABASE)) - .isEqualTo("mydatabase"); - checkDatabaseAccess(connectionDetails); - } - @DockerComposeTest(composeFile = "postgres-application-name-compose.yaml", image = TestImage.POSTGRESQL) void runCreatesConnectionDetailsApplicationName(R2dbcConnectionDetails connectionDetails) { assertConnectionDetails(connectionDetails); diff --git a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/postgres/postgres-bitnami-empty-password-compose.yaml b/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/postgres/postgres-bitnami-empty-password-compose.yaml deleted file mode 100644 index 96779634160..00000000000 --- a/spring-boot-project/spring-boot-docker-compose/src/dockerTest/resources/org/springframework/boot/docker/compose/service/connection/postgres/postgres-bitnami-empty-password-compose.yaml +++ /dev/null @@ -1,9 +0,0 @@ -services: - database: - image: '{imageName}' - ports: - - '5432' - environment: - - 'POSTGRESQL_USERNAME=myuser' - - 'POSTGRESQL_DATABASE=mydatabase' - - 'ALLOW_EMPTY_PASSWORD=yes' diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java index 07c1ce583bc..a4f64eae03a 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java +++ b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java @@ -17,7 +17,6 @@ package org.springframework.boot.docker.compose.service.connection.postgres; import java.util.Map; -import java.util.Objects; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -69,8 +68,8 @@ class PostgresEnvironment { } String password = env.getOrDefault("POSTGRES_PASSWORD", env.get("POSTGRESQL_PASSWORD")); boolean allowEmpty = env.containsKey("ALLOW_EMPTY_PASSWORD"); - Assert.state(allowEmpty || StringUtils.hasLength(password), "PostgreSQL password must be provided"); - return Objects.requireNonNullElse(password, ""); + Assert.state(allowEmpty || StringUtils.hasLength(password), "No PostgreSQL password found"); + return (password != null) ? password : ""; } private boolean isUsingTrustHostAuthMethod(Map env) { diff --git a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java index 519d217b99d..83cec657c1c 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java @@ -39,7 +39,7 @@ class PostgresEnvironmentTests { @Test void createWhenNoPostgresPasswordThrowsException() { assertThatIllegalStateException().isThrownBy(() -> new PostgresEnvironment(Collections.emptyMap())) - .withMessage("PostgreSQL password must be provided"); + .withMessage("No PostgreSQL password found"); } @Test