]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_httpd_config.cpp
Sync helpop chmodes s and p with docs
[user/henk/code/inspircd.git] / src / modules / m_httpd_config.cpp
index fa8f5f95f169883e3c22506b42021fb2da5186cc..3a842416874eedf3f1f2ddb892e12a5da53672fa 100644 (file)
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
  *
- *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ *   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) 2009 Uli Schlachter <psychon@inspircd.org>
+ *   Copyright (C) 2008, 2010 Craig Edwards <brain@inspircd.org>
  *
- * This program is free but copyrighted software; see
- *         the file COPYING for details.
+ * 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
+ * License as published by the Free Software Foundation, version 2.
  *
- * ---------------------------------------------------
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "inspircd.h"
-#include "httpd.h"
-#include "protocol.h"
 
-/* $ModDesc: Provides statistics over HTTP via m_httpd.so */
-/* $ModDep: httpd.h */
+#include "inspircd.h"
+#include "modules/httpd.h"
 
-class ModuleHttpStats : public Module
+class ModuleHttpConfig : public Module, public HTTPRequestEventListener
 {
-
-       std::string stylesheet;
-       bool changed;
+       HTTPdAPI API;
 
  public:
-
-       void ReadConfig()
+       ModuleHttpConfig()
+               : HTTPRequestEventListener(this)
+               , API(this)
        {
-               ConfigReader c;
-               this->stylesheet = c.ReadValue("httpstats", "stylesheet", 0);
        }
 
-       ModuleHttpStats()       {
-               ReadConfig();
-               this->changed = true;
-               Implementation eventlist[] = { I_OnEvent };
-               ServerInstance->Modules->Attach(eventlist, this, 1);
-       }
-
-       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)
-       {
-               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("m_http_stats", DEBUG,"Handling httpd event");
-                       HTTPRequest* http = (HTTPRequest*)&event;
-
-                       if ((http->GetURI() == "/config") || (http->GetURI() == "/config/"))
+                       // Show the location of the tag in a comment.
+                       ConfigTag* tag = citer->second;
+                       buffer << "# " << tag->getTagLocation() << std::endl
+                               << '<' << tag->tag << ' ';
+
+                       // 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>::iterator j = tag->items.begin(); j != tag->items.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", "m_httpd_config.so");
-                               response.headers.SetHeader("Content-Type", "text/html");
-                               response.Send();
+                               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;
                }
-       }
 
-       virtual ~ModuleHttpStats()
-       {
+               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;
        }
 
-       virtual Version GetVersion()
+       Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides statistics over HTTP via m_httpd.so", VF_VENDOR, API_VERSION);
+               return Version("Allows the server configuration to be viewed over HTTP via the /config path.", VF_VENDOR);
        }
 };
 
-MODULE_INIT(ModuleHttpStats)
+MODULE_INIT(ModuleHttpConfig)