From: Chris Porter Date: Sat, 8 Mar 2008 23:49:42 +0000 (+0000) Subject: Add chanlev/ban limits. X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/commitdiff_plain/705542fac2cb940bdc9beec16b5ca65fa646a5a7 Add chanlev/ban limits. --- diff --git a/chanserv/chancmds/adduser.c b/chanserv/chancmds/adduser.c index 953a0b2a..0fb3778f 100644 --- a/chanserv/chancmds/adduser.c +++ b/chanserv/chancmds/adduser.c @@ -33,13 +33,13 @@ int csc_doadduser(void *source, int cargc, char **cargv) { nick *sender=source; chanindex *cip; - regchanuser *rcup; + regchanuser *rcup, *rcuplist; regchan *rcp; reguser *rup; flag_t addflags; char *flagbuf; - - int i=1; + unsigned int count=0; + int i; if (cargc<2) { chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "adduser"); @@ -79,7 +79,12 @@ int csc_doadduser(void *source, int cargc, char **cargv) { flagbuf=printflags(addflags, rcuflags); - for (;iregusers[i];rcuplist;rcuplist=rcuplist->nextbychan) + count++; + + for (i=1;i= MAXCHANLEVS) { + chanservstdmessage(sender, QM_TOOMANYCHANLEVS); + chanservstdmessage(sender, QM_DONE); + return CMD_OK; + } + rcup=getregchanuser(); rcup->chan=rcp; rcup->user=rup; diff --git a/chanserv/chancmds/chanlev.c b/chanserv/chancmds/chanlev.c index 2a208a5b..8acfeaa7 100644 --- a/chanserv/chancmds/chanlev.c +++ b/chanserv/chancmds/chanlev.c @@ -231,6 +231,18 @@ int csc_dochanlev(void *source, int cargc, char **cargv) { } if (!rcuplist) { + /* new user, we could store a count instead... that's probably better... */ + unsigned int count; + + for (count=i=0;iregusers[i];rcuplist;rcuplist=rcuplist->nextbychan) + count++; + + if(count >= MAXCHANLEVS) { + chanservstdmessage(sender, QM_TOOMANYCHANLEVS); + return CMD_ERROR; + } + rcuplist=getregchanuser(); rcuplist->user=target; rcuplist->chan=rcp; diff --git a/chanserv/chancmds/permban.c b/chanserv/chancmds/permban.c index 5cd8faec..c64c5fd4 100644 --- a/chanserv/chancmds/permban.c +++ b/chanserv/chancmds/permban.c @@ -41,6 +41,7 @@ int csc_dopermban(void *source, int cargc, char **cargv) { reguser *rup=getreguserfromnick(sender); struct chanban *b; char banbuf[1024]; + unsigned int count = 0; if (cargc<2) { chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "permban"); @@ -59,6 +60,7 @@ int csc_dopermban(void *source, int cargc, char **cargv) { b=makeban(banbuf); for(rbp=rcp->bans;rbp;rbp=rbp->next) { + count++; if(banequal(b,rbp->cbp)) { /* if they're equal and one is temporary we just replace it */ if(rbp->expiry) { if(toreplace) { /* shouldn't happen */ @@ -81,6 +83,12 @@ int csc_dopermban(void *source, int cargc, char **cargv) { return CMD_ERROR; } + if(count >= MAXBANS) { + freechanban(b); + chanservstdmessage(sender, QM_TOOMANYBANS); + return CMD_ERROR; + } + if(toreplace) { freechanban(b); chanservstdmessage(sender, QM_REPLACINGTEMPBAN); diff --git a/chanserv/chancmds/tempban.c b/chanserv/chancmds/tempban.c index 44681a82..d853c3a0 100644 --- a/chanserv/chancmds/tempban.c +++ b/chanserv/chancmds/tempban.c @@ -46,6 +46,7 @@ int csc_dotempban(void *source, int cargc, char **cargv) { unsigned int duration; struct chanban *b; char banbuf[1024]; + unsigned int count = 0; if (cargc<3) { chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "tempban"); @@ -71,6 +72,7 @@ int csc_dotempban(void *source, int cargc, char **cargv) { b=makeban(banbuf); for(rbp=rcp->bans;rbp;rbp=rbp->next) { + count++; if(banequal(b,rbp->cbp)) { if(rbp->expiry && (duration > rbp->expiry)) { if(toreplace) { /* shouldn't happen */ @@ -93,7 +95,13 @@ int csc_dotempban(void *source, int cargc, char **cargv) { freechanban(b); return CMD_ERROR; } - + + if(count >= MAXBANS) { + freechanban(b); + chanservstdmessage(sender, QM_TOOMANYBANS); + return CMD_ERROR; + } + if(toreplace) { freechanban(b); chanservstdmessage(sender, QM_REPLACINGBANSDURATION); diff --git a/chanserv/chanserv.h b/chanserv/chanserv.h index 980a3b96..57603abd 100644 --- a/chanserv/chanserv.h +++ b/chanserv/chanserv.h @@ -58,6 +58,10 @@ #define MAXLANG 50 #define MAXMESSAGES 200 +/* Maximum number of user chanlevs and bans */ +#define MAXCHANLEVS 250 +#define MAXBANS 50 + /* Sources of entropy and standard length defines */ #define ENTROPYSOURCE "/dev/urandom" #define ENTROPYLEN 8 @@ -217,6 +221,8 @@ #define QM_PERMBANALREADYSET 151 #define QM_NOTREPLACINGBANLDURATION 152 #define QM_REPLACINGBANSDURATION 153 +#define QM_TOOMANYCHANLEVS 154 +#define QM_TOOMANYBANS 155 /* List of privileged operations */ diff --git a/chanserv/database/chanservdb_messages.c b/chanserv/database/chanservdb_messages.c index 57105206..94fcc307 100644 --- a/chanserv/database/chanservdb_messages.c +++ b/chanserv/database/chanservdb_messages.c @@ -162,6 +162,8 @@ char *defaultmessages[MAXMESSAGES] = { /* 151*/ "That permanent ban already exists.", /* 152*/ "A ban with the same mask and longer duration exists, aborting.", /* 153*/ "Replacing existing ban with the same mask as it has a shorter duration.", + /* 154*/ "Channel has too many user entries, aborting.", + /* 155*/ "Channel has too many bans set, aborting.", }; void initmessages() {