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>
This commit is contained in:
parent
891103609d
commit
185e53bce4
|
@ -185,6 +185,74 @@ public void testConnectTimout() throws Exception {
|
|||
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 @@ private Session createSession(String uriText) throws Exception {
|
|||
String password = uri.getPass();
|
||||
int port = uri.getPort();
|
||||
OpenSshConfig.Host hostConfig = tmpConfig.lookup(host);
|
||||
host = hostConfig.getHostName();
|
||||
if (port <= 0) {
|
||||
port = hostConfig.getPort();
|
||||
}
|
||||
|
|
|
@ -121,7 +121,6 @@ public synchronized RemoteSession getSession(URIish uri,
|
|||
config = OpenSshConfig.get(fs);
|
||||
|
||||
final OpenSshConfig.Host hc = config.lookup(host);
|
||||
host = hc.getHostName();
|
||||
if (port <= 0)
|
||||
port = hc.getPort();
|
||||
if (user == null)
|
||||
|
|
Loading…
Reference in New Issue