diff --git a/src/modules/m_addmotd.c b/src/modules/m_addmotd.c index 6a9d33e5a..d356fdbb3 100644 --- a/src/modules/m_addmotd.c +++ b/src/modules/m_addmotd.c @@ -86,7 +86,7 @@ DLLFUNC CMD_FUNC(m_addmotd) if (!MyConnect(sptr)) return 0; - if (!(IsAdmin(sptr) || IsCoAdmin(sptr))) + if (!IsAdmin(sptr) && !IsCoAdmin(sptr) && !OperClass_evaluateACLPath(sptr->user->operlogin,"add:motd",sptr,NULL,NULL,NULL)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; diff --git a/src/modules/m_addomotd.c b/src/modules/m_addomotd.c index 20175d290..d1ede40aa 100644 --- a/src/modules/m_addomotd.c +++ b/src/modules/m_addomotd.c @@ -86,7 +86,7 @@ DLLFUNC CMD_FUNC(m_addomotd) if (!MyConnect(sptr)) return 0; - if (!(IsAdmin(sptr) || IsCoAdmin(sptr))) + if (!IsAdmin(sptr) && !IsCoAdmin(sptr) && !OperClass_evaluateACLPath(sptr->user->operlogin,"add:omotd",sptr,NULL,NULL,NULL)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; diff --git a/src/modules/m_adminchat.c b/src/modules/m_adminchat.c index 894dfd418..c5e4ec0c5 100644 --- a/src/modules/m_adminchat.c +++ b/src/modules/m_adminchat.c @@ -96,7 +96,7 @@ DLLFUNC int m_admins(aClient *cptr, aClient *sptr, int parc, char *parv[]) return 0; } #ifdef ADMINCHAT - if (MyClient(sptr) && !IsAdmin(sptr) && !IsCoAdmin(sptr)) + if (MyClient(sptr) && !IsAdmin(sptr) && !IsCoAdmin(sptr) && !OperClass_evaluateACLPath(sptr->user->operlogin,"chat:admin",sptr,NULL,NULL,NULL)) #else if (MyClient(sptr)) #endif diff --git a/src/modules/m_sajoin.c b/src/modules/m_sajoin.c index 2dd26c91f..6ec41afa1 100644 --- a/src/modules/m_sajoin.c +++ b/src/modules/m_sajoin.c @@ -85,23 +85,25 @@ DLLFUNC CMD_FUNC(m_sajoin) char jbuf[BUFSIZE]; int did_anything = 0; - if (!IsSAdmin(sptr) && !IsULine(sptr)) + if (parc < 3) + { + sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "SAJOIN"); + return 0; + } + + if (!(acptr = find_person(parv[1], NULL))) + { + sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], parv[1]); + return 0; + } + + /* Is this user disallowed from operating on this victim at all? */ + if (!IsSAdmin(sptr) && !IsULine(sptr) && !OperClass_evaluateACLPath(sptr->user->operlogin,"sajoin",sptr,acptr,NULL,NULL)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } - if (parc < 3) - { - sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "SAJOIN"); - return 0; - } - - if (!(acptr = find_person(parv[1], NULL))) - { - sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], parv[1]); - return 0; - } if (MyClient(acptr)) { char *name, *p = NULL; @@ -135,6 +137,14 @@ DLLFUNC CMD_FUNC(m_sajoin) } chptr = get_channel(acptr, name, 0); + + /* If this _specific_ channel is not permitted, skip it */ + if (!IsSAdmin(sptr) && !IsULine(sptr) && !OperClass_evaluateACLPath(sptr->user->operlogin,"sajoin",sptr,acptr,chptr,NULL)) + { + sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); + continue; + } + if (!parted && chptr && (lp = find_membership_link(acptr->user->channel, chptr))) { sendto_one(sptr, err_str(ERR_USERONCHANNEL), me.name, parv[0], diff --git a/src/modules/m_samode.c b/src/modules/m_samode.c index e4acd655c..b59bad929 100644 --- a/src/modules/m_samode.c +++ b/src/modules/m_samode.c @@ -82,24 +82,25 @@ DLLFUNC CMD_FUNC(m_samode) { aChannel *chptr; - if (!IsPrivileged(cptr) || !IsSAdmin(sptr)) + if (parc > 2) + { + chptr = find_channel(parv[1], NullChn); + if (chptr == NullChn) + return 0; + } + else + { + sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), + me.name, parv[0], "SAMODE"); + return 0; + } + + if ((!IsPrivileged(cptr) || !IsSAdmin(sptr)) && !OperClass_evaluateACLPath(sptr->user->operlogin,"samode",sptr,NULL,chptr,NULL)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } - if (parc > 2) - { - chptr = find_channel(parv[1], NullChn); - if (chptr == NullChn) - return 0; - } - else - { - sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), - me.name, parv[0], "SAMODE"); - return 0; - } opermode = 0; (void)do_mode(chptr, cptr, sptr, parc - 2, parv + 2, 0, 1); diff --git a/src/modules/m_sapart.c b/src/modules/m_sapart.c index 545a14e7c..8e0d6873b 100644 --- a/src/modules/m_sapart.c +++ b/src/modules/m_sapart.c @@ -92,24 +92,25 @@ DLLFUNC CMD_FUNC(m_sapart) char commentx[512]; char jbuf[BUFSIZE]; - if (!IsSAdmin(sptr) && !IsULine(sptr)) + if (parc < 3) + { + sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "SAPART"); + return 0; + } + + if (!(acptr = find_person(parv[1], NULL))) + { + sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], parv[1]); + return 0; + } + + /* See if we can operate on this vicim/this command */ + if (!IsSAdmin(sptr) && !IsULine(sptr) && !OperClass_evaluateACLPath(sptr->user->operlogin,"sapart",sptr,acptr,NULL,NULL)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } - if (parc < 3) - { - sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "SAPART"); - return 0; - } - - if (!(acptr = find_person(parv[1], NULL))) - { - sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], parv[1]); - return 0; - } - if (MyClient(acptr)) { /* Now works like m_join */ @@ -124,6 +125,14 @@ DLLFUNC CMD_FUNC(m_sapart) name); continue; } + + /* Validate oper can do this on chan/victim */ + if (!IsSAdmin(sptr) && !IsULine(sptr) && !OperClass_evaluateACLPath(sptr->user->operlogin,"sapart",sptr,acptr,chptr,NULL)) + { + sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); + continue; + } + if (!(lp = find_membership_link(acptr->user->channel, chptr))) { sendto_one(sptr, err_str(ERR_USERNOTINCHANNEL), me.name, parv[0], diff --git a/src/modules/m_sdesc.c b/src/modules/m_sdesc.c index 236df7b96..6ac307edb 100644 --- a/src/modules/m_sdesc.c +++ b/src/modules/m_sdesc.c @@ -81,7 +81,7 @@ DLLFUNC int MOD_UNLOAD(m_sdesc)(int module_unload) int m_sdesc(aClient *cptr, aClient *sptr, int parc, char *parv[]) { - if (!IsAdmin(sptr) && !IsCoAdmin(sptr)) + if (!IsAdmin(sptr) && !IsCoAdmin(sptr) && !OperClass_evaluateACLPath(sptr->user->operlogin,"add:description",sptr,NULL,NULL,NULL)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, sptr->name); return 0; diff --git a/src/modules/m_tsctl.c b/src/modules/m_tsctl.c index 46ac56231..e5a81ffa0 100644 --- a/src/modules/m_tsctl.c +++ b/src/modules/m_tsctl.c @@ -91,7 +91,7 @@ DLLFUNC int m_tsctl(aClient *cptr, aClient *sptr, int parc, char *parv[]) if (!MyClient(sptr)) goto doit; - if (!IsAdmin(sptr) && !IsCoAdmin(sptr)) + if (!IsAdmin(sptr) && !IsCoAdmin(sptr) && !OperClass_evaluateACLPath(sptr->user->operlogin,"tsctl",sptr,NULL,NULL,NULL)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; diff --git a/src/modules/m_wallops.c b/src/modules/m_wallops.c index b10fe90d3..a2dc18f40 100644 --- a/src/modules/m_wallops.c +++ b/src/modules/m_wallops.c @@ -87,7 +87,7 @@ DLLFUNC CMD_FUNC(m_wallops) me.name, parv[0], "WALLOPS"); return 0; } - if (MyClient(sptr) && !OPCanWallOps(sptr)) + if (MyClient(sptr) && !OPCanWallOps(sptr) && !OperClass_evaluateACLPath(sptr->user->operlogin,"chat:wallops",sptr,NULL,NULL,NULL)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0;