Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:lkundrak
orion-ssh2
orion-ssh2-213-socketfactory.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File orion-ssh2-213-socketfactory.patch of Package orion-ssh2
From a1156e38b9384fe01e261b6e9d5645e5fc311eac Mon Sep 17 00:00:00 2001 From: Lubomir Rintel <lkundrak@v3.sk> Date: Fri, 5 Mar 2010 12:08:00 +0100 Subject: [PATCH 2/2] Add SocketFactory This was imported from trilead-ssh2 for in IntelliJ IDEA community edition repository. --- src/com/trilead/ssh2/SelfConnectionProxyData.java | 8 ++ src/com/trilead/ssh2/transport/SocketFactory.java | 129 ++++++++++++++++++++ .../trilead/ssh2/transport/TransportManager.java | 127 ++------------------ 3 files changed, 148 insertions(+), 116 deletions(-) create mode 100644 src/com/trilead/ssh2/SelfConnectionProxyData.java create mode 100644 src/com/trilead/ssh2/transport/SocketFactory.java diff --git a/src/com/trilead/ssh2/SelfConnectionProxyData.java b/src/com/trilead/ssh2/SelfConnectionProxyData.java new file mode 100644 index 0000000..3223e1e --- /dev/null +++ b/src/com/trilead/ssh2/SelfConnectionProxyData.java @@ -0,0 +1,8 @@ +package com.trilead.ssh2; + +import java.io.IOException; +import java.net.Socket; + +public interface SelfConnectionProxyData extends ProxyData { + Socket connect() throws IOException; +} diff --git a/src/com/trilead/ssh2/transport/SocketFactory.java b/src/com/trilead/ssh2/transport/SocketFactory.java new file mode 100644 index 0000000..60fa75d --- /dev/null +++ b/src/com/trilead/ssh2/transport/SocketFactory.java @@ -0,0 +1,129 @@ +package com.trilead.ssh2.transport; + +import com.trilead.ssh2.HTTPProxyData; +import com.trilead.ssh2.HTTPProxyException; +import com.trilead.ssh2.ProxyData; +import com.trilead.ssh2.SelfConnectionProxyData; +import com.trilead.ssh2.crypto.Base64; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; + +public class SocketFactory { + public static Socket open(final String hostname, final int port, final ProxyData proxyData, final int connectTimeout) throws IOException { + final Socket sock = new Socket(); + if (proxyData == null) + { + InetAddress addr = TransportManager.createInetAddress(hostname); + sock.connect(new InetSocketAddress(addr, port), connectTimeout); + sock.setSoTimeout(0); + return sock; + } + + if (proxyData instanceof SelfConnectionProxyData) { + // already connected + return ((SelfConnectionProxyData) proxyData).connect(); + } + + if (proxyData instanceof HTTPProxyData) + { + HTTPProxyData pd = (HTTPProxyData) proxyData; + + /* At the moment, we only support HTTP proxies */ + + InetAddress addr = TransportManager.createInetAddress(pd.proxyHost); + sock.connect(new InetSocketAddress(addr, pd.proxyPort), connectTimeout); + sock.setSoTimeout(0); + + /* OK, now tell the proxy where we actually want to connect to */ + + StringBuffer sb = new StringBuffer(); + + sb.append("CONNECT "); + sb.append(hostname); + sb.append(':'); + sb.append(port); + sb.append(" HTTP/1.0\r\n"); + + if ((pd.proxyUser != null) && (pd.proxyPass != null)) + { + String credentials = pd.proxyUser + ":" + pd.proxyPass; + char[] encoded = Base64.encode(credentials.getBytes("ISO-8859-1")); + sb.append("Proxy-Authorization: Basic "); + sb.append(encoded); + sb.append("\r\n"); + } + + if (pd.requestHeaderLines != null) + { + for (int i = 0; i < pd.requestHeaderLines.length; i++) + { + if (pd.requestHeaderLines[i] != null) + { + sb.append(pd.requestHeaderLines[i]); + sb.append("\r\n"); + } + } + } + + sb.append("\r\n"); + + OutputStream out = sock.getOutputStream(); + + out.write(sb.toString().getBytes("ISO-8859-1")); + out.flush(); + + /* Now parse the HTTP response */ + + byte[] buffer = new byte[1024]; + InputStream in = sock.getInputStream(); + + int len = ClientServerHello.readLineRN(in, buffer); + + String httpReponse = new String(buffer, 0, len, "ISO-8859-1"); + + if (httpReponse.startsWith("HTTP/") == false) + throw new IOException("The proxy did not send back a valid HTTP response."); + + /* "HTTP/1.X XYZ X" => 14 characters minimum */ + + if ((httpReponse.length() < 14) || (httpReponse.charAt(8) != ' ') || (httpReponse.charAt(12) != ' ')) + throw new IOException("The proxy did not send back a valid HTTP response."); + + int errorCode = 0; + + try + { + errorCode = Integer.parseInt(httpReponse.substring(9, 12)); + } + catch (NumberFormatException ignore) + { + throw new IOException("The proxy did not send back a valid HTTP response."); + } + + if ((errorCode < 0) || (errorCode > 999)) + throw new IOException("The proxy did not send back a valid HTTP response."); + + if (errorCode != 200) + { + throw new HTTPProxyException(httpReponse.substring(13), errorCode); + } + + /* OK, read until empty line */ + + while (true) + { + len = ClientServerHello.readLineRN(in, buffer); + if (len == 0) + break; + } + return sock; + } + + throw new IOException("Unsupported ProxyData"); + } +} diff --git a/src/com/trilead/ssh2/transport/TransportManager.java b/src/com/trilead/ssh2/transport/TransportManager.java index 4b2bbe3..095a87b 100644 --- a/src/com/trilead/ssh2/transport/TransportManager.java +++ b/src/com/trilead/ssh2/transport/TransportManager.java @@ -114,7 +114,7 @@ public class TransportManager String hostname; int port; - final Socket sock = new Socket(); + Socket sock = new Socket(); Object connectionSemaphore = new Object(); @@ -132,6 +132,7 @@ public class TransportManager Vector connectionMonitors = new Vector(); boolean monitorsWereInformed = false; + private ClientServerHello myCsh; /** * There were reports that there are JDKs which use @@ -143,7 +144,7 @@ public class TransportManager * @return the InetAddress * @throws UnknownHostException */ - private InetAddress createInetAddress(String host) throws UnknownHostException + static InetAddress createInetAddress(String host) throws UnknownHostException { /* Check if it is a dotted IP4 address */ @@ -155,7 +156,7 @@ public class TransportManager return InetAddress.getByName(host); } - private InetAddress parseIPv4Address(String host) throws UnknownHostException + private static InetAddress parseIPv4Address(String host) throws UnknownHostException { if (host == null) return null; @@ -321,133 +322,23 @@ public class TransportManager } } - private void establishConnection(ProxyData proxyData, int connectTimeout) throws IOException - { - /* See the comment for createInetAddress() */ - - if (proxyData == null) - { - InetAddress addr = createInetAddress(hostname); - sock.connect(new InetSocketAddress(addr, port), connectTimeout); - sock.setSoTimeout(0); - return; - } - - if (proxyData instanceof HTTPProxyData) - { - HTTPProxyData pd = (HTTPProxyData) proxyData; - - /* At the moment, we only support HTTP proxies */ - - InetAddress addr = createInetAddress(pd.proxyHost); - sock.connect(new InetSocketAddress(addr, pd.proxyPort), connectTimeout); - sock.setSoTimeout(0); - - /* OK, now tell the proxy where we actually want to connect to */ - - StringBuffer sb = new StringBuffer(); - - sb.append("CONNECT "); - sb.append(hostname); - sb.append(':'); - sb.append(port); - sb.append(" HTTP/1.0\r\n"); - - if ((pd.proxyUser != null) && (pd.proxyPass != null)) - { - String credentials = pd.proxyUser + ":" + pd.proxyPass; - char[] encoded = Base64.encode(credentials.getBytes("ISO-8859-1")); - sb.append("Proxy-Authorization: Basic "); - sb.append(encoded); - sb.append("\r\n"); - } - - if (pd.requestHeaderLines != null) - { - for (int i = 0; i < pd.requestHeaderLines.length; i++) - { - if (pd.requestHeaderLines[i] != null) - { - sb.append(pd.requestHeaderLines[i]); - sb.append("\r\n"); - } - } - } - - sb.append("\r\n"); - - OutputStream out = sock.getOutputStream(); - - out.write(sb.toString().getBytes("ISO-8859-1")); - out.flush(); - - /* Now parse the HTTP response */ - - byte[] buffer = new byte[1024]; - InputStream in = sock.getInputStream(); - - int len = ClientServerHello.readLineRN(in, buffer); - - String httpReponse = new String(buffer, 0, len, "ISO-8859-1"); - - if (httpReponse.startsWith("HTTP/") == false) - throw new IOException("The proxy did not send back a valid HTTP response."); - - /* "HTTP/1.X XYZ X" => 14 characters minimum */ - - if ((httpReponse.length() < 14) || (httpReponse.charAt(8) != ' ') || (httpReponse.charAt(12) != ' ')) - throw new IOException("The proxy did not send back a valid HTTP response."); - - int errorCode = 0; - - try - { - errorCode = Integer.parseInt(httpReponse.substring(9, 12)); - } - catch (NumberFormatException ignore) - { - throw new IOException("The proxy did not send back a valid HTTP response."); - } - - if ((errorCode < 0) || (errorCode > 999)) - throw new IOException("The proxy did not send back a valid HTTP response."); - - if (errorCode != 200) - { - throw new HTTPProxyException(httpReponse.substring(13), errorCode); - } - - /* OK, read until empty line */ - - while (true) - { - len = ClientServerHello.readLineRN(in, buffer); - if (len == 0) - break; - } - return; - } - - throw new IOException("Unsupported ProxyData"); - } - public void initialize(CryptoWishList cwl, ServerHostKeyVerifier verifier, DHGexParameters dhgex, int connectTimeout, SecureRandom rnd, ProxyData proxyData) throws IOException { /* First, establish the TCP connection to the SSH-2 server */ - establishConnection(proxyData, connectTimeout); + sock = SocketFactory.open(hostname, port, proxyData, connectTimeout); /* Parse the server line and say hello - important: this information is later needed for the * key exchange (to stop man-in-the-middle attacks) - that is why we wrap it into an object * for later use. */ - ClientServerHello csh = new ClientServerHello(sock.getInputStream(), sock.getOutputStream()); + myCsh = new ClientServerHello(sock.getInputStream(), sock.getOutputStream()); tc = new TransportConnection(sock.getInputStream(), sock.getOutputStream(), rnd); - km = new KexManager(this, csh, cwl, hostname, port, verifier, rnd); + km = new KexManager(this, myCsh, cwl, hostname, port, verifier, rnd); km.initiateKEX(cwl, dhgex); receiveThread = new Thread(new Runnable() @@ -763,4 +654,8 @@ public class TransportManager mh.handleMessage(msg, msglen); } } + + public ClientServerHello getClientServerHello() { + return myCsh; + } } -- 1.6.6.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor