53 lines
1.6 KiB
Java
53 lines
1.6 KiB
Java
|
package eu.siacs.conversations.utils;
|
||
|
|
||
|
import android.util.Log;
|
||
|
|
||
|
import java.io.IOException;
|
||
|
import java.io.InputStream;
|
||
|
import java.io.OutputStream;
|
||
|
import java.net.InetAddress;
|
||
|
import java.net.InetSocketAddress;
|
||
|
import java.net.Socket;
|
||
|
import java.net.UnknownHostException;
|
||
|
import java.nio.ByteBuffer;
|
||
|
|
||
|
import eu.siacs.conversations.Config;
|
||
|
|
||
|
public class SocksSocketFactory {
|
||
|
|
||
|
public static void createSocksConnection(Socket socket, String destination, int port) throws IOException {
|
||
|
InputStream proxyIs = socket.getInputStream();
|
||
|
OutputStream proxyOs = socket.getOutputStream();
|
||
|
proxyOs.write(new byte[]{0x05, 0x01, 0x00});
|
||
|
byte[] response = new byte[2];
|
||
|
proxyIs.read(response);
|
||
|
byte[] dest = destination.getBytes();
|
||
|
ByteBuffer request = ByteBuffer.allocate(7 + dest.length);
|
||
|
request.put(new byte[]{0x05, 0x01, 0x00, 0x03});
|
||
|
request.put((byte) dest.length);
|
||
|
request.put(dest);
|
||
|
request.putShort((short) port);
|
||
|
proxyOs.write(request.array());
|
||
|
response = new byte[7 + dest.length];
|
||
|
proxyIs.read(response);
|
||
|
if (response[1] != 0x00) {
|
||
|
throw new SocksConnectionException();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static Socket createSocket(InetSocketAddress address, String destination, int port) throws IOException {
|
||
|
Socket socket = new Socket();
|
||
|
socket.connect(address, Config.CONNECT_TIMEOUT * 1000);
|
||
|
createSocksConnection(socket, destination, port);
|
||
|
return socket;
|
||
|
}
|
||
|
|
||
|
public static Socket createSocketOverTor(String destination, int port) throws IOException {
|
||
|
return createSocket(new InetSocketAddress(InetAddress.getLocalHost(), 9050), destination, port);
|
||
|
}
|
||
|
|
||
|
static class SocksConnectionException extends IOException {
|
||
|
|
||
|
}
|
||
|
}
|