Example #1
0
  void ExitTunnel::TcpCreateProxy(QSharedPointer<Packet> packet)
  {
    TcpStartPacket *sp = dynamic_cast<TcpStartPacket*>(packet.data());
    if(!sp) return;

    QTcpSocket* socket = new QTcpSocket(this);
    socket->setProxy(_exit_proxy);

    // Check the verification key
    if(!_table.SaveConnection(socket, sp->GetConnectionId(), sp->GetVerificationKey())) return;
    _tcp_buffers[socket] = QByteArray();

    connect(socket, SIGNAL(readyRead()), this, SLOT(TcpReadFromProxy()));
    connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this,
        SLOT(TcpProxyStateChanged(QAbstractSocket::SocketState)));
    connect(socket, SIGNAL(disconnected()), this, SLOT(DiscardProxy()));
    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this,
        SLOT(HandleError(QAbstractSocket::SocketError)));

    qDebug() << "SOCKS Creating connection" << sp->GetConnectionId();

    bool proxy_does_lookups = (socket->proxy().capabilities() & QNetworkProxy::HostNameLookupCapability);
    qDebug() << "Direct" << proxy_does_lookups;

    if(sp->GetHostName().IsHostName()) {
      if(proxy_does_lookups) {
        // Connect directly to hostname
        qDebug() << "SOCKS ConnectToHost Direct" << sp->GetHostName().GetName() << ":" 
          << sp->GetHostName().GetPort() << (sp->GetHostName().IsHostName() ? "DNS" : "Address");
        socket->connectToHost(sp->GetHostName().GetName(), sp->GetHostName().GetPort());
      } else {
        // Resolve hostname, then connect to IP address
        qDebug() << "SOCKS Hostname" << sp->GetHostName().GetName();
        int lookup_id = QHostInfo::lookupHost(sp->GetHostName().GetName(), 
            this, SLOT(TcpDnsLookupFinished(const QHostInfo &)));
        TcpPendingDnsData dns_data = {socket, sp->GetHostName().GetPort()};
        _tcp_pending_dns[lookup_id] = dns_data;
      }
    } else {