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 */
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 {
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;
}