From 4ee9021adbb10140c30d6027a97e4748cb2f5903 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 1 Nov 2013 04:58:38 -0400 Subject: Compare access entries created with the levels access system by access level and not by privilege set, as two entries can have the same privset but different levels, but still represent two different levels of access. This prevented users from adding other users at a lower access level when that level had the same privset as them. Spotted by TSG. --- modules/commands/cs_access.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'modules') diff --git a/modules/commands/cs_access.cpp b/modules/commands/cs_access.cpp index 0ecf95106..7a2d1a35b 100644 --- a/modules/commands/cs_access.cpp +++ b/modules/commands/cs_access.cpp @@ -43,13 +43,32 @@ class AccessChanAccess : public ChanAccess { this->level = convertTo(data); } + + bool operator>(const ChanAccess &other) const anope_override + { + if (this->provider != other.provider) + return ChanAccess::operator>(other); + else + return this->level > anope_dynamic_static_cast(other).level; + } + + bool operator<(const ChanAccess &other) const anope_override + { + if (this->provider != other.provider) + return ChanAccess::operator<(other); + else + return this->level < anope_dynamic_static_cast(other).level; + } }; class AccessAccessProvider : public AccessProvider { public: + static AccessAccessProvider *me; + AccessAccessProvider(Module *o) : AccessProvider(o, "access/access") { + me = this; } ChanAccess *Create() anope_override @@ -57,6 +76,7 @@ class AccessAccessProvider : public AccessProvider return new AccessChanAccess(this); } }; +AccessAccessProvider* AccessAccessProvider::me; class CommandCSAccess : public Command { @@ -91,7 +111,7 @@ class CommandCSAccess : public Command AccessGroup u_access = source.AccessFor(ci); const ChanAccess *highest = u_access.Highest(); - AccessChanAccess tmp_access(NULL); + AccessChanAccess tmp_access(AccessAccessProvider::me); tmp_access.ci = ci; tmp_access.level = level; -- cgit