]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_filter.h
Someone is getting slapped for this; the new hidesplits/hidebans behavior doesn't...
[user/henk/code/inspircd.git] / src / modules / m_filter.h
index ec95431faf451b1c5b5c9ceebb241cb9041c6203..896c75dc25732b361c84d53b0c915fc3553680dd 100644 (file)
@@ -50,7 +50,7 @@ class FilterBase : public Module
        virtual void SendFilter(Module* proto, void* opaque, FilterResult* iter);
        virtual std::pair<bool, std::string> AddFilter(const std::string &freeform, const std::string &type, const std::string &reason, long duration) = 0;
        virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list);
-       virtual void OnRehash(const std::string &parameter);
+       virtual void OnRehash(userrec* user, const std::string &parameter);
        virtual Version GetVersion();
        std::string EncodeFilter(FilterResult* filter);
        FilterResult DecodeFilter(const std::string &data);
@@ -221,12 +221,20 @@ int FilterBase::OnPreCommand(const std::string &command, const char** parameters
        
                if (command == "QUIT")
                {
+                       /* QUIT with no reason: nothing to do */
+                       if (pcnt < 1)
+                               return 0;
+
                        checkline = parameters[0];
                        replacepoint = 0;
                        parting = false;
                }
                else if (command == "PART")
                {
+                       /* PART with no reason: nothing to do */
+                       if (pcnt < 2)
+                               return 0;
+
                        checkline = parameters[1];
                        replacepoint = 1;
                        parting = true;
@@ -254,7 +262,10 @@ int FilterBase::OnPreCommand(const std::string &command, const char** parameters
                                params[item] = parameters[item];
                        params[replacepoint] = "Reason filtered";
 
-                       if (f->action == "block")
+                       /* We're blocking, OR theyre quitting and its a KILL action
+                        * (we cant kill someone whos already quitting, so filter them anyway)
+                        */
+                       if ((f->action == "block") || (((!parting) && (f->action == "kill"))))
                        {
                                c->Handle(params, pcnt, user);
                                return 1;
@@ -273,7 +284,11 @@ int FilterBase::OnPreCommand(const std::string &command, const char** parameters
                                }
                                if (f->action == "gline")
                                {
-                                       if (ServerInstance->XLines->add_gline(f->gline_time, ServerInstance->Config->ServerName, f->reason.c_str(), user->MakeHostIP()))
+                                       /* Note: We gline *@IP so that if their host doesnt resolve the gline still applies. */
+                                       std::string wild = "*@";
+                                       wild.append(user->GetIPString());
+
+                                       if (ServerInstance->XLines->add_gline(f->gline_time, ServerInstance->Config->ServerName, f->reason.c_str(), wild.c_str()))
                                        {
                                                ServerInstance->XLines->apply_lines(APPLY_GLINES);
                                                FOREACH_MOD(I_OnAddGLine,OnAddGLine(f->gline_time, NULL, f->reason, user->MakeHostIP()));
@@ -287,7 +302,7 @@ int FilterBase::OnPreCommand(const std::string &command, const char** parameters
        return 0;
 }
 
-void FilterBase::OnRehash(const std::string &parameter)
+void FilterBase::OnRehash(userrec* user, const std::string &parameter)
 {
 }
        
@@ -300,7 +315,13 @@ Version FilterBase::GetVersion()
 std::string FilterBase::EncodeFilter(FilterResult* filter)
 {
        std::ostringstream stream;
-       stream << filter->freeform << " " << filter->action << " " << filter->gline_time << " " << filter->reason;
+       std::string x = filter->freeform;
+
+       for (std::string::iterator n = x.begin(); n != x.end(); n++)
+               if (*n == ' ')
+                       *n = '\7';
+
+       stream << x << " " << filter->action << " " << filter->gline_time << " " << filter->reason;
        return stream.str();
 }
 
@@ -308,10 +329,16 @@ FilterResult FilterBase::DecodeFilter(const std::string &data)
 {
        FilterResult res;
        std::istringstream stream(data);
+
        stream >> res.freeform;
        stream >> res.action;
        stream >> res.gline_time;
        res.reason = stream.str();
+
+       for (std::string::iterator n = res.freeform.begin(); n != res.freeform.end(); n++)
+               if (*n == '\7')
+                       *n = ' ';
+
        return res;
 }