summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Mittendrein <git@maxmitti.tk>2015-10-12 15:45:36 +0200
committerMarkus Mittendrein <git@maxmitti.tk>2015-10-12 15:45:50 +0200
commit2edcec94e9e3f55313d4aa6d784e52ce37f1ba0e (patch)
treee24a11c2c6d4984de4ca6420beda9148a97ec1d6
parent66a0030f5d120a477128ea183451f7a7f9c33bb7 (diff)
downloadmanager-2edcec94e9e3f55313d4aa6d784e52ce37f1ba0e.tar.gz
manager-2edcec94e9e3f55313d4aa6d784e52ce37f1ba0e.zip
Add escaping in ConfigBase
-rw-r--r--src/ConfigBase.cpp18
-rw-r--r--src/Util.cpp68
-rw-r--r--src/Util.hpp2
3 files changed, 77 insertions, 11 deletions
diff --git a/src/ConfigBase.cpp b/src/ConfigBase.cpp
index d895e80..9f62d77 100644
--- a/src/ConfigBase.cpp
+++ b/src/ConfigBase.cpp
@@ -10,7 +10,7 @@ void ConfigBase::addConfigValue(QString name, ConfigValueBase* value)
void ConfigBase::setConfigValue(const QString &name, const QString &value)
{
ConfigValueBase& configValue = getConfigValue(name);
- configValue.setValue(value);
+ configValue.setValue(Util::unescape(value));
}
QString ConfigBase::getConfigValueLine(const QString &name)
@@ -26,7 +26,7 @@ QString ConfigBase::getConfigValueLine(const QString &name)
const QMap<QString, QString>& values = (dynamic_cast<ConfigValueMap*>(&value))->getValues();
foreach(const QString& mapKey, values.keys())
{
- ret += name + "[" + mapKey + "]" + " = " + values.value(mapKey) + "\n";
+ ret += name + "[" + Util::escape(mapKey, '\\', "]") + "]" + " = " + Util::escape(values.value(mapKey)) + "\n";
}
return ret;
break;
@@ -36,13 +36,13 @@ QString ConfigBase::getConfigValueLine(const QString &name)
QString ret;
foreach(const QString& val, (dynamic_cast<ConfigValueList*>(&value))->getValues())
{
- ret += name + " += " + val + "\n";
+ ret += name + " += " + Util::escape(val) + "\n";
}
return ret;
break;
}
default:
- return name + " = " + value.value() + "\n";
+ return name + " = " + Util::escape(value.value()) + "\n";
}
}
else
@@ -58,7 +58,7 @@ void ConfigBase::addConfigListEntry(const QString &name, const QString &value)
{
throw ConfigException("Cannot add a list entry to a non-list-config value \"" + name.toStdString() + "\"");
}
- ((ConfigValueList*)&configValue)->append(value);
+ ((ConfigValueList*)&configValue)->append(Util::unescape(value));
}
void ConfigBase::removeConfigMapListEntry(const QString &name, const QString &value)
@@ -66,11 +66,11 @@ void ConfigBase::removeConfigMapListEntry(const QString &name, const QString &va
ConfigValueBase& configValue = getConfigValue(name);
if(configValue.type() == ConfigValueType::List)
{
- ((ConfigValueList*)&configValue)->remove(value);
+ ((ConfigValueList*)&configValue)->remove(Util::unescape(value));
}
else if(configValue.type() == ConfigValueType::Map)
{
- ((ConfigValueMap*)&configValue)->remove(value);
+ ((ConfigValueMap*)&configValue)->remove(Util::unescape(value));
}
else
{
@@ -85,7 +85,7 @@ void ConfigBase::setConfigMapValue(const QString &name, const QString &key, cons
{
throw ConfigException("Cannot set a map value on a non-map-config value \"" + name.toStdString() + "\"");
}
- ((ConfigValueMap*)&configValue)->setKeyValue(key, value);
+ ((ConfigValueMap*)&configValue)->setKeyValue(Util::unescape(key), Util::unescape(value));
}
ConfigValueBase& ConfigBase::getConfigValue(const QString& name)
@@ -170,7 +170,7 @@ void ConfigBase::setConfigLine(const QString &line)
static QRegExp valueExp(R"(^([^=]+)=(.*)$)");
static QRegExp listExp(R"(^([^=]+)\+=(.*)$)");
static QRegExp listMapRemoveExp(R"(^([^=]+)\-=(.*)$)");
- static QRegExp mapExp(R"(^([^\[]+)\[([^\]]+)\]\s*=\s*(.*)$)");
+ static QRegExp mapExp(R"(^([^\[]+)\[((?:[^\]\\]|\\\]|\\\\)+)\]\s*=\s*(.*)$)");
if(listExp.exactMatch(line))
{
diff --git a/src/Util.cpp b/src/Util.cpp
index 78dd8d2..8b5bc67 100644
--- a/src/Util.cpp
+++ b/src/Util.cpp
@@ -15,8 +15,72 @@ namespace Util {
return string;
}
- QString& trimQuotes(const QString& string, bool& trimmed)
+ QString unescape(const QString &string, const QChar escapeChar)
{
- return trimQuotes(QString(string), trimmed);
+ if(string.isEmpty()) return string;
+ QString ret;
+ bool escaped = false;
+ QChar c = string.at(0);
+ for(int i = 0; i < string.length(); ++i)
+ {
+ c = string.at(i);
+ if(!escaped)
+ {
+ if(c == escapeChar)
+ {
+ escaped = true;
+ continue;
+ }
+ else
+ {
+ ret.append(c);
+ }
+ }
+ else
+ {
+ if(unescapeChars.contains(c))
+ {
+ ret.append(unescapeChars.value(c));
+ }
+ else
+ {
+ ret.append(c);
+ }
+ escaped = false;
+ }
+ }
+ if(escaped)
+ {
+ ret.append(escapeChar);
+ }
+ return ret;
}
+
+ QString escape(const QString &string, const QChar escapeChar, const QString &escapeChars)
+ {
+ QString ret;
+
+ for(int i = 0; i < string.length(); ++i)
+ {
+ QChar c = string.at(i);
+
+ if(escapeChars.contains(c))
+ {
+ ret.append(escapeChar);
+ ret.append(c);
+ }
+ else if(unescapeChars.values().contains(c))
+ {
+ ret.append(unescapeChars.key(c));
+ }
+ else
+ {
+ ret.append(c);
+ }
+ }
+
+ return ret;
+ }
+
+
}
diff --git a/src/Util.hpp b/src/Util.hpp
index 5826b1b..ffd2fa3 100644
--- a/src/Util.hpp
+++ b/src/Util.hpp
@@ -9,4 +9,6 @@ namespace Util {
};
QString trimQuotes(QString string, bool& trimmed);
+ QString unescape(const QString& string, const QChar escapeChar = '\\');
+ QString escape(const QString& string, const QChar escapeChar = '\\', const QString& escapeChars = "");
}