]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_filter.cpp
Convert WriteNumeric() calls to pass the parameters of the numeric as method parameters
[user/henk/code/inspircd.git] / src / modules / m_filter.cpp
index 47041f82467fed2e3e606672655ab40498c05bf4..bd1022a0824a291340dd53cb36820c62095d589c 100644 (file)
@@ -156,6 +156,8 @@ class CommandFilter : public Command
 
 class ModuleFilter : public Module
 {
+       typedef insp::flat_set<std::string, irc::insensitive_swo> ExemptTargetSet;
+
        bool initing;
        RegexFactory* factory;
        void FreeFilters();
@@ -167,7 +169,11 @@ class ModuleFilter : public Module
        std::vector<FilterResult> filters;
        int flags;
 
-       std::set<std::string> exemptfromfilter; // List of channel names excluded from filtering.
+       // List of channel names excluded from filtering.
+       ExemptTargetSet exemptedchans;
+
+       // List of target nicknames excluded from filtering.
+       ExemptTargetSet exemptednicks;
 
        ModuleFilter();
        CullResult cull();
@@ -319,12 +325,16 @@ ModResult ModuleFilter::OnUserPreMessage(User* user, void* dest, int target_type
                if (target_type == TYPE_USER)
                {
                        User* t = (User*)dest;
+                       // Check if the target nick is exempted, if yes, ignore this message
+                       if (exemptednicks.count(t->nick))
+                               return MOD_RES_PASSTHRU;
+
                        target = t->nick;
                }
                else if (target_type == TYPE_CHANNEL)
                {
                        Channel* t = (Channel*)dest;
-                       if (exemptfromfilter.find(t->name) != exemptfromfilter.end())
+                       if (exemptedchans.count(t->name))
                                return MOD_RES_PASSTHRU;
 
                        target = t->name;
@@ -333,14 +343,14 @@ ModResult ModuleFilter::OnUserPreMessage(User* user, void* dest, int target_type
                {
                        ServerInstance->SNO->WriteGlobalSno('a', "FILTER: "+user->nick+" had their message filtered, target was "+target+": "+f->reason);
                        if (target_type == TYPE_CHANNEL)
-                               user->WriteNumeric(ERR_CANNOTSENDTOCHAN, "%s :Message to channel blocked and opers notified (%s)", target.c_str(), f->reason.c_str());
+                               user->WriteNumeric(ERR_CANNOTSENDTOCHAN, target, InspIRCd::Format("Message to channel blocked and opers notified (%s)", f->reason.c_str()));
                        else
                                user->WriteNotice("Your message to "+target+" was blocked and opers notified: "+f->reason);
                }
                else if (f->action == FA_SILENT)
                {
                        if (target_type == TYPE_CHANNEL)
-                               user->WriteNumeric(ERR_CANNOTSENDTOCHAN, "%s :Message to channel blocked (%s)", target.c_str(), f->reason.c_str());
+                               user->WriteNumeric(ERR_CANNOTSENDTOCHAN, target, InspIRCd::Format("Message to channel blocked (%s)", f->reason.c_str()));
                        else
                                user->WriteNotice("Your message to "+target+" was blocked: "+f->reason);
                }
@@ -367,7 +377,7 @@ ModResult ModuleFilter::OnUserPreMessage(User* user, void* dest, int target_type
 
 ModResult ModuleFilter::OnPreCommand(std::string &command, std::vector<std::string> &parameters, LocalUser *user, bool validated, const std::string &original_line)
 {
-       if (validated && IS_LOCAL(user))
+       if (validated)
        {
                flags = 0;
                bool parting;
@@ -387,7 +397,7 @@ ModResult ModuleFilter::OnPreCommand(std::string &command, std::vector<std::stri
                        if (parameters.size() < 2)
                                return MOD_RES_PASSTHRU;
 
-                       if (exemptfromfilter.find(parameters[0]) != exemptfromfilter.end())
+                       if (exemptedchans.count(parameters[0]))
                                return MOD_RES_PASSTHRU;
 
                        parting = true;
@@ -440,12 +450,22 @@ ModResult ModuleFilter::OnPreCommand(std::string &command, std::vector<std::stri
 void ModuleFilter::ReadConfig(ConfigStatus& status)
 {
        ConfigTagList tags = ServerInstance->Config->ConfTags("exemptfromfilter");
-       exemptfromfilter.clear();
+       exemptedchans.clear();
+       exemptednicks.clear();
+
        for (ConfigIter i = tags.first; i != tags.second; ++i)
        {
-               std::string chan = i->second->getString("channel");
-               if (!chan.empty())
-                       exemptfromfilter.insert(chan);
+               ConfigTag* tag = i->second;
+
+               // If "target" is not found, try the old "channel" key to keep compatibility with 2.0 configs
+               const std::string target = tag->getString("target", tag->getString("channel"));
+               if (!target.empty())
+               {
+                       if (target[0] == '#')
+                               exemptedchans.insert(target);
+                       else
+                               exemptednicks.insert(target);
+               }
        }
 
        std::string newrxengine = ServerInstance->Config->ConfValue("filteropts")->getString("engine");
@@ -681,7 +701,11 @@ ModResult ModuleFilter::OnStats(char symbol, User* user, string_list &results)
                {
                        results.push_back("223 "+user->nick+" :"+RegexEngine.GetProvider()+":"+i->freeform+" "+i->GetFlags()+" "+FilterActionToString(i->action)+" "+ConvToStr(i->gline_time)+" :"+i->reason);
                }
-               for (std::set<std::string>::iterator i = exemptfromfilter.begin(); i != exemptfromfilter.end(); ++i)
+               for (ExemptTargetSet::const_iterator i = exemptedchans.begin(); i != exemptedchans.end(); ++i)
+               {
+                       results.push_back("223 "+user->nick+" :EXEMPT "+(*i));
+               }
+               for (ExemptTargetSet::const_iterator i = exemptednicks.begin(); i != exemptednicks.end(); ++i)
                {
                        results.push_back("223 "+user->nick+" :EXEMPT "+(*i));
                }