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