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