aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules/m_services.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2024-02-27 16:28:20 +0000
committerGravatar Sadie Powell2024-02-27 17:40:00 +0000
commit97d333901ec43e4e9a8e9d5025c3240161154a56 (patch)
treea56505f85dd0c6b7b9b084d4c9e93d8ef001d45c /src/modules/m_services.cpp
parentReplace FRHOST with a two parameter version of FHOST. (diff)
downloadinspircd++-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.cpp46
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;
}