@ -53,14 +53,19 @@ import java.io.File;
import java.io.FileInputStream ;
import java.io.FileInputStream ;
import java.io.FileNotFoundException ;
import java.io.FileNotFoundException ;
import java.io.IOException ;
import java.io.IOException ;
import java.lang.reflect.InvocationTargetException ;
import java.lang.reflect.Method ;
import java.net.ConnectException ;
import java.net.ConnectException ;
import java.net.UnknownHostException ;
import java.net.UnknownHostException ;
import java.text.MessageFormat ;
import java.util.HashMap ;
import java.util.HashMap ;
import java.util.Map ;
import java.util.Map ;
import org.eclipse.jgit.errors.TransportException ;
import org.eclipse.jgit.errors.TransportException ;
import org.eclipse.jgit.internal.JGitText ;
import org.eclipse.jgit.internal.JGitText ;
import org.eclipse.jgit.util.FS ;
import org.eclipse.jgit.util.FS ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
import com.jcraft.jsch.JSch ;
import com.jcraft.jsch.JSch ;
import com.jcraft.jsch.JSchException ;
import com.jcraft.jsch.JSchException ;
@ -80,6 +85,10 @@ import com.jcraft.jsch.UserInfo;
* to supply appropriate { @link UserInfo } to the session .
* to supply appropriate { @link UserInfo } to the session .
* /
* /
public abstract class JschConfigSessionFactory extends SshSessionFactory {
public abstract class JschConfigSessionFactory extends SshSessionFactory {
private static final Logger LOG = LoggerFactory
. getLogger ( JschConfigSessionFactory . class ) ;
private final Map < String , JSch > byIdentityFile = new HashMap < > ( ) ;
private final Map < String , JSch > byIdentityFile = new HashMap < > ( ) ;
private JSch defaultJSch ;
private JSch defaultJSch ;
@ -177,6 +186,9 @@ public abstract class JschConfigSessionFactory extends SshSessionFactory {
FS fs , String user , final String pass , String host , int port ,
FS fs , String user , final String pass , String host , int port ,
final OpenSshConfig . Host hc ) throws JSchException {
final OpenSshConfig . Host hc ) throws JSchException {
final Session session = createSession ( hc , user , host , port , fs ) ;
final Session session = createSession ( hc , user , host , port , fs ) ;
// Jsch will have overridden the explicit user by the one from the SSH
// config file...
setUserName ( session , user ) ;
// We retry already in getSession() method. JSch must not retry
// We retry already in getSession() method. JSch must not retry
// on its own.
// on its own.
session . setConfig ( "MaxAuthTries" , "1" ) ; //$NON-NLS-1$ //$NON-NLS-2$
session . setConfig ( "MaxAuthTries" , "1" ) ; //$NON-NLS-1$ //$NON-NLS-2$
@ -199,6 +211,28 @@ public abstract class JschConfigSessionFactory extends SshSessionFactory {
return session ;
return session ;
}
}
private void setUserName ( Session session , String userName ) {
// Jsch 0.1.54 picks up the user name from the ssh config, even if an
// explicit user name was given! We must correct that if ~/.ssh/config
// has a different user name.
if ( userName = = null | | userName . isEmpty ( )
| | userName . equals ( session . getUserName ( ) ) ) {
return ;
}
try {
Class < ? > [ ] parameterTypes = { String . class } ;
Method method = Session . class . getDeclaredMethod ( "setUserName" , //$NON-NLS-1$
parameterTypes ) ;
method . setAccessible ( true ) ;
method . invoke ( session , userName ) ;
} catch ( NullPointerException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException
| NoSuchMethodException | SecurityException e ) {
LOG . error ( MessageFormat . format ( JGitText . get ( ) . sshUserNameError ,
userName , session . getUserName ( ) ) , e ) ;
}
}
/ * *
/ * *
* Create a new remote session for the requested address .
* Create a new remote session for the requested address .
*
*