diff options
| author | 2019-07-16 15:11:21 +0100 | |
|---|---|---|
| committer | 2019-07-16 16:48:18 +0100 | |
| commit | cd8b456f979733525941284639d8bf899173b429 (patch) | |
| tree | f1d26962e61c74c5acb076662a909beafbe8e5fd /src/modules/m_exemptchanops.cpp | |
| parent | Replace socketengine_{pthread,win32} with C++11 threads. (diff) | |
| parent | ssl_gnutls: remove PackageInfo directives for EOL Debian versions. (diff) | |
Merge branch 'insp3' into master.
Diffstat (limited to 'src/modules/m_exemptchanops.cpp')
| -rw-r--r-- | src/modules/m_exemptchanops.cpp | 74 |
1 files changed, 56 insertions, 18 deletions
diff --git a/src/modules/m_exemptchanops.cpp b/src/modules/m_exemptchanops.cpp index bbe97293f..6d2611285 100644 --- a/src/modules/m_exemptchanops.cpp +++ b/src/modules/m_exemptchanops.cpp @@ -29,27 +29,74 @@ class ExemptChanOps : public ListModeBase ExemptChanOps(Module* Creator) : ListModeBase(Creator, "exemptchanops", 'X', "End of channel exemptchanops list", 954, 953, false) { + syntax = "<restriction>:<prefix>"; + } + + static PrefixMode* FindMode(const std::string& mode) + { + if (mode.length() == 1) + return ServerInstance->Modes.FindPrefixMode(mode[0]); + + ModeHandler* mh = ServerInstance->Modes.FindMode(mode, MODETYPE_CHANNEL); + return mh ? mh->IsPrefixMode() : NULL; + } + + static bool ParseEntry(const std::string& entry, std::string& restriction, std::string& prefix) + { + // The entry must be in the format <restriction>:<prefix>. + std::string::size_type colon = entry.find(':'); + if (colon == std::string::npos || colon == entry.length()-1) + return false; + + restriction.assign(entry, 0, colon); + prefix.assign(entry, colon + 1, std::string::npos); + return true; + } + + ModResult AccessCheck(User* source, Channel* channel, std::string& parameter, bool adding) override + { + std::string restriction; + std::string prefix; + if (!ParseEntry(parameter, restriction, prefix)) + return MOD_RES_PASSTHRU; + + PrefixMode* pm = FindMode(prefix); + if (!pm) + return MOD_RES_PASSTHRU; + + if (channel->GetPrefixValue(source) >= pm->GetLevelRequired(adding)) + return MOD_RES_PASSTHRU; + + source->WriteNumeric(ERR_CHANOPRIVSNEEDED, channel->name, InspIRCd::Format("You must be able to %s mode %c (%s) to %s a restriction containing it", + adding ? "set" : "unset", pm->GetModeChar(), pm->name.c_str(), adding ? "add" : "remove")); + return MOD_RES_DENY; } bool ValidateParam(User* user, Channel* chan, std::string& word) override { - std::string::size_type p = word.find(':'); - if (p == std::string::npos) + std::string restriction; + std::string prefix; + if (!ParseEntry(word, restriction, prefix)) { - user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Invalid exemptchanops entry, format is <restriction>:<prefix>")); + user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word)); return false; } - std::string restriction(word, 0, p); // If there is a '-' in the restriction string ignore it and everything after it // to support "auditorium-vis" and "auditorium-see" in m_auditorium - p = restriction.find('-'); - if (p != std::string::npos) - restriction.erase(p); + std::string::size_type dash = restriction.find('-'); + if (dash != std::string::npos) + restriction.erase(dash); if (!ServerInstance->Modes.FindMode(restriction, MODETYPE_CHANNEL)) { - user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Unknown restriction")); + user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Unknown restriction.")); + return false; + } + + if (prefix != "*" && !FindMode(prefix)) + { + user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Unknown prefix mode.")); return false; } @@ -67,15 +114,6 @@ class ExemptHandler : public CheckExemption::EventListener { } - PrefixMode* FindMode(const std::string& mid) - { - if (mid.length() == 1) - return ServerInstance->Modes.FindPrefixMode(mid[0]); - - ModeHandler* mh = ServerInstance->Modes.FindMode(mid, MODETYPE_CHANNEL); - return mh ? mh->IsPrefixMode() : NULL; - } - ModResult OnCheckExemption(User* user, Channel* chan, const std::string& restriction) override { unsigned int mypfx = chan->GetPrefixValue(user); @@ -95,7 +133,7 @@ class ExemptHandler : public CheckExemption::EventListener } } - PrefixMode* mh = FindMode(minmode); + PrefixMode* mh = ExemptChanOps::FindMode(minmode); if (mh && mypfx >= mh->GetPrefixRank()) return MOD_RES_ALLOW; if (mh || minmode == "*") |
