anope

- supernets anope source code & configuration
git clone git://git.acid.vegas/anope.git
Log | Files | Refs | Archive | README

webcpanel.cpp (9478B)

      1 /*
      2  * (C) 2003-2022 Anope Team
      3  * Contact us at team@anope.org
      4  *
      5  * Please read COPYING and README for further details.
      6  */
      7 
      8 #include "webcpanel.h"
      9 
     10 Module *me;
     11 Anope::string provider_name, template_name, template_base, page_title;
     12 
     13 class ModuleWebCPanel : public Module
     14 {
     15 	ServiceReference<HTTPProvider> provider;
     16 	Panel panel;
     17 	PrimitiveExtensibleItem<Anope::string> id, ip;
     18 	PrimitiveExtensibleItem<time_t> last_login;
     19 
     20 	StaticFileServer style_css, logo_png, cubes_png, favicon_ico;
     21 
     22 	WebCPanel::Index index;
     23 	WebCPanel::Logout logout;
     24 	WebCPanel::Register _register;
     25 	WebCPanel::Confirm confirm;
     26 
     27 	WebCPanel::NickServ::Info nickserv_info;
     28 	WebCPanel::NickServ::Cert nickserv_cert;
     29 	WebCPanel::NickServ::Access nickserv_access;
     30 	WebCPanel::NickServ::Alist nickserv_alist;
     31 	WebCPanel::NickServ::Confirm nickserv_confirm;
     32 
     33 	WebCPanel::ChanServ::Info chanserv_info;
     34 	WebCPanel::ChanServ::Set chanserv_set;
     35 	WebCPanel::ChanServ::Access chanserv_access;
     36 	WebCPanel::ChanServ::Akick chanserv_akick;
     37 	WebCPanel::ChanServ::Modes chanserv_modes;
     38 	WebCPanel::ChanServ::Drop chanserv_drop;
     39 
     40 	WebCPanel::MemoServ::Memos memoserv_memos;
     41 
     42 	WebCPanel::HostServ::Request hostserv_request;
     43 
     44 	WebCPanel::OperServ::Akill operserv_akill;
     45 
     46 
     47  public:
     48 	ModuleWebCPanel(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, EXTRA | VENDOR),
     49 		panel(this, "webcpanel"),
     50 		id(this, "webcpanel_id"), ip(this, "webcpanel_ip"), last_login(this, "webcpanel_last_login"),
     51 		style_css("style.css", "/static/style.css", "text/css"), logo_png("logo.png", "/static/logo.png", "image/png"), cubes_png("cubes.png", "/static/cubes.png", "image/png"), favicon_ico("favicon.ico", "/favicon.ico", "image/x-icon"),
     52 		index("/"), logout("/logout"), _register("/register"), confirm("/confirm"),
     53 		nickserv_info("NickServ", "/nickserv/info"), nickserv_cert("NickServ", "/nickserv/cert"), nickserv_access("NickServ", "/nickserv/access"), nickserv_alist("NickServ", "/nickserv/alist"), nickserv_confirm("NickServ", "/nickserv/confirm"),
     54 		chanserv_info("ChanServ", "/chanserv/info"), chanserv_set("ChanServ", "/chanserv/set"), chanserv_access("ChanServ", "/chanserv/access"), chanserv_akick("ChanServ", "/chanserv/akick"),
     55 		chanserv_modes("ChanServ", "/chanserv/modes"), chanserv_drop("ChanServ", "/chanserv/drop"), memoserv_memos("MemoServ", "/memoserv/memos"), hostserv_request("HostServ", "/hostserv/request"),
     56 		operserv_akill("OperServ", "/operserv/akill")
     57 	{
     58 
     59 		me = this;
     60 
     61 		Configuration::Block *block = Config->GetModule(this);
     62 		provider_name = block->Get<const Anope::string>("server", "httpd/main");
     63 		template_name = block->Get<const Anope::string>("template", "default");
     64 		template_base = Anope::DataDir + "/modules/webcpanel/templates/" + template_name;
     65 		page_title = block->Get<const Anope::string>("title", "Anope IRC Services");
     66 
     67 		provider = ServiceReference<HTTPProvider>("HTTPProvider", provider_name);
     68 		if (!provider)
     69 			throw ModuleException("Unable to find HTTPD provider. Is m_httpd loaded?");
     70 
     71 		provider->RegisterPage(&this->style_css);
     72 		provider->RegisterPage(&this->logo_png);
     73 		provider->RegisterPage(&this->cubes_png);
     74 		provider->RegisterPage(&this->favicon_ico);
     75 
     76 		provider->RegisterPage(&this->index);
     77 		provider->RegisterPage(&this->logout);
     78 		provider->RegisterPage(&this->_register);
     79 		provider->RegisterPage(&this->confirm);
     80 
     81 		BotInfo *NickServ = Config->GetClient("NickServ");
     82 		if (NickServ)
     83 		{
     84 			Section s;
     85 			s.name = NickServ->nick;
     86 
     87 			SubSection ss;
     88 			ss.name = "Information";
     89 			ss.url = "/nickserv/info";
     90 			s.subsections.push_back(ss);
     91 			provider->RegisterPage(&this->nickserv_info);
     92 
     93 			if (IRCD && IRCD->CanCertFP)
     94 			{
     95 				ss.name = "SSL Certificates";
     96 				ss.url = "/nickserv/cert";
     97 				s.subsections.push_back(ss);
     98 				provider->RegisterPage(&this->nickserv_cert);
     99 			}
    100 
    101 			ss.name = "Access";
    102 			ss.url = "/nickserv/access";
    103 			s.subsections.push_back(ss);
    104 			provider->RegisterPage(&this->nickserv_access);
    105 
    106 			ss.name = "AList";
    107 			ss.url = "/nickserv/alist";
    108 			s.subsections.push_back(ss);
    109 			provider->RegisterPage(&this->nickserv_alist);
    110 
    111 			ss.name = "Confirm";
    112 			ss.url = "/nickserv/confirm";
    113 			s.subsections.push_back(ss);
    114 			provider->RegisterPage(&this->nickserv_confirm);
    115 
    116 			panel.sections.push_back(s);
    117 		}
    118 
    119 		BotInfo *ChanServ = Config->GetClient("ChanServ");
    120 		if (ChanServ)
    121 		{
    122 			Section s;
    123 			s.name = ChanServ->nick;
    124 
    125 			SubSection ss;
    126 			ss.name = "Channels";
    127 			ss.url = "/chanserv/info";
    128 			s.subsections.push_back(ss);
    129 			provider->RegisterPage(&this->chanserv_info);
    130 
    131 			ss.name = "Settings";
    132 			ss.url = "/chanserv/set";
    133 			s.subsections.push_back(ss);
    134 			provider->RegisterPage(&this->chanserv_set);
    135 
    136 			ss.name = "Access";
    137 			ss.url = "/chanserv/access";
    138 			s.subsections.push_back(ss);
    139 			provider->RegisterPage(&this->chanserv_access);
    140 
    141 			ss.name = "Akick";
    142 			ss.url = "/chanserv/akick";
    143 			s.subsections.push_back(ss);
    144 			provider->RegisterPage(&this->chanserv_akick);
    145 
    146 			ss.name = "Modes";
    147 			ss.url = "/chanserv/modes";
    148 			s.subsections.push_back(ss);
    149 			provider->RegisterPage(&this->chanserv_modes);
    150 
    151 			ss.name = "Drop";
    152 			ss.url = "/chanserv/drop";
    153 			s.subsections.push_back(ss);
    154 			provider->RegisterPage(&this->chanserv_drop);
    155 
    156 			panel.sections.push_back(s);
    157 		}
    158 
    159 		BotInfo *MemoServ = Config->GetClient("MemoServ");
    160 		if (MemoServ)
    161 		{
    162 			Section s;
    163 			s.name = MemoServ->nick;
    164 
    165 			SubSection ss;
    166 			ss.name = "Memos";
    167 			ss.url = "/memoserv/memos";
    168 			s.subsections.push_back(ss);
    169 			provider->RegisterPage(&this->memoserv_memos);
    170 
    171 			panel.sections.push_back(s);
    172 		}
    173 
    174 		BotInfo *HostServ = Config->GetClient("HostServ");
    175 		if (HostServ)
    176 		{
    177 			Section s;
    178 			s.name = HostServ->nick;
    179 
    180 			SubSection ss;
    181 			ss.name = "vHost Request";
    182 			ss.url = "/hostserv/request";
    183 			s.subsections.push_back(ss);
    184 			provider->RegisterPage(&this->hostserv_request);
    185 
    186 			panel.sections.push_back(s);
    187 		}
    188 
    189 		BotInfo *OperServ = Config->GetClient("OperServ");
    190 		if (OperServ)
    191 		{
    192 			Section s;
    193 			s.name = OperServ->nick;
    194 
    195 			SubSection ss;
    196 			ss.name = "Akill";
    197 			ss.url = "/operserv/akill";
    198 			s.subsections.push_back(ss);
    199 			provider->RegisterPage(&this->operserv_akill);
    200 
    201 			panel.sections.push_back(s);
    202 		}
    203 	}
    204 
    205 	~ModuleWebCPanel()
    206 	{
    207 		if (provider)
    208 		{
    209 			provider->UnregisterPage(&this->style_css);
    210 			provider->UnregisterPage(&this->logo_png);
    211 			provider->UnregisterPage(&this->cubes_png);
    212 			provider->UnregisterPage(&this->favicon_ico);
    213 
    214 			provider->UnregisterPage(&this->index);
    215 			provider->UnregisterPage(&this->logout);
    216 			provider->UnregisterPage(&this->_register);
    217 			provider->UnregisterPage(&this->confirm);
    218 
    219 			provider->UnregisterPage(&this->nickserv_info);
    220 			provider->UnregisterPage(&this->nickserv_cert);
    221 			provider->UnregisterPage(&this->nickserv_access);
    222 			provider->UnregisterPage(&this->nickserv_alist);
    223 			provider->UnregisterPage(&this->nickserv_confirm);
    224 
    225 			provider->UnregisterPage(&this->chanserv_info);
    226 			provider->UnregisterPage(&this->chanserv_set);
    227 			provider->UnregisterPage(&this->chanserv_access);
    228 			provider->UnregisterPage(&this->chanserv_akick);
    229 			provider->UnregisterPage(&this->chanserv_modes);
    230 			provider->UnregisterPage(&this->chanserv_drop);
    231 
    232 			provider->UnregisterPage(&this->memoserv_memos);
    233 
    234 			provider->UnregisterPage(&this->hostserv_request);
    235 
    236 			provider->UnregisterPage(&this->operserv_akill);
    237 		}
    238 	}
    239 };
    240 
    241 namespace WebPanel
    242 {
    243 	void RunCommand(HTTPClient *client, const Anope::string &user, NickCore *nc, const Anope::string &service, const Anope::string &c, std::vector<Anope::string> &params, TemplateFileServer::Replacements &r, const Anope::string &key)
    244 	{
    245 		ServiceReference<Command> cmd("Command", c);
    246 		if (!cmd)
    247 		{
    248 			r[key] = "Unable to find command " + c;
    249 			return;
    250 		}
    251 
    252 		if (params.size() < cmd->min_params)
    253 			return;
    254 
    255 		BotInfo *bi = Config->GetClient(service);
    256 		if (!bi)
    257 		{
    258 			if (BotListByNick->empty())
    259 				return;
    260 			bi = BotListByNick->begin()->second; // Pick one...
    261 		}
    262 
    263 		struct MyComandReply : CommandReply
    264 		{
    265 			TemplateFileServer::Replacements &re;
    266 			const Anope::string &k;
    267 
    268 			MyComandReply(TemplateFileServer::Replacements &_r, const Anope::string &_k) : re(_r), k(_k) { }
    269 
    270 			void SendMessage(BotInfo *source, const Anope::string &msg) anope_override
    271 			{
    272 				re[k] = msg;
    273 			}
    274 		}
    275 		my_reply(r, key);
    276 
    277 		CommandSource source(user, NULL, nc, &my_reply, bi);
    278 		source.ip = client->GetIP();
    279 
    280 		CommandInfo info;
    281 		info.name = c;
    282 
    283 		cmd->Run(source, "", info, params);
    284 	}
    285 
    286 	void RunCommandWithName(HTTPClient *client, NickCore *nc, const Anope::string &service, const Anope::string &c, const Anope::string &cmdname, std::vector<Anope::string> &params, TemplateFileServer::Replacements &r, const Anope::string &key)
    287 	{
    288 		ServiceReference<Command> cmd("Command", c);
    289 		if (!cmd)
    290 		{
    291 			r[key] = "Unable to find command " + c;
    292 			return;
    293 		}
    294 
    295 		BotInfo *bi = Config->GetClient(service);
    296 		if (!bi)
    297 			return;
    298 
    299 		CommandInfo *info = bi->GetCommand(cmdname);
    300 		if (!info)
    301 			return;
    302 
    303 		struct MyComandReply : CommandReply
    304 		{
    305 			TemplateFileServer::Replacements &re;
    306 			const Anope::string &k;
    307 
    308 			MyComandReply(TemplateFileServer::Replacements &_r, const Anope::string &_k) : re(_r), k(_k) { }
    309 
    310 			void SendMessage(BotInfo *source, const Anope::string &msg) anope_override
    311 			{
    312 				re[k] = msg;
    313 			}
    314 		}
    315 		my_reply(r, key);
    316 
    317 		CommandSource source(nc->display, NULL, nc, &my_reply, bi);
    318 		source.ip = client->GetIP();
    319 
    320 		cmd->Run(source, cmdname, *info, params);
    321 	}
    322 }
    323 
    324 MODULE_INIT(ModuleWebCPanel)