]> jfr.im git - irc/quakenet/newserv.git/blobdiff - chanserv/usercmds/userflags.c
Merge.
[irc/quakenet/newserv.git] / chanserv / usercmds / userflags.c
index 71793f3c0135a9e0a1da5db0ab66024fd33be7a9..17b8a4cfd6cef9a1ef4037214a002705c7ed9ae2 100644 (file)
 int csu_douserflags(void *source, int cargc, char **cargv) {
   nick *sender=source;
   reguser *rup=getreguserfromnick(sender), *target;
-  int arg=0;
+  authname *anp;
+  int arg=0, wasorisoper;
   flag_t flagmask, changemask, oldflags;
   char flagbuf[30];
 
   if (!rup)
     return CMD_ERROR;
   
-  if (cargc<1) {
-    chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "userflags");
-    return CMD_ERROR;
-  }
-
-  if (*cargv[0]!='+' && *cargv[0]!='-') {
+  if (cargc>0 && (*cargv[0]!='+' && *cargv[0]!='-')) {
     arg++;
     /* If the first char isn't a "change" character, it must specify a target */
 
@@ -43,7 +39,7 @@ int csu_douserflags(void *source, int cargc, char **cargv) {
       return CMD_ERROR;
 
     if (target!=rup && !cs_privcheck(QPRIV_VIEWUSERFLAGS, sender)) {
-      chanservstdmessage(sender, QM_NOACCESS, "userflags");
+      chanservstdmessage(sender, QM_NOACCESSONUSER, "userflags", cargv[0]);
       return CMD_ERROR;
     }
   } else {
@@ -53,54 +49,71 @@ int csu_douserflags(void *source, int cargc, char **cargv) {
   if (cargc>arg) {
     /* OK, now we have a changestring.. */
     if (target!=rup && !cs_privcheck(QPRIV_CHANGEUSERFLAGS, sender)) {
-      chanservstdmessage(sender, QM_NOACCESS, "userflags");
+      /* Safe to use cargv[0] because if target != rup then first arg must have been the target name */
+      chanservstdmessage(sender, QM_NOACCESSONUSER, "userflags", cargv[0]);
       return CMD_ERROR;
     }
 
     strcpy(flagbuf,printflags(target->flags, ruflags));
     oldflags=target->flags;
 
-    changemask=QUFLAG_NOTICE | QUFLAG_INFO;
+    changemask=QUFLAG_NOTICE;
 
     if (target==rup) {
       /* If you're changing yourself, you can give up the "status" flags and add/remove notice */
-      changemask|=(target->flags & (QUFLAG_OPER | QUFLAG_DEV | QUFLAG_PROTECT | QUFLAG_HELPER | QUFLAG_ADMIN));
+      changemask|=(target->flags & (QUFLAG_OPER | QUFLAG_DEV | QUFLAG_PROTECT | QUFLAG_HELPER | QUFLAG_ADMIN | QUFLAG_STAFF));
     }
 
     /* Warning, policy ahead */
 
+    if (UHasStaffPriv(rup))
+      changemask |= QUFLAG_PROTECT;
+
     if (UHasOperPriv(rup))
-      changemask |= QUFLAG_GLINE | QUFLAG_DELAYEDGLINE | QUFLAG_RESTRICTED | QUFLAG_PROTECT | QUFLAG_TRUST;
+      changemask |= QUFLAG_PROTECT | QUFLAG_TRUST | QCFLAG_NOINFO;
 
     if (UHasAdminPriv(rup))
-      changemask |= (QUFLAG_OPER | QUFLAG_HELPER | QUFLAG_CLEANUPEXEMPT);
+      changemask |= (QUFLAG_OPER | QUFLAG_HELPER | QUFLAG_CLEANUPEXEMPT | QUFLAG_STAFF);
     
     if (UIsDev(rup))
       changemask=QUFLAG_ALL;
     
+    wasorisoper = UHasOperPriv(target);
     setflags(&target->flags, changemask, cargv[arg], ruflags, REJECT_NONE);
-    
+    wasorisoper |= UHasOperPriv(target);
+
     /* More policy */
-    if (!UHasHelperPriv(target)) {
+    if (!UHasStaffPriv(target)) {
       target->flags &= ~QUFLAG_PROTECT;
     }
 
     cs_log(sender,"USERFLAGS #%s %s (%s -> %s)",target->username,cargv[arg],flagbuf,printflags(target->flags, ruflags));
 
     /* only warn about interesting changes */
-    if((target->flags ^ oldflags) & ~(QUFLAG_NOTICE | QUFLAG_INFO))
+    if((target->flags ^ oldflags) & ~(QUFLAG_NOTICE | QUFLAG_INFO | QUFLAG_TRUST)) {
       chanservwallmessage("%s (%s) just used USERFLAGS on %s %s (%s -> %s)",sender->nick,rup->username,target->username,cargv[arg],flagbuf,printflags(target->flags,ruflags));
 
+#ifdef AUTHGATE_WARNINGS
+      if(wasorisoper)
+        chanservsendmessage(sender, "WARNING FOR PRIVILEGED USERS: you MUST go to https://auth.quakenet.org and attempt to login as %s (with any password) to update the cache, otherwise their old credentials will be preserved in certain circumstances.",target->username);
+#endif
+    }
     csdb_updateuser(target);
+
+/* Disabled this for now as live ircu doesn't support it - splidge
+    if ((anp=findauthname(rup->ID)))
+      localusersetaccountflags(anp, cs_accountflagmap(target));
+ */
     chanservstdmessage(sender, QM_DONE);
   }
 
   if (cs_privcheck(QPRIV_VIEWUSERFLAGS, sender))
     flagmask=QUFLAG_ALL;
   else
-    flagmask=QUFLAG_INFO | QUFLAG_NOTICE | QUFLAG_OPER | QUFLAG_HELPER | QUFLAG_DEV | QUFLAG_ADMIN;
+    flagmask=QUFLAG_INFO | QUFLAG_NOTICE | QUFLAG_OPER | QUFLAG_HELPER | QUFLAG_DEV | QUFLAG_ADMIN | QUFLAG_STAFF;
   
-  chanservstdmessage(sender, QM_CURUSERFLAGS, target->username, printflags(target->flags & flagmask, ruflags));
+  chanservstdmessage(sender, QM_CURUSERFLAGS, target->username, printflagsornone(target->flags & flagmask, ruflags));
 
   return CMD_OK;
 }