aboutsummaryrefslogtreecommitdiff
path: root/source/QXmppSocks.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-03-04 18:50:18 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-03-04 18:50:18 +0000
commitab47ccf582b4be8f57eb3f09d28f6085a3f96244 (patch)
treee19221e785fa75e441dbedec6069c261f6a15a9f /source/QXmppSocks.cpp
parent7c55f728ba4606ec7c821132b1be04f9d171ac19 (diff)
downloadqxmpp-ab47ccf582b4be8f57eb3f09d28f6085a3f96244.tar.gz
rework SOCKS5 API
Diffstat (limited to 'source/QXmppSocks.cpp')
-rw-r--r--source/QXmppSocks.cpp99
1 files changed, 35 insertions, 64 deletions
diff --git a/source/QXmppSocks.cpp b/source/QXmppSocks.cpp
index c11c6584..c2e3ecec 100644
--- a/source/QXmppSocks.cpp
+++ b/source/QXmppSocks.cpp
@@ -215,7 +215,6 @@ void QXmppSocksClient::slotReadyRead()
// FIXME : what do we do with the resulting name / port?
// from now on, forward signals
- connect(m_socket, SIGNAL(bytesWritten(qint64)), this, SIGNAL(bytesWritten(qint64)));
disconnect(m_socket, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
connect(m_socket, SIGNAL(readyRead()), this, SIGNAL(readyRead()));
@@ -244,11 +243,13 @@ qint64 QXmppSocksClient::write(const QByteArray &data)
return m_socket->write(data);
}
+QTcpSocket *QXmppSocksClient::socket()
+{
+ return m_socket;
+}
+
QXmppSocksServer::QXmppSocksServer(QObject *parent)
- : QObject(parent),
- m_hostPort(0),
- m_socket(0),
- m_step(ConnectState)
+ : QObject(parent)
{
m_server = new QTcpServer(this);
connect(m_server, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
@@ -257,8 +258,6 @@ QXmppSocksServer::QXmppSocksServer(QObject *parent)
void QXmppSocksServer::close()
{
m_server->close();
- if (m_socket)
- m_socket->close();
}
bool QXmppSocksServer::listen(const QHostAddress &address, quint16 port)
@@ -266,11 +265,6 @@ bool QXmppSocksServer::listen(const QHostAddress &address, quint16 port)
return m_server->listen(address, port);
}
-QByteArray QXmppSocksServer::readAll()
-{
- return m_socket->readAll();
-}
-
QHostAddress QXmppSocksServer::serverAddress() const
{
return m_server->serverAddress();
@@ -283,30 +277,33 @@ quint16 QXmppSocksServer::serverPort() const
void QXmppSocksServer::slotNewConnection()
{
- m_socket = m_server->nextPendingConnection();
- if (!m_socket)
+ QTcpSocket *socket = m_server->nextPendingConnection();
+ if (!socket)
return;
- // don't accept any further connections
- m_server->close();
- connect(m_socket, SIGNAL(disconnected()), this, SIGNAL(disconnected()));
- connect(m_socket, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
+ // register socket
+ m_states.insert(socket, ConnectState);
+ connect(socket, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
}
void QXmppSocksServer::slotReadyRead()
{
- if (m_step == ConnectState)
+ QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
+ if (!socket || !m_states.contains(socket))
+ return;
+
+ if (m_states.value(socket) == ConnectState)
{
- m_step++;
+ m_states.insert(socket, CommandState);
// receive connect to server request
- QByteArray buffer = m_socket->readAll();
+ QByteArray buffer = socket->readAll();
if (buffer.size() < 3 ||
buffer.at(0) != SocksVersion ||
buffer.at(1) + 2 != buffer.size())
{
qWarning("QXmppSocksServer received invalid handshake");
- m_socket->close();
+ socket->close();
return;
}
@@ -323,7 +320,7 @@ void QXmppSocksServer::slotReadyRead()
if (!foundMethod)
{
qWarning("QXmppSocksServer received bad authentication method");
- m_socket->close();
+ socket->close();
return;
}
@@ -331,20 +328,23 @@ void QXmppSocksServer::slotReadyRead()
buffer.resize(2);
buffer[0] = SocksVersion;
buffer[1] = NoAuthentication;
- m_socket->write(buffer);
+ socket->write(buffer);
- } else if (m_step == CommandState) {
- m_step++;
+ } 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 = m_socket->readAll();
+ 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");
- m_socket->close();
+ socket->close();
return;
}
@@ -355,16 +355,13 @@ void QXmppSocksServer::slotReadyRead()
if (!parseHostAndPort(buffer.mid(3), hostType, hostName, hostPort))
{
qWarning("QXmppSocksServer could not parse type/host/port");
- m_socket->close();
- return;
- }
- if (hostName != m_hostName || hostPort != m_hostPort)
- {
- qWarning("QXmppSocksServer got wrong host or port");
- m_socket->close();
+ socket->close();
return;
}
+ // notify of connection
+ emit newConnection(socket, hostName, hostPort);
+
// send response
buffer.resize(3);
buffer[0] = SocksVersion;
@@ -372,35 +369,9 @@ void QXmppSocksServer::slotReadyRead()
buffer[2] = 0x00;
buffer.append(encodeHostAndPort(
DomainName,
- m_hostName.toAscii(),
- m_hostPort));
- m_socket->write(buffer);
-
- // from now on, forward signals
- connect(m_socket, SIGNAL(bytesWritten(qint64)), this, SIGNAL(bytesWritten(qint64)));
- disconnect(m_socket, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
- connect(m_socket, SIGNAL(readyRead()), this, SIGNAL(readyRead()));
-
- // notify of connection
- emit connected();
+ hostName,
+ hostPort));
+ socket->write(buffer);
}
}
-void QXmppSocksServer::setHostName(const QString &hostName)
-{
- m_hostName = hostName;
-}
-
-void QXmppSocksServer::setHostPort(quint16 hostPort)
-{
- m_hostPort = hostPort;
-}
-
-qint64 QXmppSocksServer::write(const QByteArray &data)
-{
- if (m_socket)
- return m_socket->write(data);
- else
- return -1;
-}
-