void QXmppSocksServer::slotReadyRead() { QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender()); if (!socket || !m_states.contains(socket)) return; if (m_states.value(socket) == ConnectState) { m_states.insert(socket, CommandState); // receive connect to server request QByteArray buffer = socket->readAll(); if (buffer.size() < 3 || buffer.at(0) != SocksVersion || buffer.at(1) + 2 != buffer.size()) { qWarning("QXmppSocksServer received invalid handshake"); socket->close(); return; } // check authentication method bool foundMethod = false; for (int i = 2; i < buffer.size(); i++) { if (buffer.at(i) == NoAuthentication) { foundMethod = true; break; } } if (!foundMethod) { qWarning("QXmppSocksServer received bad authentication method"); socket->close(); return; } // send connect to server response buffer.resize(2); buffer[0] = SocksVersion; buffer[1] = NoAuthentication; socket->write(buffer); } else if (m_states.value(socket) == CommandState) { m_states.insert(socket, ReadyState); // disconnect from signals disconnect(socket, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); // receive command QByteArray buffer = socket->readAll(); if (buffer.size() < 4 || buffer.at(0) != SocksVersion || buffer.at(1) != ConnectCommand || buffer.at(2) != 0x00) { qWarning("QXmppSocksServer received an invalid command"); socket->close(); return; } // parse host quint8 hostType; QByteArray hostName; quint16 hostPort; if (!parseHostAndPort(buffer.mid(3), hostType, hostName, hostPort)) { qWarning("QXmppSocksServer could not parse type/host/port"); socket->close(); return; } // notify of connection emit newConnection(socket, hostName, hostPort); // send response buffer.resize(3); buffer[0] = SocksVersion; buffer[1] = Succeeded; buffer[2] = 0x00; buffer.append(encodeHostAndPort( DomainName, hostName, hostPort)); socket->write(buffer); } }
void QXmppSocksClient::slotReadyRead() { if (m_step == ConnectState) { m_step++; // receive connect to server response QByteArray buffer = readAll(); if (buffer.size() != 2 || buffer.at(0) != SocksVersion || buffer.at(1) != NoAuthentication) { qWarning("QXmppSocksClient received an invalid response during handshake"); close(); return; } // send CONNECT command buffer.resize(3); buffer[0] = SocksVersion; buffer[1] = ConnectCommand; buffer[2] = 0x00; // reserved buffer.append(encodeHostAndPort( DomainName, m_hostName.toLatin1(), m_hostPort)); write(buffer); } else if (m_step == CommandState) { m_step++; // disconnect from signal disconnect(this, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); // receive CONNECT response QByteArray buffer = readAll(); if (buffer.size() < 6 || buffer.at(0) != SocksVersion || buffer.at(1) != Succeeded || buffer.at(2) != 0) { qWarning("QXmppSocksClient received an invalid response to CONNECT command"); close(); return; } // parse host quint8 hostType; QByteArray hostName; quint16 hostPort; if (!parseHostAndPort(buffer.mid(3), hostType, hostName, hostPort)) { qWarning("QXmppSocksClient could not parse type/host/port"); close(); return; } // FIXME : what do we do with the resulting name / port? // notify of connection emit ready(); } }
void executeCommandPasv(ClientThreadResource * res , int * result) { char * m; int cantRetries = 0; char * port = calculatePort(getServerDataPort() , res->heapHandler); res->dataSocket = openServerSocket(getServerAddress() , port); while( (res->dataSocket == INVALID_SOCKET) && (cantRetries < getMaxRetriesFindingDataPort())) { port = calculatePort(port , res->heapHandler); res->dataSocket = openServerSocket(getServerAddress() , port); cantRetries++; } validateAndCloseDataConnection(res); res->mode = FTP_DATA_MODE_PASIVE; m = concat(res->heapHandler , 4 , "227 (" , encodeHostAndPort(getServerAddress() , port , res->heapHandler), ")" , CHARACTER_CRLF); sendMessage(res->controlSocket , m , &result); }