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