aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppUtils.cpp
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 /src/QXmppUtils.cpp
parentd5b9ca273924e220a6b5a9c78e7fddfe9400ac53 (diff)
downloadqxmpp-31f92915ef254bbdb702e1de0de72bdeff831ab6.tar.gz
implement and test quoted character handling
Diffstat (limited to 'src/QXmppUtils.cpp')
-rw-r--r--src/QXmppUtils.cpp15
1 files changed, 13 insertions, 2 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);
}