aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2012-07-20 14:17:40 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2012-07-20 14:17:40 +0200
commit8377415d954fde92a10dfd2a428b724ef4e7991d (patch)
treebbc9f0e18de92b09ccaf230e880da710eae7dba9
parentf355e899fe539e9f743efe0118d69a7348fa3d52 (diff)
downloadqxmpp-8377415d954fde92a10dfd2a428b724ef4e7991d.tar.gz
use QXmppSaslFailure
-rw-r--r--src/base/QXmppSaslAuth.cpp32
-rw-r--r--src/base/QXmppSaslAuth_p.h19
-rw-r--r--src/client/QXmppOutgoingClient.cpp7
-rw-r--r--src/server/QXmppIncomingClient.cpp8
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;
}