diff options
| author | 2024-02-27 16:28:20 +0000 | |
|---|---|---|
| committer | 2024-02-27 17:40:00 +0000 | |
| commit | 97d333901ec43e4e9a8e9d5025c3240161154a56 (patch) | |
| tree | a56505f85dd0c6b7b9b084d4c9e93d8ef001d45c /src/modules/m_services.cpp | |
| parent | Replace FRHOST with a two parameter version of FHOST. (diff) | |
| download | inspircd++-97d333901ec43e4e9a8e9d5025c3240161154a56.tar.gz inspircd++-97d333901ec43e4e9a8e9d5025c3240161154a56.tar.bz2 inspircd++-97d333901ec43e4e9a8e9d5025c3240161154a56.zip | |
Refactor the services module slightly.
Diffstat (limited to 'src/modules/m_services.cpp')
| -rw-r--r-- | src/modules/m_services.cpp | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/src/modules/m_services.cpp b/src/modules/m_services.cpp index 63f73bf99..1f9ac13c7 100644 --- a/src/modules/m_services.cpp +++ b/src/modules/m_services.cpp @@ -439,6 +439,30 @@ private: CommandSVSPart svspartcmd; bool accountoverrideshold; + bool HandleProtectedService(User* user, Channel* chan, const Modes::Change& change) + { + if (change.adding || change.param.empty()) + return true; // We only care about local users removing prefix modes. + + const auto* pm = change.mh->IsPrefixMode(); + if (!pm) + return true; // Mode is not a prefix mode. + + auto* target = ServerInstance->Users.Find(change.param); + if (!target) + return true; // Target does not exist. + + Membership* memb = chan->GetUser(target); + if (!memb || !memb->HasMode(pm)) + return true; // Target does not have the mode. + + if (!target->IsModeSet(servprotectmode)) + return true; // Target is not a protected service. + + user->WriteNumeric(ERR_RESTRICTED, chan->name, INSP_FORMAT("You are not permitted to remove privileges from {} services!", ServerInstance->Config->Network)); + return false; + } + public: ModuleServices() : Module(VF_COMMON | VF_VENDOR, "Provides support for integrating with a services server.") @@ -488,26 +512,12 @@ public: ModResult OnRawMode(User* user, Channel* chan, const Modes::Change& change) override { - if (!IS_LOCAL(user) || change.adding || change.param.empty()) - return MOD_RES_PASSTHRU; // We only care about local users removing prefix modes. - - const PrefixMode* const pm = change.mh->IsPrefixMode(); - if (!pm) - return MOD_RES_PASSTHRU; // Mode is not a prefix mode. - - auto* target = ServerInstance->Users.Find(change.param); - if (!target) - return MOD_RES_PASSTHRU; // Target does not exist. + if (!IS_LOCAL(user) || !chan) + return MOD_RES_PASSTHRU; // Not our job to handle. - Membership* memb = chan->GetUser(target); - if (!memb || !memb->HasMode(pm)) - return MOD_RES_PASSTHRU; // Target does not have the mode. - - if (target->IsModeSet(servprotectmode)) - { - user->WriteNumeric(ERR_RESTRICTED, chan->name, INSP_FORMAT("You are not permitted to remove privileges from {} services!", ServerInstance->Config->Network)); + if (!HandleProtectedService(user, chan, change)) return MOD_RES_DENY; - } + return MOD_RES_PASSTHRU; } |
