xref: /JGit/org.eclipse.jgit.ssh.jsch/src/org/eclipse/jgit/transport/CredentialsProviderUserInfo.java (revision 8d2d683655e2de17cf465fa46af10e0e56b3aaed)
1*8d2d6836SMatthias Sohn /*
2*8d2d6836SMatthias Sohn  * Copyright (C) 2010, Google Inc. and others
3*8d2d6836SMatthias Sohn  *
4*8d2d6836SMatthias Sohn  * This program and the accompanying materials are made available under the
5*8d2d6836SMatthias Sohn  * terms of the Eclipse Distribution License v. 1.0 which is available at
6*8d2d6836SMatthias Sohn  * https://www.eclipse.org/org/documents/edl-v10.php.
7*8d2d6836SMatthias Sohn  *
8*8d2d6836SMatthias Sohn  * SPDX-License-Identifier: BSD-3-Clause
9*8d2d6836SMatthias Sohn  */
10*8d2d6836SMatthias Sohn 
11*8d2d6836SMatthias Sohn //TODO(ms): move to org.eclipse.jgit.ssh.jsch in 6.0
12*8d2d6836SMatthias Sohn package org.eclipse.jgit.transport;
13*8d2d6836SMatthias Sohn 
14*8d2d6836SMatthias Sohn import java.util.ArrayList;
15*8d2d6836SMatthias Sohn import java.util.Arrays;
16*8d2d6836SMatthias Sohn import java.util.List;
17*8d2d6836SMatthias Sohn 
18*8d2d6836SMatthias Sohn import com.jcraft.jsch.Session;
19*8d2d6836SMatthias Sohn import com.jcraft.jsch.UIKeyboardInteractive;
20*8d2d6836SMatthias Sohn import com.jcraft.jsch.UserInfo;
21*8d2d6836SMatthias Sohn 
22*8d2d6836SMatthias Sohn /**
23*8d2d6836SMatthias Sohn  * A JSch {@link com.jcraft.jsch.UserInfo} adapter for a
24*8d2d6836SMatthias Sohn  * {@link org.eclipse.jgit.transport.CredentialsProvider}.
25*8d2d6836SMatthias Sohn  */
26*8d2d6836SMatthias Sohn public class CredentialsProviderUserInfo implements UserInfo,
27*8d2d6836SMatthias Sohn 		UIKeyboardInteractive {
28*8d2d6836SMatthias Sohn 	private final URIish uri;
29*8d2d6836SMatthias Sohn 
30*8d2d6836SMatthias Sohn 	private final CredentialsProvider provider;
31*8d2d6836SMatthias Sohn 
32*8d2d6836SMatthias Sohn 	private String password;
33*8d2d6836SMatthias Sohn 
34*8d2d6836SMatthias Sohn 	private String passphrase;
35*8d2d6836SMatthias Sohn 
36*8d2d6836SMatthias Sohn 	/**
37*8d2d6836SMatthias Sohn 	 * Wrap a CredentialsProvider to make it suitable for use with JSch.
38*8d2d6836SMatthias Sohn 	 *
39*8d2d6836SMatthias Sohn 	 * @param session
40*8d2d6836SMatthias Sohn 	 *            the JSch session this UserInfo will support authentication on.
41*8d2d6836SMatthias Sohn 	 * @param credentialsProvider
42*8d2d6836SMatthias Sohn 	 *            the provider that will perform the authentication.
43*8d2d6836SMatthias Sohn 	 */
CredentialsProviderUserInfo(Session session, CredentialsProvider credentialsProvider)44*8d2d6836SMatthias Sohn 	public CredentialsProviderUserInfo(Session session,
45*8d2d6836SMatthias Sohn 			CredentialsProvider credentialsProvider) {
46*8d2d6836SMatthias Sohn 		this.uri = createURI(session);
47*8d2d6836SMatthias Sohn 		this.provider = credentialsProvider;
48*8d2d6836SMatthias Sohn 	}
49*8d2d6836SMatthias Sohn 
createURI(Session session)50*8d2d6836SMatthias Sohn 	private static URIish createURI(Session session) {
51*8d2d6836SMatthias Sohn 		URIish uri = new URIish();
52*8d2d6836SMatthias Sohn 		uri = uri.setScheme("ssh"); //$NON-NLS-1$
53*8d2d6836SMatthias Sohn 		uri = uri.setUser(session.getUserName());
54*8d2d6836SMatthias Sohn 		uri = uri.setHost(session.getHost());
55*8d2d6836SMatthias Sohn 		uri = uri.setPort(session.getPort());
56*8d2d6836SMatthias Sohn 		return uri;
57*8d2d6836SMatthias Sohn 	}
58*8d2d6836SMatthias Sohn 
59*8d2d6836SMatthias Sohn 	/** {@inheritDoc} */
60*8d2d6836SMatthias Sohn 	@Override
getPassword()61*8d2d6836SMatthias Sohn 	public String getPassword() {
62*8d2d6836SMatthias Sohn 		return password;
63*8d2d6836SMatthias Sohn 	}
64*8d2d6836SMatthias Sohn 
65*8d2d6836SMatthias Sohn 	/** {@inheritDoc} */
66*8d2d6836SMatthias Sohn 	@Override
getPassphrase()67*8d2d6836SMatthias Sohn 	public String getPassphrase() {
68*8d2d6836SMatthias Sohn 		return passphrase;
69*8d2d6836SMatthias Sohn 	}
70*8d2d6836SMatthias Sohn 
71*8d2d6836SMatthias Sohn 	/** {@inheritDoc} */
72*8d2d6836SMatthias Sohn 	@Override
promptPassphrase(String msg)73*8d2d6836SMatthias Sohn 	public boolean promptPassphrase(String msg) {
74*8d2d6836SMatthias Sohn 		CredentialItem.StringType v = newPrompt(msg);
75*8d2d6836SMatthias Sohn 		if (provider.get(uri, v)) {
76*8d2d6836SMatthias Sohn 			passphrase = v.getValue();
77*8d2d6836SMatthias Sohn 			return true;
78*8d2d6836SMatthias Sohn 		}
79*8d2d6836SMatthias Sohn 		passphrase = null;
80*8d2d6836SMatthias Sohn 		return false;
81*8d2d6836SMatthias Sohn 	}
82*8d2d6836SMatthias Sohn 
83*8d2d6836SMatthias Sohn 	/** {@inheritDoc} */
84*8d2d6836SMatthias Sohn 	@Override
promptPassword(String msg)85*8d2d6836SMatthias Sohn 	public boolean promptPassword(String msg) {
86*8d2d6836SMatthias Sohn 		CredentialItem.Password p = new CredentialItem.Password(msg);
87*8d2d6836SMatthias Sohn 		if (provider.get(uri, p)) {
88*8d2d6836SMatthias Sohn 			password = new String(p.getValue());
89*8d2d6836SMatthias Sohn 			return true;
90*8d2d6836SMatthias Sohn 		}
91*8d2d6836SMatthias Sohn 		password = null;
92*8d2d6836SMatthias Sohn 		return false;
93*8d2d6836SMatthias Sohn 	}
94*8d2d6836SMatthias Sohn 
newPrompt(String msg)95*8d2d6836SMatthias Sohn 	private CredentialItem.StringType newPrompt(String msg) {
96*8d2d6836SMatthias Sohn 		return new CredentialItem.StringType(msg, true);
97*8d2d6836SMatthias Sohn 	}
98*8d2d6836SMatthias Sohn 
99*8d2d6836SMatthias Sohn 	/** {@inheritDoc} */
100*8d2d6836SMatthias Sohn 	@Override
promptYesNo(String msg)101*8d2d6836SMatthias Sohn 	public boolean promptYesNo(String msg) {
102*8d2d6836SMatthias Sohn 		CredentialItem.YesNoType v = new CredentialItem.YesNoType(msg);
103*8d2d6836SMatthias Sohn 		return provider.get(uri, v) && v.getValue();
104*8d2d6836SMatthias Sohn 	}
105*8d2d6836SMatthias Sohn 
106*8d2d6836SMatthias Sohn 	/** {@inheritDoc} */
107*8d2d6836SMatthias Sohn 	@Override
showMessage(String msg)108*8d2d6836SMatthias Sohn 	public void showMessage(String msg) {
109*8d2d6836SMatthias Sohn 		provider.get(uri, new CredentialItem.InformationalMessage(msg));
110*8d2d6836SMatthias Sohn 	}
111*8d2d6836SMatthias Sohn 
112*8d2d6836SMatthias Sohn 	/** {@inheritDoc} */
113*8d2d6836SMatthias Sohn 	@Override
promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt, boolean[] echo)114*8d2d6836SMatthias Sohn 	public String[] promptKeyboardInteractive(String destination, String name,
115*8d2d6836SMatthias Sohn 			String instruction, String[] prompt, boolean[] echo) {
116*8d2d6836SMatthias Sohn 		CredentialItem.StringType[] v = new CredentialItem.StringType[prompt.length];
117*8d2d6836SMatthias Sohn 		for (int i = 0; i < prompt.length; i++)
118*8d2d6836SMatthias Sohn 			v[i] = new CredentialItem.StringType(prompt[i], !echo[i]);
119*8d2d6836SMatthias Sohn 
120*8d2d6836SMatthias Sohn 		List<CredentialItem> items = new ArrayList<>();
121*8d2d6836SMatthias Sohn 		if (instruction != null && instruction.length() > 0)
122*8d2d6836SMatthias Sohn 			items.add(new CredentialItem.InformationalMessage(instruction));
123*8d2d6836SMatthias Sohn 		items.addAll(Arrays.asList(v));
124*8d2d6836SMatthias Sohn 
125*8d2d6836SMatthias Sohn 		if (!provider.get(uri, items))
126*8d2d6836SMatthias Sohn 			return null; // cancel
127*8d2d6836SMatthias Sohn 
128*8d2d6836SMatthias Sohn 		String[] result = new String[v.length];
129*8d2d6836SMatthias Sohn 		for (int i = 0; i < v.length; i++)
130*8d2d6836SMatthias Sohn 			result[i] = v[i].getValue();
131*8d2d6836SMatthias Sohn 		return result;
132*8d2d6836SMatthias Sohn 	}
133*8d2d6836SMatthias Sohn }
134