@ -1,4 +1,5 @@
/ *
/ *
* Copyright ( C ) 2018 , Sasa Zivkov < sasa . zivkov @sap.com >
* Copyright ( C ) 2016 , Mark Ingram < markdingram @gmail.com >
* Copyright ( C ) 2016 , Mark Ingram < markdingram @gmail.com >
* Copyright ( C ) 2009 , Constantine Plotnikov < constantine . plotnikov @gmail.com >
* Copyright ( C ) 2009 , Constantine Plotnikov < constantine . plotnikov @gmail.com >
* Copyright ( C ) 2008 - 2009 , Google Inc .
* Copyright ( C ) 2008 - 2009 , Google Inc .
@ -49,6 +50,10 @@
package org.eclipse.jgit.transport ;
package org.eclipse.jgit.transport ;
import static java.util.stream.Collectors.joining ;
import static java.util.stream.Collectors.toList ;
import static org.eclipse.jgit.transport.OpenSshConfig.SSH_PORT ;
import java.io.File ;
import java.io.File ;
import java.io.FileInputStream ;
import java.io.FileInputStream ;
import java.io.FileNotFoundException ;
import java.io.FileNotFoundException ;
@ -59,9 +64,11 @@ import java.net.ConnectException;
import java.net.UnknownHostException ;
import java.net.UnknownHostException ;
import java.text.MessageFormat ;
import java.text.MessageFormat ;
import java.util.HashMap ;
import java.util.HashMap ;
import java.util.List ;
import java.util.Locale ;
import java.util.Locale ;
import java.util.Map ;
import java.util.Map ;
import java.util.concurrent.TimeUnit ;
import java.util.concurrent.TimeUnit ;
import java.util.stream.Stream ;
import org.eclipse.jgit.errors.TransportException ;
import org.eclipse.jgit.errors.TransportException ;
import org.eclipse.jgit.internal.JGitText ;
import org.eclipse.jgit.internal.JGitText ;
@ -71,6 +78,8 @@ import org.slf4j.LoggerFactory;
import com.jcraft.jsch.ConfigRepository ;
import com.jcraft.jsch.ConfigRepository ;
import com.jcraft.jsch.ConfigRepository.Config ;
import com.jcraft.jsch.ConfigRepository.Config ;
import com.jcraft.jsch.HostKey ;
import com.jcraft.jsch.HostKeyRepository ;
import com.jcraft.jsch.JSch ;
import com.jcraft.jsch.JSch ;
import com.jcraft.jsch.JSchException ;
import com.jcraft.jsch.JSchException ;
import com.jcraft.jsch.Session ;
import com.jcraft.jsch.Session ;
@ -224,6 +233,9 @@ public abstract class JschConfigSessionFactory extends SshSessionFactory {
credentialsProvider ) ) ;
credentialsProvider ) ) ;
}
}
safeConfig ( session , hc . getConfig ( ) ) ;
safeConfig ( session , hc . getConfig ( ) ) ;
if ( hc . getConfig ( ) . getValue ( "HostKeyAlgorithms" ) = = null ) { //$NON-NLS-1$
setPreferredKeyTypesOrder ( session ) ;
}
configure ( hc , session ) ;
configure ( hc , session ) ;
return session ;
return session ;
}
}
@ -239,6 +251,36 @@ public abstract class JschConfigSessionFactory extends SshSessionFactory {
"CheckSignatures" ) ; //$NON-NLS-1$
"CheckSignatures" ) ; //$NON-NLS-1$
}
}
private static void setPreferredKeyTypesOrder ( Session session ) {
HostKeyRepository hkr = session . getHostKeyRepository ( ) ;
List < String > known = Stream . of ( hkr . getHostKey ( hostName ( session ) , null ) )
. map ( HostKey : : getType )
. collect ( toList ( ) ) ;
if ( ! known . isEmpty ( ) ) {
String serverHostKey = "server_host_key" ; //$NON-NLS-1$
String current = session . getConfig ( serverHostKey ) ;
if ( current = = null ) {
session . setConfig ( serverHostKey , String . join ( "," , known ) ) ; //$NON-NLS-1$
return ;
}
String knownFirst = Stream . concat (
known . stream ( ) ,
Stream . of ( current . split ( "," ) ) //$NON-NLS-1$
. filter ( s - > ! known . contains ( s ) ) )
. collect ( joining ( "," ) ) ; //$NON-NLS-1$
session . setConfig ( serverHostKey , knownFirst ) ;
}
}
private static String hostName ( Session s ) {
if ( s . getPort ( ) = = SSH_PORT ) {
return s . getHost ( ) ;
}
return String . format ( "[%s]:%d" , s . getHost ( ) , s . getPort ( ) ) ; //$NON-NLS-1$
}
private void copyConfigValueToSession ( Session session , Config cfg ,
private void copyConfigValueToSession ( Session session , Config cfg ,
String from , String to ) {
String from , String to ) {
String value = cfg . getValue ( from ) ;
String value = cfg . getValue ( from ) ;