]> source.dussan.org Git - jgit.git/commitdiff
sshd: fix proxy connections with the DefaultProxyDataFactory 93/145493/5
authorThomas Wolf <thomas.wolf@paranor.ch>
Thu, 4 Jul 2019 18:00:48 +0000 (20:00 +0200)
committerThomas Wolf <thomas.wolf@paranor.ch>
Mon, 2 Sep 2019 19:30:28 +0000 (21:30 +0200)
The java.net.ProxySelector is quite a bit different from the one
in Eclipse. Eclipse (and the OS) uses "socks" as URI scheme to
look up a SOCKS proxy. java.net.ProxySelector needs "socket" as
scheme (and internally maps that to "socks" if and when it asks
the OS about the proxies).

Moreover, java.net.ProxySelector may return unresolved addresses,
whereas the Eclipse proxy selector always returns resolved addresses.

Fix both by explicitly resolving unresolved proxy addresses and using
scheme "socket" in the DefaultProxyDataFactory.

Tested manually with the jgit command-line tool using ssh -vvv -D7020
localhost and 3proxy as SOCKS5 proxies on localhost (3proxy with
user/password authentication). Start jgit with _JAVA_OPTIONS set to
"-DsocksProxyHost=<host> -DsocksProxyPort=<port>
-Djava.net.useSystemProxies=false" to test manually.

Bug: 548965
Change-Id: Ib81ae8255ac2f9c48268f172e7d8ebb4a792b66d
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/internal/transport/sshd/JGitSshClient.java
org.eclipse.jgit.ssh.apache/src/org/eclipse/jgit/transport/sshd/DefaultProxyDataFactory.java

index 98e71dfe4b7d0b1137ad1286361617d69fe35618..377eabb00acbbb9c2f9c831c680e65f91c085a5c 100644 (file)
@@ -177,6 +177,10 @@ public class JGitSshClient extends SshClient {
                        return remoteAddress;
                }
                InetSocketAddress address = (InetSocketAddress) proxy.address();
+               if (address.isUnresolved()) {
+                       address = new InetSocketAddress(address.getHostName(),
+                                       address.getPort());
+               }
                switch (proxy.type()) {
                case HTTP:
                        setClientProxyConnector(
index 97e0da0428c2f8f203aede5b56f83dc9997563b0..66e595c6cce34bdb9f434ec51cba42ebd5928c02 100644 (file)
@@ -62,8 +62,8 @@ public class DefaultProxyDataFactory implements ProxyDataFactory {
        public ProxyData get(InetSocketAddress remoteAddress) {
                try {
                        List<Proxy> proxies = ProxySelector.getDefault()
-                                       .select(new URI(Proxy.Type.SOCKS.name(),
-                                                       "//" + remoteAddress.getHostString(), null)); //$NON-NLS-1$
+                                       .select(new URI(
+                                                       "socket://" + remoteAddress.getHostString())); //$NON-NLS-1$
                        ProxyData data = getData(proxies, Proxy.Type.SOCKS);
                        if (data == null) {
                                proxies = ProxySelector.getDefault()