]> jfr.im git - irc/quakenet/newserv.git/blobdiff - chanserv/chanservprivs.c
Merge chanserv-live into default.
[irc/quakenet/newserv.git] / chanserv / chanservprivs.c
index 3fd1958f0deba266c43543ee71c5b954f955f8f6..c38e6b205dfe5b818cc9808ac6637766c56f2783 100644 (file)
@@ -21,6 +21,7 @@ int cs_privcheck(int privnum, nick *np) {
   case QPRIV_VIEWAUTOLIMIT:
   case QPRIV_VIEWBANTIMER:
   case QPRIV_VIEWUSERFLAGS:
+  case QPRIV_VIEWCHANSUSPENSION:
     return (rup && UHasHelperPriv(rup));
     
   case QPRIV_VIEWCOMMENTS:
@@ -31,10 +32,13 @@ int cs_privcheck(int privnum, nick *np) {
   case QPRIV_CHANGEAUTOLIMIT:
   case QPRIV_CHANGEBANTIMER:
   case QPRIV_CHANGEUSERFLAGS:
+  case QPRIV_VIEWSUSPENDEDBY:
+  case QPRIV_VIEWWALLMESSAGE: /* if you change VIEWWALLMESSAGE alter chanservwallmessage too */
+  case QPRIV_VIEWREALHOST:
     return (np && rup && IsOper(np) && UHasOperPriv(rup));
     
-  default:
-    return 0;
+  default: /* By default opers can override anything */
+    return (np && rup && IsOper(np) && UHasOperPriv(rup));
   }
 }
 
@@ -57,17 +61,29 @@ chanindex *cs_checkaccess(nick *np, const char *chan, unsigned int flags,
     return NULL;
   }
   
-  if (!(rcp=cip->exts[chanservext]) || 
-      (CIsSuspended(rcp) && !cs_privcheck(QPRIV_SUSPENDBYPASS, np))) {
+  if (!(rcp=cip->exts[chanservext])) {
     if (!quiet) chanservstdmessage(np, QM_UNKNOWNCHAN, cip->name->content);
     return NULL;
   }
   
-  if (!priv || !cs_privcheck(priv,np)) {
+  
+  if (CIsSuspended(rcp)) {
+    if (cs_privcheck(QPRIV_SUSPENDBYPASS, np)) {
+      if (!quiet) chanservstdmessage(np, QM_BYPASSINGSUSPEND, cip->name->content);
+    } else {
+      if (!quiet) chanservstdmessage(np, QM_UNKNOWNCHAN, cip->name->content);
+      return NULL;
+    }
+  }
+
+  if (rcp && rup)
+    rcup=findreguseronchannel(rcp, rup);
+  
+  if (!cs_privcheck(priv,np)) {
     if ((flags & CA_VOICEPRIV) &&
-       !(rcp && (CIsVoiceAll(rcp)) && 
-         !(cip->channel && (nickbanned(np, cip->channel) || IsInviteOnly(cip->channel)))) &&
-       !(rcup && (CUHasVoicePriv(rcup)))) {
+       !(rcp && CIsVoiceAll(rcp) && !(rcup && CUIsQuiet(rcup)) &&
+         !(cip->channel && (nickbanned(np, cip->channel, 1) || IsInviteOnly(cip->channel)))) &&
+       !(rcup && CUHasVoicePriv(rcup))) {
       if (!quiet) chanservstdmessage(np, QM_NOACCESSONCHAN, cip->name->content, cmdname);
       return NULL;
     }
@@ -77,8 +93,7 @@ chanindex *cs_checkaccess(nick *np, const char *chan, unsigned int flags,
       return NULL;
     }
   
-    if ((flags & CA_NEEDKNOWN) && (!(rcup=findreguseronchannel(rcp, rup)) ||
-        !CUKnown(rcup))) {
+    if ((flags & CA_NEEDKNOWN) && (!rcup || !CUKnown(rcup))) {
       if (!quiet) chanservstdmessage(np, QM_NOACCESSONCHAN, cip->name->content, cmdname);
       return NULL;
     }