/* * InspIRCd -- Internet Relay Chat Daemon * * Copyright (C) 2013, 2017-2020 Sadie Powell * Copyright (C) 2012-2013 Attila Molnar * Copyright (C) 2012, 2019 Robby * Copyright (C) 2009-2010 Daniel De Graaf * Copyright (C) 2008 Robin Burchell * Copyright (C) 2007-2008 Dennis Friis * Copyright (C) 2006-2007 Craig Edwards * Copyright (C) 2006 Oliver Lupton * * 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" #include "listmode.h" enum { // From RFC 2812. RPL_EXCEPTLIST = 348, RPL_ENDOFEXCEPTLIST = 349 }; class BanException : public ListModeBase { public: BanException(Module* Creator) : ListModeBase(Creator, "banexception", 'e', "End of Channel Exception List", RPL_EXCEPTLIST, RPL_ENDOFEXCEPTLIST, true) { syntax = ""; } }; class ModuleBanException : public Module { BanException be; public: ModuleBanException() : be(this) { } void On005Numeric(std::map& tokens) CXX11_OVERRIDE { tokens["EXCEPTS"] = ConvToStr(be.GetModeChar()); } ModResult OnExtBanCheck(User *user, Channel *chan, char type) CXX11_OVERRIDE { ListModeBase::ModeList* list = be.GetList(chan); if (!list) return MOD_RES_PASSTHRU; for (ListModeBase::ModeList::iterator it = list->begin(); it != list->end(); it++) { if (it->mask.length() <= 2 || it->mask[0] != type || it->mask[1] != ':') continue; if (chan->CheckBan(user, it->mask.substr(2))) { // They match an entry on the list, so let them pass this. return MOD_RES_ALLOW; } } return MOD_RES_PASSTHRU; } ModResult OnCheckChannelBan(User* user, Channel* chan) CXX11_OVERRIDE { ListModeBase::ModeList* list = be.GetList(chan); if (!list) { // No list, proceed normally return MOD_RES_PASSTHRU; } for (ListModeBase::ModeList::iterator it = list->begin(); it != list->end(); it++) { if (chan->CheckBan(user, it->mask)) { // They match an entry on the list, so let them in. return MOD_RES_ALLOW; } } return MOD_RES_PASSTHRU; } void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE { be.DoRehash(); } Version GetVersion() CXX11_OVERRIDE { return Version("Adds channel mode e (banexception) which allows channel operators to exempt user masks from the b (ban) channel mode.", VF_VENDOR); } }; MODULE_INIT(ModuleBanException)