diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-07-20 13:58:42 +0200 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-07-20 13:58:42 +0200 |
| commit | f355e899fe539e9f743efe0118d69a7348fa3d52 (patch) | |
| tree | d1420f67529c23b835b5e1ee5025c665933b7de3 /src | |
| parent | b45b8e0f5d4ccd8e072a93fbbe390a7a13526a23 (diff) | |
| download | qxmpp-f355e899fe539e9f743efe0118d69a7348fa3d52.tar.gz | |
rework
Diffstat (limited to 'src')
| -rw-r--r-- | src/base/QXmppSaslAuth.cpp | 33 | ||||
| -rw-r--r-- | src/base/QXmppSaslAuth_p.h | 42 | ||||
| -rw-r--r-- | src/server/QXmppIncomingClient.cpp | 31 |
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: |
