From 2be4811d14f921f92e7f976b6e3c9ceb5404086b Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Mon, 11 Nov 2013 00:29:44 +0100 Subject: Unescape XML before sending messages over IRC --- src/xmpp/xmpp_stanza.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++++-- src/xmpp/xmpp_stanza.hpp | 2 +- 2 files changed, 48 insertions(+), 3 deletions(-) (limited to 'src/xmpp') diff --git a/src/xmpp/xmpp_stanza.cpp b/src/xmpp/xmpp_stanza.cpp index a1a04ba..169a8ef 100644 --- a/src/xmpp/xmpp_stanza.cpp +++ b/src/xmpp/xmpp_stanza.cpp @@ -4,6 +4,8 @@ #include +#include + std::string xml_escape(const std::string& data) { std::string res; @@ -35,6 +37,49 @@ std::string xml_escape(const std::string& data) return res; } +std::string xml_unescape(const std::string& data) +{ + std::string res; + res.reserve(data.size()); + const char* str = data.c_str(); + while (str && *str && (str - data.c_str()) < data.size()) + { + if (*str == '&') + { + if (strncmp(str+1, "amp;", 4) == 0) + { + res += "&"; + str += 4; + } + else if (strncmp(str+1, "lt;", 3) == 0) + { + res += "<"; + str += 3; + } + else if (strncmp(str+1, "gt;", 3) == 0) + { + res += ">"; + str += 3; + } + else if (strncmp(str+1, "quot;", 5) == 0) + { + res += "\""; + str += 5; + } + else if (strncmp(str+1, "apos;", 5) == 0) + { + res += "'"; + str += 5; + } + else + res += "&"; + } + else + res += *str; + str++; + } + return res; +} XmlNode::XmlNode(const std::string& name, XmlNode* parent): name(name), @@ -89,12 +134,12 @@ void XmlNode::add_to_inner(const std::string& data) std::string XmlNode::get_inner() const { - return this->inner; + return xml_unescape(this->inner); } std::string XmlNode::get_tail() const { - return this->tail; + return xml_unescape(this->tail); } XmlNode* XmlNode::get_child(const std::string& name) const diff --git a/src/xmpp/xmpp_stanza.hpp b/src/xmpp/xmpp_stanza.hpp index d2fe8c8..2ce8ce2 100644 --- a/src/xmpp/xmpp_stanza.hpp +++ b/src/xmpp/xmpp_stanza.hpp @@ -6,6 +6,7 @@ #include std::string xml_escape(const std::string& data); +std::string xml_unescape(const std::string& data); /** * Raised on operator[] when the attribute does not exist @@ -66,7 +67,6 @@ public: void add_to_inner(const std::string& data); /** * Get the content of inner - * TODO: unescape it here. */ std::string get_inner() const; /** -- cgit v1.2.3