]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_dccallow.cpp
m_dccallow Validate tokens before use
[user/henk/code/inspircd.git] / src / modules / m_dccallow.cpp
index 495a0da5a51fa92f88283a5ba628dd6d16a641f0..829c1d3378ce91a3229f4de51ef15a6fc7a47611 100644 (file)
@@ -25,7 +25,7 @@
 
 #include "inspircd.h"
 
-/* $ModDesc: Povides support for the /DCCALLOW command */
+/* $ModDesc: Provides support for the /DCCALLOW command */
 
 class BannedFileList
 {
@@ -60,7 +60,7 @@ class CommandDccallow : public Command
  public:
        CommandDccallow(Module* parent) : Command(parent, "DCCALLOW", 0)
        {
-               syntax = "{[+|-]<nick> <time>|HELP|LIST}";
+               syntax = "[(+|-)<nick> [<time>]]|[LIST|HELP]";
                /* XXX we need to fix this so it can work with translation stuff (i.e. move +- into a seperate param */
        }
 
@@ -102,7 +102,7 @@ class CommandDccallow : public Command
                        std::string nick = parameters[0].substr(1);
                        User *target = ServerInstance->FindNickOnly(nick);
 
-                       if (target)
+                       if ((target) && (!IS_SERVER(target)) && (!target->quitting) && (target->registered == REG_ALL))
                        {
 
                                if (action == '-')
@@ -149,9 +149,8 @@ class CommandDccallow : public Command
                                                }
                                        }
 
-                                       std::string mask = std::string(target->nick)+"!"+std::string(target->ident)+"@"+std::string(target->dhost);
-                                       ConfigReader Conf;
-                                       std::string default_length = Conf.ReadValue("dccallow", "length", 0);
+                                       std::string mask = target->nick+"!"+target->ident+"@"+target->dhost;
+                                       std::string default_length = ServerInstance->Config->ConfValue("dccallow")->getString("length");
 
                                        long length;
                                        if (parameters.size() < 2)
@@ -167,7 +166,7 @@ class CommandDccallow : public Command
                                                length = ServerInstance->Duration(parameters[1]);
                                        }
 
-                                       if (!ServerInstance->IsValidMask(mask.c_str()))
+                                       if (!ServerInstance->IsValidMask(mask))
                                        {
                                                return CMD_FAILURE;
                                        }
@@ -204,7 +203,7 @@ class CommandDccallow : public Command
 
        void DisplayHelp(User* user)
        {
-               user->WriteNumeric(998, "%s :DCCALLOW [<+|->nick [time]] [list] [help]", user->nick.c_str());
+               user->WriteNumeric(998, "%s :DCCALLOW [(+|-)<nick> [<time>]]|[LIST|HELP]", user->nick.c_str());
                user->WriteNumeric(998, "%s :You may allow DCCs from specific users by specifying a", user->nick.c_str());
                user->WriteNumeric(998, "%s :DCC allow for the user you want to receive DCCs from.", user->nick.c_str());
                user->WriteNumeric(998, "%s :For example, to allow the user Brain to send you inspircd.exe", user->nick.c_str());
@@ -224,6 +223,10 @@ class CommandDccallow : public Command
                user->WriteNumeric(998, "%s :  they will be removed from your DCCALLOW list.", user->nick.c_str());
                user->WriteNumeric(998, "%s :  your DCCALLOW list will be deleted when you leave IRC.", user->nick.c_str());
                user->WriteNumeric(999, "%s :End of DCCALLOW HELP", user->nick.c_str());
+
+               LocalUser* localuser = IS_LOCAL(user);
+               if (localuser)
+                       localuser->CommandFloodPenalty += 4000;
        }
 
        void DisplayDCCAllowList(User* user)
@@ -252,16 +255,20 @@ class ModuleDCCAllow : public Module
 
        ModuleDCCAllow()
                : cmd(this)
+       {
+               ext = NULL;
+       }
+
+       void init()
        {
                ext = new SimpleExtItem<dccallowlist>("dccallow", this);
-               ServerInstance->Extensions.Register(ext);
-               ServerInstance->AddCommand(&cmd);
+               ServerInstance->Modules->AddService(*ext);
+               ServerInstance->Modules->AddService(cmd);
                ReadFileConf();
-               Implementation eventlist[] = { I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserQuit, I_OnUserPreNick, I_OnRehash };
-               ServerInstance->Modules->Attach(eventlist, this, 5);
+               Implementation eventlist[] = { I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserQuit, I_OnUserPostNick, I_OnRehash };
+               ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
        }
 
-
        virtual void OnRehash(User* user)
        {
                ReadFileConf();
@@ -274,7 +281,9 @@ class ModuleDCCAllow : public Module
                // remove their DCCALLOW list if they have one
                if (udl)
                {
-                       RemoveFromUserlist(user);
+                       userlist::iterator it = std::find(ul.begin(), ul.end(), user);
+                       if (it != ul.end())
+                               ul.erase(it);
                }
 
                // remove them from any DCCALLOW lists
@@ -282,10 +291,9 @@ class ModuleDCCAllow : public Module
                RemoveNick(user);
        }
 
-       virtual ModResult OnUserPreNick(User* user, const std::string &newnick)
+       virtual void OnUserPostNick(User* user, const std::string &oldnick)
        {
                RemoveNick(user);
-               return MOD_RES_PASSTHRU;
        }
 
        virtual ModResult OnUserPreMessage(User* user, void* dest, int target_type, std::string &text, char status, CUList &exempt_list)
@@ -331,14 +339,20 @@ class ModuleDCCAllow : public Module
                                        while (ss >> buf)
                                                tokens.push_back(buf);
 
+                                       if (tokens.size() < 2)
+                                               return MOD_RES_PASSTHRU;
+
                                        irc::string type = tokens[1].c_str();
 
-                                       ConfigReader Conf;
-                                       bool blockchat = Conf.ReadFlag("dccallow", "blockchat", 0);
+                                       ConfigTag* conftag = ServerInstance->Config->ConfValue("dccallow");
+                                       bool blockchat = conftag->getBool("blockchat");
 
                                        if (type == "SEND")
                                        {
-                                               std::string defaultaction = Conf.ReadValue("dccallow", "action", 0);
+                                               if (tokens.size() < 3)
+                                                       return MOD_RES_PASSTHRU;
+
+                                               std::string defaultaction = conftag->getString("action");
                                                std::string filename = tokens[2];
 
                                                bool found = false;
@@ -381,7 +395,7 @@ class ModuleDCCAllow : public Module
 
        void Expire()
        {
-               for (userlist::iterator iter = ul.begin(); iter != ul.end(); ++iter)
+               for (userlist::iterator iter = ul.begin(); iter != ul.end();)
                {
                        User* u = (User*)(*iter);
                        dl = ext->get(u);
@@ -403,10 +417,11 @@ class ModuleDCCAllow : public Module
                                                }
                                        }
                                }
+                               ++iter;
                        }
                        else
                        {
-                               RemoveFromUserlist(u);
+                               iter = ul.erase(iter);
                        }
                }
        }
@@ -414,7 +429,7 @@ class ModuleDCCAllow : public Module
        void RemoveNick(User* user)
        {
                /* Iterate through all DCCALLOW lists and remove user */
-               for (userlist::iterator iter = ul.begin(); iter != ul.end(); ++iter)
+               for (userlist::iterator iter = ul.begin(); iter != ul.end();)
                {
                        User *u = (User*)(*iter);
                        dl = ext->get(u);
@@ -434,10 +449,11 @@ class ModuleDCCAllow : public Module
                                                }
                                        }
                                }
+                               ++iter;
                        }
                        else
                        {
-                               RemoveFromUserlist(u);
+                               iter = ul.erase(iter);
                        }
                }
        }
@@ -458,18 +474,15 @@ class ModuleDCCAllow : public Module
 
        void ReadFileConf()
        {
-               ConfigReader Conf;
                bfl.clear();
-               for (int i = 0; i < Conf.Enumerate("banfile"); i++)
+               ConfigTagList tags = ServerInstance->Config->ConfTags("banfile");
+               for (ConfigIter i = tags.first; i != tags.second; ++i)
                {
                        BannedFileList bf;
-                       std::string fileglob = Conf.ReadValue("banfile", "pattern", i);
-                       std::string action = Conf.ReadValue("banfile", "action", i);
-                       bf.filemask = fileglob;
-                       bf.action = action;
+                       bf.filemask = i->second->getString("pattern");
+                       bf.action = i->second->getString("action");
                        bfl.push_back(bf);
                }
-
        }
 
        virtual ~ModuleDCCAllow()
@@ -479,7 +492,7 @@ class ModuleDCCAllow : public Module
 
        virtual Version GetVersion()
        {
-               return Version("Povides support for the /DCCALLOW command", VF_COMMON | VF_VENDOR);
+               return Version("Provides support for the /DCCALLOW command", VF_COMMON | VF_VENDOR);
        }
 };