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> ¶ms, 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> ¶ms, 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)