]> jfr.im git - irc/quakenet/newserv.git/commitdiff
recover/unbanme now remove registered bans, refactored the code from unbanmask too.
authorChris Porter <redacted>
Sun, 9 Mar 2008 00:51:16 +0000 (00:51 +0000)
committerChris Porter <redacted>
Sun, 9 Mar 2008 00:51:16 +0000 (00:51 +0000)
chanserv/chancmds/recover.c
chanserv/chancmds/unbanmask.c
chanserv/chancmds/unbanme.c
chanserv/chanserv.h
chanserv/chanservuser.c
chanserv/database/chanservdb_messages.c

index 156cba8933d7d45d9f7b3066c580b36859a1aa93..05ed9b1793b80d03fc9cbb23722a021dff9e938c 100644 (file)
@@ -59,6 +59,9 @@ int csc_dorecover(void *source, int cargc, char **cargv) {
       localdosetmode_ban(&changes, bantostring(cip->channel->bans), MCB_DEL);
     }
 
+    /* remove the registered bans that match on me */
+    cs_unbanfn(sender, cip, (UnbanFN)nickmatchban, sender, 1);
+
     /* deopall */
     for (i=0,lp=cip->channel->users->content;
         i<cip->channel->users->hashsize;i++,lp++) {
index 0771c8d5495a876b1e27219e6b138ffed0c62a3c..56dc5ce10f9073ee822332409c0a71cc1a223935 100644 (file)
 int csc_dounbanmask(void *source, int cargc, char **cargv) {
   nick *sender=source;
   chanindex *cip;
-  regban **rbh, *rbp;
-  chanban **cbh, *cbp;
-  regchan *rcp;
-  chanban *theban;
-  modechanges changes;
-  char *banstr;
+  struct chanban *theban;
 
   if (cargc<2) {
     chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "unbanmask");
@@ -47,54 +42,11 @@ int csc_dounbanmask(void *source, int cargc, char **cargv) {
   if (!(cip=cs_checkaccess(sender, cargv[0], CA_OPPRIV, NULL, "unbanmask", 0, 0)))
     return CMD_ERROR;
 
-  rcp=cip->exts[chanservext];
   theban=makeban(cargv[1]);
+  /* nice cast here */
+  cs_unbanfn(sender, cip, (UnbanFN)banoverlap, theban, 1);
+  cs_log(sender,"UNBANMASK %s",bantostring(theban));
 
-  if (cip->channel)
-    localsetmodeinit(&changes, cip->channel, chanservnick);
-    
-  for (rbh=&(rcp->bans); *rbh; ) {
-    rbp=*rbh;
-    if (banoverlap(theban, rbp->cbp)) {
-      banstr=bantostring(rbp->cbp);
-      /* Check perms and remove */
-      if (!cs_checkaccess(sender, NULL, CA_MASTERPRIV, cip, NULL, 0, 1)) {
-       chanservstdmessage(sender, QM_NOTREMOVEDPERMBAN, banstr, cip->name->content);
-       rbh=&(rbp->next);
-      } else {
-       chanservstdmessage(sender, QM_REMOVEDPERMBAN, banstr, cip->name->content);
-       if (cip->channel)
-         localdosetmode_ban(&changes, banstr, MCB_DEL);
-       /* Remove from database */
-       csdb_deleteban(rbp);
-       /* Remove from list */
-       (*rbh)=rbp->next;
-       /* Free ban/string and update setby refcount, and free actual regban */
-       freesstring(rbp->reason);
-       freechanban(rbp->cbp);
-       freeregban(rbp);
-      }
-    } else {
-      rbh=&(rbp->next);
-    }
-  }
-
-  if (cip->channel) {
-    for (cbh=&(cip->channel->bans); *cbh; ) {
-      cbp=*cbh;
-      if (banoverlap(theban, cbp)) {
-       /* Remove */
-       banstr=bantostring(cbp);
-       chanservstdmessage(sender, QM_REMOVEDCHANBAN, banstr, cip->name->content);
-       localdosetmode_ban(&changes, banstr, MCB_DEL);
-      } else {
-       cbh=&(cbp->next);
-      }
-    }
-    localsetmodeflush(&changes,1);
-  }
-  
-  
   chanservstdmessage(sender, QM_DONE);
   return CMD_OK;
 }
index d0bbe445ce26f3e6e2f2b50e55f9c0474dfe062c..d8b6d5cb5f275562db09730a6774085807ea1e03 100644 (file)
 
 int csc_dounbanme(void *source, int cargc, char **cargv) {
   nick *sender=source;
-  regchan *rcp;
   chanindex *cip;
-  modechanges changes;
-  chanban **cbh;
-
+  
   if (cargc<1) {
     chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "unbanme");
     return CMD_ERROR;
@@ -40,20 +37,7 @@ int csc_dounbanme(void *source, int cargc, char **cargv) {
   if (!(cip=cs_checkaccess(sender, cargv[0], CA_OPPRIV, NULL, "unbanme", 0, 0)))
     return CMD_ERROR;
 
-  rcp=cip->exts[chanservext];
-
-  if (cip->channel) {
-    localsetmodeinit(&changes, cip->channel, chanservnick);
-
-    for (cbh=&(cip->channel->bans);*cbh;) {
-      if (nickmatchban(sender, *cbh))
-       localdosetmode_ban(&changes, bantostring(*cbh), MCB_DEL);
-      else
-       cbh=&((*cbh)->next);
-    }
-
-    localsetmodeflush(&changes, 1);
-  }
+  cs_unbanfn(sender, cip, (UnbanFN)nickmatchban, sender, 1);
 
   cs_log(sender,"UNBANME %s",cip->name->content);
   chanservstdmessage(sender, QM_DONE);
index 57603abd9d4b0883c64ce3c4e77b0cd8bedf0fc7..94325c5b60d947827f1c5a3c22002a2f53e895ef 100644 (file)
 #define QM_REPLACINGBANSDURATION   153
 #define QM_TOOMANYCHANLEVS         154
 #define QM_TOOMANYBANS             155
+#define QM_WARNNOTREMOVEDPERMBAN   156
 
 /* List of privileged operations */
 
@@ -892,6 +893,9 @@ int checkresponse(reguser *rup, const unsigned char *entropy, const char *respon
 int checkhashpass(reguser *rup, const char *junk, const char *hash);
 flag_t cs_sanitisechanlev(flag_t flags);
 
+typedef int (*UnbanFN)(void *arg, struct chanban *ban);
+void cs_unbanfn(nick *sender, chanindex *cip, UnbanFN fn, void *arg, int removepermbans);
+
 /* chanservstdcmds.c */
 int cs_doshowcommands(void *source, int cargc, char **cargv);
 int cs_dohelp(void *source, int cargc, char **cargv);
index 2b5bc08b14aeea10ce5b8c2361b287e5f04632bc..c42c3a3257379067c2ce0a31b049665c3749291a 100644 (file)
@@ -1223,3 +1223,63 @@ reguser *findreguser(nick *sender, const char *str) {
 
   return rup;
 }
+
+/*
+ * Unbans a mask from a channel, including permbans if user has correct privs.
+ */
+void cs_unbanfn(nick *sender, chanindex *cip, UnbanFN fn, void *arg, int removepermbans) {
+  regban **rbh, *rbp;
+  chanban **cbh, *cbp;
+  regchan *rcp;
+  modechanges changes;
+  char *banstr;
+
+  rcp=cip->exts[chanservext];
+
+  if (cip->channel)
+    localsetmodeinit(&changes, cip->channel, chanservnick);
+
+  for (rbh=&(rcp->bans); *rbh; ) {
+    rbp=*rbh;
+    if (fn(arg, rbp->cbp)) {
+      banstr=bantostring(rbp->cbp);
+      /* Check perms and remove */
+      if(!removepermbans) {
+        chanservstdmessage(sender, QM_WARNNOTREMOVEDPERMBAN, banstr, cip->name->content);
+        rbh=&(rbp->next);
+      } else if (!cs_checkaccess(sender, NULL, CA_MASTERPRIV, cip, NULL, 0, 1)) {
+        chanservstdmessage(sender, QM_NOTREMOVEDPERMBAN, banstr, cip->name->content);
+        rbh=&(rbp->next);
+      } else {
+        chanservstdmessage(sender, QM_REMOVEDPERMBAN, banstr, cip->name->content);
+        if (cip->channel)
+          localdosetmode_ban(&changes, banstr, MCB_DEL);
+        /* Remove from database */
+        csdb_deleteban(rbp);
+        /* Remove from list */
+        (*rbh)=rbp->next;
+        /* Free ban/string and update setby refcount, and free actual regban */
+        freesstring(rbp->reason);
+        freechanban(rbp->cbp);
+        freeregban(rbp);
+      }
+    } else {
+      rbh=&(rbp->next);
+    }
+  }
+
+  if (cip->channel) {
+    for (cbh=&(cip->channel->bans); *cbh; ) {
+      cbp=*cbh;
+      if (fn(arg, cbp)) {
+        /* Remove */
+        banstr=bantostring(cbp);
+        chanservstdmessage(sender, QM_REMOVEDCHANBAN, banstr, cip->name->content);
+        localdosetmode_ban(&changes, banstr, MCB_DEL);
+      } else {
+        cbh=&(cbp->next);
+      }
+    }
+    localsetmodeflush(&changes,1);
+  }
+}
index 94fcc30719fdc918059236c3f2e575ecd031d1be..9af15f2eb80e7e4a0212bff664302b1c6b8a9979 100644 (file)
@@ -164,6 +164,7 @@ char *defaultmessages[MAXMESSAGES] = {
   /* 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.",
+  /* 156*/ "Warning: not removing registered ban %s from %s.",
 };
 
 void initmessages() {