]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_dccallow.cpp
m_spanningtree Move all server-to-server command handlers into handler classes
[user/henk/code/inspircd.git] / src / modules / m_dccallow.cpp
index a615826298badec92b9453dc7a0b844334ae9344..d65537537548490a654fd8d467dbaee9802d3c75 100644 (file)
@@ -1,30 +1,38 @@
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
  *
- *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2008 John Brooks <john.brooks@dereferenced.net>
+ *   Copyright (C) 2008 Pippijn van Steenhoven <pip88nl@gmail.com>
+ *   Copyright (C) 2006-2008 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
+ *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ *   Copyright (C) 2006 Jamie ??? <???@???>
  *
- * This program is free but copyrighted software; see
- *            the file COPYING for details.
+ * This file is part of InspIRCd.  InspIRCd is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation, version 2.
  *
- * ---------------------------------------------------
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "inspircd.h"
-
-/* $ModDesc: Povides support for the /DCCALLOW command */
 
-static ConfigReader *Conf;
+#include "inspircd.h"
 
-class BannedFileList : public classbase
+class BannedFileList
 {
  public:
        std::string filemask;
        std::string action;
 };
 
-class DCCAllow : public classbase
+class DCCAllow
 {
  public:
        std::string nickname;
@@ -48,7 +56,7 @@ SimpleExtItem<dccallowlist>* ext;
 class CommandDccallow : public Command
 {
  public:
-       CommandDccallow(InspIRCd* Me, Module* parent) : Command(Me, parent, "DCCALLOW", 0, 0)
+       CommandDccallow(Module* parent) : Command(parent, "DCCALLOW", 0)
        {
                syntax = "{[+|-]<nick> <time>|HELP|LIST}";
                /* XXX we need to fix this so it can work with translation stuff (i.e. move +- into a seperate param */
@@ -90,9 +98,9 @@ class CommandDccallow : public Command
                        }
 
                        std::string nick = parameters[0].substr(1);
-                       User *target = ServerInstance->FindNick(nick);
+                       User *target = ServerInstance->FindNickOnly(nick);
 
-                       if (target)
+                       if ((target) && (!IS_SERVER(target)) && (!target->quitting) && (target->registered == REG_ALL))
                        {
 
                                if (action == '-')
@@ -139,13 +147,13 @@ class CommandDccallow : public Command
                                                }
                                        }
 
-                                       std::string mask = std::string(target->nick)+"!"+std::string(target->ident)+"@"+std::string(target->dhost);
-                                       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;
+                                       unsigned long length;
                                        if (parameters.size() < 2)
                                        {
-                                               length = ServerInstance->Duration(default_length);
+                                               length = InspIRCd::Duration(default_length);
                                        }
                                        else if (!atoi(parameters[1].c_str()))
                                        {
@@ -153,10 +161,10 @@ class CommandDccallow : public Command
                                        }
                                        else
                                        {
-                                               length = ServerInstance->Duration(parameters[1]);
+                                               length = InspIRCd::Duration(parameters[1]);
                                        }
 
-                                       if (!ServerInstance->IsValidMask(mask.c_str()))
+                                       if (!ServerInstance->IsValidMask(mask))
                                        {
                                                return CMD_FAILURE;
                                        }
@@ -237,36 +245,37 @@ class CommandDccallow : public Command
 class ModuleDCCAllow : public Module
 {
        CommandDccallow cmd;
+
  public:
+       ModuleDCCAllow()
+               : cmd(this)
+       {
+               ext = NULL;
+       }
 
-       ModuleDCCAllow(InspIRCd* Me)
-               : Module(Me), cmd(Me, this)
+       void init() CXX11_OVERRIDE
        {
-               Conf = new ConfigReader(ServerInstance);
                ext = new SimpleExtItem<dccallowlist>("dccallow", this);
-               Extensible::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);
        }
 
-
-       virtual void OnRehash(User* user)
+       void OnRehash(User* user) CXX11_OVERRIDE
        {
-               delete Conf;
-               Conf = new ConfigReader(ServerInstance);
                ReadFileConf();
        }
 
-       virtual void OnUserQuit(User* user, const std::string &reason, const std::string &oper_message)
+       void OnUserQuit(User* user, const std::string &reason, const std::string &oper_message) CXX11_OVERRIDE
        {
                dccallowlist* udl = ext->get(user);
 
                // 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
@@ -274,18 +283,12 @@ class ModuleDCCAllow : public Module
                RemoveNick(user);
        }
 
-       virtual ModResult OnUserPreNick(User* user, const std::string &newnick)
+       void OnUserPostNick(User* user, const std::string &oldnick) CXX11_OVERRIDE
        {
                RemoveNick(user);
-               return MOD_RES_PASSTHRU;
-       }
-
-       virtual ModResult OnUserPreMessage(User* user, void* dest, int target_type, std::string &text, char status, CUList &exempt_list)
-       {
-               return OnUserPreNotice(user, dest, target_type, text, status, exempt_list);
        }
 
-       virtual ModResult OnUserPreNotice(User* user, void* dest, int target_type, std::string &text, char status, CUList &exempt_list)
+       ModResult OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype) CXX11_OVERRIDE
        {
                if (!IS_LOCAL(user))
                        return MOD_RES_PASSTHRU;
@@ -325,11 +328,12 @@ class ModuleDCCAllow : public Module
 
                                        irc::string type = tokens[1].c_str();
 
-                                       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);
+                                               std::string defaultaction = conftag->getString("action");
                                                std::string filename = tokens[2];
 
                                                bool found = false;
@@ -352,16 +356,16 @@ class ModuleDCCAllow : public Module
                                                if ((!found) && (defaultaction == "allow"))
                                                        return MOD_RES_PASSTHRU;
 
-                                               user->WriteServ("NOTICE %s :The user %s is not accepting DCC SENDs from you. Your file %s was not sent.", user->nick.c_str(), u->nick.c_str(), filename.c_str());
-                                               u->WriteServ("NOTICE %s :%s (%s@%s) attempted to send you a file named %s, which was blocked.", u->nick.c_str(), user->nick.c_str(), user->ident.c_str(), user->dhost.c_str(), filename.c_str());
-                                               u->WriteServ("NOTICE %s :If you trust %s and were expecting this, you can type /DCCALLOW HELP for information on the DCCALLOW system.", u->nick.c_str(), user->nick.c_str());
+                                               user->WriteNotice("The user " + u->nick + " is not accepting DCC SENDs from you. Your file " + filename + " was not sent.");
+                                               u->WriteNotice(user->nick + " (" + user->ident + "@" + user->dhost + ") attempted to send you a file named " + filename + ", which was blocked.");
+                                               u->WriteNotice("If you trust " + user->nick + " and were expecting this, you can type /DCCALLOW HELP for information on the DCCALLOW system.");
                                                return MOD_RES_DENY;
                                        }
                                        else if ((type == "CHAT") && (blockchat))
                                        {
-                                               user->WriteServ("NOTICE %s :The user %s is not accepting DCC CHAT requests from you.", user->nick.c_str(), u->nick.c_str());
-                                               u->WriteServ("NOTICE %s :%s (%s@%s) attempted to initiate a DCC CHAT session, which was blocked.", u->nick.c_str(), user->nick.c_str(), user->ident.c_str(), user->dhost.c_str());
-                                               u->WriteServ("NOTICE %s :If you trust %s and were expecting this, you can type /DCCALLOW HELP for information on the DCCALLOW system.", u->nick.c_str(), user->nick.c_str());
+                                               user->WriteNotice("The user " + u->nick + " is not accepting DCC CHAT requests from you.");
+                                               u->WriteNotice(user->nick + " (" + user->ident + "@" + user->dhost + ") attempted to initiate a DCC CHAT session, which was blocked.");
+                                               u->WriteNotice("If you trust " + user->nick + " and were expecting this, you can type /DCCALLOW HELP for information on the DCCALLOW system.");
                                                return MOD_RES_DENY;
                                        }
                                }
@@ -372,7 +376,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);
@@ -394,10 +398,11 @@ class ModuleDCCAllow : public Module
                                                }
                                        }
                                }
+                               ++iter;
                        }
                        else
                        {
-                               RemoveFromUserlist(u);
+                               iter = ul.erase(iter);
                        }
                }
        }
@@ -405,7 +410,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);
@@ -418,17 +423,18 @@ class ModuleDCCAllow : public Module
                                                if (i->nickname == user->nick)
                                                {
 
-                                                       u->WriteServ("NOTICE %s :%s left the network or changed their nickname and has been removed from your DCCALLOW list", u->nick.c_str(), i->nickname.c_str());
+                                                       u->WriteNotice(i->nickname + " left the network or changed their nickname and has been removed from your DCCALLOW list");
                                                        u->WriteNumeric(995, "%s %s :Removed %s from your DCCALLOW list", u->nick.c_str(), u->nick.c_str(), i->nickname.c_str());
                                                        dl->erase(i);
                                                        break;
                                                }
                                        }
                                }
+                               ++iter;
                        }
                        else
                        {
-                               RemoveFromUserlist(u);
+                               iter = ul.erase(iter);
                        }
                }
        }
@@ -450,28 +456,24 @@ class ModuleDCCAllow : public Module
        void ReadFileConf()
        {
                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()
+       ~ModuleDCCAllow()
        {
-               delete Conf;
                delete ext;
-               Conf = NULL;
        }
 
-       virtual Version GetVersion()
+       Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("$Id$", VF_COMMON | VF_VENDOR, API_VERSION);
+               return Version("Provides support for the /DCCALLOW command", VF_COMMON | VF_VENDOR);
        }
 };