]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_httpd_config.cpp
Remove module file extensions from user-visible messages.
[user/henk/code/inspircd.git] / src / modules / m_httpd_config.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
5  *   Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc>
6  *
7  * This file is part of InspIRCd.  InspIRCd is free software: you can
8  * redistribute it and/or modify it under the terms of the GNU General Public
9  * License as published by the Free Software Foundation, version 2.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
14  * details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20
21 #include "inspircd.h"
22 #include "modules/httpd.h"
23
24 class ModuleHttpConfig : public Module, public HTTPRequestEventListener
25 {
26         HTTPdAPI API;
27
28  public:
29         ModuleHttpConfig()
30                 : HTTPRequestEventListener(this)
31                 , API(this)
32         {
33         }
34
35         std::string Sanitize(const std::string &str)
36         {
37                 std::string ret;
38
39                 for (std::string::const_iterator x = str.begin(); x != str.end(); ++x)
40                 {
41                         switch (*x)
42                         {
43                                 case '<':
44                                         ret += "&lt;";
45                                 break;
46                                 case '>':
47                                         ret += "&gt;";
48                                 break;
49                                 case '&':
50                                         ret += "&amp;";
51                                 break;
52                                 case '"':
53                                         ret += "&quot;";
54                                 break;
55                                 default:
56                                         if (*x < 32 || *x > 126)
57                                         {
58                                                 int n = *x;
59                                                 ret += ("&#" + ConvToStr(n) + ";");
60                                         }
61                                         else
62                                                 ret += *x;
63                                 break;
64                         }
65                 }
66                 return ret;
67         }
68
69         ModResult HandleRequest(HTTPRequest* http)
70         {
71                 std::stringstream data("");
72
73                 {
74                         ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Handling httpd event");
75
76                         if ((http->GetURI() == "/config") || (http->GetURI() == "/config/"))
77                         {
78                                 data << "<html><head><title>InspIRCd Configuration</title></head><body>";
79                                 data << "<h1>InspIRCd Configuration</h1><p>";
80
81                                 for (ConfigDataHash::iterator x = ServerInstance->Config->config_data.begin(); x != ServerInstance->Config->config_data.end(); ++x)
82                                 {
83                                         data << "&lt;" << x->first << " ";
84                                         const ConfigItems& items = x->second->getItems();
85                                         for (ConfigItems::const_iterator j = items.begin(); j != items.end(); j++)
86                                         {
87                                                 data << Sanitize(j->first) << "=&quot;" << Sanitize(j->second) << "&quot; ";
88                                         }
89                                         data << "&gt;<br>";
90                                 }
91
92                                 data << "</body></html>";
93                                 /* Send the document back to m_httpd */
94                                 HTTPDocumentResponse response(this, *http, &data, 200);
95                                 response.headers.SetHeader("X-Powered-By", MODNAME);
96                                 response.headers.SetHeader("Content-Type", "text/html");
97                                 API->SendResponse(response);
98                                 return MOD_RES_DENY; // Handled
99                         }
100                 }
101                 return MOD_RES_PASSTHRU;
102         }
103
104         ModResult OnHTTPRequest(HTTPRequest& req) CXX11_OVERRIDE
105         {
106                 return HandleRequest(&req);
107         }
108
109         Version GetVersion() CXX11_OVERRIDE
110         {
111                 return Version("Allows for the server configuration to be viewed over HTTP via m_httpd", VF_VENDOR);
112         }
113 };
114
115 MODULE_INIT(ModuleHttpConfig)