X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/31a0c5fe57af0a06320dce4edef845469e51947c..0d6366b6a61a69b26dc0cde44eb85e3293c6659d:/trusts/trusts_management.c diff --git a/trusts/trusts_management.c b/trusts/trusts_management.c index a387b21a..8f72f4d6 100644 --- a/trusts/trusts_management.c +++ b/trusts/trusts_management.c @@ -8,8 +8,8 @@ #include "../core/schedule.h" #include "../irc/irc.h" #include "../lib/stringbuf.h" -#include "../noperserv/noperserv.h" -#include "../noperserv/noperserv_policy.h" +#include "../control/control.h" +#include "../control/control_policy.h" #include "trusts.h" MODULE_VERSION(""); @@ -69,14 +69,14 @@ static int trusts_cmdtrustadd(void *source, int cargc, char **cargv) { /* OKAY! Lots of checking here! * * Need to check: - * - host isn't already covered by given group (reject if it is) + * - exact same host isn't already covered by given group (reject if it is) * - host doesn't already exist exactly already (reject if it does) * - host is more specific than an existing one (warn if it is, fix up later) * - host is less specific than an existing one (warn if it is, don't need to do anything special) */ for(th=tg->hosts;th;th=th->next) { - if(ipmask_check(&ip, &th->ip, th->bits)) { + if(ipmask_check(&ip, &th->ip, th->bits) && th->bits == bits) { controlreply(sender, "This host (or part of it) is already covered in the given group."); return CMD_ERROR; } @@ -401,6 +401,20 @@ static int modifyreliableusername(void *arg, char *num, nick *source, int overri return 1; } +static int modifyunthrottle(void *arg, char *num, nick *source, int override) { + trustgroup *tg = arg; + + if(num[0] == '1') { + tg->flags |= TRUST_UNTHROTTLE; + } else if(num[0] == '0') { + tg->flags &= ~TRUST_UNTHROTTLE; + } else { + return 0; + } + + return 1; +} + static int modifyexpires(void *arg, char *expires, nick *source, int override) { trustgroup *tg = arg; int howlong = durationtolong(expires); @@ -487,6 +501,11 @@ static int modifynodebits(void *arg, char *num, nick *source, int override) { if(irc_in_addr_is_ipv4(&th->ip)) nodebits += 96; + if(nodebits > 128) { + controlreply(source, "Node bits is invalid."); + return 0; + } + if(!override) { int minbits = irc_in_addr_is_ipv4(&th->ip)?TRUST_MIN_UNPRIVILEGED_NODEBITS_IPV4:TRUST_MIN_UNPRIVILEGED_NODEBITS_IPV6; @@ -514,9 +533,8 @@ static struct trustmodification *trusthostmods; static int trusts_cmdtrustgroupmodify(void *source, int cargc, char **cargv) { trustgroup *tg; nick *sender = source; - char *what, *to, validfields[512]; + char *what, *to; int i, override; - StringBuf b; if(cargc < 3) return CMD_USAGE; @@ -538,7 +556,6 @@ static int trusts_cmdtrustgroupmodify(void *source, int cargc, char **cargv) { return CMD_ERROR; } - sbinit(&b, validfields, sizeof(validfields)); for(i=0;i 0) - sbaddstr(&b, ", "); - sbaddstr(&b, trustgroupmods[i].name); } - if(i == trustgroupmods_a.cursi) { - sbterminate(&b); - controlreply(sender, "No such field, valid fields are: %s", validfields); - return CMD_ERROR; - } + if(i == trustgroupmods_a.cursi) + return CMD_USAGE; triggerhook(HOOK_TRUSTS_MODIFYGROUP, tg); tg_update(tg); @@ -573,9 +583,8 @@ static int trusts_cmdtrusthostmodify(void *source, int cargc, char **cargv) { trustgroup *tg; trusthost *th; nick *sender = source; - char *what, *to, validfields[512]; + char *what, *to; int i, override; - StringBuf b; struct irc_in_addr ip; unsigned char bits; @@ -619,7 +628,6 @@ static int trusts_cmdtrusthostmodify(void *source, int cargc, char **cargv) { override = noperserv_policy_command_permitted(NO_DEVELOPER, sender); - sbinit(&b, validfields, sizeof(validfields)); for(i=0;i 0) - sbaddstr(&b, ", "); - sbaddstr(&b, trusthostmods[i].name); } - if(i == trusthostmods_a.cursi) { - sbterminate(&b); - controlreply(sender, "No such field, valid fields are: %s", validfields); - return CMD_ERROR; - } + if(i == trusthostmods_a.cursi) + return CMD_USAGE; triggerhook(HOOK_TRUSTS_MODIFYHOST, th); th_update(th); @@ -741,6 +742,11 @@ static int trusts_cmdtrustcleanup(void *source, int cargc, char **cargv) { static int commandsregistered; static void registercommands(int hooknum, void *arg) { + static char tgmhelp[512], thmhelp[512]; + char validfields[512]; + StringBuf b; + int i; + if(commandsregistered) return; commandsregistered = 1; @@ -749,8 +755,29 @@ static void registercommands(int hooknum, void *arg) { registercontrolhelpcmd("trustadd", NO_OPER, 2, trusts_cmdtrustadd, "Usage: trustadd <#id|name|id> "); registercontrolhelpcmd("trustgroupdel", NO_OPER, 1, trusts_cmdtrustgroupdel, "Usage: trustgroupdel <#id|name|id>"); registercontrolhelpcmd("trustdel", NO_OPER, 2, trusts_cmdtrustdel, "Usage: trustdel <#id|name|id> "); - registercontrolhelpcmd("trustgroupmodify", NO_OPER, 3, trusts_cmdtrustgroupmodify, "Usage: trustgroupmodify <#id|name|id> "); - registercontrolhelpcmd("trusthostmodify", NO_OPER, 4, trusts_cmdtrusthostmodify, "Usage: trusthostmodify <#id|name|id> "); + + sbinit(&b, validfields, sizeof(validfields)); + for(i=0;i 0) + sbaddstr(&b, ", "); + sbaddstr(&b, trustgroupmods[i].name); + } + sbterminate(&b); + + snprintf(tgmhelp, sizeof(tgmhelp), "Usage: trustgroupmodify <#id|name|id> \nModifies a trust group.\nValid fields: %s", validfields); + registercontrolhelpcmd("trustgroupmodify", NO_OPER, 3, trusts_cmdtrustgroupmodify, tgmhelp); + + sbinit(&b, validfields, sizeof(validfields)); + for(i=0;i 0) + sbaddstr(&b, ", "); + sbaddstr(&b, trusthostmods[i].name); + } + sbterminate(&b); + + snprintf(thmhelp, sizeof(thmhelp), "Usage: trusthostmodify <#id|name|id> \nModifies a trust host\nValid fields: %s", validfields); + registercontrolhelpcmd("trusthostmodify", NO_OPER, 4, trusts_cmdtrusthostmodify, thmhelp); + registercontrolhelpcmd("trustlog", NO_OPER, 2, trusts_cmdtrustlog, "Usage: trustlog <#id|name> ?limit?\nShows log for the specified trust group."); registercontrolhelpcmd("trustloggrep", NO_OPER, 2, trusts_cmdtrustloggrep, "Usage trustloggrep ?limit?\nShows maching log entries."); registercontrolhelpcmd("trustcomment", NO_OPER, 2, trusts_cmdtrustcomment, "Usage: trustcomment <#id|name> \nLogs a comment for a trust."); @@ -790,6 +817,7 @@ static void setupmods(void) { MSGROUP(trustedfor); MSGROUP(cleanup); MSGROUP(protected); + MSGROUP(unthrottle); MSHOST(maxpernode); MSHOST(nodebits); @@ -804,15 +832,18 @@ static void cleanuptrusts(void *arg) { trusthost *th; int thcount = 0, tgcount = 0; int i; + flag_t noticelevel; array expiredths, expiredtgs; now = getnettime(); to_age = now - (CLEANUP_TH_INACTIVE * 3600 * 24); if(np) { - controlwall(NO_OPER, NL_TRUSTS, "CLEANUPTRUSTS: Manually started by %s.", np->nick); + noticelevel = NL_TRUSTS; + controlwall(NO_OPER, noticelevel, "CLEANUPTRUSTS: Manually started by %s.", np->nick); } else { - controlwall(NO_OPER, NL_TRUSTS, "CLEANUPTRUSTS: Automatically started."); + noticelevel = NL_CLEANUP; + controlwall(NO_OPER, noticelevel, "CLEANUPTRUSTS: Automatically started."); } if (cleanuptrusts_active) { @@ -838,7 +869,7 @@ static void cleanuptrusts(void *arg) { } for(i=0;i