diff options
| author | 2010-02-26 16:13:56 -0600 | |
|---|---|---|
| committer | 2010-08-03 17:32:38 -0400 | |
| commit | 3a80eb767569a64f39d28a4f2f2e52520f24d599 (patch) | |
| tree | 8b621aaec77286236c3ec325c9e22f130b76367b /src/modules/m_opflags.cpp | |
| parent | Remove three rarely-used cache items (diff) | |
Change PermissionCheck to ModResult, allow flags to grant an ACL directly in addition to via +WX
Diffstat (limited to 'src/modules/m_opflags.cpp')
| -rw-r--r-- | src/modules/m_opflags.cpp | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/src/modules/m_opflags.cpp b/src/modules/m_opflags.cpp index 831ac281f..7eb5644e7 100644 --- a/src/modules/m_opflags.cpp +++ b/src/modules/m_opflags.cpp @@ -32,10 +32,26 @@ class OpFlagProviderImpl : public OpFlagProvider return ""; } - bool PermissionCheck(Membership* memb, const std::string& needed) + ModResult PermissionCheck(Membership* memb, const std::string& acl, const std::string& needed) { if (!memb) - return false; + return MOD_RES_DENY; + + std::string* mine = ext.get(memb); + if (mine && !acl.empty()) + { + irc::commasepstream myflags(*mine); + std::string myflag; + while (myflags.GetToken(myflag)) + { + if (acl == myflag) + return MOD_RES_ALLOW; + } + } + + if (needed.empty()) + return MOD_RES_PASSTHRU; + irc::commasepstream flags(needed); std::string flag; if (flags.GetToken(flag)) @@ -45,11 +61,9 @@ class OpFlagProviderImpl : public OpFlagProvider ServerInstance->Modes->FindMode(flag); unsigned int neededrank = privmh ? privmh->GetPrefixRank() : INT_MAX; if (memb->getRank() >= neededrank) - return true; + return MOD_RES_ALLOW; } - std::string* mine = ext.get(memb); - if (!mine) - return false; + while (flags.GetToken(flag)) { irc::commasepstream myflags(*mine); @@ -57,10 +71,10 @@ class OpFlagProviderImpl : public OpFlagProvider while (myflags.GetToken(myflag)) { if (flag == myflag) - return true; + return MOD_RES_ALLOW; } } - return false; + return MOD_RES_DENY; } }; @@ -117,7 +131,7 @@ class FlagCmd : public Command while (myflags.GetToken(flag)) flags.insert(flag); } - + bool adding = true; irc::commasepstream deltaflags(parameters[2]); while (deltaflags.GetToken(flag)) |
