X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_httpd_stats.cpp;h=7d7ebcf3d662d46332d87b06342524cecd38c998;hb=551d687ec6d7ce44be35fae0dd7345fe73c4f63a;hp=ee5b213f7eafa4065f0379d3f78479686712def6;hpb=ac7defcd3e52695dcf5e5150e9fe3e1624205e64;p=user%2Fhenk%2Fcode%2Finspircd.git
diff --git a/src/modules/m_httpd_stats.cpp b/src/modules/m_httpd_stats.cpp
index ee5b213f7..7d7ebcf3d 100644
--- a/src/modules/m_httpd_stats.cpp
+++ b/src/modules/m_httpd_stats.cpp
@@ -22,7 +22,7 @@
#include "inspircd.h"
-#include "httpd.h"
+#include "modules/httpd.h"
#include "xline.h"
#include "protocol.h"
@@ -37,7 +37,7 @@ class ModuleHttpStats : public Module
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)
@@ -55,14 +55,22 @@ class ModuleHttpStats : public Module
ret += it->second;
ret += ';';
}
- else if (*x < 32 || *x > 126)
+ else if (*x == 0x9 || *x == 0xA || *x == 0xD || *x >= 0x20)
{
- 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 += "";
+ break;
}
}
return ret;
@@ -89,7 +97,7 @@ class ModuleHttpStats : public Module
if (event.id == "httpd_url")
{
- ServerInstance->Logs->Log("m_http_stats", DEBUG,"Handling httpd event");
+ ServerInstance->Logs->Log("m_http_stats", LOG_DEBUG,"Handling httpd event");
HTTPRequest* http = (HTTPRequest*)&event;
if ((http->GetURI() == "/stats") || (http->GetURI() == "/stats/"))
@@ -111,7 +119,13 @@ class ModuleHttpStats : public Module
stime = gmtime(&server_uptime);
data << "" << stime->tm_yday << "" << stime->tm_hour << "" << stime->tm_min << "" << stime->tm_sec << "" << ServerInstance->startup_time << "";
- data << "" << Sanitize(ServerInstance->Config->data005) << "";
+ data << "";
+ const std::vector& isupport = ServerInstance->ISupport.GetLines();
+ for (std::vector::const_iterator it = isupport.begin(); it != isupport.end(); it++)
+ {
+ data << Sanitize(*it) << std::endl;
+ }
+ data << "";
std::vector xltypes = ServerInstance->XLines->GetAllTypes();
for (std::vector::iterator it = xltypes.begin(); it != xltypes.end(); ++it)
{
@@ -145,7 +159,7 @@ class ModuleHttpStats : public Module
Channel* c = a->second;
data << "";
- data << "" << c->GetUsers()->size() << "" << c->name << "";
+ data << "" << c->GetUsers()->size() << "" << Sanitize(c->name) << "";
data << "";
data << "" << Sanitize(c->topic) << "";
data << "" << Sanitize(c->setby) << "";
@@ -179,9 +193,9 @@ class ModuleHttpStats : public Module
data << "" << u->nick << "" << u->uuid << ""
<< u->host << "" << u->dhost << ""
<< Sanitize(u->fullname) << "" << u->server << "";
- if (IS_AWAY(u))
+ if (u->IsAway())
data << "" << Sanitize(u->awaymsg) << "" << u->awaytime << "";
- if (IS_OPER(u))
+ if (u->IsOper())
data << "" << Sanitize(u->oper->NameStr()) << "";
data << "" << u->FormatModes() << "" << Sanitize(u->ident) << "";
LocalUser* lu = IS_LOCAL(u);
@@ -224,10 +238,6 @@ class ModuleHttpStats : public Module
}
}
- virtual ~ModuleHttpStats()
- {
- }
-
virtual Version GetVersion()
{
return Version("Provides statistics over HTTP via m_httpd.so", VF_VENDOR);