X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_dccallow.cpp;h=d65537537548490a654fd8d467dbaee9802d3c75;hb=67de413cad88194972d55a8ff88464370890c5a9;hp=fb05283fc4faa36cb6361d98dd55f7cb3489c317;hpb=a59d08fffd3dc8a9850ce34c9928fb6382b9b37f;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_dccallow.cpp b/src/modules/m_dccallow.cpp index fb05283fc..d65537537 100644 --- a/src/modules/m_dccallow.cpp +++ b/src/modules/m_dccallow.cpp @@ -1,19 +1,29 @@ -/* +------------------------------------+ - * | 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 + * Copyright (C) 2008 John Brooks + * Copyright (C) 2008 Pippijn van Steenhoven + * Copyright (C) 2006-2008 Craig Edwards + * Copyright (C) 2007-2008 Robin Burchell + * Copyright (C) 2007 Dennis Friis + * 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 . */ -#include "inspircd.h" -/* $ModDesc: Povides support for the /DCCALLOW command */ +#include "inspircd.h" class BannedFileList { @@ -88,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 == '-') @@ -137,14 +147,13 @@ 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; + unsigned long length; if (parameters.size() < 2) { - length = ServerInstance->Duration(default_length); + length = InspIRCd::Duration(default_length); } else if (!atoi(parameters[1].c_str())) { @@ -152,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; } @@ -236,33 +245,37 @@ class CommandDccallow : public Command class ModuleDCCAllow : public Module { CommandDccallow cmd; - public: + public: ModuleDCCAllow() : cmd(this) + { + ext = NULL; + } + + void init() CXX11_OVERRIDE { ext = new SimpleExtItem("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); } - - virtual void OnRehash(User* user) + void OnRehash(User* user) CXX11_OVERRIDE { 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 @@ -270,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; @@ -321,12 +328,12 @@ class ModuleDCCAllow : public Module 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); + std::string defaultaction = conftag->getString("action"); std::string filename = tokens[2]; bool found = false; @@ -349,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; } } @@ -369,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); @@ -391,10 +398,11 @@ class ModuleDCCAllow : public Module } } } + ++iter; } else { - RemoveFromUserlist(u); + iter = ul.erase(iter); } } } @@ -402,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); @@ -415,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); } } } @@ -446,28 +455,25 @@ 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() + ~ModuleDCCAllow() { delete ext; } - virtual Version GetVersion() + Version GetVersion() CXX11_OVERRIDE { - return Version("Povides support for the /DCCALLOW command", VF_COMMON | VF_VENDOR); + return Version("Provides support for the /DCCALLOW command", VF_COMMON | VF_VENDOR); } };