Esempio n. 1
0
  private void onConnect(final ProxyMessage msg) throws IOException {
    Socket s;

    if (proxy == null) {
      s = new Socket(msg.ip, msg.port);
    } else {
      s = new SocksSocket(proxy, msg.ip, msg.port);
    }

    log.info("Connected to " + s.getInetAddress() + ":" + s.getPort());

    ProxyMessage response = null;
    final InetAddress localAddress = s.getLocalAddress();
    final int localPort = s.getLocalPort();

    if (msg instanceof Socks5Message) {
      final int cmd = SocksProxyBase.SOCKS_SUCCESS;
      Socks5Message socks5Message = new Socks5Message(cmd, localAddress, localPort);
      socks5Message.setDnsResolver(dnsResolver);
      response = socks5Message;
    } else {
      final int cmd = Socks4Message.REPLY_OK;
      Socks4Message socks4Message = new Socks4Message(cmd, localAddress, localPort);
      socks4Message.setDnsResolver(dnsResolver);
      response = socks4Message;
    }
    response.write(out);
    startPipe(s);
  }
Esempio n. 2
0
  private void doAccept() throws IOException {
    Socket s = null;
    final long startTime = System.currentTimeMillis();

    while (true) {
      s = ss.accept();
      if (s.getInetAddress().equals(msg.ip)) {
        // got the connection from the right host
        // Close listenning socket.
        ss.close();
        break;
      } else if (ss instanceof SocksServerSocket) {
        // We can't accept more then one connection
        s.close();
        ss.close();
        throw new SocksException(SocksProxyBase.SOCKS_FAILURE);
      } else {
        if (acceptTimeout != 0) { // If timeout is not infinit
          final long passed = System.currentTimeMillis() - startTime;
          final int newTimeout = acceptTimeout - (int) passed;

          if (newTimeout <= 0) {
            throw new InterruptedIOException("newTimeout <= 0");
          }
          ss.setSoTimeout(newTimeout);
        }
        s.close(); // Drop all connections from other hosts
      }
    }

    // Accepted connection
    remote_sock = s;
    remote_in = s.getInputStream();
    remote_out = s.getOutputStream();

    // Set timeout
    remote_sock.setSoTimeout(iddleTimeout);

    final InetAddress inetAddress = s.getInetAddress();
    final int port = s.getPort();
    log.info("Accepted from {}:{}", s.getInetAddress(), port);

    ProxyMessage response;

    if (msg.version == 5) {
      final int cmd = SocksProxyBase.SOCKS_SUCCESS;
      Socks5Message socks5Message = new Socks5Message(cmd, inetAddress, port);
      socks5Message.setDnsResolver(dnsResolver);
      response = socks5Message;
    } else {
      final int cmd = Socks4Message.REPLY_OK;
      Socks4Message socks4Message = new Socks4Message(cmd, inetAddress, port);
      socks4Message.setDnsResolver(dnsResolver);
      response = socks4Message;
    }
    response.write(out);
  }
Esempio n. 3
0
  private void onBind(final ProxyMessage msg) throws IOException {
    ProxyMessage response = null;

    if (proxy == null) {
      ss = new ServerSocket(0);
    } else {
      ss = new SocksServerSocket(proxy, msg.ip, msg.port);
    }

    ss.setSoTimeout(acceptTimeout);

    final InetAddress inetAddress = ss.getInetAddress();
    final int localPort = ss.getLocalPort();
    log.info("Trying accept on {}:{}", inetAddress, localPort);

    if (msg.version == 5) {
      final int cmd = SocksProxyBase.SOCKS_SUCCESS;
      Socks5Message socks5Message = new Socks5Message(cmd, inetAddress, localPort);
      socks5Message.setDnsResolver(dnsResolver);
      response = socks5Message;
    } else {
      final int cmd = Socks4Message.REPLY_OK;
      Socks4Message socks4Message = new Socks4Message(cmd, inetAddress, localPort);
      socks4Message.setDnsResolver(dnsResolver);
      response = socks4Message;
    }
    response.write(out);

    mode = ACCEPT_MODE;

    pipe_thread1 = Thread.currentThread();
    pipe_thread2 = new Thread(this);
    pipe_thread2.start();

    // Make timeout infinit.
    sock.setSoTimeout(0);
    int eof = 0;

    try {
      while ((eof = in.read()) >= 0) {
        if (mode != ACCEPT_MODE) {
          if (mode != PIPE_MODE) {
            return; // Accept failed
          }

          remote_out.write(eof);
          break;
        }
      }
    } catch (final EOFException e) {
      log.debug("Connection closed while we were trying to accept", e);
      return;
    } catch (final InterruptedIOException e) {
      log.debug("Interrupted by unsucessful accept thread", e);
      if (mode != PIPE_MODE) {
        return;
      }
    } finally {
      // System.out.println("Finnaly!");
    }

    if (eof < 0) {
      return;
    }

    // Do not restore timeout, instead timeout is set on the
    // remote socket. It does not make any difference.

    pipe(in, remote_out);
  }