From eb0887085e487198896ccd1e5ecf282e51b95006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 7 Oct 2026 15:30:45 +0200 Subject: [PATCH] Polish "Encode credentials in Docker Compose MongoDB connection string" See gh-51939 --- ...nectionDetailsFactoryIntegrationTests.java | 14 ------ ...ved-characters-in-credentials-compose.yaml | 9 ---- ...DockerComposeConnectionDetailsFactory.java | 2 +- ...ComposeConnectionDetailsFactoryTests.java} | 45 ++++++++++--------- 4 files changed, 24 insertions(+), 46 deletions(-) delete mode 100644 module/spring-boot-mongodb/src/dockerTest/resources/org/springframework/boot/mongodb/docker/compose/mongo-with-reserved-characters-in-credentials-compose.yaml rename module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/docker/compose/{MongoDockerComposeConnectionDetailsFactoryConnectionDetailsTests.java => MongoDockerComposeConnectionDetailsFactoryTests.java} (68%) diff --git a/module/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryIntegrationTests.java b/module/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryIntegrationTests.java index cd1e5e20f62..91b70cac78f 100644 --- a/module/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/module/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -18,8 +18,6 @@ package org.springframework.boot.mongodb.docker.compose; import com.mongodb.ConnectionString; import com.mongodb.MongoCredential; -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoClients; import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest; import org.springframework.boot.mongodb.autoconfigure.MongoConnectionDetails; @@ -52,18 +50,6 @@ class MongoDockerComposeConnectionDetailsFactoryIntegrationTests { assertThat(sslBundle).isNotNull(); } - @DockerComposeTest(composeFile = "mongo-with-reserved-characters-in-credentials-compose.yaml", - image = TestImage.MONGODB) - void runWithReservedCharactersInCredentialsCreatesConnectionDetails(MongoConnectionDetails connectionDetails) { - ConnectionString connectionString = connectionDetails.getConnectionString(); - MongoCredential credential = connectionString.getCredential(); - assertThat(credential).isNotNull(); - assertThat(credential.getPassword()).isEqualTo("p@ss:w/rd".toCharArray()); - try (MongoClient client = MongoClients.create(connectionString)) { - assertThat(client.listDatabaseNames()).contains("admin"); - } - } - private void assertConnectionDetailsWithDatabase(MongoConnectionDetails connectionDetails, String database) { ConnectionString connectionString = connectionDetails.getConnectionString(); MongoCredential credential = connectionString.getCredential(); diff --git a/module/spring-boot-mongodb/src/dockerTest/resources/org/springframework/boot/mongodb/docker/compose/mongo-with-reserved-characters-in-credentials-compose.yaml b/module/spring-boot-mongodb/src/dockerTest/resources/org/springframework/boot/mongodb/docker/compose/mongo-with-reserved-characters-in-credentials-compose.yaml deleted file mode 100644 index 1ea6161603f..00000000000 --- a/module/spring-boot-mongodb/src/dockerTest/resources/org/springframework/boot/mongodb/docker/compose/mongo-with-reserved-characters-in-credentials-compose.yaml +++ /dev/null @@ -1,9 +0,0 @@ -services: - mongo: - image: '{imageName}' - ports: - - '27017' - environment: - MONGO_INITDB_ROOT_USERNAME: 'root' - MONGO_INITDB_ROOT_PASSWORD: 'p@ss:w/rd' - MONGO_INITDB_DATABASE: 'mydatabase' diff --git a/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactory.java b/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactory.java index 691ab24c3eb..fe00b70a3c9 100644 --- a/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactory.java +++ b/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactory.java @@ -88,7 +88,7 @@ class MongoDockerComposeConnectionDetailsFactory extends DockerComposeConnection return new ConnectionString(builder.toString()); } - private String encode(String input) { + private static String encode(String input) { return URLEncoder.encode(input, StandardCharsets.UTF_8).replace("+", "%20"); } diff --git a/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryConnectionDetailsTests.java b/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryTests.java similarity index 68% rename from module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryConnectionDetailsTests.java rename to module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryTests.java index a935bcbf19b..5f952fde18f 100644 --- a/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryConnectionDetailsTests.java +++ b/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryTests.java @@ -32,28 +32,19 @@ import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; /** - * Tests for - * {@link MongoDockerComposeConnectionDetailsFactory.MongoDockerComposeConnectionDetails}. + * Tests for {@link MongoDockerComposeConnectionDetailsFactory}. * * @author Iram Tazim Hoque */ -class MongoDockerComposeConnectionDetailsFactoryConnectionDetailsTests { - - private final RunningService service = mock(RunningService.class); - - MongoDockerComposeConnectionDetailsFactoryConnectionDetailsTests() { - given(this.service.labels()).willReturn(Collections.emptyMap()); - ConnectionPorts connectionPorts = mock(ConnectionPorts.class); - given(this.service.ports()).willReturn(connectionPorts); - given(this.service.host()).willReturn("localhost"); - given(connectionPorts.get(27017)).willReturn(30001); - } +class MongoDockerComposeConnectionDetailsFactoryTests { @Test void createConnectionDetails() { - given(this.service.env()).willReturn(Map.of("MONGO_INITDB_ROOT_USERNAME", "root", "MONGO_INITDB_ROOT_PASSWORD", - "secret", "MONGO_INITDB_DATABASE", "mydatabase")); - ConnectionString connectionString = getConnectionString(); + RunningService runningService = mockRunningService(); + given(runningService.env()).willReturn(Map.of("MONGO_INITDB_ROOT_USERNAME", "root", + "MONGO_INITDB_ROOT_PASSWORD", "secret", "MONGO_INITDB_DATABASE", "mydatabase")); + ConnectionString connectionString = new MongoDockerComposeConnectionDetails(runningService) + .getConnectionString(); assertThat(connectionString.getHosts()).containsExactly("localhost:30001"); assertThat(connectionString.getDatabase()).isEqualTo("mydatabase"); MongoCredential credential = connectionString.getCredential(); @@ -65,9 +56,11 @@ class MongoDockerComposeConnectionDetailsFactoryConnectionDetailsTests { @Test void createConnectionDetailsWhenCredentialsContainReservedCharacters() { - given(this.service.env()).willReturn(Map.of("MONGO_INITDB_ROOT_USERNAME", "us@r:name", + RunningService runningService = mockRunningService(); + given(runningService.env()).willReturn(Map.of("MONGO_INITDB_ROOT_USERNAME", "us@r:name", "MONGO_INITDB_ROOT_PASSWORD", "p@ss:w/rd%?#[] +", "MONGO_INITDB_DATABASE", "mydatabase")); - ConnectionString connectionString = getConnectionString(); + ConnectionString connectionString = new MongoDockerComposeConnectionDetails(runningService) + .getConnectionString(); assertThat(connectionString.getHosts()).containsExactly("localhost:30001"); assertThat(connectionString.getDatabase()).isEqualTo("mydatabase"); MongoCredential credential = connectionString.getCredential(); @@ -79,15 +72,23 @@ class MongoDockerComposeConnectionDetailsFactoryConnectionDetailsTests { @Test void createConnectionDetailsWithoutCredentials() { - given(this.service.env()).willReturn(Collections.emptyMap()); - ConnectionString connectionString = getConnectionString(); + RunningService runningService = mockRunningService(); + given(runningService.env()).willReturn(Collections.emptyMap()); + ConnectionString connectionString = new MongoDockerComposeConnectionDetails(runningService) + .getConnectionString(); assertThat(connectionString.getHosts()).containsExactly("localhost:30001"); assertThat(connectionString.getDatabase()).isEqualTo("test"); assertThat(connectionString.getCredential()).isNull(); } - private ConnectionString getConnectionString() { - return new MongoDockerComposeConnectionDetails(this.service).getConnectionString(); + private static RunningService mockRunningService() { + RunningService service = mock(RunningService.class); + given(service.labels()).willReturn(Collections.emptyMap()); + ConnectionPorts connectionPorts = mock(ConnectionPorts.class); + given(service.ports()).willReturn(connectionPorts); + given(service.host()).willReturn("localhost"); + given(connectionPorts.get(27017)).willReturn(30001); + return service; } }