123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- /*
- * Copyright (C) 2018, Thomas Wolf <thomas.wolf@paranor.ch> and others
- *
- * 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.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
- //TODO(ms): move to org.eclipse.jgit.ssh.jsch in 6.0
- 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;
-
- import org.eclipse.jgit.junit.MockSystemReader;
- import org.eclipse.jgit.util.FS;
- import org.eclipse.jgit.util.SystemReader;
- import org.junit.After;
- import org.junit.Before;
- 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;
-
- JschConfigSessionFactory factory = new JschConfigSessionFactory();
-
- @Before
- public void setup() {
- SystemReader.setInstance(new MockSystemReader());
- }
-
- @After
- public void removeTmpConfig() {
- SystemReader.setInstance(null);
- 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
- assertEquals(SystemReader.getInstance().getProperty("user.name"),
- session.getUserName());
- 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());
- }
-
- @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));
- 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);
- }
- }
|