From f0debf907a36846e3b48767e9797880135a4583b Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Tue, 30 Aug 2016 16:05:01 +0200 Subject: [PATCH] Pass the ModeHandler to User::HasModePermission() Mark the method as const --- include/users.h | 10 ++++------ src/mode.cpp | 2 +- src/modules/m_check.cpp | 4 ++-- src/users.cpp | 7 ++++--- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/include/users.h b/include/users.h index b97c62d4a..ae76d2eb3 100644 --- a/include/users.h +++ b/include/users.h @@ -455,11 +455,10 @@ class CoreExport User : public Extensible /** Returns true or false if a user can set a privileged user or channel mode. * This is done by looking up their oper type from User::oper, then referencing * this to their oper classes, and checking the modes they can set. - * @param mode The mode the check - * @param type ModeType (MODETYPE_CHANNEL or MODETYPE_USER). + * @param mh Mode to check * @return True if the user can set or unset this mode. */ - virtual bool HasModePermission(unsigned char mode, ModeType type); + virtual bool HasModePermission(const ModeHandler* mh) const; /** Creates a usermask with real host. * Takes a buffer to use and fills the given buffer with the hostmask in the format user\@host @@ -864,11 +863,10 @@ class CoreExport LocalUser : public User, public insp::intrusive_list_nodeNeedsOper() && !user->HasModePermission(modechar, type)) + if ((adding) && (IS_LOCAL(user)) && (mh->NeedsOper()) && (!user->HasModePermission(mh))) { /* It's an oper only mode, and they don't have access to it. */ if (user->IsOper()) diff --git a/src/modules/m_check.cpp b/src/modules/m_check.cpp index 17eb9d9c5..ddac033c1 100644 --- a/src/modules/m_check.cpp +++ b/src/modules/m_check.cpp @@ -184,10 +184,10 @@ class CommandCheck : public Command for(char c='A'; c <= 'z'; c++) { ModeHandler* mh = ServerInstance->Modes->FindMode(c, MODETYPE_USER); - if (mh && mh->NeedsOper() && loctarg->HasModePermission(c, MODETYPE_USER)) + if (mh && mh->NeedsOper() && loctarg->HasModePermission(mh)) umodes.push_back(c); mh = ServerInstance->Modes->FindMode(c, MODETYPE_CHANNEL); - if (mh && mh->NeedsOper() && loctarg->HasModePermission(c, MODETYPE_CHANNEL)) + if (mh && mh->NeedsOper() && loctarg->HasModePermission(mh)) cmodes.push_back(c); } context.Write("modeperms", "user=" + umodes + " channel=" + cmodes); diff --git a/src/users.cpp b/src/users.cpp index c57b6fc14..5d1c12b13 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -153,19 +153,20 @@ const std::string& User::GetFullRealHost() return this->cached_fullrealhost; } -bool User::HasModePermission(unsigned char, ModeType) +bool User::HasModePermission(const ModeHandler* mh) const { return true; } -bool LocalUser::HasModePermission(unsigned char mode, ModeType type) +bool LocalUser::HasModePermission(const ModeHandler* mh) const { if (!this->IsOper()) return false; + const unsigned char mode = mh->GetModeChar(); if (mode < 'A' || mode > ('A' + 64)) return false; - return ((type == MODETYPE_USER ? oper->AllowedUserModes : oper->AllowedChanModes))[(mode - 'A')]; + return ((mh->GetModeType() == MODETYPE_USER ? oper->AllowedUserModes : oper->AllowedChanModes))[(mode - 'A')]; } /* -- 2.39.2