]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
m_filter: add Z-Line support
authorMichael Hazell <michaelhazell@hotmail.com>
Mon, 12 Nov 2018 00:39:53 +0000 (19:39 -0500)
committerPeter Powell <petpow@saberuk.com>
Mon, 12 Nov 2018 01:13:48 +0000 (01:13 +0000)
docs/conf/filter.conf.example
src/modules/m_filter.cpp

index ea62efd1f51a31c08b1a298bccb1c45769c05c88..a389d39e159d0ca0ce0c24ad046f79c296eb3edc 100644 (file)
 #               other glines, omitting the duration or setting it to 0 makes
 #               any glines set by this filter be permanent.
 #
+# zline         Z-LINE the user for 'duration' length of time. Durations may
+#               be specified using the notation 1y2d3h4m6s in a similar way to
+#               other zlines, omitting the duration or setting it to 0 makes
+#               any zlines set by this filter be permanent.
+#
 # You can add filters from IRC using the /FILTER command. If you do this, they
 # will be set globally to your entire network.
 #
index 239135655f0754e293432c47df1faf7d943e2e1f..d32a11f21ce58050e232663885cd07a11cf33168 100644 (file)
@@ -38,6 +38,7 @@ enum FilterFlags
 enum FilterAction
 {
        FA_GLINE,
+       FA_ZLINE,
        FA_BLOCK,
        FA_SILENT,
        FA_KILL,
@@ -239,13 +240,13 @@ CmdResult CommandFilter::Handle(User* user, const Params& parameters)
                        if (!ModuleFilter::StringToFilterAction(parameters[1], type))
                        {
                                if (ServerInstance->XLines->GetFactory("SHUN"))
-                                       user->WriteNotice("*** Invalid filter type '" + parameters[1] + "'. Supported types are 'gline', 'none', 'block', 'silent', 'kill', and 'shun'.");
+                                       user->WriteNotice("*** Invalid filter type '" + parameters[1] + "'. Supported types are 'gline', 'zline', 'none', 'block', 'silent', 'kill', and 'shun'.");
                                else
-                                       user->WriteNotice("*** Invalid filter type '" + parameters[1] + "'. Supported types are 'gline', 'none', 'block', 'silent', and 'kill'.");
+                                       user->WriteNotice("*** Invalid filter type '" + parameters[1] + "'. Supported types are 'gline', 'zline', 'none', 'block', 'silent', and 'kill'.");
                                return CMD_FAILURE;
                        }
 
-                       if (type == FA_GLINE || type == FA_SHUN)
+                       if (type == FA_GLINE || type == FA_ZLINE || type == FA_SHUN)
                        {
                                if (parameters.size() >= 5)
                                {
@@ -254,7 +255,7 @@ CmdResult CommandFilter::Handle(User* user, const Params& parameters)
                                }
                                else
                                {
-                                       user->WriteNotice("*** Not enough parameters: When setting a gline or shun type filter, a duration must be specified as the third parameter.");
+                                       user->WriteNotice("*** Not enough parameters: When setting a '" + parameters[1] + "' type filter, a duration must be specified as the third parameter.");
                                        return CMD_FAILURE;
                                }
                        }
@@ -418,6 +419,18 @@ ModResult ModuleFilter::OnUserPreMessage(User* user, const MessageTarget& msgtar
                        else
                                delete gl;
                }
+               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)",
+                               user->nick.c_str(), target.c_str(), f->freeform.c_str(), f->reason.c_str()));
+                       if (ServerInstance->XLines->AddLine(zl,NULL))
+                       {
+                               ServerInstance->XLines->ApplyLines();
+                       }
+                       else
+                               delete zl;
+               }
 
                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;
@@ -494,6 +507,19 @@ ModResult ModuleFilter::OnPreCommand(std::string& command, CommandBase::Params&
                                else
                                        delete gl;
                        }
+                       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)",
+                                       user->nick.c_str(), command.c_str(), f->freeform.c_str(), f->reason.c_str()));
+
+                               if (ServerInstance->XLines->AddLine(zl,NULL))
+                               {
+                                       ServerInstance->XLines->ApplyLines();
+                               }
+                               else
+                                       delete zl;
+                       }
                        else if (f->action == FA_SHUN && (ServerInstance->XLines->GetFactory("SHUN")))
                        {
                                /* Note: We shun *!*@IP so that if their host doesnt resolve the shun still applies. */
@@ -709,6 +735,8 @@ bool ModuleFilter::StringToFilterAction(const std::string& str, FilterAction& fa
 {
        if (stdalgo::string::equalsci(str, "gline"))
                fa = FA_GLINE;
+       else if (stdalgo::string::equalsci(str, "zline"))
+               fa = FA_ZLINE;
        else if (stdalgo::string::equalsci(str, "block"))
                fa = FA_BLOCK;
        else if (stdalgo::string::equalsci(str, "silent"))
@@ -730,6 +758,7 @@ std::string ModuleFilter::FilterActionToString(FilterAction fa)
        switch (fa)
        {
                case FA_GLINE:  return "gline";
+               case FA_ZLINE:  return "zline";
                case FA_BLOCK:  return "block";
                case FA_SILENT: return "silent";
                case FA_KILL:   return "kill";