int csa_dosetemail(void *source, int cargc, char **cargv) { char *email; char *error; reguser *rup; nick *sender=(nick *)source; if(cargc<3) { controlreply(sender, "SETEMAIL FALSE args"); return CMD_ERROR; } rup = findreguserbyID(atoi(cargv[0])); if(rup == NULL) { controlreply(sender, "SETEMAIL FALSE useridnotexist"); return CMD_ERROR; } if(UHasStaffPriv(rup)) { controlreply(sender, "SETEMAIL FALSE privuser"); return CMD_ERROR; } if(UHasSuspension(rup)) { controlreply(sender, "SETEMAIL FALSE suspended"); return CMD_ERROR; } if(rup->lastpasschange > atoi(cargv[1])) { controlreply(sender, "SETEMAIL FALSE passwordchanged"); return CMD_ERROR; } email = cargv[2]; if(!strcmp(email, rup->email->content)) { /* setting to the same thing? fine! */ controlreply(sender, "SETEMAIL TRUE"); return CMD_OK; } error = email_to_error(email); if(error) { controlreply(sender, "SETEMAIL FALSE %s", error); return CMD_ERROR; } freesstring(rup->email); rup->email=getsstring(email,EMAILLEN); cs_log(sender,"SETEMAIL OK username %s email %s",rup->username, rup->email->content); csdb_updateuser(rup); sendemail(rup); controlreply(sender, "SETEMAIL TRUE"); return CMD_OK; }
int csu_dodeluser(void *source, int cargc, char **cargv) { nick *sender=source; reguser *rup=getreguserfromnick(sender), *target; char *reason; if (!rup) return CMD_ERROR; if (cargc<2) { chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "deluser"); return CMD_ERROR; } reason = cargv[1]; if(!checkreason(sender, reason)) return CMD_ERROR; if (!(target=findreguser(sender, cargv[0]))) return CMD_ERROR; if(target->ID == lastuserID) { chanservsendmessage(sender, "Sorry, can't delete last user -- wait a while and try again."); return CMD_ERROR; } if(UHasStaffPriv(target)) { cs_log(sender,"DELUSER FAILED username %s (reason: %s)",target->username,reason); chanservwallmessage("%s (%s) just FAILED using DELUSER on %s (reason: %s)", sender->nick, rup->username, target->username, reason); chanservsendmessage(sender, "Sorry, that user is privileged."); return CMD_ERROR; } cs_log(sender,"DELUSER OK username %s (reason: %s)",target->username,reason); chanservwallmessage("%s (%s) just used DELUSER on %s (reason: %s)", sender->nick, rup->username, target->username, reason); cs_removeuser(target); chanservstdmessage(sender, QM_DONE); return CMD_OK; }
int csa_donewpw(void *source, int cargc, char **cargv) { reguser *rup; nick *sender=source; unsigned int same=0; time_t t; int pq; if (cargc<3) { chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "newpass"); return CMD_ERROR; } if (!(rup=getreguserfromnick(sender))) return CMD_ERROR; if (!checkpassword(rup, cargv[0])) { chanservstdmessage(sender, QM_AUTHFAIL); cs_log(sender,"NEWPASS FAIL username %s bad password %s",rup->username,cargv[0]); return CMD_ERROR; } if (strcmp(cargv[1],cargv[2])) { chanservstdmessage(sender, QM_PWDONTMATCH); /* Sorry, passwords do not match */ cs_log(sender,"NEWPASS FAIL username %s new passwords don't match (%s vs %s)",rup->username,cargv[1],cargv[2]); return CMD_ERROR; } if (!strcmp(cargv[0],cargv[1])) { /* If they are the same then continue anyway but don't send the hook later. */ same=1; } pq = csa_checkpasswordquality(cargv[1]); if(pq == QM_PWTOSHORT) { chanservstdmessage(sender, QM_PWTOSHORT); /* new password too short */ cs_log(sender,"NEWPASS FAIL username %s password too short %s (%zu characters)",rup->username,cargv[1],strlen(cargv[1])); return CMD_ERROR; } else if(pq == QM_PWTOWEAK) { chanservstdmessage(sender, QM_PWTOWEAK); /* new password is weak */ cs_log(sender,"NEWPASS FAIL username %s password too weak %s",rup->username,cargv[1]); return CMD_ERROR; } else if(pq == QM_PWTOLONG) { chanservstdmessage(sender, QM_PWTOLONG); /* new password too long */ cs_log(sender,"NEWPASS FAIL username %s password too long %s",rup->username,cargv[1]); return CMD_ERROR; } else if(pq == QM_PWINVALID) { chanservstdmessage(sender, QM_PWINVALID); cs_log(sender,"NEWPASS FAIL username %s password invalid %s",rup->username,cargv[1]); return CMD_ERROR; } else if(pq == -1) { /* all good */ } else { chanservsendmessage(sender, "unknown error in newpass.c... contact #help"); return CMD_ERROR; } t=time(NULL); if(!UHasStaffPriv(rup)) { if(rup->lockuntil && rup->lockuntil > t) { chanservstdmessage(sender, QM_ACCOUNTLOCKED, rup->lockuntil); return CMD_ERROR; } rup->lockuntil=t+7*24*3600; } else { rup->lockuntil=0; } if(rup->lastemail) { freesstring(rup->lastemail); rup->lastemail=NULL; } rup->lastpasschange=t; csdb_accounthistory_insert(sender, rup->password, cargv[1], NULL, NULL); setpassword(rup, cargv[1]); rup->lastauth=time(NULL); chanservstdmessage(sender, QM_PWCHANGED); cs_log(sender,"NEWPASS OK username %s", rup->username); #ifdef AUTHGATE_WARNINGS if(UHasOperPriv(rup)) chanservsendmessage(sender, "WARNING FOR PRIVILEGED USERS: you MUST go to https://auth.quakenet.org and login successfully to update the cache, if you do not your old password will still be usable in certain circumstances."); #endif csdb_updateuser(rup); csdb_createmail(rup, QMAIL_NEWPW); if (!same) triggerhook(HOOK_CHANSERV_PWCHANGE, sender); return CMD_OK; }