]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_filter.cpp
Add ConfigTag::getDuration() with optional bounds checking
[user/henk/code/inspircd.git] / src / modules / m_filter.cpp
index 949d0e6e6d88713aa254727fddd31697b77c6c76..d60dd794272fe123d85399003e75e796db808227 100644 (file)
@@ -24,8 +24,6 @@
 #include "xline.h"
 #include "modules/regex.h"
 
-/* $ModDesc: Text (spam) filtering */
-
 class ModuleFilter;
 
 enum FilterFlags
@@ -60,7 +58,7 @@ class FilterResult
        bool flag_notice;
        bool flag_strip_color;
 
-       FilterResult(const std::string free, const std::string &rea, FilterAction act, long gt, const std::string &fla) :
+       FilterResult(const std::string& free, const std::string& rea, FilterAction act, long gt, const std::string& fla) :
                        freeform(free), reason(rea), action(act), gline_time(gt)
        {
                this->FillFlags(fla);
@@ -181,11 +179,10 @@ class ModuleFilter : public Module
        ModuleFilter();
        void init() CXX11_OVERRIDE;
        CullResult cull();
-       ModResult OnUserPreMessage(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) CXX11_OVERRIDE;
+       ModResult OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype) CXX11_OVERRIDE;
        FilterResult* FilterMatch(User* user, const std::string &text, int flags);
        bool DeleteFilter(const std::string &freeform);
        std::pair<bool, std::string> AddFilter(const std::string &freeform, FilterAction type, const std::string &reason, long duration, const std::string &flags);
-       ModResult OnUserPreNotice(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) CXX11_OVERRIDE;
        void OnRehash(User* user) CXX11_OVERRIDE;
        Version GetVersion() CXX11_OVERRIDE;
        std::string EncodeFilter(FilterResult* filter);
@@ -304,8 +301,6 @@ ModuleFilter::ModuleFilter()
 void ModuleFilter::init()
 {
        ServerInstance->Modules->AddService(filtcommand);
-       Implementation eventlist[] = { I_OnPreCommand, I_OnStats, I_OnSyncNetwork, I_OnDecodeMetaData, I_OnUserPreMessage, I_OnUserPreNotice, I_OnRehash, I_OnUnloadModule };
-       ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
        OnRehash(NULL);
 }
 
@@ -323,23 +318,13 @@ void ModuleFilter::FreeFilters()
        filters.clear();
 }
 
-ModResult ModuleFilter::OnUserPreMessage(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
-{
-       if (!IS_LOCAL(user))
-               return MOD_RES_PASSTHRU;
-
-       flags = FLAG_PRIVMSG;
-       return OnUserPreNotice(user,dest,target_type,text,status,exempt_list);
-}
-
-ModResult ModuleFilter::OnUserPreNotice(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
+ModResult ModuleFilter::OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype)
 {
        /* Leave ulines alone */
        if ((ServerInstance->ULine(user->server)) || (!IS_LOCAL(user)))
                return MOD_RES_PASSTHRU;
 
-       if (!flags)
-               flags = FLAG_NOTICE;
+       flags = (msgtype == MSG_PRIVMSG) ? FLAG_PRIVMSG : FLAG_NOTICE;
 
        FilterResult* f = this->FilterMatch(user, text, flags);
        if (f)
@@ -388,7 +373,7 @@ ModResult ModuleFilter::OnUserPreNotice(User* user,void* dest,int target_type, s
                                delete gl;
                }
 
-               ServerInstance->Logs->Log("FILTER",LOG_DEFAULT,"FILTER: "+ user->nick + " had their message filtered, target was " + target + ": " + f->reason + " Action: " + ModuleFilter::FilterActionToString(f->action));
+               ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, user->nick + " had their message filtered, target was " + target + ": " + f->reason + " Action: " + ModuleFilter::FilterActionToString(f->action));
                return MOD_RES_DENY;
        }
        return MOD_RES_PASSTHRU;
@@ -573,7 +558,7 @@ void ModuleFilter::OnDecodeMetaData(Extensible* target, const std::string &extna
                }
                catch (ModuleException& e)
                {
-                       ServerInstance->Logs->Log("m_filter", LOG_DEBUG, "Error when unserializing filter: " + std::string(e.GetReason()));
+                       ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Error when unserializing filter: " + std::string(e.GetReason()));
                }
        }
 }
@@ -605,13 +590,8 @@ FilterResult* ModuleFilter::FilterMatch(User* user, const std::string &text, int
                        InspIRCd::StripColor(stripped_text);
                }
 
-               //ServerInstance->Logs->Log("m_filter", LOG_DEBUG, "Match '%s' against '%s'", text.c_str(), index->freeform.c_str());
                if (index->regex->Matches(filter->flag_strip_color ? stripped_text : text))
-               {
-                       //ServerInstance->Logs->Log("m_filter", LOG_DEBUG, "MATCH");
                        return &*index;
-               }
-               //ServerInstance->Logs->Log("m_filter", LOG_DEBUG, "NO MATCH");
        }
        return NULL;
 }
@@ -646,7 +626,7 @@ std::pair<bool, std::string> ModuleFilter::AddFilter(const std::string &freeform
        }
        catch (ModuleException &e)
        {
-               ServerInstance->Logs->Log("m_filter", LOG_DEFAULT, "Error in regular expression '%s': %s", freeform.c_str(), e.GetReason());
+               ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Error in regular expression '%s': %s", freeform.c_str(), e.GetReason());
                return std::make_pair(false, e.GetReason());
        }
        return std::make_pair(true, "");
@@ -695,7 +675,7 @@ void ModuleFilter::ReadFilters()
                std::string reason = i->second->getString("reason");
                std::string action = i->second->getString("action");
                std::string flgs = i->second->getString("flags");
-               unsigned long gline_time = InspIRCd::Duration(i->second->getString("duration"));
+               unsigned long gline_time = i->second->getDuration("duration", 10*60, 1);
                if (flgs.empty())
                        flgs = "*";
 
@@ -706,11 +686,11 @@ void ModuleFilter::ReadFilters()
                try
                {
                        filters.push_back(ImplFilter(this, reason, fa, gline_time, pattern, flgs));
-                       ServerInstance->Logs->Log("m_filter", LOG_DEFAULT, "Regular expression %s loaded.", pattern.c_str());
+                       ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Regular expression %s loaded.", pattern.c_str());
                }
                catch (ModuleException &e)
                {
-                       ServerInstance->Logs->Log("m_filter", LOG_DEFAULT, "Error in regular expression '%s': %s", pattern.c_str(), e.GetReason());
+                       ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Error in regular expression '%s': %s", pattern.c_str(), e.GetReason());
                }
        }
 }