diff options
author | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2010-02-03 16:28:08 +0000 |
---|---|---|
committer | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2010-02-03 16:28:08 +0000 |
commit | 04cfaea87edd1b4b742cb607ea69ece760c460aa (patch) | |
tree | 5b7e5671290d808353f2c0c6064f74cee1182b6a /src/modules/m_autoop.cpp | |
parent | b7caf477e6ac3a6ba5790c0915783be02b8b6d41 (diff) |
Add access checking for m_autoop
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@12361 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules/m_autoop.cpp')
-rw-r--r-- | src/modules/m_autoop.cpp | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/src/modules/m_autoop.cpp b/src/modules/m_autoop.cpp index a66e2bd4d..5dc54fba6 100644 --- a/src/modules/m_autoop.cpp +++ b/src/modules/m_autoop.cpp @@ -25,8 +25,30 @@ class AutoOpList : public ListModeBase { levelrequired = OP_VALUE; } - // TODO need own numerics - // TODO add some serious access control for setting this mode (you can currently gain +qa with it) + + ModResult AccessCheck(User* source, Channel* channel, std::string ¶meter, bool adding) + { + std::string::size_type pos = parameter.find(':'); + if (pos == 0 || pos == std::string::npos) + return adding ? MOD_RES_DENY : MOD_RES_PASSTHRU; + unsigned int mylevel = channel->GetPrefixValue(source); + while (pos > 0) + { + pos--; + ModeHandler* mh = ServerInstance->Modes->FindMode(parameter[pos], MODETYPE_CHANNEL); + if (adding && !mh) + return MOD_RES_DENY; + else if (!mh) + continue; + + std::string dummy; + if (mh->AccessCheck(source, channel, dummy, true) == MOD_RES_DENY) + return MOD_RES_DENY; + if (mh->GetLevelRequired() > mylevel) + return MOD_RES_DENY; + } + return MOD_RES_PASSTHRU; + } }; @@ -58,10 +80,7 @@ public: if (colon == std::string::npos) continue; if (chan->CheckBan(user, it->mask.substr(colon+1))) - { - privs = it->mask.substr(0, colon); - break; - } + privs += it->mask.substr(0, colon); } } |