aboutsummaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-03-04 20:36:51 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-03-04 20:36:51 +0000
commit789fda8616d00ff1b880f4760cdeb3ff7f35eda0 (patch)
tree3cc76cb9915349e84d3e512fb59915dd9ec69d07 /source
parent20dccb6eb88e81363030120fbc4ede901ac55582 (diff)
downloadqxmpp-789fda8616d00ff1b880f4760cdeb3ff7f35eda0.tar.gz
use a single SOCKS5 server instead of one per job
Diffstat (limited to 'source')
-rw-r--r--source/QXmppSocks.cpp5
-rw-r--r--source/QXmppSocks.h1
-rw-r--r--source/QXmppTransferManager.cpp38
-rw-r--r--source/QXmppTransferManager.h2
4 files changed, 25 insertions, 21 deletions
diff --git a/source/QXmppSocks.cpp b/source/QXmppSocks.cpp
index c2e3ecec..691563a7 100644
--- a/source/QXmppSocks.cpp
+++ b/source/QXmppSocks.cpp
@@ -265,6 +265,11 @@ bool QXmppSocksServer::listen(const QHostAddress &address, quint16 port)
return m_server->listen(address, port);
}
+bool QXmppSocksServer::isListening() const
+{
+ return m_server->isListening();
+}
+
QHostAddress QXmppSocksServer::serverAddress() const
{
return m_server->serverAddress();
diff --git a/source/QXmppSocks.h b/source/QXmppSocks.h
index e99c7618..21d3be2d 100644
--- a/source/QXmppSocks.h
+++ b/source/QXmppSocks.h
@@ -70,6 +70,7 @@ class QXmppSocksServer : public QObject
public:
QXmppSocksServer(QObject *parent=0);
void close();
+ bool isListening() const;
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
QHostAddress serverAddress() const;
diff --git a/source/QXmppTransferManager.cpp b/source/QXmppTransferManager.cpp
index 7816f289..dc498607 100644
--- a/source/QXmppTransferManager.cpp
+++ b/source/QXmppTransferManager.cpp
@@ -58,7 +58,6 @@ QXmppTransferJob::QXmppTransferJob(const QString &jid, QXmppTransferJob::Directi
m_fileSize(0),
m_ibbSequence(0),
m_socksClient(0),
- m_socksServer(0),
m_socksSocket(0)
{
}
@@ -173,8 +172,6 @@ void QXmppTransferJob::terminate(QXmppTransferJob::Error cause)
// close sockets
if (m_socksClient)
m_socksClient->close();
- if (m_socksServer)
- m_socksServer->close();
if (m_socksSocket)
m_socksSocket->close();
@@ -197,8 +194,18 @@ bool QXmppTransferJob::writeData(const QByteArray &data)
QXmppTransferManager::QXmppTransferManager(QXmppClient *client)
: m_client(client),
m_ibbBlockSize(4096),
+ m_socksServer(0),
m_supportedMethods(QXmppTransferJob::AnyMethod)
{
+ // start SOCKS server
+ m_socksServer = new QXmppSocksServer(this);
+ if (m_socksServer->listen())
+ {
+ connect(m_socksServer, SIGNAL(newConnection(QTcpSocket*, const QString&, quint16)),
+ this, SLOT(socksServerConnected(QTcpSocket*, const QString&, quint16)));
+ } else {
+ qWarning() << "QXmppSocksServer could not start listening";
+ }
}
void QXmppTransferManager::byteStreamIqReceived(const QXmppByteStreamIq &iq)
@@ -730,21 +737,16 @@ void QXmppTransferManager::socksClientDisconnected()
void QXmppTransferManager::socksServerConnected(QTcpSocket *socket, const QString &hostName, quint16 port)
{
- QXmppSocksServer *socksServer = qobject_cast<QXmppSocksServer*>(sender());
+ const QString ownJid = m_client->getConfiguration().jid();
foreach (QXmppTransferJob *job, m_jobs)
{
- if (job->m_socksServer == socksServer)
+ if (hostName == streamHash(job->m_sid, ownJid, job->jid()) && port == 0)
{
- const QString ownJid = m_client->getConfiguration().jid();
- if (hostName == streamHash(job->m_sid, ownJid, job->jid()) || port == 0)
- {
- job->m_socksSocket = socket;
- return;
- }
- // don't accept any further connections
- job->m_socksServer->close();
+ job->m_socksSocket = socket;
+ return;
}
}
+ qWarning("QXmppSocksServer got a connection for a unknown stream");
socket->close();
}
@@ -805,7 +807,7 @@ void QXmppTransferManager::socksServerSendOffer(QXmppTransferJob *job)
QXmppByteStreamIq::StreamHost streamHost;
streamHost.setHost(entry.ip());
- streamHost.setPort(job->m_socksServer->serverPort());
+ streamHost.setPort(m_socksServer->serverPort());
streamHost.setJid(ownJid);
streamHosts.append(streamHost);
}
@@ -879,16 +881,12 @@ void QXmppTransferManager::streamInitiationResultReceived(const QXmppStreamIniti
job->m_requestId = openIq.id();
m_client->sendPacket(openIq);
} else if (job->method() == QXmppTransferJob::SocksMethod) {
- // start listening
- job->m_socksServer = new QXmppSocksServer(this);
- if (!job->m_socksServer->listen())
+ if (!m_socksServer->isListening())
{
- qWarning() << "QXmppSocksServer could not start listening";
+ qWarning() << "QXmppSocksServer is not listening";
job->terminate(QXmppTransferJob::ProtocolError);
return;
}
- qDebug() << "QXmppSocksServer listening on port" << job->m_socksServer->serverPort();
-
if (!m_proxy.isEmpty())
{
job->m_socksProxy.setJid(m_proxy);
diff --git a/source/QXmppTransferManager.h b/source/QXmppTransferManager.h
index 45d87172..cc8fc926 100644
--- a/source/QXmppTransferManager.h
+++ b/source/QXmppTransferManager.h
@@ -136,7 +136,6 @@ private:
// for socks5 bytestreams
QXmppSocksClient *m_socksClient;
- QXmppSocksServer *m_socksServer;
QTcpSocket *m_socksSocket;
QXmppByteStreamIq::StreamHost m_socksProxy;
@@ -189,6 +188,7 @@ private:
QXmppClient* m_client;
QList<QXmppTransferJob*> m_jobs;
int m_ibbBlockSize;
+ QXmppSocksServer *m_socksServer;
int m_supportedMethods;
QString m_proxy;
};