You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
263 lines
9.1 KiB
263 lines
9.1 KiB
6 years ago
|
/*
|
||
4 years ago
|
* Copyright (C) 2018, Thomas Wolf <thomas.wolf@paranor.ch> and others
|
||
6 years ago
|
*
|
||
4 years ago
|
* This program and the accompanying materials are made available under the
|
||
|
* terms of the Eclipse Distribution License v. 1.0 which is available at
|
||
|
* https://www.eclipse.org/org/documents/edl-v10.php.
|
||
6 years ago
|
*
|
||
4 years ago
|
* SPDX-License-Identifier: BSD-3-Clause
|
||
6 years ago
|
*/
|
||
4 years ago
|
|
||
|
//TODO(ms): move to org.eclipse.jgit.ssh.jsch in 6.0
|
||
6 years ago
|
package org.eclipse.jgit.transport;
|
||
|
|
||
|
import static org.junit.Assert.assertEquals;
|
||
|
|
||
|
import java.io.File;
|
||
|
import java.nio.file.Files;
|
||
|
import java.util.Arrays;
|
||
|
import java.util.concurrent.TimeUnit;
|
||
|
|
||
5 years ago
|
import org.eclipse.jgit.junit.MockSystemReader;
|
||
6 years ago
|
import org.eclipse.jgit.util.FS;
|
||
5 years ago
|
import org.eclipse.jgit.util.SystemReader;
|
||
6 years ago
|
import org.junit.After;
|
||
5 years ago
|
import org.junit.Before;
|
||
6 years ago
|
import org.junit.Test;
|
||
|
|
||
|
import com.jcraft.jsch.Session;
|
||
|
|
||
|
/**
|
||
|
* Tests for correctly interpreting ssh config values when Jsch sessions are
|
||
|
* used.
|
||
|
*/
|
||
|
public class JschConfigSessionFactoryTest {
|
||
|
|
||
|
File tmpConfigFile;
|
||
|
|
||
|
OpenSshConfig tmpConfig;
|
||
|
|
||
4 years ago
|
JschConfigSessionFactory factory = new JschConfigSessionFactory();
|
||
6 years ago
|
|
||
5 years ago
|
@Before
|
||
|
public void setup() {
|
||
|
SystemReader.setInstance(new MockSystemReader());
|
||
|
}
|
||
|
|
||
6 years ago
|
@After
|
||
|
public void removeTmpConfig() {
|
||
5 years ago
|
SystemReader.setInstance(null);
|
||
6 years ago
|
if (tmpConfigFile == null) {
|
||
|
return;
|
||
|
}
|
||
|
if (tmpConfigFile.exists() && !tmpConfigFile.delete()) {
|
||
|
tmpConfigFile.deleteOnExit();
|
||
|
}
|
||
|
tmpConfigFile = null;
|
||
|
}
|
||
|
|
||
|
@Test
|
||
|
public void testNoConfigEntry() throws Exception {
|
||
|
tmpConfigFile = File.createTempFile("jsch", "test");
|
||
|
tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
|
||
|
tmpConfigFile);
|
||
|
factory.setConfig(tmpConfig);
|
||
|
Session session = createSession("ssh://egit/egit/egit");
|
||
|
assertEquals("egit", session.getHost());
|
||
|
// No user in URI, none in ssh config: default is OS user name
|
||
5 years ago
|
assertEquals(SystemReader.getInstance().getProperty("user.name"),
|
||
|
session.getUserName());
|
||
6 years ago
|
assertEquals(22, session.getPort());
|
||
|
}
|
||
|
|
||
|
@Test
|
||
|
public void testAlias() throws Exception {
|
||
|
tmpConfigFile = createConfig("Host egit", "Hostname git.eclipse.org",
|
||
|
"User foo", "Port 29418");
|
||
|
tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
|
||
|
tmpConfigFile);
|
||
|
factory.setConfig(tmpConfig);
|
||
|
Session session = createSession("ssh://egit/egit/egit");
|
||
|
assertEquals("git.eclipse.org", session.getHost());
|
||
|
assertEquals("foo", session.getUserName());
|
||
|
assertEquals(29418, session.getPort());
|
||
|
}
|
||
|
|
||
|
@Test
|
||
|
public void testAliasWithUser() throws Exception {
|
||
|
tmpConfigFile = createConfig("Host egit", "Hostname git.eclipse.org",
|
||
|
"User foo", "Port 29418");
|
||
|
tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
|
||
|
tmpConfigFile);
|
||
|
factory.setConfig(tmpConfig);
|
||
|
Session session = createSession("ssh://bar@egit/egit/egit");
|
||
|
assertEquals("git.eclipse.org", session.getHost());
|
||
|
assertEquals("bar", session.getUserName());
|
||
|
assertEquals(29418, session.getPort());
|
||
|
}
|
||
|
|
||
|
@Test
|
||
|
public void testAliasWithPort() throws Exception {
|
||
|
tmpConfigFile = createConfig("Host egit", "Hostname git.eclipse.org",
|
||
|
"User foo", "Port 29418");
|
||
|
tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
|
||
|
tmpConfigFile);
|
||
|
factory.setConfig(tmpConfig);
|
||
|
Session session = createSession("ssh://bar@egit:22/egit/egit");
|
||
|
assertEquals("git.eclipse.org", session.getHost());
|
||
|
assertEquals("bar", session.getUserName());
|
||
|
assertEquals(22, session.getPort());
|
||
|
}
|
||
|
|
||
|
@Test
|
||
|
public void testAliasIdentical() throws Exception {
|
||
|
tmpConfigFile = createConfig("Host git.eclipse.org",
|
||
|
"Hostname git.eclipse.org", "User foo", "Port 29418");
|
||
|
tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
|
||
|
tmpConfigFile);
|
||
|
factory.setConfig(tmpConfig);
|
||
|
Session session = createSession("ssh://git.eclipse.org/egit/egit");
|
||
|
assertEquals("git.eclipse.org", session.getHost());
|
||
|
assertEquals("foo", session.getUserName());
|
||
|
assertEquals(29418, session.getPort());
|
||
|
}
|
||
|
|
||
|
@Test
|
||
|
public void testAliasIdenticalWithUser() throws Exception {
|
||
|
tmpConfigFile = createConfig("Host git.eclipse.org",
|
||
|
"Hostname git.eclipse.org", "User foo", "Port 29418");
|
||
|
tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
|
||
|
tmpConfigFile);
|
||
|
factory.setConfig(tmpConfig);
|
||
|
Session session = createSession("ssh://bar@git.eclipse.org/egit/egit");
|
||
|
assertEquals("git.eclipse.org", session.getHost());
|
||
|
assertEquals("bar", session.getUserName());
|
||
|
assertEquals(29418, session.getPort());
|
||
|
}
|
||
|
|
||
|
@Test
|
||
|
public void testAliasIdenticalWithPort() throws Exception {
|
||
|
tmpConfigFile = createConfig("Host git.eclipse.org",
|
||
|
"Hostname git.eclipse.org", "User foo", "Port 29418");
|
||
|
tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
|
||
|
tmpConfigFile);
|
||
|
factory.setConfig(tmpConfig);
|
||
|
Session session = createSession(
|
||
|
"ssh://bar@git.eclipse.org:300/egit/egit");
|
||
|
assertEquals("git.eclipse.org", session.getHost());
|
||
|
assertEquals("bar", session.getUserName());
|
||
|
assertEquals(300, session.getPort());
|
||
|
}
|
||
|
|
||
|
@Test
|
||
|
public void testConnectTimout() throws Exception {
|
||
|
tmpConfigFile = createConfig("Host git.eclipse.org",
|
||
|
"Hostname git.eclipse.org", "User foo", "Port 29418",
|
||
|
"ConnectTimeout 10");
|
||
|
tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
|
||
|
tmpConfigFile);
|
||
|
factory.setConfig(tmpConfig);
|
||
|
Session session = createSession("ssh://git.eclipse.org/something");
|
||
|
assertEquals("git.eclipse.org", session.getHost());
|
||
|
assertEquals("foo", session.getUserName());
|
||
|
assertEquals(29418, session.getPort());
|
||
|
assertEquals(TimeUnit.SECONDS.toMillis(10), session.getTimeout());
|
||
|
}
|
||
|
|
||
6 years ago
|
@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());
|
||
|
}
|
||
|
|
||
6 years ago
|
private File createConfig(String... lines) throws Exception {
|
||
|
File f = File.createTempFile("jsch", "test");
|
||
|
Files.write(f.toPath(), Arrays.asList(lines));
|
||
|
return f;
|
||
|
}
|
||
|
|
||
|
private Session createSession(String uriText) throws Exception {
|
||
|
// For this test to make sense, these few lines must correspond to the
|
||
|
// code in JschConfigSessionFactory.getSession(). Because of
|
||
|
// side-effects we cannot encapsulate that there properly and so we have
|
||
|
// to duplicate this bit here. We also can't test getSession() itself
|
||
|
// since it would try to actually connect to a server.
|
||
|
URIish uri = new URIish(uriText);
|
||
|
String host = uri.getHost();
|
||
|
String user = uri.getUser();
|
||
|
String password = uri.getPass();
|
||
|
int port = uri.getPort();
|
||
|
OpenSshConfig.Host hostConfig = tmpConfig.lookup(host);
|
||
|
if (port <= 0) {
|
||
|
port = hostConfig.getPort();
|
||
|
}
|
||
|
if (user == null) {
|
||
|
user = hostConfig.getUser();
|
||
|
}
|
||
|
return factory.createSession(null, FS.DETECTED, user, password, host,
|
||
|
port, hostConfig);
|
||
|
}
|
||
|
}
|