]> jfr.im git - irc/quakenet/newserv.git/commitdiff
chanserv: Limit number of channels a user can have flags on.
authorGunnar Beutner <redacted>
Fri, 28 Jun 2013 15:25:33 +0000 (17:25 +0200)
committerGunnar Beutner <redacted>
Fri, 28 Jun 2013 15:25:33 +0000 (17:25 +0200)
--HG--
branch : shroudrequest

chanserv/chancmds/addchan.c
chanserv/chancmds/adduser.c
chanserv/chancmds/chanlev.c
chanserv/chanserv.h
chanserv/chanserv_messages.h

index ec4e13cbd3c8957d59128a62cf379c2fa8c7816d..a77e2258505883a801a529a55f30737dbeb102ba 100644 (file)
@@ -37,7 +37,7 @@ int csc_doaddchan(void *source, int cargc, char **cargv) {
   reguser *founder;
   flag_t flags;
   short type=0;
-  unsigned int i;
+  unsigned int i, count;
   void *args[3];
   
   if (!rup)
@@ -102,7 +102,19 @@ int csc_doaddchan(void *source, int cargc, char **cargv) {
       chanservstdmessage(notify, QM_ALREADYREGISTERED, cip->name->content);
     return CMD_ERROR;
   }
-  
+
+  count = 0;
+
+  for (rcup=founder->knownon;rcup;rcup=rcup->nextbyuser)
+    count++; 
+
+  if (count > MAXCHANNELS) {
+    chanservstdmessage(sender, QM_TOOMANYCHANNELS, cip->name->content);
+    if (notify)
+      chanservstdmessage(sender, QM_TOOMANYCHANNELS, cip->name->content);
+    return CMD_ERROR;
+  }
+
   /* Initialise the channel */ 
   rcp=getregchan();
   
index 556b32ac93739ddbebbbaacb63cbec1e88411594..b5e544f13c0bb6c50be79c7b914512fb28ac35ff 100644 (file)
 int csc_doadduser(void *source, int cargc, char **cargv) {
   nick *sender=source;
   chanindex *cip;
-  regchanuser *rcup, *rcuplist;
+  regchanuser *rcup, *trcup, *rcuplist;
   regchan *rcp;
   reguser *rup;
   flag_t addflags;
   char *flagbuf;
-  unsigned int count=0;
+  unsigned int chanlevcount=0, channelcount=0;
   int added=0;
   int i, foundflags=0;
   void *args[3];
@@ -82,9 +82,9 @@ int csc_doadduser(void *source, int cargc, char **cargv) {
   flagbuf=printflags(addflags, rcuflags);  
 
   /* ugh */
-  for (count=i=0;i<REGCHANUSERHASHSIZE;i++)
+  for (chanlevcount=i=0;i<REGCHANUSERHASHSIZE;i++)
     for (rcuplist=rcp->regusers[i];rcuplist;rcuplist=rcuplist->nextbychan)
-      count++;
+      chanlevcount++;
 
   /* If we found flags don't try to add them as a user as well.. */
   for (i=1+foundflags;i<cargc;i++) {
@@ -96,12 +96,21 @@ int csc_doadduser(void *source, int cargc, char **cargv) {
       continue;
     }
 
-    if(count++ >= MAXCHANLEVS) {
+    if(chanlevcount++ >= MAXCHANLEVS) {
       chanservstdmessage(sender, QM_TOOMANYCHANLEVS);
       chanservstdmessage(sender, QM_DONE);
       return CMD_OK;
     }
 
+    channelcount=0;
+    for (trcup=rup->knownon;trcup;trcup=trcup->nextbyuser)
+      channelcount++;
+
+    if(channelcount >= MAXCHANNELS) {
+      chanservstdmessage(sender, QM_TOOMANYCHANNELS);
+      return CMD_ERROR;
+    }
+
     rcup=getregchanuser();
     rcup->chan=rcp;
     rcup->user=rup;
index ee0588e74662996afacfcc6bb078da6d7c0660e6..3a9e66782d715438e1f8914c659cbfd57fdc7c47 100644 (file)
@@ -90,7 +90,7 @@ int csc_dochanlev(void *source, int cargc, char **cargv) {
   nick *sender=source;
   chanindex *cip;
   regchan *rcp;
-  regchanuser *rcup, *rcuplist;
+  regchanuser *rcup, *trcup, *rcuplist;
   regchanuser **rusers;
   reguser *rup=getreguserfromnick(sender), *target;
   char time1[TIMELEN],time2[TIMELEN];
@@ -267,17 +267,26 @@ 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;
+        unsigned int chanlevcount, channelcount;
 
-        for (count=i=0;i<REGCHANUSERHASHSIZE;i++)
+        for (chanlevcount=i=0;i<REGCHANUSERHASHSIZE;i++)
           for (rcuplist=rcp->regusers[i];rcuplist;rcuplist=rcuplist->nextbychan)
-            count++;
+            chanlevcount++;
 
-        if(count >= MAXCHANLEVS) {
+        if(chanlevcount >= MAXCHANLEVS) {
           chanservstdmessage(sender, QM_TOOMANYCHANLEVS);
           return CMD_ERROR;
         }
-   
+
+        channelcount=0;
+        for (trcup=target->knownon;trcup;trcup=trcup->nextbyuser)
+          channelcount++;
+
+        if(channelcount >= MAXCHANNELS) {
+          chanservstdmessage(sender, QM_TOOMANYCHANNELS);
+          return CMD_ERROR;
+        } 
+
        rcuplist=getregchanuser();
        rcuplist->user=target;
        rcuplist->chan=rcp;
index e9539b87ca79228f098f77da9171282ef4339dba..9c60a55e1ec98099347f2513287cce361e45d01d 100644 (file)
 #define MAXCHANLEVS  500
 #define MAXBANS      50
 
+/* Maximum number of channels a user may be known on when adding new channels */
+#define MAXCHANNELS  2
+
 /* Sources of entropy and standard length defines */
 #define ENTROPYSOURCE "/dev/urandom"
 #define ENTROPYLEN    8
index d31b09c96b4a5978e2924a77845c8693e86398b9..e18dbac8b2553a927c2fd486f83b8c97d94fa85e 100644 (file)
@@ -56,6 +56,7 @@ BeginMessages() {
   msg(QM_NOCHANBANAUTOREMOVE, "Bans on $0 will not be automatically removed.", "s"),
   msg(QM_INVALIDCHANNAME, "$0 is not a valid channel name.", "s"),
   msg(QM_ALREADYREGISTERED, "$0 is already registered.", "s"),
+  msg(QM_TOOMANYCHANNELS, "User is known on too many channels.", ""),
   msg(QM_CURUSERFLAGS, "User flags for $0: $1", "ss"),
   msg(QM_WELCOMEMESSAGEIS, "Welcome message for $0: $1", "ss"),
   msg(QM_GLOBALINFO, "Default info line: $0", "s"),