diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-29 12:14:07 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-29 12:14:07 +0000 |
| commit | e427a07d55dbaff1cf4008e4cefadc3c2a16d985 (patch) | |
| tree | 70a1f5fba687190fb5bf79845702663f33b90c54 /src | |
| parent | 1f3472f71ae867d9fc5e5482a355f12465c23ece (diff) | |
| download | qxmpp-e427a07d55dbaff1cf4008e4cefadc3c2a16d985.tar.gz | |
move remaining SASL code out of QXmppUtils
Diffstat (limited to 'src')
| -rw-r--r-- | src/QXmppIncomingClient.cpp | 6 | ||||
| -rw-r--r-- | src/QXmppOutgoingClient.cpp | 10 | ||||
| -rw-r--r-- | src/QXmppSaslAuth.cpp | 76 | ||||
| -rw-r--r-- | src/QXmppSaslAuth.h | 5 | ||||
| -rw-r--r-- | src/QXmppUtils.cpp | 75 | ||||
| -rw-r--r-- | src/QXmppUtils.h | 6 |
6 files changed, 89 insertions, 89 deletions
diff --git a/src/QXmppIncomingClient.cpp b/src/QXmppIncomingClient.cpp index eb23d7bc..b3556b62 100644 --- a/src/QXmppIncomingClient.cpp +++ b/src/QXmppIncomingClient.cpp @@ -223,7 +223,7 @@ void QXmppIncomingClient::handleStanza(const QDomElement &nodeRecv) challenge["charset"] = "utf-8"; challenge["algorithm"] = "md5-sess"; - const QByteArray data = serializeDigestMd5(challenge).toBase64(); + const QByteArray data = QXmppSaslDigestMd5::serializeMessage(challenge).toBase64(); sendData("<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" + data +"</challenge>"); } else @@ -237,7 +237,7 @@ void QXmppIncomingClient::handleStanza(const QDomElement &nodeRecv) else if (nodeRecv.tagName() == "response") { const QByteArray raw = QByteArray::fromBase64(nodeRecv.text().toAscii()); - QMap<QByteArray, QByteArray> response = parseDigestMd5(raw); + QMap<QByteArray, QByteArray> response = QXmppSaslDigestMd5::parseMessage(raw); if (d->saslStep == 1) { @@ -269,7 +269,7 @@ void QXmppIncomingClient::handleStanza(const QDomElement &nodeRecv) QMap<QByteArray, QByteArray> challenge; challenge["rspauth"] = d->saslDigest.calculateDigest( QByteArray(":") + d->saslDigest.digestUri()); - const QByteArray data = serializeDigestMd5(challenge).toBase64(); + const QByteArray data = QXmppSaslDigestMd5::serializeMessage(challenge).toBase64(); sendData("<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" + data +"</challenge>"); } else if (d->saslStep == 2) diff --git a/src/QXmppOutgoingClient.cpp b/src/QXmppOutgoingClient.cpp index b77b72ba..38e06ddb 100644 --- a/src/QXmppOutgoingClient.cpp +++ b/src/QXmppOutgoingClient.cpp @@ -718,8 +718,8 @@ void QXmppOutgoingClient::pingTimeout() // challenge is BASE64 encoded string void QXmppOutgoingClient::sendAuthDigestMD5ResponseStep1(const QString& challenge) { - QByteArray ba = QByteArray::fromBase64(challenge.toUtf8()); - QMap<QByteArray, QByteArray> map = parseDigestMd5(ba); + QByteArray ba = QByteArray::fromBase64(challenge.toAscii()); + QMap<QByteArray, QByteArray> map = QXmppSaslDigestMd5::parseMessage(ba); if (!map.contains("nonce")) { @@ -754,7 +754,7 @@ void QXmppOutgoingClient::sendAuthDigestMD5ResponseStep1(const QString& challeng response["authzid"] = d->saslDigest.authzid(); response["charset"] = "utf-8"; - const QByteArray data = serializeDigestMd5(response); + const QByteArray data = QXmppSaslDigestMd5::serializeMessage(response); QByteArray packet = "<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" + data.toBase64() + "</response>"; sendData(packet); @@ -762,8 +762,8 @@ void QXmppOutgoingClient::sendAuthDigestMD5ResponseStep1(const QString& challeng void QXmppOutgoingClient::sendAuthDigestMD5ResponseStep2(const QString &challenge) { - QByteArray ba = QByteArray::fromBase64(challenge.toUtf8()); - QMap<QByteArray, QByteArray> map = parseDigestMd5(ba); + QByteArray ba = QByteArray::fromBase64(challenge.toAscii()); + QMap<QByteArray, QByteArray> map = QXmppSaslDigestMd5::parseMessage(ba); if (!map.contains("rspauth")) { diff --git a/src/QXmppSaslAuth.cpp b/src/QXmppSaslAuth.cpp index b82c4231..6b642f13 100644 --- a/src/QXmppSaslAuth.cpp +++ b/src/QXmppSaslAuth.cpp @@ -132,3 +132,79 @@ QByteArray QXmppSaslDigestMd5::calculateDigest(const QByteArray &A2) const return QCryptographicHash::hash(KD, QCryptographicHash::Md5).toHex(); } +QMap<QByteArray, QByteArray> QXmppSaslDigestMd5::parseMessage(const QByteArray &ba) +{ + QMap<QByteArray, QByteArray> map; + int startIndex = 0; + int pos = 0; + while ((pos = ba.indexOf("=", startIndex)) >= 0) + { + // key get name and skip equals + const QByteArray key = ba.mid(startIndex, pos - startIndex).trimmed(); + pos++; + + // check whether string is quoted + if (ba.at(pos) == '"') + { + // skip opening quote + pos++; + int endPos = ba.indexOf('"', pos); + // skip quoted quotes + while (endPos >= 0 && ba.at(endPos - 1) == '\\') + endPos = ba.indexOf('"', endPos + 1); + if (endPos < 0) + { + qWarning("Unfinished quoted string"); + return map; + } + // unquote + QByteArray value = ba.mid(pos, endPos - pos); + value.replace("\\\"", "\""); + value.replace("\\\\", "\\"); + map[key] = value; + // skip closing quote and comma + startIndex = endPos + 2; + } else { + // non-quoted string + int endPos = ba.indexOf(',', pos); + if (endPos < 0) + endPos = ba.size(); + map[key] = ba.mid(pos, endPos - pos); + // skip comma + startIndex = endPos + 1; + } + } + return map; +} + +QByteArray QXmppSaslDigestMd5::serializeMessage(const QMap<QByteArray, QByteArray> &map) +{ + QByteArray ba; + foreach (const QByteArray &key, map.keys()) + { + if (!ba.isEmpty()) + ba.append(','); + ba.append(key + "="); + QByteArray value = map[key]; + const char *separators = "()<>@,;:\\\"/[]?={} \t"; + bool quote = false; + for (const char *c = separators; *c; c++) + { + if (value.contains(*c)) + { + quote = true; + break; + } + } + if (quote) + { + value.replace("\\", "\\\\"); + value.replace("\"", "\\\""); + ba.append("\"" + value + "\""); + } + else + ba.append(value); + } + return ba; +} + diff --git a/src/QXmppSaslAuth.h b/src/QXmppSaslAuth.h index 7e8c548e..1667826f 100644 --- a/src/QXmppSaslAuth.h +++ b/src/QXmppSaslAuth.h @@ -26,6 +26,7 @@ #define QXMPPSASLAUTH_H #include <QByteArray> +#include <QMap> class QXmppSaslDigestMd5 { @@ -56,6 +57,10 @@ public: QByteArray calculateDigest(const QByteArray &a2) const; static QByteArray generateNonce(); + // message parsing and serialization + static QMap<QByteArray, QByteArray> parseMessage(const QByteArray &ba); + static QByteArray serializeMessage(const QMap<QByteArray, QByteArray> &map); + private: QByteArray m_authzid; QByteArray m_cnonce; diff --git a/src/QXmppUtils.cpp b/src/QXmppUtils.cpp index 5879f3a8..fcf12b1d 100644 --- a/src/QXmppUtils.cpp +++ b/src/QXmppUtils.cpp @@ -299,78 +299,3 @@ QString unescapeString(const QString& str) return strOut; } -QMap<QByteArray, QByteArray> parseDigestMd5(const QByteArray &ba) -{ - QMap<QByteArray, QByteArray> map; - int startIndex = 0; - int pos = 0; - while ((pos = ba.indexOf("=", startIndex)) >= 0) - { - // key get name and skip equals - const QByteArray key = ba.mid(startIndex, pos - startIndex).trimmed(); - pos++; - - // check whether string is quoted - if (ba.at(pos) == '"') - { - // skip opening quote - pos++; - int endPos = ba.indexOf('"', pos); - // skip quoted quotes - while (endPos >= 0 && ba.at(endPos - 1) == '\\') - endPos = ba.indexOf('"', endPos + 1); - if (endPos < 0) - { - qWarning("Unfinished quoted string"); - return map; - } - // unquote - QByteArray value = ba.mid(pos, endPos - pos); - value.replace("\\\"", "\""); - value.replace("\\\\", "\\"); - map[key] = value; - // skip closing quote and comma - startIndex = endPos + 2; - } else { - // non-quoted string - int endPos = ba.indexOf(',', pos); - if (endPos < 0) - endPos = ba.size(); - map[key] = ba.mid(pos, endPos - pos); - // skip comma - startIndex = endPos + 1; - } - } - return map; -} - -QByteArray serializeDigestMd5(const QMap<QByteArray, QByteArray> &map) -{ - QByteArray ba; - foreach (const QByteArray &key, map.keys()) - { - if (!ba.isEmpty()) - ba.append(','); - ba.append(key + "="); - QByteArray value = map[key]; - const char *separators = "()<>@,;:\\\"/[]?={} \t"; - bool quote = false; - for (const char *c = separators; *c; c++) - { - if (value.contains(*c)) - { - quote = true; - break; - } - } - if (quote) - { - value.replace("\\", "\\\\"); - value.replace("\"", "\\\""); - ba.append("\"" + value + "\""); - } - else - ba.append(value); - } - return ba; -} diff --git a/src/QXmppUtils.h b/src/QXmppUtils.h index cc5e1cbf..fce000b9 100644 --- a/src/QXmppUtils.h +++ b/src/QXmppUtils.h @@ -26,8 +26,6 @@ #ifndef QXMPPUTILS_H #define QXMPPUTILS_H -#include <QMap> - // forward declarations of QXmlStream* classes will not work on Mac, we need to // include the whole header. // See http://lists.trolltech.com/qt-interest/2008-07/thread00798-0.html @@ -66,8 +64,4 @@ void helperToXmlAddNumberElement(QXmlStreamWriter* stream, const QString& name, QString escapeString(const QString& str); QString unescapeString(const QString& str); -// Digest MD5 authentication -QMap<QByteArray, QByteArray> parseDigestMd5(const QByteArray &ba); -QByteArray serializeDigestMd5(const QMap<QByteArray, QByteArray> &map); - #endif // QXMPPUTILS_H |
