summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/users.h10
-rw-r--r--src/mode.cpp2
-rw-r--r--src/modules/m_check.cpp4
-rw-r--r--src/users.cpp7
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_node<Local
/** 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.
*/
- bool HasModePermission(unsigned char mode, ModeType type);
+ bool HasModePermission(const ModeHandler* mh) const;
};
class RemoteUser : public User
diff --git a/src/mode.cpp b/src/mode.cpp
index beea6d3a0..b7a7b7d41 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -294,7 +294,7 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, Mode
}
}
- if (adding && IS_LOCAL(user) && mh->NeedsOper() && !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')];
}
/*