Skip to content

Commit 07ee299

Browse files
committed
Add parameter to retrieve private key for mTLS.
1 parent af4bb26 commit 07ee299

File tree

5 files changed

+17
-19
lines changed

5 files changed

+17
-19
lines changed

cli/src/main/java/ch/cyberduck/cli/TerminalLoginService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
import ch.cyberduck.core.LoginOptions;
2828
import ch.cyberduck.core.PasswordStoreFactory;
2929
import ch.cyberduck.core.exception.ConnectionCanceledException;
30-
import ch.cyberduck.core.exception.LoginCanceledException;
3130
import ch.cyberduck.core.exception.LoginFailureException;
3231
import ch.cyberduck.core.preferences.PreferencesFactory;
32+
import ch.cyberduck.core.ssl.X509KeyManager;
3333

3434
import org.apache.commons.cli.CommandLine;
3535
import org.apache.commons.lang3.StringUtils;
@@ -44,7 +44,7 @@ public TerminalLoginService(final CommandLine input) {
4444
}
4545

4646
@Override
47-
public void validate(final Host bookmark, final LoginCallback prompt, final LoginOptions options) throws ConnectionCanceledException, LoginFailureException {
47+
public void validate(final Host bookmark, final X509KeyManager keys, final LoginCallback prompt, final LoginOptions options) throws ConnectionCanceledException, LoginFailureException {
4848
final Credentials credentials = bookmark.getCredentials();
4949
if(input.hasOption(TerminalOptionsBuilder.Params.anonymous.name())) {
5050
credentials.setUsername(PreferencesFactory.get().getProperty("connection.login.anon.name"));
@@ -61,6 +61,6 @@ public void validate(final Host bookmark, final LoginCallback prompt, final Logi
6161
if(StringUtils.isNotBlank(credentials.getUsername()) && StringUtils.isNotBlank(credentials.getPassword())) {
6262
return;
6363
}
64-
super.validate(bookmark, prompt, options);
64+
super.validate(bookmark, keys, prompt, options);
6565
}
6666
}

core/src/main/java/ch/cyberduck/core/KeychainLoginService.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,13 @@ public class KeychainLoginService implements LoginService {
3636

3737
private final HostPasswordStore keychain;
3838

39-
public KeychainLoginService() {
40-
this(PasswordStoreFactory.get());
41-
}
42-
4339
public KeychainLoginService(final HostPasswordStore keychain) {
4440
this.keychain = keychain;
4541
}
4642

4743
@Override
48-
public void validate(final Session<?> session, final LoginCallback prompt, final LoginOptions options) throws ConnectionCanceledException, LoginFailureException {
49-
log.debug("Validate login credentials for {}", session);
50-
final Host host = session.getHost();
44+
public void validate(final Host host, final X509KeyManager keys, final LoginCallback prompt, final LoginOptions options) throws ConnectionCanceledException, LoginFailureException {
45+
log.debug("Validate login credentials for {}", host);
5146
final Credentials credentials = host.getCredentials();
5247
if(credentials.isPublicKeyAuthentication()) {
5348
if(!credentials.getIdentity().attributes().getPermission().isReadable()) {
@@ -96,9 +91,8 @@ public void validate(final Session<?> session, final LoginCallback prompt, final
9691
if(options.certificate) {
9792
final String alias = host.getCredentials().getCertificate();
9893
if(StringUtils.isNotBlank(alias)) {
99-
final X509KeyManager manager = session.getFeature(X509KeyManager.class);
100-
if(manager != null) {
101-
if(null == manager.getPrivateKey(alias)) {
94+
if(keys != null) {
95+
if(null == keys.getPrivateKey(alias)) {
10296
log.warn("No private key found for alias {} in keychain", alias);
10397
throw new LoginFailureException(LocaleFactory.localizedString("Provide additional login credentials", "Credentials"));
10498
}

core/src/main/java/ch/cyberduck/core/LoginConnectionService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import ch.cyberduck.core.proxy.ProxyFactory;
2525
import ch.cyberduck.core.proxy.ProxyFinder;
2626
import ch.cyberduck.core.proxy.ProxyHostUrlProvider;
27+
import ch.cyberduck.core.ssl.X509KeyManager;
2728
import ch.cyberduck.core.threading.CancelCallback;
2829

2930
import org.apache.commons.lang3.StringUtils;
@@ -93,7 +94,7 @@ public boolean check(final Session<?> session, final CancelCallback callback) th
9394
}
9495
// Obtain password from keychain or prompt
9596
synchronized(login) {
96-
login.validate(session, prompt, new LoginOptions(bookmark.getProtocol()));
97+
login.validate(bookmark, session.getFeature(X509KeyManager.class), prompt, new LoginOptions(bookmark.getProtocol()));
9798
}
9899
this.connect(session, callback);
99100
return true;

core/src/main/java/ch/cyberduck/core/LoginService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,18 @@
2121
import ch.cyberduck.core.exception.ConnectionCanceledException;
2222
import ch.cyberduck.core.exception.LoginCanceledException;
2323
import ch.cyberduck.core.exception.LoginFailureException;
24+
import ch.cyberduck.core.ssl.X509KeyManager;
2425
import ch.cyberduck.core.threading.CancelCallback;
2526

2627
public interface LoginService {
2728
/**
2829
* Obtain password from password store or prompt user for input
2930
*
30-
* @param session Credentials
31-
* @param pompt Login prompt
31+
* @param bookmark Credentials
32+
* @param prompt Login prompt
3233
* @param options Login mechanism features
3334
*/
34-
void validate(Session<?> session, LoginCallback pompt, LoginOptions options) throws ConnectionCanceledException, LoginFailureException;
35+
void validate(Host bookmark, X509KeyManager keys, LoginCallback prompt, LoginOptions options) throws ConnectionCanceledException, LoginFailureException;
3536

3637
/**
3738
* Login and prompt on failure

core/src/test/java/ch/cyberduck/core/KeychainLoginServiceTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import ch.cyberduck.core.exception.LoginCanceledException;
55
import ch.cyberduck.core.preferences.PreferencesFactory;
66
import ch.cyberduck.core.proxy.DisabledProxyFinder;
7+
import ch.cyberduck.core.ssl.DefaultX509KeyManager;
78
import ch.cyberduck.core.threading.CancelCallback;
89

910
import org.junit.Test;
@@ -51,7 +52,8 @@ else if(1 == i) {
5152
@Test(expected = LoginCanceledException.class)
5253
public void testCancel() throws Exception {
5354
LoginService l = new KeychainLoginService(new DisabledPasswordStore());
54-
l.validate(new NullSession(new Host(new TestProtocol(), "h")), new DisabledLoginCallback(), new LoginOptions());
55+
l.validate(new Host(new TestProtocol(), "h"),
56+
new DefaultX509KeyManager(), new DisabledLoginCallback(), new LoginOptions());
5557
}
5658

5759
@Test
@@ -68,7 +70,7 @@ public String findLoginPassword(final Host bookmark) {
6870
final Credentials credentials = new Credentials();
6971
credentials.setUsername("u");
7072
final Host host = new Host(new TestProtocol(), "test.cyberduck.ch", credentials);
71-
l.validate(new NullSession(host), new DisabledLoginCallback(), new LoginOptions(host.getProtocol()));
73+
l.validate(host, new DefaultX509KeyManager(), new DisabledLoginCallback(), new LoginOptions(host.getProtocol()));
7274
assertTrue(keychain.get());
7375
assertFalse(host.getCredentials().isSaved());
7476
assertEquals("P", host.getCredentials().getPassword());

0 commit comments

Comments
 (0)