aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2012-07-20 13:58:42 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2012-07-20 13:58:42 +0200
commitf355e899fe539e9f743efe0118d69a7348fa3d52 (patch)
treed1420f67529c23b835b5e1ee5025c665933b7de3 /src
parentb45b8e0f5d4ccd8e072a93fbbe390a7a13526a23 (diff)
downloadqxmpp-f355e899fe539e9f743efe0118d69a7348fa3d52.tar.gz
rework
Diffstat (limited to 'src')
-rw-r--r--src/base/QXmppSaslAuth.cpp33
-rw-r--r--src/base/QXmppSaslAuth_p.h42
-rw-r--r--src/server/QXmppIncomingClient.cpp31
3 files changed, 68 insertions, 38 deletions
diff --git a/src/base/QXmppSaslAuth.cpp b/src/base/QXmppSaslAuth.cpp
index 2f332454..d651fad8 100644
--- a/src/base/QXmppSaslAuth.cpp
+++ b/src/base/QXmppSaslAuth.cpp
@@ -36,25 +36,25 @@
const char *ns_xmpp_sasl = "urn:ietf:params:xml:ns:xmpp-sasl";
QXmppSaslAuth::QXmppSaslAuth(const QString &mechanism, const QByteArray &value)
- : m_mechanism(mechanism)
- , m_value(value)
+ : QXmppSaslStanza("auth", value)
+ , m_mechanism(mechanism)
{
}
-QByteArray QXmppSaslAuth::value() const
+QString QXmppSaslAuth::mechanism() const
{
- return m_value;
+ return m_mechanism;
}
-void QXmppSaslAuth::setValue(const QByteArray &value)
+void QXmppSaslAuth::setMechanism(const QString &mechanism)
{
- m_value = value;
+ m_mechanism = mechanism;
}
void QXmppSaslAuth::parse(const QDomElement &element)
{
m_mechanism = element.attribute("mechanism");
- m_value = QByteArray::fromBase64(element.text().toAscii());
+ setValue(QByteArray::fromBase64(element.text().toAscii()));
}
void QXmppSaslAuth::toXml(QXmlStreamWriter *writer) const
@@ -62,11 +62,26 @@ void QXmppSaslAuth::toXml(QXmlStreamWriter *writer) const
writer->writeStartElement("auth");
writer->writeAttribute("xmlns", ns_xmpp_sasl);
writer->writeAttribute("mechanism", m_mechanism);
- if (!m_value.isEmpty())
- writer->writeCharacters(m_value.toBase64());
+ if (!value().isEmpty())
+ writer->writeCharacters(value().toBase64());
writer->writeEndElement();
}
+QXmppSaslChallenge::QXmppSaslChallenge(const QByteArray &value)
+ : QXmppSaslStanza("challenge", value)
+{
+}
+
+QXmppSaslFailure::QXmppSaslFailure()
+ : QXmppSaslStanza("failure")
+{
+}
+
+QXmppSaslSuccess::QXmppSaslSuccess()
+ : QXmppSaslStanza("success")
+{
+}
+
QXmppSaslStanza::QXmppSaslStanza(const QString &type, const QByteArray &value)
: m_type(type)
, m_value(value)
diff --git a/src/base/QXmppSaslAuth_p.h b/src/base/QXmppSaslAuth_p.h
index 8d52a09b..87b6dc36 100644
--- a/src/base/QXmppSaslAuth_p.h
+++ b/src/base/QXmppSaslAuth_p.h
@@ -38,13 +38,13 @@
// We mean it.
//
-class QXmppSaslAuth : public QXmppStanza
+class QXmppSaslStanza : public QXmppStanza
{
public:
- QXmppSaslAuth(const QString &mechanism = QString(), const QByteArray &value = QByteArray());
+ QXmppSaslStanza(const QString &type, const QByteArray &value = QByteArray());
- QString mechanism() const;
- void setMechanism(const QString &mechanism);
+ QString type() const;
+ void setType(const QString &type);
QByteArray value() const;
void setValue(const QByteArray &value);
@@ -55,20 +55,17 @@ public:
/// \endcond
private:
- QString m_mechanism;
+ QString m_type;
QByteArray m_value;
};
-class QXmppSaslStanza : public QXmppStanza
+class QXmppSaslAuth : public QXmppSaslStanza
{
public:
- QXmppSaslStanza(const QString &type = QString(), const QByteArray &value = QByteArray());
-
- QString type() const;
- void setType(const QString &type);
+ QXmppSaslAuth(const QString &mechanism = QString(), const QByteArray &value = QByteArray());
- QByteArray value() const;
- void setValue(const QByteArray &value);
+ QString mechanism() const;
+ void setMechanism(const QString &mechanism);
/// \cond
void parse(const QDomElement &element);
@@ -76,8 +73,25 @@ public:
/// \endcond
private:
- QString m_type;
- QByteArray m_value;
+ QString m_mechanism;
+};
+
+class QXmppSaslChallenge : public QXmppSaslStanza
+{
+public:
+ QXmppSaslChallenge(const QByteArray &value = QByteArray());
+};
+
+class QXmppSaslFailure : public QXmppSaslStanza
+{
+public:
+ QXmppSaslFailure();
+};
+
+class QXmppSaslSuccess : public QXmppSaslStanza
+{
+public:
+ QXmppSaslSuccess();
};
class QXmppSaslClientAnonymous : public QXmppSaslClient
diff --git a/src/server/QXmppIncomingClient.cpp b/src/server/QXmppIncomingClient.cpp
index 6fcb41b9..a7d864e1 100644
--- a/src/server/QXmppIncomingClient.cpp
+++ b/src/server/QXmppIncomingClient.cpp
@@ -231,30 +231,31 @@ void QXmppIncomingClient::handleStanza(const QDomElement &nodeRecv)
if (!d->passwordChecker) {
// FIXME: what type of failure?
warning("Cannot perform authentication, no password checker");
- sendPacket(QXmppSaslStanza("failure"));
+ sendPacket(QXmppSaslFailure());
disconnectFromHost();
return;
}
- if (nodeRecv.tagName() == QLatin1String("auth"))
- {
- const QString mechanism = nodeRecv.attribute("mechanism");
- d->saslServer = QXmppSaslServer::create(mechanism, this);
+ if (nodeRecv.tagName() == QLatin1String("auth")) {
+ QXmppSaslAuth auth;
+ auth.parse(nodeRecv);
+
+ d->saslServer = QXmppSaslServer::create(auth.mechanism(), this);
if (!d->saslServer) {
// unsupported method
- sendPacket(QXmppSaslStanza("failure"));
+ sendPacket(QXmppSaslFailure());
disconnectFromHost();
return;
}
d->saslServer->setRealm(d->domain.toUtf8());
- if (mechanism == QLatin1String("PLAIN"))
+ if (d->saslServer->mechanism() == QLatin1String("PLAIN"))
{
QByteArray challenge;
- QXmppSaslServer::Response response = d->saslServer->respond(QByteArray::fromBase64(nodeRecv.text().toAscii()), challenge);
+ QXmppSaslServer::Response response = d->saslServer->respond(auth.value(), challenge);
if (response != QXmppSaslServer::InputNeeded) {
- sendPacket(QXmppSaslStanza("failure"));
+ sendPacket(QXmppSaslFailure());
disconnectFromHost();
return;
}
@@ -269,7 +270,7 @@ void QXmppIncomingClient::handleStanza(const QDomElement &nodeRecv)
reply->setProperty("__sasl_username", request.username());
connect(reply, SIGNAL(finished()), this, SLOT(onPasswordReply()));
}
- else if (mechanism == QLatin1String("DIGEST-MD5"))
+ else if (d->saslServer->mechanism() == QLatin1String("DIGEST-MD5"))
{
// generate nonce
d->saslDigest.setNonce(QXmppSaslDigestMd5::generateNonce());
@@ -283,12 +284,12 @@ void QXmppIncomingClient::handleStanza(const QDomElement &nodeRecv)
output["charset"] = "utf-8";
output["algorithm"] = "md5-sess";
- sendPacket(QXmppSaslStanza("challenge", QXmppSaslDigestMd5::serializeMessage(output)));
+ sendPacket(QXmppSaslChallenge(QXmppSaslDigestMd5::serializeMessage(output)));
}
else
{
// unsupported method
- sendPacket(QXmppSaslStanza("failure"));
+ sendPacket(QXmppSaslFailure());
disconnectFromHost();
return;
}
@@ -318,7 +319,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()));
- sendPacket(QXmppSaslStanza("success"));
+ sendPacket(QXmppSaslSuccess());
handleStart();
}
}
@@ -431,7 +432,7 @@ void QXmppIncomingClient::onDigestReply()
QMap<QByteArray, QByteArray> challenge;
challenge["rspauth"] = d->saslDigest.calculateDigest(
QByteArray(":") + d->saslDigest.digestUri());
- sendPacket(QXmppSaslStanza("challenge", QXmppSaslDigestMd5::serializeMessage(challenge)));
+ sendPacket(QXmppSaslChallenge(QXmppSaslDigestMd5::serializeMessage(challenge)));
}
void QXmppIncomingClient::onPasswordReply()
@@ -447,7 +448,7 @@ void QXmppIncomingClient::onPasswordReply()
case QXmppPasswordReply::NoError:
d->jid = jid;
info(QString("Authentication succeeded for '%1' from %2").arg(d->jid, d->origin()));
- sendPacket(QXmppSaslStanza("success"));
+ sendPacket(QXmppSaslSuccess());
handleStart();
break;
case QXmppPasswordReply::AuthorizationError: