]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_httpd_config.cpp
Always set the topic in Channel::SetTopic(), move access checks into cmd_topic
[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 #include "protocol.h"
24
25 /* $ModDesc: Allows for the server configuration to be viewed over HTTP via m_httpd.so */
26
27 class ModuleHttpConfig : public Module
28 {
29         HTTPdAPI API;
30
31  public:
32         ModuleHttpConfig()
33                 : API(this)
34         {
35         }
36
37         void init() CXX11_OVERRIDE
38         {
39                 Implementation eventlist[] = { I_OnEvent };
40                 ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
41         }
42
43         std::string Sanitize(const std::string &str)
44         {
45                 std::string ret;
46
47                 for (std::string::const_iterator x = str.begin(); x != str.end(); ++x)
48                 {
49                         switch (*x)
50                         {
51                                 case '<':
52                                         ret += "&lt;";
53                                 break;
54                                 case '>':
55                                         ret += "&gt;";
56                                 break;
57                                 case '&':
58                                         ret += "&amp;";
59                                 break;
60                                 case '"':
61                                         ret += "&quot;";
62                                 break;
63                                 default:
64                                         if (*x < 32 || *x > 126)
65                                         {
66                                                 int n = *x;
67                                                 ret += ("&#" + ConvToStr(n) + ";");
68                                         }
69                                         else
70                                                 ret += *x;
71                                 break;
72                         }
73                 }
74                 return ret;
75         }
76
77         void OnEvent(Event& event) CXX11_OVERRIDE
78         {
79                 std::stringstream data("");
80
81                 if (event.id == "httpd_url")
82                 {
83                         ServerInstance->Logs->Log("m_http_stats", LOG_DEBUG, "Handling httpd event");
84                         HTTPRequest* http = (HTTPRequest*)&event;
85
86                         if ((http->GetURI() == "/config") || (http->GetURI() == "/config/"))
87                         {
88                                 data << "<html><head><title>InspIRCd Configuration</title></head><body>";
89                                 data << "<h1>InspIRCd Configuration</h1><p>";
90
91                                 for (ConfigDataHash::iterator x = ServerInstance->Config->config_data.begin(); x != ServerInstance->Config->config_data.end(); ++x)
92                                 {
93                                         data << "&lt;" << x->first << " ";
94                                         ConfigTag* tag = x->second;
95                                         for (std::vector<KeyVal>::const_iterator j = tag->getItems().begin(); j != tag->getItems().end(); j++)
96                                         {
97                                                 data << Sanitize(j->first) << "=&quot;" << Sanitize(j->second) << "&quot; ";
98                                         }
99                                         data << "&gt;<br>";
100                                 }
101
102                                 data << "</body></html>";
103                                 /* Send the document back to m_httpd */
104                                 HTTPDocumentResponse response(this, *http, &data, 200);
105                                 response.headers.SetHeader("X-Powered-By", "m_httpd_config.so");
106                                 response.headers.SetHeader("Content-Type", "text/html");
107                                 API->SendResponse(response);
108                         }
109                 }
110         }
111
112         Version GetVersion() CXX11_OVERRIDE
113         {
114                 return Version("Allows for the server configuration to be viewed over HTTP via m_httpd.so", VF_VENDOR);
115         }
116 };
117
118 MODULE_INIT(ModuleHttpConfig)