]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_filter.cpp
Improve support for wildcards in <link:name>.
[user/henk/code/inspircd.git] / src / modules / m_filter.cpp
index 584bfef002fc259afdb57ba019f9fed1283cf6ff..849f9908617404f978107e413811f423cf28d855 100644 (file)
@@ -54,7 +54,7 @@ class FilterResult
        std::string freeform;
        std::string reason;
        FilterAction action;
-       long duration;
+       unsigned long duration;
        bool from_config;
 
        bool flag_no_opers;
@@ -64,7 +64,7 @@ class FilterResult
        bool flag_notice;
        bool flag_strip_color;
 
-       FilterResult(dynamic_reference<RegexFactory>& RegexEngine, const std::string& free, const std::string& rea, FilterAction act, long gt, const std::string& fla, bool cfg)
+       FilterResult(dynamic_reference<RegexFactory>& RegexEngine, const std::string& free, const std::string& rea, FilterAction act, unsigned long gt, const std::string& fla, bool cfg)
                : freeform(free)
                , reason(rea)
                , action(act)
@@ -193,7 +193,7 @@ class ModuleFilter : public Module, public ServerEventListener, public Stats::Ev
        ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) 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);
+       std::pair<bool, std::string> AddFilter(const std::string& freeform, FilterAction type, const std::string& reason, unsigned long duration, const std::string& flags);
        void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE;
        Version GetVersion() CXX11_OVERRIDE;
        std::string EncodeFilter(FilterResult* filter);
@@ -236,7 +236,7 @@ CmdResult CommandFilter::Handle(User* user, const Params& parameters)
                        FilterAction type;
                        const std::string& flags = parameters[2];
                        unsigned int reasonindex;
-                       long duration = 0;
+                       unsigned long duration = 0;
 
                        if (!ModuleFilter::StringToFilterAction(parameters[1], type))
                        {
@@ -251,7 +251,11 @@ CmdResult CommandFilter::Handle(User* user, const Params& parameters)
                        {
                                if (parameters.size() >= 5)
                                {
-                                       duration = InspIRCd::Duration(parameters[3]);
+                                       if (!InspIRCd::Duration(parameters[3], duration))
+                                       {
+                                               user->WriteNotice("*** Invalid duration for filter");
+                                               return CMD_FAILURE;
+                                       }
                                        reasonindex = 4;
                                }
                                else
@@ -417,7 +421,7 @@ ModResult ModuleFilter::OnUserPreMessage(User* user, const MessageTarget& msgtar
                else if (f->action == FA_GLINE)
                {
                        GLine* gl = new GLine(ServerInstance->Time(), f->duration, ServerInstance->Config->ServerName.c_str(), f->reason.c_str(), "*", user->GetIPString());
-                       ServerInstance->SNO->WriteGlobalSno('f', InspIRCd::Format("%s was glined because their message to %s matched %s (%s)",
+                       ServerInstance->SNO->WriteGlobalSno('f', InspIRCd::Format("%s was G-lined because their message to %s matched %s (%s)",
                                user->nick.c_str(), target.c_str(), f->freeform.c_str(), f->reason.c_str()));
                        if (ServerInstance->XLines->AddLine(gl,NULL))
                        {
@@ -429,7 +433,7 @@ ModResult ModuleFilter::OnUserPreMessage(User* user, const MessageTarget& msgtar
                else if (f->action == FA_ZLINE)
                {
                        ZLine* zl = new ZLine(ServerInstance->Time(), f->duration, ServerInstance->Config->ServerName.c_str(), f->reason.c_str(), user->GetIPString());
-                       ServerInstance->SNO->WriteGlobalSno('f', InspIRCd::Format("%s was zlined because their message to %s matched %s (%s)",
+                       ServerInstance->SNO->WriteGlobalSno('f', InspIRCd::Format("%s was Z-lined because their message to %s matched %s (%s)",
                                user->nick.c_str(), target.c_str(), f->freeform.c_str(), f->reason.c_str()));
                        if (ServerInstance->XLines->AddLine(zl,NULL))
                        {
@@ -502,9 +506,9 @@ ModResult ModuleFilter::OnPreCommand(std::string& command, CommandBase::Params&
                        }
                        if (f->action == FA_GLINE)
                        {
-                               /* Note: We gline *@IP so that if their host doesnt resolve the gline still applies. */
+                               /* Note: We G-line *@IP so that if their host doesn't resolve the G-line still applies. */
                                GLine* gl = new GLine(ServerInstance->Time(), f->duration, ServerInstance->Config->ServerName.c_str(), f->reason.c_str(), "*", user->GetIPString());
-                               ServerInstance->SNO->WriteGlobalSno('f', InspIRCd::Format("%s was glined because their %s message matched %s (%s)",
+                               ServerInstance->SNO->WriteGlobalSno('f', InspIRCd::Format("%s was G-lined because their %s message matched %s (%s)",
                                        user->nick.c_str(), command.c_str(), f->freeform.c_str(), f->reason.c_str()));
 
                                if (ServerInstance->XLines->AddLine(gl,NULL))
@@ -517,7 +521,7 @@ ModResult ModuleFilter::OnPreCommand(std::string& command, CommandBase::Params&
                        if (f->action == FA_ZLINE)
                        {
                                ZLine* zl = new ZLine(ServerInstance->Time(), f->duration, ServerInstance->Config->ServerName.c_str(), f->reason.c_str(), user->GetIPString());
-                               ServerInstance->SNO->WriteGlobalSno('f', InspIRCd::Format("%s was zlined because their %s message matched %s (%s)",
+                               ServerInstance->SNO->WriteGlobalSno('f', InspIRCd::Format("%s was Z-lined because their %s message matched %s (%s)",
                                        user->nick.c_str(), command.c_str(), f->freeform.c_str(), f->reason.c_str()));
 
                                if (ServerInstance->XLines->AddLine(zl,NULL))
@@ -637,7 +641,7 @@ FilterResult ModuleFilter::DecodeFilter(const std::string &data)
 
        std::string duration;
        tokens.GetMiddle(duration);
-       res.duration = ConvToInt(duration);
+       res.duration = ConvToNum<unsigned long>(duration);
 
        tokens.GetTrailing(res.reason);
 
@@ -716,7 +720,7 @@ bool ModuleFilter::DeleteFilter(const std::string &freeform)
        return false;
 }
 
-std::pair<bool, std::string> ModuleFilter::AddFilter(const std::string &freeform, FilterAction type, const std::string &reason, long duration, const std::string &flgs)
+std::pair<bool, std::string> ModuleFilter::AddFilter(const std::string& freeform, FilterAction type, const std::string& reason, unsigned long duration, const std::string& flgs)
 {
        for (std::vector<FilterResult>::iterator i = filters.begin(); i != filters.end(); i++)
        {