diff options
| author | 2010-02-10 08:34:12 -0600 | |
|---|---|---|
| committer | 2010-08-03 17:32:35 -0400 | |
| commit | ac222736ddfdb3b04891814b7691aa2799b91ae2 (patch) | |
| tree | 4a4ee419ea8f39f6b12b8847f3ccab6de0592c83 /src/users.cpp | |
| parent | Show listmodes in CHECK output (diff) | |
Convert allowed oper-only modes to use names instead of letters
Diffstat (limited to 'src/users.cpp')
| -rw-r--r-- | src/users.cpp | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/src/users.cpp b/src/users.cpp index 0fc74ee7a..38f4563a3 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -375,20 +375,26 @@ void LocalUser::RemoveInvite(const irc::string &channel) } } -bool User::HasModePermission(unsigned char, ModeType) +bool User::HasModePermission(ModeID) { return true; } -bool LocalUser::HasModePermission(unsigned char mode, ModeType type) +bool LocalUser::HasModePermission(ModeID id) { if (!IS_OPER(this)) return false; - if (mode < 'A' || mode > ('A' + 64)) return false; + ModeHandler* mh = ServerInstance->Modes->FindMode(id); + if (!mh) + return false; - return ((type == MODETYPE_USER ? oper->AllowedUserModes : oper->AllowedChanModes))[(mode - 'A')]; + if (oper->AllowedModes.find(mh->name) != oper->AllowedModes.end()) + return true; + else if (oper->AllowedModes.find("*") != oper->AllowedModes.end()) + return true; + return false; } /* * users on remote servers can completely bypass all permissions based checks. @@ -611,9 +617,8 @@ void OperInfo::init() { AllowedOperCommands.clear(); AllowedPrivs.clear(); - AllowedUserModes.reset(); - AllowedChanModes.reset(); - AllowedUserModes['o' - 'A'] = true; // Call me paranoid if you want. + AllowedModes.clear(); + AllowedModes.insert("oper"); // Call me paranoid if you want. for(std::vector<reference<ConfigTag> >::iterator iter = class_blocks.begin(); iter != class_blocks.end(); ++iter) { @@ -632,28 +637,29 @@ void OperInfo::init() AllowedPrivs.insert(mypriv); } + irc::spacesepstream ModeList(tag->getString("modes")); + while (ModeList.GetToken(mypriv)) + { + AllowedModes.insert(mypriv); + } + + // backwards compatability for by-letter configuration for (unsigned char* c = (unsigned char*)tag->getString("usermodes").c_str(); *c; ++c) { if (*c == '*') - { - this->AllowedUserModes.set(); - } - else - { - this->AllowedUserModes[*c - 'A'] = true; - } + AllowedModes.insert("*"); + ModeHandler* mh = ServerInstance->Modes->FindMode(*c, MODETYPE_USER); + if (mh) + AllowedModes.insert(mh->name); } for (unsigned char* c = (unsigned char*)tag->getString("chanmodes").c_str(); *c; ++c) { if (*c == '*') - { - this->AllowedChanModes.set(); - } - else - { - this->AllowedChanModes[*c - 'A'] = true; - } + AllowedModes.insert("*"); + ModeHandler* mh = ServerInstance->Modes->FindMode(*c, MODETYPE_CHANNEL); + if (mh) + AllowedModes.insert(mh->name); } } } |
