diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-07-20 14:17:40 +0200 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-07-20 14:17:40 +0200 |
| commit | 8377415d954fde92a10dfd2a428b724ef4e7991d (patch) | |
| tree | bbc9f0e18de92b09ccaf230e880da710eae7dba9 | |
| parent | f355e899fe539e9f743efe0118d69a7348fa3d52 (diff) | |
| download | qxmpp-8377415d954fde92a10dfd2a428b724ef4e7991d.tar.gz | |
use QXmppSaslFailure
| -rw-r--r-- | src/base/QXmppSaslAuth.cpp | 32 | ||||
| -rw-r--r-- | src/base/QXmppSaslAuth_p.h | 19 | ||||
| -rw-r--r-- | src/client/QXmppOutgoingClient.cpp | 7 | ||||
| -rw-r--r-- | src/server/QXmppIncomingClient.cpp | 8 |
4 files changed, 58 insertions, 8 deletions
diff --git a/src/base/QXmppSaslAuth.cpp b/src/base/QXmppSaslAuth.cpp index d651fad8..ddec1e0d 100644 --- a/src/base/QXmppSaslAuth.cpp +++ b/src/base/QXmppSaslAuth.cpp @@ -72,8 +72,38 @@ QXmppSaslChallenge::QXmppSaslChallenge(const QByteArray &value) { } -QXmppSaslFailure::QXmppSaslFailure() +QXmppSaslFailure::QXmppSaslFailure(const QString &condition) : QXmppSaslStanza("failure") + , m_condition(condition) +{ +} + +QString QXmppSaslFailure::condition() const +{ + return m_condition; +} + +void QXmppSaslFailure::setCondition(const QString &condition) +{ + m_condition = condition; +} + +void QXmppSaslFailure::parse(const QDomElement &element) +{ + m_condition = element.firstChildElement().tagName(); +} + +void QXmppSaslFailure::toXml(QXmlStreamWriter *writer) const +{ + writer->writeStartElement("failure"); + writer->writeAttribute("xmlns", ns_xmpp_sasl); + if (!m_condition.isEmpty()) + writer->writeEmptyElement(m_condition); + writer->writeEndElement(); +} + +QXmppSaslResponse::QXmppSaslResponse(const QByteArray &value) + : QXmppSaslStanza("response", value) { } diff --git a/src/base/QXmppSaslAuth_p.h b/src/base/QXmppSaslAuth_p.h index 87b6dc36..67480ddb 100644 --- a/src/base/QXmppSaslAuth_p.h +++ b/src/base/QXmppSaslAuth_p.h @@ -85,7 +85,24 @@ public: class QXmppSaslFailure : public QXmppSaslStanza { public: - QXmppSaslFailure(); + QXmppSaslFailure(const QString &condition = QString()); + + QString condition() const; + void setCondition(const QString &condition); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + +private: + QString m_condition; +}; + +class QXmppSaslResponse : public QXmppSaslStanza +{ +public: + QXmppSaslResponse(const QByteArray &value = QByteArray()); }; class QXmppSaslSuccess : public QXmppSaslStanza diff --git a/src/client/QXmppOutgoingClient.cpp b/src/client/QXmppOutgoingClient.cpp index a34ac2ec..71d81d3a 100644 --- a/src/client/QXmppOutgoingClient.cpp +++ b/src/client/QXmppOutgoingClient.cpp @@ -431,9 +431,12 @@ void QXmppOutgoingClient::handleStanza(const QDomElement &nodeRecv) } else if(nodeRecv.tagName() == "challenge") { + QXmppSaslChallenge challenge; + challenge.parse(nodeRecv); + QByteArray response; - if (d->saslClient->respond(QByteArray::fromBase64(nodeRecv.text().toAscii()), response)) { - sendData("<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" + response.toBase64() + "</response>"); + if (d->saslClient->respond(challenge.value(), response)) { + sendPacket(QXmppSaslResponse(response)); } else { warning("Could not respond to SASL challenge"); disconnectFromHost(); diff --git a/src/server/QXmppIncomingClient.cpp b/src/server/QXmppIncomingClient.cpp index a7d864e1..a8eadb4e 100644 --- a/src/server/QXmppIncomingClient.cpp +++ b/src/server/QXmppIncomingClient.cpp @@ -409,7 +409,7 @@ void QXmppIncomingClient::onDigestReply() const QString username = QString::fromUtf8(saslResponse.value("username")); if (reply->error() == QXmppPasswordReply::TemporaryError) { warning(QString("Temporary authentication failure for '%1'").arg(username)); - sendData("<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><temporary-auth-failure/></failure>"); + sendPacket(QXmppSaslFailure("temporary-auth-failure")); disconnectFromHost(); return; } @@ -421,7 +421,7 @@ void QXmppIncomingClient::onDigestReply() if (saslResponse.value("response") != d->saslDigest.calculateDigest( QByteArray("AUTHENTICATE:") + d->saslDigest.digestUri())) { - sendData("<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><not-authorized/></failure>"); + sendPacket(QXmppSaslFailure("not-authorized")); disconnectFromHost(); return; } @@ -453,12 +453,12 @@ void QXmppIncomingClient::onPasswordReply() break; case QXmppPasswordReply::AuthorizationError: warning(QString("Authentication failed for '%1' from %2").arg(jid, d->origin())); - sendData("<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><not-authorized/></failure>"); + sendPacket(QXmppSaslFailure("not-authorized")); disconnectFromHost(); break; case QXmppPasswordReply::TemporaryError: warning(QString("Temporary authentication failure for '%1' from %2").arg(jid, d->origin())); - sendData("<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><temporary-auth-failure/></failure>"); + sendPacket(QXmppSaslFailure("temporary-auth-failure")); disconnectFromHost(); break; } |
