1
2
3
4
5
6
7
8
9
10
11
12 package org.eclipse.jgit.transport;
13
14 import static org.junit.Assert.assertEquals;
15
16 import java.io.File;
17 import java.nio.file.Files;
18 import java.util.Arrays;
19 import java.util.concurrent.TimeUnit;
20
21 import org.eclipse.jgit.junit.MockSystemReader;
22 import org.eclipse.jgit.util.FS;
23 import org.eclipse.jgit.util.SystemReader;
24 import org.junit.After;
25 import org.junit.Before;
26 import org.junit.Test;
27
28 import com.jcraft.jsch.Session;
29
30
31
32
33
34 public class JschConfigSessionFactoryTest {
35
36 File tmpConfigFile;
37
38 OpenSshConfig tmpConfig;
39
40 JschConfigSessionFactory factory = new JschConfigSessionFactory();
41
42 @Before
43 public void setup() {
44 SystemReader.setInstance(new MockSystemReader());
45 }
46
47 @After
48 public void removeTmpConfig() {
49 SystemReader.setInstance(null);
50 if (tmpConfigFile == null) {
51 return;
52 }
53 if (tmpConfigFile.exists() && !tmpConfigFile.delete()) {
54 tmpConfigFile.deleteOnExit();
55 }
56 tmpConfigFile = null;
57 }
58
59 @Test
60 public void testNoConfigEntry() throws Exception {
61 tmpConfigFile = File.createTempFile("jsch", "test");
62 tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
63 tmpConfigFile);
64 factory.setConfig(tmpConfig);
65 Session session = createSession("ssh://egit/egit/egit");
66 assertEquals("egit", session.getHost());
67
68 assertEquals(SystemReader.getInstance().getProperty("user.name"),
69 session.getUserName());
70 assertEquals(22, session.getPort());
71 }
72
73 @Test
74 public void testAlias() throws Exception {
75 tmpConfigFile = createConfig("Host egit", "Hostname git.eclipse.org",
76 "User foo", "Port 29418");
77 tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
78 tmpConfigFile);
79 factory.setConfig(tmpConfig);
80 Session session = createSession("ssh://egit/egit/egit");
81 assertEquals("git.eclipse.org", session.getHost());
82 assertEquals("foo", session.getUserName());
83 assertEquals(29418, session.getPort());
84 }
85
86 @Test
87 public void testAliasWithUser() throws Exception {
88 tmpConfigFile = createConfig("Host egit", "Hostname git.eclipse.org",
89 "User foo", "Port 29418");
90 tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
91 tmpConfigFile);
92 factory.setConfig(tmpConfig);
93 Session session = createSession("ssh://bar@egit/egit/egit");
94 assertEquals("git.eclipse.org", session.getHost());
95 assertEquals("bar", session.getUserName());
96 assertEquals(29418, session.getPort());
97 }
98
99 @Test
100 public void testAliasWithPort() throws Exception {
101 tmpConfigFile = createConfig("Host egit", "Hostname git.eclipse.org",
102 "User foo", "Port 29418");
103 tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
104 tmpConfigFile);
105 factory.setConfig(tmpConfig);
106 Session session = createSession("ssh://bar@egit:22/egit/egit");
107 assertEquals("git.eclipse.org", session.getHost());
108 assertEquals("bar", session.getUserName());
109 assertEquals(22, session.getPort());
110 }
111
112 @Test
113 public void testAliasIdentical() throws Exception {
114 tmpConfigFile = createConfig("Host git.eclipse.org",
115 "Hostname git.eclipse.org", "User foo", "Port 29418");
116 tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
117 tmpConfigFile);
118 factory.setConfig(tmpConfig);
119 Session session = createSession("ssh://git.eclipse.org/egit/egit");
120 assertEquals("git.eclipse.org", session.getHost());
121 assertEquals("foo", session.getUserName());
122 assertEquals(29418, session.getPort());
123 }
124
125 @Test
126 public void testAliasIdenticalWithUser() throws Exception {
127 tmpConfigFile = createConfig("Host git.eclipse.org",
128 "Hostname git.eclipse.org", "User foo", "Port 29418");
129 tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
130 tmpConfigFile);
131 factory.setConfig(tmpConfig);
132 Session session = createSession("ssh://bar@git.eclipse.org/egit/egit");
133 assertEquals("git.eclipse.org", session.getHost());
134 assertEquals("bar", session.getUserName());
135 assertEquals(29418, session.getPort());
136 }
137
138 @Test
139 public void testAliasIdenticalWithPort() throws Exception {
140 tmpConfigFile = createConfig("Host git.eclipse.org",
141 "Hostname git.eclipse.org", "User foo", "Port 29418");
142 tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
143 tmpConfigFile);
144 factory.setConfig(tmpConfig);
145 Session session = createSession(
146 "ssh://bar@git.eclipse.org:300/egit/egit");
147 assertEquals("git.eclipse.org", session.getHost());
148 assertEquals("bar", session.getUserName());
149 assertEquals(300, session.getPort());
150 }
151
152 @Test
153 public void testConnectTimout() throws Exception {
154 tmpConfigFile = createConfig("Host git.eclipse.org",
155 "Hostname git.eclipse.org", "User foo", "Port 29418",
156 "ConnectTimeout 10");
157 tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
158 tmpConfigFile);
159 factory.setConfig(tmpConfig);
160 Session session = createSession("ssh://git.eclipse.org/something");
161 assertEquals("git.eclipse.org", session.getHost());
162 assertEquals("foo", session.getUserName());
163 assertEquals(29418, session.getPort());
164 assertEquals(TimeUnit.SECONDS.toMillis(10), session.getTimeout());
165 }
166
167 @Test
168 public void testAliasCaseDifferenceUpcase() throws Exception {
169 tmpConfigFile = createConfig("Host Bitbucket.org",
170 "Hostname bitbucket.org", "User foo", "Port 29418",
171 "ConnectTimeout 10",
172 "Host bitbucket.org", "Hostname bitbucket.org", "User bar",
173 "Port 22", "ConnectTimeout 5");
174 tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
175 tmpConfigFile);
176 factory.setConfig(tmpConfig);
177 Session session = createSession("ssh://Bitbucket.org/something");
178 assertEquals("bitbucket.org", session.getHost());
179 assertEquals("foo", session.getUserName());
180 assertEquals(29418, session.getPort());
181 assertEquals(TimeUnit.SECONDS.toMillis(10), session.getTimeout());
182 }
183
184 @Test
185 public void testAliasCaseDifferenceLowcase() throws Exception {
186 tmpConfigFile = createConfig("Host Bitbucket.org",
187 "Hostname bitbucket.org", "User foo", "Port 29418",
188 "ConnectTimeout 10",
189 "Host bitbucket.org", "Hostname bitbucket.org", "User bar",
190 "Port 22", "ConnectTimeout 5");
191 tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
192 tmpConfigFile);
193 factory.setConfig(tmpConfig);
194 Session session = createSession("ssh://bitbucket.org/something");
195 assertEquals("bitbucket.org", session.getHost());
196 assertEquals("bar", session.getUserName());
197 assertEquals(22, session.getPort());
198 assertEquals(TimeUnit.SECONDS.toMillis(5), session.getTimeout());
199 }
200
201 @Test
202 public void testAliasCaseDifferenceUpcaseInverted() throws Exception {
203 tmpConfigFile = createConfig("Host bitbucket.org",
204 "Hostname bitbucket.org", "User bar", "Port 22",
205 "ConnectTimeout 5",
206 "Host Bitbucket.org", "Hostname bitbucket.org", "User foo",
207 "Port 29418", "ConnectTimeout 10");
208 tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
209 tmpConfigFile);
210 factory.setConfig(tmpConfig);
211 Session session = createSession("ssh://Bitbucket.org/something");
212 assertEquals("bitbucket.org", session.getHost());
213 assertEquals("foo", session.getUserName());
214 assertEquals(29418, session.getPort());
215 assertEquals(TimeUnit.SECONDS.toMillis(10), session.getTimeout());
216 }
217
218 @Test
219 public void testAliasCaseDifferenceLowcaseInverted() throws Exception {
220 tmpConfigFile = createConfig("Host bitbucket.org",
221 "Hostname bitbucket.org", "User bar", "Port 22",
222 "ConnectTimeout 5",
223 "Host Bitbucket.org", "Hostname bitbucket.org", "User foo",
224 "Port 29418", "ConnectTimeout 10");
225 tmpConfig = new OpenSshConfig(tmpConfigFile.getParentFile(),
226 tmpConfigFile);
227 factory.setConfig(tmpConfig);
228 Session session = createSession("ssh://bitbucket.org/something");
229 assertEquals("bitbucket.org", session.getHost());
230 assertEquals("bar", session.getUserName());
231 assertEquals(22, session.getPort());
232 assertEquals(TimeUnit.SECONDS.toMillis(5), session.getTimeout());
233 }
234
235 private File createConfig(String... lines) throws Exception {
236 File f = File.createTempFile("jsch", "test");
237 Files.write(f.toPath(), Arrays.asList(lines));
238 return f;
239 }
240
241 private Session createSession(String uriText) throws Exception {
242
243
244
245
246
247 URIish uri = new URIish(uriText);
248 String host = uri.getHost();
249 String user = uri.getUser();
250 String password = uri.getPass();
251 int port = uri.getPort();
252 OpenSshConfig.Host hostConfig = tmpConfig.lookup(host);
253 if (port <= 0) {
254 port = hostConfig.getPort();
255 }
256 if (user == null) {
257 user = hostConfig.getUser();
258 }
259 return factory.createSession(null, FS.DETECTED, user, password, host,
260 port, hostConfig);
261 }
262 }