Fix for bug #466 reported by John

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@9042 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
brain 2008-02-26 20:46:21 +00:00
parent b8412d56a2
commit 68216fd12c
2 changed files with 18 additions and 4 deletions

View File

@ -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

View File

@ -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)