diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/QXmppIncomingServer.cpp | 5 | ||||
| -rw-r--r-- | src/QXmppOutgoingServer.cpp | 72 | ||||
| -rw-r--r-- | src/QXmppOutgoingServer.h | 10 | ||||
| -rw-r--r-- | src/QXmppServer.cpp | 7 |
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(); |
