From 5008f4e433c305f63b6b6dbd4d8545ab4cb9d4b4 Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Fri, 20 Aug 2010 12:02:31 +0000 Subject: add and test better auth-md5 parser (not used yet) --- src/QXmppUtils.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'src/QXmppUtils.cpp') diff --git a/src/QXmppUtils.cpp b/src/QXmppUtils.cpp index 4f8b84f2..ec84e8c5 100644 --- a/src/QXmppUtils.cpp +++ b/src/QXmppUtils.cpp @@ -286,4 +286,67 @@ QString unescapeString(const QString& str) return strOut; } +QMap parseDigestMd5(const QByteArray &ba) +{ + QMap 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); + if (endPos < 0) + { + qWarning("Unfinished quoted string"); + return map; + } + map[key] = ba.mid(pos, endPos - pos); + // 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 &map) +{ + QByteArray ba; + foreach (const QByteArray &key, map.keys()) + { + if (!ba.isEmpty()) + ba.append(','); + ba.append(key + "="); + const 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) + ba.append("\"" + value + "\""); + else + ba.append(value); + } + return ba; +} -- cgit v1.2.3