/* * InspIRCd -- Internet Relay Chat Daemon * * Copyright (C) 2018-2021, 2023 Sadie Powell * Copyright (C) 2012-2013 Attila Molnar * Copyright (C) 2012, 2019 Robby * Copyright (C) 2009 Thomas Stagner * Copyright (C) 2009 Daniel De Graaf * Copyright (C) 2007-2008 Robin Burchell * Copyright (C) 2007 Dennis Friis * Copyright (C) 2005-2006 Craig Edwards * * 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 "numerichelper.h" class ModuleOperLevels final : public Module { public: ModuleOperLevels() : Module(VF_VENDOR, "Allows the server administrator to define ranks for server operators which prevent lower ranked server operators from using /KILL on higher ranked server operators.") { } ModResult OnKill(User* source, User* dest, const std::string &reason) override { // oper killing an oper? if (dest->IsOper() && source->IsOper()) { unsigned long dest_level = dest->oper->GetConfig()->getNum("level", 0); unsigned long source_level = source->oper->GetConfig()->getNum("level", 0); if (dest_level > source_level) { if (source->IsLocal()) { ServerInstance->SNO.WriteGlobalSno('a', "Oper {} (level {}) attempted to /KILL a higher level oper: {} (level {}), reason: {}", source->nick, source_level, dest->nick, dest_level, reason); } dest->WriteNotice("*** Oper " + source->nick + " attempted to /KILL you!"); source->WriteNumeric(Numerics::NoPrivileges("oper {} is a higher level than you", dest->nick)); return MOD_RES_DENY; } } return MOD_RES_PASSTHRU; } }; MODULE_INIT(ModuleOperLevels)