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 */ CredentialsProviderUserInfo(Session session, CredentialsProvider credentialsProvider)44 public CredentialsProviderUserInfo(Session session, 45 CredentialsProvider credentialsProvider) { 46 this.uri = createURI(session); 47 this.provider = credentialsProvider; 48 } 49 createURI(Session session)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 getPassword()61 public String getPassword() { 62 return password; 63 } 64 65 /** {@inheritDoc} */ 66 @Override getPassphrase()67 public String getPassphrase() { 68 return passphrase; 69 } 70 71 /** {@inheritDoc} */ 72 @Override promptPassphrase(String msg)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 promptPassword(String msg)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 newPrompt(String msg)95 private CredentialItem.StringType newPrompt(String msg) { 96 return new CredentialItem.StringType(msg, true); 97 } 98 99 /** {@inheritDoc} */ 100 @Override promptYesNo(String msg)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 showMessage(String msg)108 public void showMessage(String msg) { 109 provider.get(uri, new CredentialItem.InformationalMessage(msg)); 110 } 111 112 /** {@inheritDoc} */ 113 @Override promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt, boolean[] echo)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 } 134