Support for ssh key with passphrase using Apache MINA (#2209)

Fixes #2201
This commit is contained in:
Ryan Baxter
2023-01-18 09:08:21 -05:00
committed by GitHub
parent 97cc9c87a5
commit fd36db29c3
2 changed files with 22 additions and 18 deletions

View File

@@ -31,9 +31,9 @@ public class PassphraseCredentialsProvider extends CredentialsProvider {
/**
* Prompt to skip iteration for.
*/
public static final String PROMPT = "Passphrase for";
public static final String PROMPT = "Passphrase";
private final String passphrase;
private final char[] passphrase;
/**
* Initialize the provider with a the ssh passphrase.
@@ -41,7 +41,7 @@ public class PassphraseCredentialsProvider extends CredentialsProvider {
*/
public PassphraseCredentialsProvider(String passphrase) {
super();
this.passphrase = passphrase;
this.passphrase = passphrase.toCharArray();
}
/**
@@ -58,12 +58,13 @@ public class PassphraseCredentialsProvider extends CredentialsProvider {
@Override
public boolean supports(CredentialItem... items) {
for (final CredentialItem item : items) {
if (item instanceof CredentialItem.StringType && item.getPromptText().startsWith(PROMPT)) {
if (item instanceof CredentialItem.InformationalMessage) {
continue;
}
else {
return false;
if (item instanceof CredentialItem.Password && item.getPromptText().equals(PROMPT)) {
continue;
}
return false;
}
return true;
}
@@ -80,8 +81,11 @@ public class PassphraseCredentialsProvider extends CredentialsProvider {
@Override
public boolean get(URIish uri, CredentialItem... items) throws UnsupportedCredentialItem {
for (final CredentialItem item : items) {
if (item instanceof CredentialItem.StringType && item.getPromptText().startsWith(PROMPT)) {
((CredentialItem.StringType) item).setValue(this.passphrase);
if (item instanceof CredentialItem.InformationalMessage) {
continue;
}
if (item instanceof CredentialItem.Password && item.getPromptText().equals(PROMPT)) {
((CredentialItem.Password) item).setValue(this.passphrase);
continue;
}
throw new UnsupportedCredentialItem(uri, item.getClass().getName() + ":" + item.getPromptText());

View File

@@ -916,12 +916,11 @@ public class JGitEnvironmentRepositoryTests {
CredentialsProvider provider = mockCloneCommand.getCredentialsProvider();
assertThat(provider.isInteractive()).isFalse();
CredentialItem.StringType stringCredential = new CredentialItem.StringType(PassphraseCredentialsProvider.PROMPT,
true);
CredentialItem.Password credential = new CredentialItem.Password(PassphraseCredentialsProvider.PROMPT);
assertThat(provider.supports(stringCredential)).isTrue();
provider.get(new URIish(), stringCredential);
assertThat(passphrase).isEqualTo(stringCredential.getValue());
assertThat(provider.supports(credential)).isTrue();
provider.get(new URIish(), credential);
assertThat(passphrase.toCharArray()).isEqualTo(credential.getValue());
}
@Test
@@ -945,12 +944,13 @@ public class JGitEnvironmentRepositoryTests {
CredentialsProvider provider = mockCloneCommand.getCredentialsProvider();
assertThat(provider.isInteractive()).isFalse();
CredentialItem.StringType stringCredential = new CredentialItem.StringType(PassphraseCredentialsProvider.PROMPT,
true);
CredentialItem.InformationalMessage informational = new CredentialItem.InformationalMessage(
"Passphrase required for ssh key");
CredentialItem.Password credential = new CredentialItem.Password(PassphraseCredentialsProvider.PROMPT);
assertThat(provider.supports(stringCredential)).isTrue();
provider.get(new URIish(), stringCredential);
assertThat(passphrase).isEqualTo(stringCredential.getValue());
assertThat(provider.supports(credential)).isTrue();
provider.get(new URIish(), informational, credential);
assertThat(passphrase.toCharArray()).isEqualTo(credential.getValue());
}