]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_httpd_config.cpp
Fix the cloaking module on C++98 compilers.
[user/henk/code/inspircd.git] / src / modules / m_httpd_config.cpp
index 3c468079925a3ca0cc16c93548fc2316129546e0..3a842416874eedf3f1f2ddb892e12a5da53672fa 100644 (file)
@@ -1,8 +1,12 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2013, 2017-2018, 2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013, 2015 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012 Robby <robby@chatbelgie.be>
  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
- *   Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
+ *   Copyright (C) 2008, 2010 Craig Edwards <brain@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
 #include "inspircd.h"
 #include "modules/httpd.h"
 
-class ModuleHttpConfig : public Module
+class ModuleHttpConfig : public Module, public HTTPRequestEventListener
 {
        HTTPdAPI API;
 
  public:
        ModuleHttpConfig()
-               : API(this)
+               : HTTPRequestEventListener(this)
+               , API(this)
        {
        }
 
-       std::string Sanitize(const std::string &str)
+       ModResult OnHTTPRequest(HTTPRequest& request) CXX11_OVERRIDE
        {
-               std::string ret;
+               if (request.GetPath() != "/config")
+                       return MOD_RES_PASSTHRU;
 
-               for (std::string::const_iterator x = str.begin(); x != str.end(); ++x)
-               {
-                       switch (*x)
-                       {
-                               case '<':
-                                       ret += "&lt;";
-                               break;
-                               case '>':
-                                       ret += "&gt;";
-                               break;
-                               case '&':
-                                       ret += "&amp;";
-                               break;
-                               case '"':
-                                       ret += "&quot;";
-                               break;
-                               default:
-                                       if (*x < 32 || *x > 126)
-                                       {
-                                               int n = *x;
-                                               ret += ("&#" + ConvToStr(n) + ";");
-                                       }
-                                       else
-                                               ret += *x;
-                               break;
-                       }
-               }
-               return ret;
-       }
+               ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Handling HTTP request for %s", request.GetPath().c_str());
+               std::stringstream buffer;
 
-       void OnEvent(Event& event) CXX11_OVERRIDE
-       {
-               std::stringstream data("");
-
-               if (event.id == "httpd_url")
+               ConfigDataHash& config = ServerInstance->Config->config_data;
+               for (ConfigDataHash::const_iterator citer = config.begin(); citer != config.end(); ++citer)
                {
-                       ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Handling httpd event");
-                       HTTPRequest* http = (HTTPRequest*)&event;
+                       // Show the location of the tag in a comment.
+                       ConfigTag* tag = citer->second;
+                       buffer << "# " << tag->getTagLocation() << std::endl
+                               << '<' << tag->tag << ' ';
 
-                       if ((http->GetURI() == "/config") || (http->GetURI() == "/config/"))
+                       // Print out the tag with all keys aligned vertically.
+                       const std::string indent(tag->tag.length() + 2, ' ');
+                       const ConfigItems& items = tag->getItems();
+                       for (ConfigItems::const_iterator kiter = items.begin(); kiter != items.end(); )
                        {
-                               data << "<html><head><title>InspIRCd Configuration</title></head><body>";
-                               data << "<h1>InspIRCd Configuration</h1><p>";
-
-                               for (ConfigDataHash::iterator x = ServerInstance->Config->config_data.begin(); x != ServerInstance->Config->config_data.end(); ++x)
-                               {
-                                       data << "&lt;" << x->first << " ";
-                                       ConfigTag* tag = x->second;
-                                       for (std::vector<KeyVal>::const_iterator j = tag->getItems().begin(); j != tag->getItems().end(); j++)
-                                       {
-                                               data << Sanitize(j->first) << "=&quot;" << Sanitize(j->second) << "&quot; ";
-                                       }
-                                       data << "&gt;<br>";
-                               }
-
-                               data << "</body></html>";
-                               /* Send the document back to m_httpd */
-                               HTTPDocumentResponse response(this, *http, &data, 200);
-                               response.headers.SetHeader("X-Powered-By", MODNAME);
-                               response.headers.SetHeader("Content-Type", "text/html");
-                               API->SendResponse(response);
+                               ConfigItems::const_iterator curr = kiter++;
+                               buffer << curr->first << "=\"" << ServerConfig::Escape(curr->second) << '"';
+                               if (kiter != items.end())
+                                       buffer << std::endl << indent;
                        }
+                       buffer << '>' << std::endl << std::endl;
                }
+
+               HTTPDocumentResponse response(this, request, &buffer, 200);
+               response.headers.SetHeader("X-Powered-By", MODNAME);
+               response.headers.SetHeader("Content-Type", "text/plain");
+               API->SendResponse(response);
+               return MOD_RES_DENY;
        }
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Allows for the server configuration to be viewed over HTTP via m_httpd.so", VF_VENDOR);
+               return Version("Allows the server configuration to be viewed over HTTP via the /config path.", VF_VENDOR);
        }
 };