X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_filter.cpp;h=86ef0d4f655ada4cbb670349450b4fba0af4a8de;hb=1dfead3b2cc9e8c603f6ad6f7216576a2ce361fb;hp=5ce089b63b72144872b38731309ef77b2f98445c;hpb=96917a414a4dafb8b17ef9fe7b9e22537e6e0c93;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_filter.cpp b/src/modules/m_filter.cpp index 5ce089b63..86ef0d4f6 100644 --- a/src/modules/m_filter.cpp +++ b/src/modules/m_filter.cpp @@ -111,10 +111,10 @@ class FilterResult if (flag_no_opers) flags.push_back('o'); if (flag_part_message) - flags.push_back('p'); + flags.push_back('P'); if (flag_quit_message) flags.push_back('q'); - if (flag_privmsg); + if (flag_privmsg) flags.push_back('p'); if (flag_notice) flags.push_back('n'); @@ -192,7 +192,7 @@ class ModuleFilter : public Module ModResult OnStats(char symbol, User* user, string_list &results); ModResult OnPreCommand(std::string &command, std::vector ¶meters, LocalUser *user, bool validated, const std::string &original_line); bool AppliesToMe(User* user, FilterResult* filter, int flags); - void ReadFilters(ConfigReader &MyConf); + void ReadFilters(); static bool StringToFilterAction(const std::string& str, FilterAction& fa); static std::string FilterActionToString(FilterAction fa); }; @@ -220,10 +220,10 @@ CmdResult CommandFilter::Handle(const std::vector ¶meters, User /* Adding a filter */ if (parameters.size() >= 4) { - std::string freeform = parameters[0]; + const std::string& freeform = parameters[0]; FilterAction type; - std::string flags = parameters[2]; - std::string reason; + const std::string& flags = parameters[2]; + unsigned int reasonindex; long duration = 0; if (!ModuleFilter::StringToFilterAction(parameters[1], type)) @@ -237,7 +237,7 @@ CmdResult CommandFilter::Handle(const std::vector ¶meters, User if (parameters.size() >= 5) { duration = ServerInstance->Duration(parameters[3]); - reason = parameters[4]; + reasonindex = 4; } else { @@ -247,18 +247,18 @@ CmdResult CommandFilter::Handle(const std::vector ¶meters, User } else { - reason = parameters[3]; + reasonindex = 3; } Module *me = creator; - std::pair result = static_cast(me)->AddFilter(freeform, type, reason, duration, flags); + std::pair result = static_cast(me)->AddFilter(freeform, type, parameters[reasonindex], duration, flags); if (result.first) { user->WriteServ("NOTICE %s :*** Added filter '%s', type '%s'%s%s, flags '%s', reason: '%s'", user->nick.c_str(), freeform.c_str(), parameters[1].c_str(), (duration ? ", duration " : ""), (duration ? parameters[3].c_str() : ""), - flags.c_str(), reason.c_str()); + flags.c_str(), parameters[reasonindex].c_str()); - ServerInstance->SNO->WriteToSnoMask(IS_LOCAL(user) ? 'a' : 'A', "FILTER: "+user->nick+" added filter '"+freeform+"', type '"+parameters[1]+"', "+(duration ? "duration "+parameters[3]+", " : "")+"flags '"+flags+"', reason: "+reason); + ServerInstance->SNO->WriteToSnoMask(IS_LOCAL(user) ? 'a' : 'A', "FILTER: "+user->nick+" added filter '"+freeform+"', type '"+parameters[1]+"', "+(duration ? "duration "+parameters[3]+", " : "")+"flags '"+flags+"', reason: "+parameters[reasonindex]); return CMD_SUCCESS; } @@ -298,9 +298,9 @@ ModuleFilter::ModuleFilter() : filtcommand(this), RegexEngine(this, "regex") void ModuleFilter::init() { - ServerInstance->AddCommand(&filtcommand); + ServerInstance->Modules->AddService(filtcommand); Implementation eventlist[] = { I_OnPreCommand, I_OnStats, I_OnSyncNetwork, I_OnDecodeMetaData, I_OnUserPreMessage, I_OnUserPreNotice, I_OnRehash }; - ServerInstance->Modules->Attach(eventlist, this, 7); + ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); OnRehash(NULL); } @@ -377,12 +377,10 @@ ModResult ModuleFilter::OnUserPreNotice(User* user,void* dest,int target_type, s ModResult ModuleFilter::OnPreCommand(std::string &command, std::vector ¶meters, LocalUser *user, bool validated, const std::string &original_line) { - flags = 0; if (validated && IS_LOCAL(user)) { - std::string checkline; - int replacepoint = 0; - bool parting = false; + flags = 0; + bool parting; if (command == "QUIT") { @@ -390,8 +388,6 @@ ModResult ModuleFilter::OnPreCommand(std::string &command, std::vectorFilterMatch(user, checkline, flags); - + FilterResult* f = this->FilterMatch(user, parameters[parting ? 1 : 0], flags); if (!f) /* PART or QUIT reason doesnt match a filter */ return MOD_RES_PASSTHRU; /* We cant block a part or quit, so instead we change the reason to 'Reason filtered' */ - Command* c = ServerInstance->Parser->GetHandler(command); - if (c) + parameters[parting ? 1 : 0] = "Reason filtered"; + + /* We're blocking, OR theyre quitting and its a KILL action + * (we cant kill someone whos already quitting, so filter them anyway) + */ + if ((f->action == FA_BLOCK) || (((!parting) && (f->action == FA_KILL))) || (f->action == FA_SILENT)) + { + return MOD_RES_PASSTHRU; + } + else { - std::vector params; - for (int item = 0; item < (int)parameters.size(); item++) - params.push_back(parameters[item]); - params[replacepoint] = "Reason filtered"; - - /* We're blocking, OR theyre quitting and its a KILL action - * (we cant kill someone whos already quitting, so filter them anyway) - */ - if ((f->action == FA_BLOCK) || (((!parting) && (f->action == FA_KILL))) || (f->action == FA_SILENT)) + /* Are they parting, if so, kill is applicable */ + if ((parting) && (f->action == FA_KILL)) { - c->Handle(params, user); - return MOD_RES_DENY; + user->WriteServ("NOTICE %s :*** Your PART message was filtered: %s", user->nick.c_str(), f->reason.c_str()); + ServerInstance->Users->QuitUser(user, "Filtered: " + f->reason); } - else + if (f->action == FA_GLINE) { - /* Are they parting, if so, kill is applicable */ - if ((parting) && (f->action == FA_KILL)) - { - user->WriteServ("NOTICE %s :*** Your PART message was filtered: %s", user->nick.c_str(), f->reason.c_str()); - ServerInstance->Users->QuitUser(user, "Filtered: " + f->reason); - } - if (f->action == FA_GLINE) + /* Note: We gline *@IP so that if their host doesnt resolve the gline still applies. */ + GLine* gl = new GLine(ServerInstance->Time(), f->gline_time, ServerInstance->Config->ServerName.c_str(), f->reason.c_str(), "*", user->GetIPString()); + if (ServerInstance->XLines->AddLine(gl,NULL)) { - /* Note: We gline *@IP so that if their host doesnt resolve the gline still applies. */ - GLine* gl = new GLine(ServerInstance->Time(), f->gline_time, ServerInstance->Config->ServerName.c_str(), f->reason.c_str(), "*", user->GetIPString()); - if (ServerInstance->XLines->AddLine(gl,NULL)) - { - ServerInstance->XLines->ApplyLines(); - } - else - delete gl; + ServerInstance->XLines->ApplyLines(); } - return MOD_RES_DENY; + else + delete gl; } + return MOD_RES_DENY; } - return MOD_RES_PASSTHRU; } return MOD_RES_PASSTHRU; } void ModuleFilter::OnRehash(User* user) { - ConfigReader MyConf; + ConfigTagList tags = ServerInstance->Config->ConfTags("exemptfromfilter"); exemptfromfilter.clear(); - for (int index = 0; index < MyConf.Enumerate("exemptfromfilter"); ++index) + for (ConfigIter i = tags.first; i != tags.second; ++i) { - std::string chan = MyConf.ReadValue("exemptfromfilter", "channel", index); + std::string chan = i->second->getString("channel"); if (!chan.empty()) exemptfromfilter.insert(chan); } - std::string newrxengine = "regex/" + MyConf.ReadValue("filteropts", "engine", 0); + std::string newrxengine = "regex/" + ServerInstance->Config->ConfValue("filteropts")->getString("engine"); if (newrxengine == "regex/") newrxengine = "regex"; if (RegexEngine.GetProvider() == newrxengine) @@ -490,7 +471,7 @@ void ModuleFilter::OnRehash(User* user) { ServerInstance->SNO->WriteGlobalSno('a', "WARNING: Regex engine '%s' is not loaded - Filter functionality disabled until this is corrected.", newrxengine.c_str()); } - ReadFilters(MyConf); + ReadFilters(); } Version ModuleFilter::GetVersion() @@ -594,14 +575,7 @@ FilterResult* ModuleFilter::FilterMatch(User* user, const std::string &text, int if (index->regex->Matches(filter->flag_strip_color ? stripped_text : text)) { //ServerInstance->Logs->Log("m_filter", DEBUG, "MATCH"); - ImplFilter fr = *index; - if (index != filters.begin()) - { - /* Move to head of list for efficiency */ - filters.erase(index); - filters.insert(filters.begin(), fr); - } - return &*filters.begin(); + return &*index; } //ServerInstance->Logs->Log("m_filter", DEBUG, "NO MATCH"); } @@ -676,17 +650,18 @@ std::string ModuleFilter::FilterActionToString(FilterAction fa) } } -void ModuleFilter::ReadFilters(ConfigReader &MyConf) +void ModuleFilter::ReadFilters() { - for (int index = 0; index < MyConf.Enumerate("keyword"); index++) + ConfigTagList tags = ServerInstance->Config->ConfTags("keyword"); + for (ConfigIter i = tags.first; i != tags.second; ++i) { - this->DeleteFilter(MyConf.ReadValue("keyword", "pattern", index)); + std::string pattern = i->second->getString("pattern"); + this->DeleteFilter(pattern); - std::string pattern = MyConf.ReadValue("keyword", "pattern", index); - std::string reason = MyConf.ReadValue("keyword", "reason", index); - std::string action = MyConf.ReadValue("keyword", "action", index); - std::string flgs = MyConf.ReadValue("keyword", "flags", index); - long gline_time = ServerInstance->Duration(MyConf.ReadValue("keyword", "duration", index)); + std::string reason = i->second->getString("reason"); + std::string action = i->second->getString("action"); + std::string flgs = i->second->getString("flags"); + long gline_time = ServerInstance->Duration(i->second->getString("duration")); if (flgs.empty()) flgs = "*";