]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_filter.cpp
Add irc::sockets::isunix for checking if a file is a UNIX socket.
[user/henk/code/inspircd.git] / src / modules / m_filter.cpp
index f49694e81744fc47e7636e9541504733f92c7d58..c0798f7d0353452a9b8a8d89bd6fa37cfcd92386 100644 (file)
@@ -26,6 +26,7 @@
 #include "modules/server.h"
 #include "modules/shun.h"
 #include "modules/stats.h"
+#include "modules/account.h"
 
 enum FilterFlags
 {
@@ -63,6 +64,7 @@ class FilterResult
        bool flag_privmsg;
        bool flag_notice;
        bool flag_strip_color;
+       bool flag_no_registered;
 
        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)
@@ -80,7 +82,7 @@ class FilterResult
        char FillFlags(const std::string &fl)
        {
                flag_no_opers = flag_part_message = flag_quit_message = flag_privmsg =
-                       flag_notice = flag_strip_color = false;
+                       flag_notice = flag_strip_color = flag_no_registered = false;
 
                for (std::string::const_iterator n = fl.begin(); n != fl.end(); ++n)
                {
@@ -104,6 +106,9 @@ class FilterResult
                                case 'c':
                                        flag_strip_color = true;
                                break;
+                               case 'r':
+                                       flag_no_registered = true;
+                               break;
                                case '*':
                                        flag_no_opers = flag_part_message = flag_quit_message =
                                                flag_privmsg = flag_notice = flag_strip_color = true;
@@ -130,12 +135,15 @@ class FilterResult
                if (flag_notice)
                        flags.push_back('n');
 
-               /* Order is important here, 'c' must be the last char in the string as it is unsupported
-                * on < 2.0.10, and the logic in FillFlags() stops parsing when it ecounters an unknown
-                * character.
+               /* Order is important here, as the logic in FillFlags() stops parsing when it encounters
+                * an unknown character. So the following characters must be last in the string.
+                * 'c' is unsupported on < 2.0.10
+                * 'r' is unsupported on < 3.2.0
                 */
                if (flag_strip_color)
                        flags.push_back('c');
+               if (flag_no_registered)
+                       flags.push_back('r');
 
                if (flags.empty())
                        flags.push_back('-');
@@ -193,7 +201,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::string& reason);
-       std::pair<bool, std::string> AddFilter(const std::string& freeform, FilterAction type, const std::string& reason, unsigned 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, bool config = false);
        void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE;
        Version GetVersion() CXX11_OVERRIDE;
        std::string EncodeFilter(FilterResult* filter);
@@ -226,7 +234,7 @@ CmdResult CommandFilter::Handle(User* user, const Params& parameters)
                }
                else
                {
-                       user->WriteNotice("*** Filter '" + parameters[0] + "' not found in list, try /stats s.");
+                       user->WriteNotice("*** Filter '" + parameters[0] + "' not found on the list.");
                        return CMD_FAILURE;
                }
        }
@@ -305,8 +313,12 @@ CmdResult CommandFilter::Handle(User* user, const Params& parameters)
 
 bool ModuleFilter::AppliesToMe(User* user, FilterResult* filter, int iflags)
 {
+       const AccountExtItem* accountext = GetAccountExtItem();
+
        if ((filter->flag_no_opers) && user->IsOper())
                return false;
+       if ((filter->flag_no_registered) && accountext && accountext->get(user))
+               return false;
        if ((iflags & FLAG_PRIVMSG) && (!filter->flag_privmsg))
                return false;
        if ((iflags & FLAG_NOTICE) && (!filter->flag_notice))
@@ -629,7 +641,7 @@ void ModuleFilter::ReadConfig(ConfigStatus& status)
 
 Version ModuleFilter::GetVersion()
 {
-       return Version("Text (spam) filtering", VF_VENDOR | VF_COMMON, RegexEngine ? RegexEngine->name : "");
+       return Version("Provides text (spam) filtering", VF_VENDOR | VF_COMMON, RegexEngine ? RegexEngine->name : "");
 }
 
 std::string ModuleFilter::EncodeFilter(FilterResult* filter)
@@ -744,7 +756,7 @@ bool ModuleFilter::DeleteFilter(const std::string& freeform, std::string& reason
        return false;
 }
 
-std::pair<bool, std::string> ModuleFilter::AddFilter(const std::string& freeform, FilterAction type, const std::string& reason, unsigned 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, bool config)
 {
        for (std::vector<FilterResult>::iterator i = filters.begin(); i != filters.end(); i++)
        {
@@ -756,7 +768,7 @@ std::pair<bool, std::string> ModuleFilter::AddFilter(const std::string& freeform
 
        try
        {
-               filters.push_back(FilterResult(RegexEngine, freeform, reason, type, duration, flgs, false));
+               filters.push_back(FilterResult(RegexEngine, freeform, reason, type, duration, flgs, config));
        }
        catch (ModuleException &e)
        {
@@ -807,11 +819,13 @@ std::string ModuleFilter::FilterActionToString(FilterAction fa)
 
 void ModuleFilter::ReadFilters()
 {
+       insp::flat_set<std::string> removedfilters;
+
        for (std::vector<FilterResult>::iterator filter = filters.begin(); filter != filters.end(); )
        {
                if (filter->from_config)
                {
-                       ServerInstance->SNO->WriteGlobalSno('f', "Removing filter '" + filter->freeform + "' due to config rehash.");
+                       removedfilters.insert(filter->freeform);
                        delete filter->regex;
                        filter = filters.erase(filter);
                        continue;
@@ -836,15 +850,17 @@ void ModuleFilter::ReadFilters()
                if (!StringToFilterAction(action, fa))
                        fa = FA_NONE;
 
-               try
-               {
-                       filters.push_back(FilterResult(RegexEngine, pattern, reason, fa, duration, flgs, true));
-                       ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Regular expression %s loaded.", pattern.c_str());
-               }
-               catch (ModuleException &e)
-               {
-                       ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Error in regular expression '%s': %s", pattern.c_str(), e.GetReason().c_str());
-               }
+               std::pair<bool, std::string> result = static_cast<ModuleFilter*>(this)->AddFilter(pattern, fa, reason, duration, flgs, true);
+               if (result.first)
+                       removedfilters.erase(pattern);
+               else
+                       ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Filter '%s' could not be added: %s", pattern.c_str(), result.second.c_str());
+       }
+
+       if (!removedfilters.empty())
+       {
+               for (insp::flat_set<std::string>::const_iterator it = removedfilters.begin(); it != removedfilters.end(); ++it)
+                       ServerInstance->SNO->WriteGlobalSno('f', "Removing filter '" + *(it) + "' due to config rehash.");
        }
 }