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.

JschConfigSessionFactoryTest.java 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. /*
  2. * Copyright (C) 2018, Thomas Wolf <thomas.wolf@paranor.ch> and others
  3. *
  4. * This program and the accompanying materials are made available under the
  5. * terms of the Eclipse Distribution License v. 1.0 which is available at
  6. * https://www.eclipse.org/org/documents/edl-v10.php.
  7. *
  8. * SPDX-License-Identifier: BSD-3-Clause
  9. */
  10. //TODO(ms): move to org.eclipse.jgit.ssh.jsch in 6.0
  11. package org.eclipse.jgit.transport;
  12. import static org.junit.Assert.assertEquals;
  13. import java.io.File;
  14. import java.nio.file.Files;
  15. import java.util.Arrays;
  16. import java.util.concurrent.TimeUnit;
  17. import org.eclipse.jgit.junit.MockSystemReader;
  18. import org.eclipse.jgit.util.FS;
  19. import org.eclipse.jgit.util.SystemReader;
  20. import org.junit.After;
  21. import org.junit.Before;
  22. import org.junit.Test;
  23. import com.jcraft.jsch.Session;
  24. /**
  25. * Tests for correctly interpreting ssh config values when Jsch sessions are
  26. * used.
  27. */
  28. public class JschConfigSessionFactoryTest {
  29. File tmpConfigFile;
  30. OpenSshConfig tmpConfig;
  31. JschConfigSessionFactory factory = new JschConfigSessionFactory();
  32. @Before
  33. public void setup() {
  34. SystemReader.setInstance(new MockSystemReader());
  35. }
  36. @After
  37. public void removeTmpConfig() {
  38. SystemReader.setInstance(null);
  39. if (tmpConfigFile == null) {
  40. return;
  41. }
  42. if (tmpConfigFile.exists() && !tmpConfigFile.delete()) {
  43. tmpConfigFile.deleteOnExit();
  44. }
  45. tmpConfigFile = null;
  46. }
  47. @Test
  48. public void testNoConfigEntry() throws Exception {
  49. tmpConfigFile = File.createTempFile("jsch", "test");
  50. tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
  51. tmpConfigFile);
  52. factory.setConfig(tmpConfig);
  53. Session session = createSession("ssh://egit/egit/egit");
  54. assertEquals("egit", session.getHost());
  55. // No user in URI, none in ssh config: default is OS user name
  56. assertEquals(SystemReader.getInstance().getProperty("user.name"),
  57. session.getUserName());
  58. assertEquals(22, session.getPort());
  59. }
  60. @Test
  61. public void testAlias() throws Exception {
  62. tmpConfigFile = createConfig("Host egit", "Hostname git.eclipse.org",
  63. "User foo", "Port 29418");
  64. tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
  65. tmpConfigFile);
  66. factory.setConfig(tmpConfig);
  67. Session session = createSession("ssh://egit/egit/egit");
  68. assertEquals("git.eclipse.org", session.getHost());
  69. assertEquals("foo", session.getUserName());
  70. assertEquals(29418, session.getPort());
  71. }
  72. @Test
  73. public void testAliasWithUser() throws Exception {
  74. tmpConfigFile = createConfig("Host egit", "Hostname git.eclipse.org",
  75. "User foo", "Port 29418");
  76. tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
  77. tmpConfigFile);
  78. factory.setConfig(tmpConfig);
  79. Session session = createSession("ssh://bar@egit/egit/egit");
  80. assertEquals("git.eclipse.org", session.getHost());
  81. assertEquals("bar", session.getUserName());
  82. assertEquals(29418, session.getPort());
  83. }
  84. @Test
  85. public void testAliasWithPort() throws Exception {
  86. tmpConfigFile = createConfig("Host egit", "Hostname git.eclipse.org",
  87. "User foo", "Port 29418");
  88. tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
  89. tmpConfigFile);
  90. factory.setConfig(tmpConfig);
  91. Session session = createSession("ssh://bar@egit:22/egit/egit");
  92. assertEquals("git.eclipse.org", session.getHost());
  93. assertEquals("bar", session.getUserName());
  94. assertEquals(22, session.getPort());
  95. }
  96. @Test
  97. public void testAliasIdentical() throws Exception {
  98. tmpConfigFile = createConfig("Host git.eclipse.org",
  99. "Hostname git.eclipse.org", "User foo", "Port 29418");
  100. tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
  101. tmpConfigFile);
  102. factory.setConfig(tmpConfig);
  103. Session session = createSession("ssh://git.eclipse.org/egit/egit");
  104. assertEquals("git.eclipse.org", session.getHost());
  105. assertEquals("foo", session.getUserName());
  106. assertEquals(29418, session.getPort());
  107. }
  108. @Test
  109. public void testAliasIdenticalWithUser() throws Exception {
  110. tmpConfigFile = createConfig("Host git.eclipse.org",
  111. "Hostname git.eclipse.org", "User foo", "Port 29418");
  112. tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
  113. tmpConfigFile);
  114. factory.setConfig(tmpConfig);
  115. Session session = createSession("ssh://bar@git.eclipse.org/egit/egit");
  116. assertEquals("git.eclipse.org", session.getHost());
  117. assertEquals("bar", session.getUserName());
  118. assertEquals(29418, session.getPort());
  119. }
  120. @Test
  121. public void testAliasIdenticalWithPort() throws Exception {
  122. tmpConfigFile = createConfig("Host git.eclipse.org",
  123. "Hostname git.eclipse.org", "User foo", "Port 29418");
  124. tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
  125. tmpConfigFile);
  126. factory.setConfig(tmpConfig);
  127. Session session = createSession(
  128. "ssh://bar@git.eclipse.org:300/egit/egit");
  129. assertEquals("git.eclipse.org", session.getHost());
  130. assertEquals("bar", session.getUserName());
  131. assertEquals(300, session.getPort());
  132. }
  133. @Test
  134. public void testConnectTimout() throws Exception {
  135. tmpConfigFile = createConfig("Host git.eclipse.org",
  136. "Hostname git.eclipse.org", "User foo", "Port 29418",
  137. "ConnectTimeout 10");
  138. tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
  139. tmpConfigFile);
  140. factory.setConfig(tmpConfig);
  141. Session session = createSession("ssh://git.eclipse.org/something");
  142. assertEquals("git.eclipse.org", session.getHost());
  143. assertEquals("foo", session.getUserName());
  144. assertEquals(29418, session.getPort());
  145. assertEquals(TimeUnit.SECONDS.toMillis(10), session.getTimeout());
  146. }
  147. @Test
  148. public void testAliasCaseDifferenceUpcase() throws Exception {
  149. tmpConfigFile = createConfig("Host Bitbucket.org",
  150. "Hostname bitbucket.org", "User foo", "Port 29418",
  151. "ConnectTimeout 10", //
  152. "Host bitbucket.org", "Hostname bitbucket.org", "User bar",
  153. "Port 22", "ConnectTimeout 5");
  154. tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
  155. tmpConfigFile);
  156. factory.setConfig(tmpConfig);
  157. Session session = createSession("ssh://Bitbucket.org/something");
  158. assertEquals("bitbucket.org", session.getHost());
  159. assertEquals("foo", session.getUserName());
  160. assertEquals(29418, session.getPort());
  161. assertEquals(TimeUnit.SECONDS.toMillis(10), session.getTimeout());
  162. }
  163. @Test
  164. public void testAliasCaseDifferenceLowcase() throws Exception {
  165. tmpConfigFile = createConfig("Host Bitbucket.org",
  166. "Hostname bitbucket.org", "User foo", "Port 29418",
  167. "ConnectTimeout 10", //
  168. "Host bitbucket.org", "Hostname bitbucket.org", "User bar",
  169. "Port 22", "ConnectTimeout 5");
  170. tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
  171. tmpConfigFile);
  172. factory.setConfig(tmpConfig);
  173. Session session = createSession("ssh://bitbucket.org/something");
  174. assertEquals("bitbucket.org", session.getHost());
  175. assertEquals("bar", session.getUserName());
  176. assertEquals(22, session.getPort());
  177. assertEquals(TimeUnit.SECONDS.toMillis(5), session.getTimeout());
  178. }
  179. @Test
  180. public void testAliasCaseDifferenceUpcaseInverted() throws Exception {
  181. tmpConfigFile = createConfig("Host bitbucket.org",
  182. "Hostname bitbucket.org", "User bar", "Port 22",
  183. "ConnectTimeout 5", //
  184. "Host Bitbucket.org", "Hostname bitbucket.org", "User foo",
  185. "Port 29418", "ConnectTimeout 10");
  186. tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
  187. tmpConfigFile);
  188. factory.setConfig(tmpConfig);
  189. Session session = createSession("ssh://Bitbucket.org/something");
  190. assertEquals("bitbucket.org", session.getHost());
  191. assertEquals("foo", session.getUserName());
  192. assertEquals(29418, session.getPort());
  193. assertEquals(TimeUnit.SECONDS.toMillis(10), session.getTimeout());
  194. }
  195. @Test
  196. public void testAliasCaseDifferenceLowcaseInverted() throws Exception {
  197. tmpConfigFile = createConfig("Host bitbucket.org",
  198. "Hostname bitbucket.org", "User bar", "Port 22",
  199. "ConnectTimeout 5", //
  200. "Host Bitbucket.org", "Hostname bitbucket.org", "User foo",
  201. "Port 29418", "ConnectTimeout 10");
  202. tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
  203. tmpConfigFile);
  204. factory.setConfig(tmpConfig);
  205. Session session = createSession("ssh://bitbucket.org/something");
  206. assertEquals("bitbucket.org", session.getHost());
  207. assertEquals("bar", session.getUserName());
  208. assertEquals(22, session.getPort());
  209. assertEquals(TimeUnit.SECONDS.toMillis(5), session.getTimeout());
  210. }
  211. private File createConfig(String... lines) throws Exception {
  212. File f = File.createTempFile("jsch", "test");
  213. Files.write(f.toPath(), Arrays.asList(lines));
  214. return f;
  215. }
  216. private Session createSession(String uriText) throws Exception {
  217. // For this test to make sense, these few lines must correspond to the
  218. // code in JschConfigSessionFactory.getSession(). Because of
  219. // side-effects we cannot encapsulate that there properly and so we have
  220. // to duplicate this bit here. We also can't test getSession() itself
  221. // since it would try to actually connect to a server.
  222. URIish uri = new URIish(uriText);
  223. String host = uri.getHost();
  224. String user = uri.getUser();
  225. String password = uri.getPass();
  226. int port = uri.getPort();
  227. OpenSshConfig.Host hostConfig = tmpConfig.lookup(host);
  228. if (port <= 0) {
  229. port = hostConfig.getPort();
  230. }
  231. if (user == null) {
  232. user = hostConfig.getUser();
  233. }
  234. return factory.createSession(null, FS.DETECTED, user, password, host,
  235. port, hostConfig);
  236. }
  237. }