aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-08-20 12:59:07 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-08-20 12:59:07 +0000
commit31f92915ef254bbdb702e1de0de72bdeff831ab6 (patch)
treec4385d1ec96815ba06927626ce8407f523675b0d
parentd5b9ca273924e220a6b5a9c78e7fddfe9400ac53 (diff)
downloadqxmpp-31f92915ef254bbdb702e1de0de72bdeff831ab6.tar.gz
implement and test quoted character handling
-rw-r--r--src/QXmppUtils.cpp15
-rw-r--r--tests/tests.cpp7
2 files changed, 17 insertions, 5 deletions
diff --git a/src/QXmppUtils.cpp b/src/QXmppUtils.cpp
index ec84e8c5..a6e6de74 100644
--- a/src/QXmppUtils.cpp
+++ b/src/QXmppUtils.cpp
@@ -303,12 +303,19 @@ QMap<QByteArray, QByteArray> parseDigestMd5(const QByteArray &ba)
// 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;
}
- map[key] = ba.mid(pos, endPos - pos);
+ // unquote
+ QByteArray value = ba.mid(pos, endPos - pos);
+ value.replace("\\\"", "\"");
+ value.replace("\\\\", "\\");
+ map[key] = value;
// skip closing quote and comma
startIndex = endPos + 2;
} else {
@@ -332,7 +339,7 @@ QByteArray serializeDigestMd5(const QMap<QByteArray, QByteArray> &map)
if (!ba.isEmpty())
ba.append(',');
ba.append(key + "=");
- const QByteArray value = map[key];
+ QByteArray value = map[key];
const char *separators = "()<>@,;:\\\"/[]?={} \t";
bool quote = false;
for (const char *c = separators; *c; c++)
@@ -344,7 +351,11 @@ QByteArray serializeDigestMd5(const QMap<QByteArray, QByteArray> &map)
}
}
if (quote)
+ {
+ value.replace("\\", "\\\\");
+ value.replace("\"", "\\\"");
ba.append("\"" + value + "\"");
+ }
else
ba.append(value);
}
diff --git a/tests/tests.cpp b/tests/tests.cpp
index 981c3abf..91cf510e 100644
--- a/tests/tests.cpp
+++ b/tests/tests.cpp
@@ -56,12 +56,13 @@ void TestUtils::testDigestMd5()
QCOMPARE(serializeDigestMd5(empty), QByteArray());
// non-empty
- const QByteArray bytes("number=12345,quoted=\"quoted string\",string=string");
+ const QByteArray bytes("number=12345,quoted_plain=\"quoted string\",quoted_quote=\"quoted\\\\slash\\\"quote\",string=string");
QMap<QByteArray, QByteArray> map = parseDigestMd5(bytes);
- QCOMPARE(map.size(), 3);
+ QCOMPARE(map.size(), 4);
QCOMPARE(map["number"], QByteArray("12345"));
- QCOMPARE(map["quoted"], QByteArray("quoted string"));
+ QCOMPARE(map["quoted_plain"], QByteArray("quoted string"));
+ QCOMPARE(map["quoted_quote"], QByteArray("quoted\\slash\"quote"));
QCOMPARE(map["string"], QByteArray("string"));
QCOMPARE(serializeDigestMd5(map), bytes);
}