aboutsummaryrefslogtreecommitdiffstats
path: root/src/users.cpp
diff options
context:
space:
mode:
authorGravatar Daniel De Graaf2010-02-10 08:34:12 -0600
committerGravatar Daniel De Graaf2010-08-03 17:32:35 -0400
commitac222736ddfdb3b04891814b7691aa2799b91ae2 (patch)
tree4a4ee419ea8f39f6b12b8847f3ccab6de0592c83 /src/users.cpp
parentShow 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.cpp48
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);
}
}
}