]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Add chanlev/ban limits.
authorChris Porter <redacted>
Sat, 8 Mar 2008 23:49:42 +0000 (23:49 +0000)
committerChris Porter <redacted>
Sat, 8 Mar 2008 23:49:42 +0000 (23:49 +0000)
chanserv/chancmds/adduser.c
chanserv/chancmds/chanlev.c
chanserv/chancmds/permban.c
chanserv/chancmds/tempban.c
chanserv/chanserv.h
chanserv/database/chanservdb_messages.c

index 953a0b2aa62f9e6a2c2308a2516e36a1d1bb8335..0fb3778fe8ee4bbdab30c31012aace4b85035541 100644 (file)
 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 (;i<cargc;i++) {
+  /* ugh */
+  for (count=i=0;i<REGCHANUSERHASHSIZE;i++)
+    for (rcuplist=rcp->regusers[i];rcuplist;rcuplist=rcuplist->nextbychan)
+      count++;
+
+  for (i=1;i<cargc;i++) {
     if (!(rup=findreguser(sender, cargv[i])))
       continue;
 
@@ -88,6 +93,12 @@ int csc_doadduser(void *source, int cargc, char **cargv) {
       continue;
     }
 
+    if(count++ >= MAXCHANLEVS) {
+      chanservstdmessage(sender, QM_TOOMANYCHANLEVS);
+      chanservstdmessage(sender, QM_DONE);
+      return CMD_OK;
+    }
+
     rcup=getregchanuser();
     rcup->chan=rcp;
     rcup->user=rup;
index 2a208a5bff77a1f97ddfe19ee8b236baa3fa2b2f..8acfeaa72558e40d51c3ad8c96a2dd2897bd35c7 100644 (file)
@@ -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;i<REGCHANUSERHASHSIZE;i++)
+          for (rcuplist=rcp->regusers[i];rcuplist;rcuplist=rcuplist->nextbychan)
+            count++;
+
+        if(count >= MAXCHANLEVS) {
+          chanservstdmessage(sender, QM_TOOMANYCHANLEVS);
+          return CMD_ERROR;
+        }
+   
        rcuplist=getregchanuser();
        rcuplist->user=target;
        rcuplist->chan=rcp;
index 5cd8faec859fb4532ef8ffe3bfe4a79b5bec2d85..c64c5fd4253236ad3a22fab9d74dd3a4b48b7b0b 100644 (file)
@@ -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);
index 44681a82c3dc6049443a008f8067745064569bfb..d853c3a0e9c07fd4ad7e9f42f0b092f9667fa602 100644 (file)
@@ -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);
index 980a3b96917691eeb81dc424aaaa0b6b4cd487f2..57603abd9d4b0883c64ce3c4e77b0cd8bedf0fc7 100644 (file)
 #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
 #define QM_PERMBANALREADYSET       151
 #define QM_NOTREPLACINGBANLDURATION 152
 #define QM_REPLACINGBANSDURATION   153
+#define QM_TOOMANYCHANLEVS         154
+#define QM_TOOMANYBANS             155
 
 /* List of privileged operations */
 
index 57105206bb9e24872cc8315fd50f4a88025721f8..94fcc30719fdc918059236c3f2e575ecd031d1be 100644 (file)
@@ -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() {