diff options
author | Adam <Adam@anope.org> | 2014-01-02 11:02:14 -0500 |
---|---|---|
committer | Adam <Adam@anope.org> | 2014-01-02 11:03:33 -0500 |
commit | 004c4cbe5f4c37cf455cb6d0caa434fbbb3406ea (patch) | |
tree | 0e6675dfe28a829f5786b0b2f993566c61662de7 /modules/webcpanel/pages/index.cpp | |
parent | 072202c181943901c727782e64881adadf13d7dd (diff) |
Move modules out of extras that dont have external dependencies
Diffstat (limited to 'modules/webcpanel/pages/index.cpp')
-rw-r--r-- | modules/webcpanel/pages/index.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/modules/webcpanel/pages/index.cpp b/modules/webcpanel/pages/index.cpp new file mode 100644 index 000000000..1b136c7fb --- /dev/null +++ b/modules/webcpanel/pages/index.cpp @@ -0,0 +1,99 @@ +/* + * (C) 2003-2014 Anope Team + * Contact us at team@anope.org + * + * Please read COPYING and README for further details. + */ + +#include "../webcpanel.h" + +class WebpanelRequest : public IdentifyRequest +{ + HTTPReply reply; + HTTPMessage message; + Reference<HTTPProvider> server; + Anope::string page_name; + Reference<HTTPClient> client; + TemplateFileServer::Replacements replacements; + + public: + WebpanelRequest(Module *o, HTTPReply &r, HTTPMessage &m, HTTPProvider *s, const Anope::string &p_n, HTTPClient *c, TemplateFileServer::Replacements &re, const Anope::string &user, const Anope::string &pass) : IdentifyRequest(o, user, pass), reply(r), message(m), server(s), page_name(p_n), client(c), replacements(re) { } + + void OnSuccess() anope_override + { + if (!client || !server) + return; + NickAlias *na = NickAlias::Find(this->GetAccount()); + if (!na) + { + this->OnFail(); + return; + } + + Anope::string id; + for (int i = 0; i < 64; ++i) + { + char c; + do + c = 48 + (rand() % 75); + while (!isalnum(c)); + id += c; + } + + na->Extend<Anope::string>("webcpanel_id", id); + na->Extend<Anope::string>("webcpanel_ip", client->GetIP()); + + { + HTTPReply::cookie c; + c.push_back(std::make_pair("account", na->nick)); + c.push_back(std::make_pair("Path", "/")); + reply.cookies.push_back(c); + } + + { + HTTPReply::cookie c; + c.push_back(std::make_pair("id", id)); + c.push_back(std::make_pair("Path", "/")); + reply.cookies.push_back(c); + } + + reply.error = HTTP_FOUND; + reply.headers["Location"] = Anope::string("http") + (server->IsSSL() ? "s" : "") + "://" + message.headers["Host"] + "/nickserv/info"; + + client->SendReply(&reply); + } + + void OnFail() anope_override + { + if (!client || !server) + return; + replacements["INVALID_LOGIN"] = "Invalid username or password"; + TemplateFileServer page("login.html"); + page.Serve(server, page_name, client, message, reply, replacements); + + client->SendReply(&reply); + } +}; + +bool WebCPanel::Index::OnRequest(HTTPProvider *server, const Anope::string &page_name, HTTPClient *client, HTTPMessage &message, HTTPReply &reply) +{ + TemplateFileServer::Replacements replacements; + const Anope::string &user = message.post_data["username"], &pass = message.post_data["password"]; + + replacements["TITLE"] = page_title; + + if (!user.empty() && !pass.empty()) + { + // Rate limit check. + + WebpanelRequest *req = new WebpanelRequest(me, reply, message, server, page_name, client, replacements, user, pass); + FOREACH_MOD(OnCheckAuthentication, (NULL, req)); + req->Dispatch(); + return false; + } + + TemplateFileServer page("login.html"); + page.Serve(server, page_name, client, message, reply, replacements); + return true; +} + |