aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/utils/SocksSocketFactory.java
blob: e3465fb9bec93d5450a48508d8341201a9510175 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package de.pixart.messenger.utils;

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.nio.ByteBuffer;

import de.pixart.messenger.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();
        try {
            socket.connect(address, Config.CONNECT_TIMEOUT * 1000);
        } catch (IOException e) {
            throw new SocksProxyNotFoundException();
        }
        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 {

    }

    public static class SocksProxyNotFoundException extends IOException {

    }
}