diff --git a/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/transport/sshd/ApacheSshTest.java b/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/transport/sshd/ApacheSshTest.java index 85626d8ee..ccaf98ced 100644 --- a/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/transport/sshd/ApacheSshTest.java +++ b/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/transport/sshd/ApacheSshTest.java @@ -354,6 +354,21 @@ public void testJumpHost() throws Exception { } } + @Test + public void testJumpHostNone() throws Exception { + // Should not try to go through the non-existing proxy + cloneWith("ssh://server/doesntmatter", defaultCloneDir, null, // + "Host server", // + "HostName localhost", // + "Port " + testPort, // + "User " + TEST_USER, // + "IdentityFile " + privateKey1.getAbsolutePath(), // + "ProxyJump none", // + "", // + "Host *", // + "ProxyJump " + TEST_USER + "@localhost:1234"); + } + @Test public void testJumpHostWrongKeyAtProxy() throws Exception { // Test that we find the proxy server's URI in the exception message diff --git a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/SshdSession.java b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/SshdSession.java index fb7500ffd..c270b4495 100644 --- a/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/SshdSession.java +++ b/org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/SshdSession.java @@ -219,7 +219,8 @@ private List determineHops(List currentHops, HostConfigEntry hostConfig, String host) throws IOException { if (currentHops.isEmpty()) { String jumpHosts = hostConfig.getProperty(SshConstants.PROXY_JUMP); - if (!StringUtils.isEmptyOrNull(jumpHosts)) { + if (!StringUtils.isEmptyOrNull(jumpHosts) + && !SshConstants.NONE.equals(jumpHosts)) { try { return parseProxyJump(jumpHosts); } catch (URISyntaxException e) { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshConstants.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshConstants.java index 5cd5b334a..212a4e46c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshConstants.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/SshConstants.java @@ -191,6 +191,26 @@ private SshConstants() { /** Flag value. */ public static final String FALSE = "false"; + /** + * Property value. Some keys accept a special 'none' value to override and + * clear a setting otherwise contributed by another host entry, for instance + * {@link #PROXY_COMMAND} or {@link #PROXY_JUMP}. Example: + * + *
+	 * Host bastion.example.org
+	 *   ProxyJump none
+	 *
+	 * Host *.example.org
+	 *   ProxyJump bastion.example.org
+	 * 
+ *

+ * OpenSSH supports this since OpenSSH 7.8. + *

+ * + * @since 6.0 + */ + public static final String NONE = "none"; + // Default identity file names /** Name of the default RSA private identity file. */ @@ -202,7 +222,7 @@ private SshConstants() { /** Name of the default ECDSA private identity file. */ public static final String ID_ECDSA = "id_ecdsa"; - /** Name of the default ECDSA private identity file. */ + /** Name of the default ED25519 private identity file. */ public static final String ID_ED25519 = "id_ed25519"; /** All known default identity file names. */