aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2012-07-20 13:32:44 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2012-07-20 13:32:44 +0200
commit72dd7ccb46ceac4b93f86a814e20576a5f325818 (patch)
treee897d81e6a5dfa504012d62bdecb59788ab1169c /src
parent8991d3b2a9f83d84b835973f1cc272d0ef0f437c (diff)
downloadqxmpp-72dd7ccb46ceac4b93f86a814e20576a5f325818.tar.gz
refactor SASL stanza handling
Diffstat (limited to 'src')
-rw-r--r--src/base/QXmppSaslAuth.cpp37
-rw-r--r--src/base/QXmppSaslAuth_p.h23
-rw-r--r--src/server/QXmppIncomingClient.cpp31
3 files changed, 75 insertions, 16 deletions
diff --git a/src/base/QXmppSaslAuth.cpp b/src/base/QXmppSaslAuth.cpp
index 5fca08e3..ab0c6bcb 100644
--- a/src/base/QXmppSaslAuth.cpp
+++ b/src/base/QXmppSaslAuth.cpp
@@ -25,6 +25,7 @@
#include <cstdlib>
#include <QCryptographicHash>
+#include <QDomElement>
#include <QStringList>
#include <QUrl>
@@ -32,6 +33,42 @@
#include "QXmppSaslAuth_p.h"
#include "QXmppUtils.h"
+const char *ns_xmpp_sasl = "urn:ietf:params:xml:ns:xmpp-sasl";
+
+QXmppSaslStanza::QXmppSaslStanza(const QString &type, const QByteArray &value)
+ : m_type(type)
+ , m_value(value)
+{
+}
+
+QByteArray QXmppSaslStanza::value() const
+{
+ return m_value;
+}
+
+void QXmppSaslStanza::setValue(const QByteArray &value)
+{
+ m_value = value;
+}
+
+
+void QXmppSaslStanza::parse(const QDomElement &element)
+{
+ m_type = element.nodeName();
+ m_value = QByteArray::fromBase64(element.text().toAscii());
+}
+
+void QXmppSaslStanza::toXml(QXmlStreamWriter *writer) const
+{
+ if (!m_type.isEmpty()) {
+ writer->writeStartElement(m_type);
+ writer->writeAttribute("xmlns", ns_xmpp_sasl);
+ if (!m_value.isEmpty())
+ writer->writeCharacters(m_value.toBase64());
+ writer->writeEndElement();
+ }
+}
+
class QXmppSaslClientPrivate
{
public:
diff --git a/src/base/QXmppSaslAuth_p.h b/src/base/QXmppSaslAuth_p.h
index 10a20cfb..e98cf802 100644
--- a/src/base/QXmppSaslAuth_p.h
+++ b/src/base/QXmppSaslAuth_p.h
@@ -25,6 +25,8 @@
#ifndef QXMPPSASLAUTH_P_H
#define QXMPPSASLAUTH_P_H
+#include "QXmppStanza.h"
+
//
// W A R N I N G
// -------------
@@ -36,6 +38,27 @@
// We mean it.
//
+class QXmppSaslStanza : public QXmppStanza
+{
+public:
+ QXmppSaslStanza(const QString &type = QString(), const QByteArray &value = QByteArray());
+
+ QString type() const;
+ void setType(const QString &type);
+
+ QByteArray value() const;
+ void setValue(const QByteArray &value);
+
+ /// \cond
+ void parse(const QDomElement &element);
+ void toXml(QXmlStreamWriter *writer) const;
+ /// \endcond
+
+private:
+ QString m_type;
+ QByteArray m_value;
+};
+
class QXmppSaslClientAnonymous : public QXmppSaslClient
{
public:
diff --git a/src/server/QXmppIncomingClient.cpp b/src/server/QXmppIncomingClient.cpp
index d9a3db0c..6fcb41b9 100644
--- a/src/server/QXmppIncomingClient.cpp
+++ b/src/server/QXmppIncomingClient.cpp
@@ -32,6 +32,7 @@
#include "QXmppMessage.h"
#include "QXmppPasswordChecker.h"
#include "QXmppSaslAuth.h"
+#include "QXmppSaslAuth_p.h"
#include "QXmppSessionIq.h"
#include "QXmppStreamFeatures.h"
#include "QXmppUtils.h"
@@ -230,7 +231,7 @@ void QXmppIncomingClient::handleStanza(const QDomElement &nodeRecv)
if (!d->passwordChecker) {
// FIXME: what type of failure?
warning("Cannot perform authentication, no password checker");
- sendData("<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>");
+ sendPacket(QXmppSaslStanza("failure"));
disconnectFromHost();
return;
}
@@ -241,7 +242,7 @@ void QXmppIncomingClient::handleStanza(const QDomElement &nodeRecv)
d->saslServer = QXmppSaslServer::create(mechanism, this);
if (!d->saslServer) {
// unsupported method
- sendData("<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'></failure>");
+ sendPacket(QXmppSaslStanza("failure"));
disconnectFromHost();
return;
}
@@ -253,7 +254,7 @@ void QXmppIncomingClient::handleStanza(const QDomElement &nodeRecv)
QByteArray challenge;
QXmppSaslServer::Response response = d->saslServer->respond(QByteArray::fromBase64(nodeRecv.text().toAscii()), challenge);
if (response != QXmppSaslServer::InputNeeded) {
- sendData("<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><incorrect-encoding/></failure>");
+ sendPacket(QXmppSaslStanza("failure"));
disconnectFromHost();
return;
}
@@ -275,20 +276,19 @@ void QXmppIncomingClient::handleStanza(const QDomElement &nodeRecv)
d->saslDigest.setQop("auth");
d->saslDigestStep = 1;
- QMap<QByteArray, QByteArray> challenge;
- challenge["nonce"] = d->saslDigest.nonce();
- challenge["realm"] = d->domain.toUtf8();
- challenge["qop"] = d->saslDigest.qop();
- challenge["charset"] = "utf-8";
- challenge["algorithm"] = "md5-sess";
+ QMap<QByteArray, QByteArray> output;
+ output["nonce"] = d->saslDigest.nonce();
+ output["realm"] = d->domain.toUtf8();
+ output["qop"] = d->saslDigest.qop();
+ output["charset"] = "utf-8";
+ output["algorithm"] = "md5-sess";
- const QByteArray data = QXmppSaslDigestMd5::serializeMessage(challenge);
- sendData("<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" + data.toBase64() +"</challenge>");
+ sendPacket(QXmppSaslStanza("challenge", QXmppSaslDigestMd5::serializeMessage(output)));
}
else
{
// unsupported method
- sendData("<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'></failure>");
+ sendPacket(QXmppSaslStanza("failure"));
disconnectFromHost();
return;
}
@@ -318,7 +318,7 @@ void QXmppIncomingClient::handleStanza(const QDomElement &nodeRecv)
d->saslDigestStep = 3;
d->jid = QString("%1@%2").arg(d->saslDigestUsername, d->domain);
info(QString("Authentication succeeded for '%1' from %2").arg(d->jid, d->origin()));
- sendData("<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>");
+ sendPacket(QXmppSaslStanza("success"));
handleStart();
}
}
@@ -431,8 +431,7 @@ void QXmppIncomingClient::onDigestReply()
QMap<QByteArray, QByteArray> challenge;
challenge["rspauth"] = d->saslDigest.calculateDigest(
QByteArray(":") + d->saslDigest.digestUri());
- const QByteArray data = QXmppSaslDigestMd5::serializeMessage(challenge).toBase64();
- sendData("<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" + data +"</challenge>");
+ sendPacket(QXmppSaslStanza("challenge", QXmppSaslDigestMd5::serializeMessage(challenge)));
}
void QXmppIncomingClient::onPasswordReply()
@@ -448,7 +447,7 @@ void QXmppIncomingClient::onPasswordReply()
case QXmppPasswordReply::NoError:
d->jid = jid;
info(QString("Authentication succeeded for '%1' from %2").arg(d->jid, d->origin()));
- sendData("<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>");
+ sendPacket(QXmppSaslStanza("success"));
handleStart();
break;
case QXmppPasswordReply::AuthorizationError: