summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mode.cpp2
-rw-r--r--src/users.cpp20
2 files changed, 18 insertions, 4 deletions
diff --git a/src/mode.cpp b/src/mode.cpp
index b3f05bd37..efb1a4cf0 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -521,13 +521,11 @@ void ModeParser::Process(const char* const* parameters, int pcnt, User *user, bo
if (!SkipAccessChecks && IS_LOCAL(user) && (MOD_RESULT != ACR_ALLOW))
{
- ServerInstance->Logs->Log("MODE", DEBUG,"Enter minimum prefix check");
/* Check access to this mode character */
if ((type == MODETYPE_CHANNEL) && (modehandlers[handler_id]->GetNeededPrefix()))
{
char needed = modehandlers[handler_id]->GetNeededPrefix();
ModeHandler* prefixmode = FindPrefix(needed);
- ServerInstance->Logs->Log("MODE", DEBUG,"Needed prefix: %c", needed);
/* If the mode defined by the handler is not '\0', but the handler for it
* cannot be found, they probably dont have the right module loaded to implement
diff --git a/src/users.cpp b/src/users.cpp
index 9da905918..aeb985237 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -703,11 +703,27 @@ void User::UnOper()
{
if (IS_OPER(this))
{
- // unset their oper type (what IS_OPER checks), and remove +o
+ /* Remove all oper only modes from the user when the deoper - Bug #466*/
+ std::string moderemove("-");
+
+ for (unsigned char letter = 'A'; letter <= 'z'; letter++)
+ {
+ if (letter != 'o')
+ {
+ ModeHandler* mh = ServerInstance->Modes->FindMode(letter, MODETYPE_USER);
+ if (mh && mh->NeedsOper())
+ moderemove += letter;
+ }
+ }
+
+ const char* parameters[] = { this->nick, moderemove.c_str() };
+ ServerInstance->Parser->CallHandler("MODE", parameters, 2, this);
+
+ /* unset their oper type (what IS_OPER checks), and remove +o */
*this->oper = 0;
this->modes[UM_OPERATOR] = 0;
- // remove the user from the oper list. Will remove multiple entries as a safeguard against bug #404
+ /* remove the user from the oper list. Will remove multiple entries as a safeguard against bug #404 */
ServerInstance->Users->all_opers.remove(this);
if (AllowedOperCommands)