aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-08-29 12:14:07 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-08-29 12:14:07 +0000
commite427a07d55dbaff1cf4008e4cefadc3c2a16d985 (patch)
tree70a1f5fba687190fb5bf79845702663f33b90c54 /src
parent1f3472f71ae867d9fc5e5482a355f12465c23ece (diff)
downloadqxmpp-e427a07d55dbaff1cf4008e4cefadc3c2a16d985.tar.gz
move remaining SASL code out of QXmppUtils
Diffstat (limited to 'src')
-rw-r--r--src/QXmppIncomingClient.cpp6
-rw-r--r--src/QXmppOutgoingClient.cpp10
-rw-r--r--src/QXmppSaslAuth.cpp76
-rw-r--r--src/QXmppSaslAuth.h5
-rw-r--r--src/QXmppUtils.cpp75
-rw-r--r--src/QXmppUtils.h6
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