diff options
author | rburchell <rburchell@5417fbe8-f217-4b02-8779-1006273d7864> | 2009-02-28 00:48:36 +0000 |
---|---|---|
committer | rburchell <rburchell@5417fbe8-f217-4b02-8779-1006273d7864> | 2009-02-28 00:48:36 +0000 |
commit | 090107db5f2afa16e155f56d7928e38d0a17a295 (patch) | |
tree | 396c2d0fd726a40aecd3d866f1a8cfdc0bc54732 /src/core/cs_access.c | |
parent | f2fb7ef53f1082f5c194f56f80592111051f1f76 (diff) |
Add access checking to cs_* modules. Also change number of arguments for cs_modes commands.
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2134 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/core/cs_access.c')
-rw-r--r-- | src/core/cs_access.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/src/core/cs_access.c b/src/core/cs_access.c index 0996a48cf..1d7264314 100644 --- a/src/core/cs_access.c +++ b/src/core/cs_access.c @@ -34,7 +34,8 @@ static int access_del(User * u, ChannelInfo *ci, ChanAccess * access, int *perm, char *nick; if (!access->in_use) return 0; - if (!is_services_admin(u) && uacc <= access->level) { + if (uacc <= access->level && !u->nc->HasPriv("chanserv/access/change")) + { (*perm)++; return 0; } @@ -116,7 +117,6 @@ class CommandCSAccess : public Command unsigned i; int level = 0, ulev; int is_list = (cmd && stricmp(cmd, "LIST") == 0); - int is_servadmin = is_services_admin(u); /* If LIST, we don't *require* any parameters, but we can take any. * If DEL, we require a nick and no level. @@ -134,9 +134,13 @@ class CommandCSAccess : public Command notice_lang(s_ChanServ, u, CHAN_ACCESS_XOP_HOP, s_ChanServ); else notice_lang(s_ChanServ, u, CHAN_ACCESS_XOP, s_ChanServ); - } else if (((is_list && !check_access(u, ci, CA_ACCESS_LIST)) - || (!is_list && !check_access(u, ci, CA_ACCESS_CHANGE))) - && !is_servadmin) { + } else if ( + ( + (is_list && !check_access(u, ci, CA_ACCESS_LIST) && !u->nc->HasCommand("chanserv/access/list")) + || + (!is_list && !check_access(u, ci, CA_ACCESS_CHANGE) && !u->nc->HasPriv("chanserv/access/modify")) + )) + { notice_lang(s_ChanServ, u, ACCESS_DENIED); } else if (stricmp(cmd, "ADD") == 0) { if (readonly) { @@ -147,7 +151,8 @@ class CommandCSAccess : public Command level = atoi(s); ulev = get_access(u, ci); - if (!is_servadmin && level >= ulev) { + if (level >= ulev && !u->nc->HasPriv("chanserv/access/modify")) + { notice_lang(s_ChanServ, u, PERMISSION_DENIED); return MOD_CONT; } @@ -176,7 +181,8 @@ class CommandCSAccess : public Command access++, i++) { if (access->nc == nc) { /* Don't allow lowering from a level >= ulev */ - if (!is_servadmin && access->level >= ulev) { + if (access->level >= ulev && !u->nc->HasPriv("chanserv/access/change")) + { notice_lang(s_ChanServ, u, PERMISSION_DENIED); return MOD_CONT; } @@ -270,7 +276,8 @@ class CommandCSAccess : public Command return MOD_CONT; } access = &ci->access[i]; - if (!is_servadmin && get_access(u, ci) <= access->level) { + if (get_access(u, ci) <= access->level && !u->nc->HasPriv("chanserv/access/change")) + { deleted = 0; notice_lang(s_ChanServ, u, PERMISSION_DENIED); } else { @@ -352,7 +359,8 @@ class CommandCSAccess : public Command return MOD_CONT; } - if (!is_servadmin && !is_founder(u, ci)) { + if (!is_founder(u, ci) && !u->nc->HasPriv("chanserv/access/change")) + { notice_lang(s_ChanServ, u, PERMISSION_DENIED); return MOD_CONT; } @@ -420,7 +428,7 @@ class CommandCSLevels : public Command notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); } else if (ci->flags & CI_XOP) { notice_lang(s_ChanServ, u, CHAN_LEVELS_XOP); - } else if (!is_founder(u, ci) && !is_services_admin(u)) { + } else if (!is_founder(u, ci) && !u->nc->HasPriv("chanserv/access/change")) { notice_lang(s_ChanServ, u, ACCESS_DENIED); } else if (stricmp(cmd, "SET") == 0) { level = strtol(s, &error, 10); |