diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java index 8ba84996..cb544e7c 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java @@ -428,7 +428,9 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository } private void setCredentialsProvider(TransportCommand cmd) { - if (hasText(getUsername())) { + if (gitCredentialsProvider != null) { + cmd.setCredentialsProvider(gitCredentialsProvider); + } else if (hasText(getUsername())) { cmd.setCredentialsProvider( new UsernamePasswordCredentialsProvider(getUsername(), getPassword())); } else if (hasText(getPassphrase())) { 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 097d6360..8766255f 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 @@ -16,7 +16,6 @@ package org.springframework.cloud.config.server.support; - import static org.springframework.util.StringUtils.hasText; import org.apache.commons.logging.Log; diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java index 8a77339c..0637eac4 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java @@ -56,6 +56,8 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.ArgumentCaptor; import org.springframework.cloud.config.environment.Environment; +import org.springframework.cloud.config.server.support.AwsCodeCommitCredentialProvider; +import org.springframework.cloud.config.server.support.GitCredentialsProviderFactory; import org.springframework.cloud.config.server.support.PassphraseCredentialsProvider; import org.springframework.cloud.config.server.test.ConfigServerTestUtils; import org.springframework.core.env.StandardEnvironment; @@ -592,6 +594,85 @@ public class JGitEnvironmentRepositoryTests { provider.get(new URIish(), stringCredential); assertEquals(stringCredential.getValue(), passphrase); } + + @Test + public void gitCredentialsProviderFactoryCreatesPassphraseProvider() throws Exception { + final String passphrase = "mypassphrase"; + final String gitUri = "git+ssh://git@somegitserver/somegitrepo"; + GitCredentialsProviderFactory credentialsFactory = new GitCredentialsProviderFactory(); + Git mockGit = mock(Git.class); + MockCloneCommand mockCloneCommand = new MockCloneCommand(mockGit); + + JGitEnvironmentRepository envRepository = new JGitEnvironmentRepository(this.environment); + envRepository.setGitFactory(new MockGitFactory(mockGit, mockCloneCommand)); + envRepository.setUri(gitUri); + envRepository.setBasedir(new File("./mybasedir")); + envRepository.setGitCredentialsProvider(credentialsFactory.createFor(gitUri, null, null, passphrase)); + envRepository.setCloneOnStart(true); + envRepository.afterPropertiesSet(); + + assertTrue(mockCloneCommand.hasPassphraseCredentialsProvider()); + + CredentialsProvider provider = mockCloneCommand.getCredentialsProvider(); + assertFalse(provider.isInteractive()); + + CredentialItem.StringType stringCredential = new CredentialItem.StringType(PassphraseCredentialsProvider.PROMPT, true); + + assertTrue(provider.supports(stringCredential)); + provider.get(new URIish(), stringCredential); + assertEquals(stringCredential.getValue(), passphrase); + + } + + @Test + public void gitCredentialsProviderFactoryCreatesUsernamePasswordProvider() throws Exception { + GitCredentialsProviderFactory credentialsFactory = new GitCredentialsProviderFactory(); + Git mockGit = mock(Git.class); + MockCloneCommand mockCloneCommand = new MockCloneCommand(mockGit); + final String username = "someuser"; + final String password = "mypassword"; + + JGitEnvironmentRepository envRepository = new JGitEnvironmentRepository(this.environment); + envRepository.setGitFactory(new MockGitFactory(mockGit, mockCloneCommand)); + envRepository.setUri("git+ssh://git@somegitserver/somegitrepo"); + envRepository.setBasedir(new File("./mybasedir")); + envRepository.setGitCredentialsProvider(credentialsFactory.createFor( + envRepository.getUri(), username, password, null)); + envRepository.setCloneOnStart(true); + envRepository.afterPropertiesSet(); + + assertTrue(mockCloneCommand.getCredentialsProvider() instanceof UsernamePasswordCredentialsProvider); + + CredentialsProvider provider = mockCloneCommand.getCredentialsProvider(); + CredentialItem.Username usernameCredential = new CredentialItem.Username(); + CredentialItem.Password passwordCredential = new CredentialItem.Password(); + assertTrue(provider.supports(usernameCredential)); + assertTrue(provider.supports(passwordCredential)); + + provider.get(new URIish(), usernameCredential); + assertEquals(usernameCredential.getValue(), username); + provider.get(new URIish(), passwordCredential); + assertEquals(String.valueOf(passwordCredential.getValue()), password); + } + + @Test + public void gitCredentialsProviderFactoryCreatesAwsCodeCommitProvider() throws Exception { + GitCredentialsProviderFactory credentialsFactory = new GitCredentialsProviderFactory(); + Git mockGit = mock(Git.class); + MockCloneCommand mockCloneCommand = new MockCloneCommand(mockGit); + final String awsUri = "https://git-codecommit.us-east-1.amazonaws.com/v1/repos/test"; + + JGitEnvironmentRepository envRepository = new JGitEnvironmentRepository(this.environment); + envRepository.setGitFactory(new MockGitFactory(mockGit, mockCloneCommand)); + envRepository.setUri(awsUri); + envRepository.setGitCredentialsProvider(credentialsFactory.createFor( + envRepository.getUri(), null, null, null)); + envRepository.setCloneOnStart(true); + envRepository.afterPropertiesSet(); + + assertTrue(mockCloneCommand.getCredentialsProvider() instanceof AwsCodeCommitCredentialProvider); + + } @Test public void strictHostKeyCheckShouldCheck() throws Exception {