From f4aab7f15d96b00e827b9ffb057128a454cb6c8c Mon Sep 17 00:00:00 2001 From: spencergibb Date: Mon, 29 Mar 2021 18:05:06 -0400 Subject: [PATCH 1/2] Adds support for uri encoded username/password Fixes gh-1621 --- .../cloud/config/client/ConfigClientProperties.java | 10 +++++++++- .../config/client/ConfigClientPropertiesTests.java | 9 +++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientProperties.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientProperties.java index 147a8af8..a9228379 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientProperties.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientProperties.java @@ -16,8 +16,11 @@ package org.springframework.cloud.config.client; +import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -333,9 +336,14 @@ public class ConfigClientProperties { // But the username can be overridden result.username = explicitCredentials.username; } + + result.password = URLDecoder.decode(result.password, + StandardCharsets.UTF_8.toString()); + result.username = URLDecoder.decode(result.username, + StandardCharsets.UTF_8.toString()); return result; } - catch (MalformedURLException e) { + catch (MalformedURLException | UnsupportedEncodingException e) { throw new IllegalStateException("Invalid URL: " + uri, e); } } diff --git a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigClientPropertiesTests.java b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigClientPropertiesTests.java index a192ec45..18b9c34a 100644 --- a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigClientPropertiesTests.java +++ b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigClientPropertiesTests.java @@ -59,6 +59,15 @@ public class ConfigClientPropertiesTests { assertThat(credentials.getPassword()).isEqualTo("bar"); } + @Test + public void uriCredsWithAtInPassword() { + this.locator.setUri(new String[] { "http://foo:bar%40@localhost:9999" }); + Credentials credentials = this.locator.getCredentials(0); + assertThat(credentials.getUri()).isEqualTo("http://localhost:9999"); + assertThat(credentials.getUsername()).isEqualTo("foo"); + assertThat(credentials.getPassword()).isEqualTo("bar@"); + } + @Test public void explicitPassword() { this.locator.setUri(new String[] { "http://foo:bar@localhost:9999" }); From e7a69671b3a9242e2412e030e8660af4a194f56c Mon Sep 17 00:00:00 2001 From: spencergibb Date: Mon, 29 Mar 2021 18:05:38 -0400 Subject: [PATCH 2/2] Adds support for token auth via username property. Fixes gh-1602 --- .../server/support/GitCredentialsProviderFactory.java | 8 ++++++++ .../GitCredentialsProviderFactoryTests.java | 10 +++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/GitCredentialsProviderFactory.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/GitCredentialsProviderFactory.java index 4a9d3dc9..6ef365bb 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/GitCredentialsProviderFactory.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/GitCredentialsProviderFactory.java @@ -96,6 +96,14 @@ public class GitCredentialsProviderFactory { provider = new UsernamePasswordCredentialsProvider(username, password.toCharArray()); } + else if (hasText(username) && !hasText(passphrase)) { + // useful for token based login gh-1602 + // see + // https://stackoverflow.com/questions/28073266/how-to-use-jgit-to-push-changes-to-remote-with-oauth-access-token + this.logger.debug( + "Constructing UsernamePasswordCredentialsProvider for URI " + uri); + provider = new UsernamePasswordCredentialsProvider(username, (String) null); + } else if (hasText(passphrase)) { this.logger .debug("Constructing PassphraseCredentialsProvider for URI " + uri); diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/credentials/GitCredentialsProviderFactoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/credentials/GitCredentialsProviderFactoryTests.java index b0794e56..d61b0e2b 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/credentials/GitCredentialsProviderFactoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/credentials/GitCredentialsProviderFactoryTests.java @@ -61,13 +61,21 @@ public class GitCredentialsProviderFactoryTests { } @Test - public void testCreateForFileWithUsername() { + public void testCreateForFileWithUsernameAndPassword() { CredentialsProvider provider = this.factory.createFor(FILE_REPO, USER, PASSWORD, null, false); assertThat(provider).isNotNull(); assertThat(provider instanceof UsernamePasswordCredentialsProvider).isTrue(); } + @Test + public void testCreateForServerWithUsernameAndNoPassword() { + CredentialsProvider provider = this.factory.createFor(HTTPS_GIT_REPO, USER, "", + null, false); + assertThat(provider).isNotNull(); + assertThat(provider instanceof UsernamePasswordCredentialsProvider).isTrue(); + } + @Test public void testCreateForServerNoUsernameIsNull() { CredentialsProvider provider = this.factory.createFor(HTTPS_GIT_REPO, null, null,