diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-20 12:59:07 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-20 12:59:07 +0000 |
| commit | 31f92915ef254bbdb702e1de0de72bdeff831ab6 (patch) | |
| tree | c4385d1ec96815ba06927626ce8407f523675b0d | |
| parent | d5b9ca273924e220a6b5a9c78e7fddfe9400ac53 (diff) | |
| download | qxmpp-31f92915ef254bbdb702e1de0de72bdeff831ab6.tar.gz | |
implement and test quoted character handling
| -rw-r--r-- | src/QXmppUtils.cpp | 15 | ||||
| -rw-r--r-- | tests/tests.cpp | 7 |
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); } |
