]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_httpd_stats.cpp
Merge pull request #1162 from SaberUK/insp20+fix-deinstall
[user/henk/code/inspircd.git] / src / modules / m_httpd_stats.cpp
index b1613d5a526c422378662292cc28018b7291b314..2fc7ca7dea33656e4c79dfcf5c7723176daf75f1 100644 (file)
@@ -34,9 +34,10 @@ class ModuleHttpStats : public Module
 
  public:
 
-       ModuleHttpStats()       {
+       void init()
+       {
                Implementation eventlist[] = { I_OnEvent };
-               ServerInstance->Modules->Attach(eventlist, this, 1);
+               ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
        }
 
        std::string Sanitize(const std::string &str)
@@ -54,14 +55,22 @@ class ModuleHttpStats : public Module
                                ret += it->second;
                                ret += ';';
                        }
-                       else if (*x < 32 || *x > 126)
+                       else if (*x == 0x09 ||  *x == 0x0A || *x == 0x0D || ((*x >= 0x20) && (*x <= 0x7e)))
                        {
-                               int n = (unsigned char)*x;
-                               ret += ("&#" + ConvToStr(n) + ";");
+                               // The XML specification defines the following characters as valid inside an XML document:
+                               // Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+                               ret += *x;
                        }
                        else
                        {
-                               ret += *x;
+                               // If we reached this point then the string contains characters which can
+                               // not be represented in XML, even using a numeric escape. Therefore, we
+                               // Base64 encode the entire string and wrap it in a CDATA.
+                               ret.clear();
+                               ret += "<![CDATA[";
+                               ret += BinToBase64(str);
+                               ret += "]]>";
+                               break;
                        }
                }
                return ret;
@@ -144,7 +153,7 @@ class ModuleHttpStats : public Module
                                        Channel* c = a->second;
 
                                        data << "<channel>";
-                                       data << "<usercount>" << c->GetUsers()->size() << "</usercount><channelname>" << c->name << "</channelname>";
+                                       data << "<usercount>" << c->GetUsers()->size() << "</usercount><channelname>" << Sanitize(c->name) << "</channelname>";
                                        data << "<channeltopic>";
                                        data << "<topictext>" << Sanitize(c->topic) << "</topictext>";
                                        data << "<setby>" << Sanitize(c->setby) << "</setby>";