aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/QXmppUtils.cpp')
-rw-r--r--src/QXmppUtils.cpp63
1 files changed, 63 insertions, 0 deletions
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<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);
+ 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<QByteArray, QByteArray> &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;
+}