Browse Source

Fix ssh host name handling for Jsch

If we give Jsch access to the ssh config file, we must _not_ resolve
the host name from the alias. Instead we must give the alias (i.e.,
the host name as is in the URI) to Jsch, so that it finds the same
ssh config entry.

Otherwise if the hostname in the URI, which is taken as an alias in
ssh config ("Host" line), is unequal to the "Hostname" line, and
there happens to be another ssh config entry with that translated
host name as alias, Jsch will pick up that second entry, and we end
up with a strange mixture of both.

Add tests for this case.

Bug: 531118
Change-Id: I249d8c073b0190ed110a69dca5b9be2a749822c3
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
stable-4.9
Thomas Wolf 7 years ago
parent
commit
185e53bce4
  1. 69
      org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/JschConfigSessionFactoryTest.java
  2. 1
      org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java

69
org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/JschConfigSessionFactoryTest.java

@ -185,6 +185,74 @@ public class JschConfigSessionFactoryTest {
assertEquals(TimeUnit.SECONDS.toMillis(10), session.getTimeout());
}
@Test
public void testAliasCaseDifferenceUpcase() throws Exception {
tmpConfigFile = createConfig("Host Bitbucket.org",
"Hostname bitbucket.org", "User foo", "Port 29418",
"ConnectTimeout 10", //
"Host bitbucket.org", "Hostname bitbucket.org", "User bar",
"Port 22", "ConnectTimeout 5");
tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
tmpConfigFile);
factory.setConfig(tmpConfig);
Session session = createSession("ssh://Bitbucket.org/something");
assertEquals("bitbucket.org", session.getHost());
assertEquals("foo", session.getUserName());
assertEquals(29418, session.getPort());
assertEquals(TimeUnit.SECONDS.toMillis(10), session.getTimeout());
}
@Test
public void testAliasCaseDifferenceLowcase() throws Exception {
tmpConfigFile = createConfig("Host Bitbucket.org",
"Hostname bitbucket.org", "User foo", "Port 29418",
"ConnectTimeout 10", //
"Host bitbucket.org", "Hostname bitbucket.org", "User bar",
"Port 22", "ConnectTimeout 5");
tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
tmpConfigFile);
factory.setConfig(tmpConfig);
Session session = createSession("ssh://bitbucket.org/something");
assertEquals("bitbucket.org", session.getHost());
assertEquals("bar", session.getUserName());
assertEquals(22, session.getPort());
assertEquals(TimeUnit.SECONDS.toMillis(5), session.getTimeout());
}
@Test
public void testAliasCaseDifferenceUpcaseInverted() throws Exception {
tmpConfigFile = createConfig("Host bitbucket.org",
"Hostname bitbucket.org", "User bar", "Port 22",
"ConnectTimeout 5", //
"Host Bitbucket.org", "Hostname bitbucket.org", "User foo",
"Port 29418", "ConnectTimeout 10");
tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
tmpConfigFile);
factory.setConfig(tmpConfig);
Session session = createSession("ssh://Bitbucket.org/something");
assertEquals("bitbucket.org", session.getHost());
assertEquals("foo", session.getUserName());
assertEquals(29418, session.getPort());
assertEquals(TimeUnit.SECONDS.toMillis(10), session.getTimeout());
}
@Test
public void testAliasCaseDifferenceLowcaseInverted() throws Exception {
tmpConfigFile = createConfig("Host bitbucket.org",
"Hostname bitbucket.org", "User bar", "Port 22",
"ConnectTimeout 5", //
"Host Bitbucket.org", "Hostname bitbucket.org", "User foo",
"Port 29418", "ConnectTimeout 10");
tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
tmpConfigFile);
factory.setConfig(tmpConfig);
Session session = createSession("ssh://bitbucket.org/something");
assertEquals("bitbucket.org", session.getHost());
assertEquals("bar", session.getUserName());
assertEquals(22, session.getPort());
assertEquals(TimeUnit.SECONDS.toMillis(5), session.getTimeout());
}
private File createConfig(String... lines) throws Exception {
File f = File.createTempFile("jsch", "test");
Files.write(f.toPath(), Arrays.asList(lines));
@ -203,7 +271,6 @@ public class JschConfigSessionFactoryTest {
String password = uri.getPass();
int port = uri.getPort();
OpenSshConfig.Host hostConfig = tmpConfig.lookup(host);
host = hostConfig.getHostName();
if (port <= 0) {
port = hostConfig.getPort();
}

1
org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java

@ -121,7 +121,6 @@ public abstract class JschConfigSessionFactory extends SshSessionFactory {
config = OpenSshConfig.get(fs);
final OpenSshConfig.Host hc = config.lookup(host);
host = hc.getHostName();
if (port <= 0)
port = hc.getPort();
if (user == null)

Loading…
Cancel
Save