aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/QXmppIncomingServer.cpp5
-rw-r--r--src/QXmppOutgoingServer.cpp72
-rw-r--r--src/QXmppOutgoingServer.h10
-rw-r--r--src/QXmppServer.cpp7
4 files changed, 70 insertions, 24 deletions
diff --git a/src/QXmppIncomingServer.cpp b/src/QXmppIncomingServer.cpp
index 14a92e17..83e1bdd4 100644
--- a/src/QXmppIncomingServer.cpp
+++ b/src/QXmppIncomingServer.cpp
@@ -128,13 +128,12 @@ void QXmppIncomingServer::handleStanza(const QDomElement &stanza)
QXmppOutgoingServer *stream = new QXmppOutgoingServer(d->domain, this);
stream->setLogger(logger());
stream->setObjectName("S2S-dialback-" + domain);
- stream->configuration().setDomain(domain);
bool check = connect(stream, SIGNAL(dialbackResponseReceived(QXmppDialback)),
this, SLOT(slotDialbackResponseReceived(QXmppDialback)));
Q_ASSERT(check);
Q_UNUSED(check);
stream->setVerify(d->localStreamId, request.key());
- stream->connectToHost();
+ stream->connectToHost(domain);
}
else if (request.command() == QXmppDialback::Verify)
{
@@ -172,7 +171,7 @@ void QXmppIncomingServer::slotDialbackResponseReceived(const QXmppDialback &dial
if (!stream ||
dialback.command() != QXmppDialback::Verify ||
dialback.id() != d->localStreamId ||
- dialback.from() != stream->configuration().domain())
+ dialback.from() != stream->remoteDomain())
return;
// relay verify response
diff --git a/src/QXmppOutgoingServer.cpp b/src/QXmppOutgoingServer.cpp
index d88299d2..41c52219 100644
--- a/src/QXmppOutgoingServer.cpp
+++ b/src/QXmppOutgoingServer.cpp
@@ -35,8 +35,9 @@
class QXmppOutgoingServerPrivate
{
public:
- QString domain;
+ QString localDomain;
QString localStreamKey;
+ QString remoteDomain;
QString verifyId;
QString verifyKey;
bool ready;
@@ -50,12 +51,19 @@ public:
///
QXmppOutgoingServer::QXmppOutgoingServer(const QString &domain, QObject *parent)
- : QXmppOutgoingClient(parent),
+ : QXmppStream(parent),
d(new QXmppOutgoingServerPrivate)
{
- d->domain = domain;
+ QSslSocket *socket = new QSslSocket(this);
+ setSocket(socket);
+
+ d->localDomain = domain;
d->ready = false;
- configuration().setKeepAliveInterval(0);
+
+ bool check = connect(socket, SIGNAL(sslErrors(QList<QSslError>)),
+ this, SLOT(slotSslErrors(QList<QSslError>)));
+ Q_ASSERT(check);
+ Q_UNUSED(check);
}
/// Destroys the stream.
@@ -66,9 +74,9 @@ QXmppOutgoingServer::~QXmppOutgoingServer()
delete d;
}
-void QXmppOutgoingServer::connectToHost()
+void QXmppOutgoingServer::connectToHost(const QString &domain)
{
- const QString domain = configuration().domain();
+ d->remoteDomain = domain;
QString host;
quint16 port;
@@ -102,6 +110,11 @@ void QXmppOutgoingServer::handleStart()
sendData(data.toUtf8());
}
+void QXmppOutgoingServer::handleStream(const QDomElement &streamElement)
+{
+ Q_UNUSED(streamElement);
+}
+
void QXmppOutgoingServer::handleStanza(const QDomElement &stanza)
{
const QString ns = stanza.namespaceURI();
@@ -110,18 +123,34 @@ void QXmppOutgoingServer::handleStanza(const QDomElement &stanza)
{
QXmppStreamFeatures features;
features.parse(stanza);
- if (features.tlsMode() != QXmppStreamFeatures::Disabled)
+
+ if (!socket()->isEncrypted())
{
- // let QXmppOutgoingClient handle TLS
- QXmppOutgoingClient::handleStanza(stanza);
+ // check we can satisfy TLS constraints
+ if (!socket()->supportsSsl() &&
+ features.tlsMode() == QXmppStreamFeatures::Required)
+ {
+ warning("Disconnecting as TLS is required, but SSL support is not available");
+ disconnectFromHost();
+ return;
+ }
+
+ // enable TLS if possible
+ if (socket()->supportsSsl() &&
+ features.tlsMode() != QXmppStreamFeatures::Disabled)
+ {
+ sendData("<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
+ return;
+ }
}
- else if (!d->localStreamKey.isEmpty())
+
+ if (!d->localStreamKey.isEmpty())
{
// send dialback key
QXmppDialback dialback;
dialback.setCommand(QXmppDialback::Result);
- dialback.setFrom(d->domain);
- dialback.setTo(configuration().domain());
+ dialback.setFrom(d->localDomain);
+ dialback.setTo(d->remoteDomain);
dialback.setKey(d->localStreamKey);
sendPacket(dialback);
}
@@ -131,8 +160,8 @@ void QXmppOutgoingServer::handleStanza(const QDomElement &stanza)
QXmppDialback verify;
verify.setCommand(QXmppDialback::Verify);
verify.setId(d->verifyId);
- verify.setTo(configuration().domain());
- verify.setFrom(d->domain);
+ verify.setFrom(d->localDomain);
+ verify.setTo(d->remoteDomain);
verify.setKey(d->verifyKey);
sendPacket(verify);
}
@@ -153,7 +182,7 @@ void QXmppOutgoingServer::handleStanza(const QDomElement &stanza)
// check the request is valid
if (response.from().isEmpty() ||
- response.to() != d->domain ||
+ response.to() != d->localDomain ||
response.type().isEmpty())
{
warning("Invalid dialback response received");
@@ -200,3 +229,16 @@ void QXmppOutgoingServer::setVerify(const QString &id, const QString &key)
d->verifyKey = key;
}
+QString QXmppOutgoingServer::remoteDomain() const
+{
+ return d->remoteDomain;
+}
+
+void QXmppOutgoingServer::slotSslErrors(const QList<QSslError> &errors)
+{
+ warning("SSL errors");
+ for(int i = 0; i < errors.count(); ++i)
+ warning(errors.at(i).errorString());
+ socket()->ignoreSslErrors();
+}
+
diff --git a/src/QXmppOutgoingServer.h b/src/QXmppOutgoingServer.h
index 9e56c6b9..c003ebf0 100644
--- a/src/QXmppOutgoingServer.h
+++ b/src/QXmppOutgoingServer.h
@@ -34,7 +34,7 @@ class QXmppOutgoingServerPrivate;
/// to another XMPP server.
///
-class QXmppOutgoingServer : public QXmppOutgoingClient
+class QXmppOutgoingServer : public QXmppStream
{
Q_OBJECT
@@ -42,13 +42,15 @@ public:
QXmppOutgoingServer(const QString &domain, QObject *parent);
~QXmppOutgoingServer();
- void connectToHost();
+ void connectToHost(const QString &domain);
bool isConnected() const;
QString localStreamKey() const;
void setLocalStreamKey(const QString &key);
void setVerify(const QString &id, const QString &key);
+ QString remoteDomain() const;
+
signals:
/// This signal is emitted when a dialback verify response is received.
void dialbackResponseReceived(const QXmppDialback &response);
@@ -56,9 +58,13 @@ signals:
protected:
/// \cond
void handleStart();
+ void handleStream(const QDomElement &streamElement);
void handleStanza(const QDomElement &stanzaElement);
/// \endcond
+private slots:
+ void slotSslErrors(const QList<QSslError> &errors);
+
private:
Q_DISABLE_COPY(QXmppOutgoingServer)
QXmppOutgoingServerPrivate* const d;
diff --git a/src/QXmppServer.cpp b/src/QXmppServer.cpp
index db91118a..65b1d6d9 100644
--- a/src/QXmppServer.cpp
+++ b/src/QXmppServer.cpp
@@ -361,7 +361,6 @@ QXmppOutgoingServer* QXmppServer::connectToDomain(const QString &domain)
stream->setObjectName("S2S-out-" + domain);
stream->setLocalStreamKey(generateStanzaHash().toAscii());
stream->setLogger(d->logger);
- stream->configuration().setDomain(domain);
bool check = connect(stream, SIGNAL(connected()),
this, SLOT(slotStreamConnected()));
@@ -376,7 +375,7 @@ QXmppOutgoingServer* QXmppServer::connectToDomain(const QString &domain)
emit streamAdded(stream);
// connect to remote server
- stream->connectToHost();
+ stream->connectToHost(domain);
return stream;
}
@@ -403,7 +402,7 @@ QList<QXmppStream*> QXmppServer::getStreams(const QString &to)
// look for an outgoing S2S connection
foreach (QXmppOutgoingServer *conn, d->outgoingServers)
{
- if (conn->configuration().domain() == toDomain)
+ if (conn->remoteDomain() == toDomain)
{
found << conn;
break;
@@ -605,7 +604,7 @@ void QXmppServer::slotDialbackRequestReceived(const QXmppDialback &dialback)
// handle a verify request
foreach (QXmppOutgoingServer *out, d->outgoingServers)
{
- if (out->configuration().domain() != dialback.from())
+ if (out->remoteDomain() != dialback.from())
continue;
bool isValid = dialback.key() == out->localStreamKey();