]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Don't kick +X or +o users.
authorsplidge <redacted>
Fri, 4 Apr 2008 12:57:46 +0000 (13:57 +0100)
committersplidge <redacted>
Fri, 4 Apr 2008 12:57:46 +0000 (13:57 +0100)
chanserv/chanservnetevents.c
chanserv/chanservuser.c

index 32cadf43ab05be824bdc5aff006acbaa1d0e6d0b..0320b00b86011732cdbcdcc9702115343602d677 100644 (file)
@@ -175,37 +175,41 @@ void cs_handlejoin(int hooknum, void *arg) {
     isopped=iscreate=0;
   }  
 
-  /* Check for "Q ban" */
-  if (!IsService(np) && cs_bancheck(np,cp)) {
-    /* They got kicked.. */
-    return;
-  }
+  /* Various things that can ban the user on join.  Don't apply these to anyone
+   * with one of +k, +X, +o */
+  if (!IsService(np) && !IsOper(np) && !IsXOper(np)) {
+    /* Check for "Q ban" */
+    if (cs_bancheck(np,cp)) {
+      /* They got kicked.. */
+      return;
+    }
 
-  /* Check for other ban lurking on channel which we are enforcing */
-  if (!IsService(np) && CIsEnforce(rcp) && nickbanned_visible(np,cp)) {
-    localkickuser(chanservnick,cp,np,"Banned.");
-    return;
-  }
+    /* Check for other ban lurking on channel which we are enforcing */
+    if (CIsEnforce(rcp) && nickbanned_visible(np,cp)) {
+      localkickuser(chanservnick,cp,np,"Banned.");
+      return;
+    }
 
-  /* Check for +b chanlev flag */
-  if (!IsService(np) && rcup && CUIsBanned(rcup)) {
-    cs_banuser(NULL, cip, np, NULL);
-    cs_timerfunc(cip);
-    return;
-  } 
-
-  /* Check for +k chan flag */
-  if (!IsService(np) && CIsKnownOnly(rcp) && !(rcup && CUKnown(rcup))) {
-    /* Don't ban if they are already "visibly" banned for some reason. */
-    if (IsInviteOnly(cp) || (IsRegOnly(cp) && !IsAccount(np))) {
-      localkickuser(chanservnick,cp,np,"Authorised users only.");
-    } else {      
-      cs_banuser(NULL, cip, np, "Authorised users only.");
+    /* Check for +b chanlev flag */
+    if (rcup && CUIsBanned(rcup)) {
+      cs_banuser(NULL, cip, np, NULL);
       cs_timerfunc(cip);
+      return;
+    } 
+
+    /* Check for +k chan flag */
+    if (CIsKnownOnly(rcp) && !(rcup && CUKnown(rcup))) {
+      /* Don't ban if they are already "visibly" banned for some reason. */
+      if (IsInviteOnly(cp) || (IsRegOnly(cp) && !IsAccount(np))) {
+        localkickuser(chanservnick,cp,np,"Authorised users only.");
+      } else {      
+        cs_banuser(NULL, cip, np, "Authorised users only.");
+        cs_timerfunc(cip);
+      }
+      return;
     }
-    return;
   }
-
+  
   if (!rup || !rcup) {
     /* They're not a registered user, so deop if it is a create */
     if (isopped && !IsService(np)) {
index 9f31209862a665bb55f870465dad1bd806ab5390..4b8c0c7005e10695368496e4973e9cdacd06221e 100644 (file)
@@ -500,6 +500,9 @@ void chanservkillstdmessage(nick *target, int messageid, ... ) {
 }
 
 int checkpassword(reguser *rup, const char *pass) {
+  if (!(*rup->password))
+    return 0;
+
   if (!strncmp(rup->password, pass, PASSLEN))
     return 1;
   return 0;
@@ -508,6 +511,9 @@ int checkpassword(reguser *rup, const char *pass) {
 int checkresponse(reguser *rup, const unsigned char *entropy, const char *response, CRAlgorithm algorithm) {
   char usernamel[NICKLEN+1], *dp, *up;
 
+  if (!(*rup->password))
+    return 0;
+
   for(up=rup->username,dp=usernamel;*up;)
     *dp++ = ToLower(*up++);
   *dp = '\0';
@@ -677,19 +683,22 @@ void cs_docheckopvoice(channel *cp, modechanges *changes) {
     else
       rcup=NULL;
     
-    if (rcup && CUIsBanned(rcup) && !IsService(np)) {
-      cs_banuser(changes, cp->index, np, NULL);
-      continue;
-    }
-
-    /* chanflag +k checks; kick them if they "obviously" can't rejoin without a ban */
-    if (!IsService(np) && CIsKnownOnly(rcp) && !(rcup && CUKnown(rcup))) {
-      if (IsInviteOnly(cp) || (IsRegOnly(cp) && !IsAccount(np))) {
-        localkickuser(chanservnick,cp,np,"Authorised users only.");
-      } else {
-        cs_banuser(NULL, cp->index, np, "Authorised users only.");
+    /* Various things that might ban the user - don't apply these to +o, +k or +X users */
+    if (!IsService(np) && !IsXOper(np) && !IsOper(np)) {
+      if (rcup && CUIsBanned(rcup)) {
+        cs_banuser(changes, cp->index, np, NULL);
+        continue;
+      }
+      
+      /* chanflag +k checks; kick them if they "obviously" can't rejoin without a ban */
+      if (!CIsKnownOnly(rcp) && !(rcup && CUKnown(rcup))) {
+        if (IsInviteOnly(cp) || (IsRegOnly(cp) && !IsAccount(np))) {
+          localkickuser(chanservnick,cp,np,"Authorised users only.");
+        } else {
+          cs_banuser(NULL, cp->index, np, "Authorised users only.");
+        }
+        continue;
       }
-      continue;
     }
                                       
     if ((cp->users->content[i] & CUMODE_OP) && !IsService(np)) {
@@ -778,7 +787,7 @@ void cs_checknickbans(nick *np) {
   regchan *rcp;
   int i,j;
 
-  if (IsService(np))
+  if (IsService(np) || IsOper(np) || IsXOper(np))
     return;
 
   /* Avoid races: memcpy the channel array */
@@ -824,7 +833,7 @@ void cs_checkbans(channel *cp) {
       continue;
     }
     
-    if (IsService(np))
+    if (IsService(np) || IsOper(np) || IsXOper(np))
       continue;
 
     for (rbp=rcp->bans;rbp;rbp=rbp->next) {
@@ -1162,7 +1171,7 @@ void cs_setregban(chanindex *cip, regban *rbp) {
   for (i=0;(cip->channel) && i<cip->channel->users->hashsize;i++) {
     if (cip->channel->users->content[i]!=nouser &&
        (np=getnickbynumeric(cip->channel->users->content[i])) &&
-       !IsService(np) &&
+       !IsService(np) && !IsOper(np) && !IsXOper(np) &&
        nickmatchban_visible(np, rbp->cbp))
       localkickuser(chanservnick, cip->channel, np, rbp->reason ? rbp->reason->content : "Banned.");
   }