From 3a80eb767569a64f39d28a4f2f2e52520f24d599 Mon Sep 17 00:00:00 2001 From: Daniel De Graaf Date: Fri, 26 Feb 2010 16:13:56 -0600 Subject: Change PermissionCheck to ModResult, allow flags to grant an ACL directly in addition to via +WX --- src/modules/m_opflags.cpp | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) (limited to 'src/modules/m_opflags.cpp') 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)) -- cgit v1.3.1-10-gc9f91