]> jfr.im git - irc/quakenet/newserv.git/blobdiff - chanserv/authcmds/setemail.c
glines: Include target nick in error message for block command.
[irc/quakenet/newserv.git] / chanserv / authcmds / setemail.c
index ffc02640bd4a6f0d754ad8401c5c4192ea409023..35dde83a93be2b7046654a412db427e8d2b262cf 100644 (file)
@@ -3,10 +3,12 @@
  *
  * CMDNAME: setemail
  * CMDLEVEL: QCMD_OPER
- * CMDARGS: 2
+ * CMDARGS: 3
  * CMDDESC: Set the email address.
  * CMDFUNC: csa_dosetmail
  * CMDPROTO: int csa_dosetmail(void *source, int cargc, char **cargv);
+ * CMDHELP: Usage: setemail <username> <email address> <reason for modification>
+ * CMDHELP: Sets the email address for the specified username.
  */
 
 #include "../chanserv.h"
 #include <string.h>
 
 int csa_dosetmail(void *source, int cargc, char **cargv) {
-  reguser *rup;
   nick *sender=source;
+  reguser *rup, *vrup = getreguserfromnick(sender);
+  char *dupemail;
+  char *local;
+  char *reason;
 
-  if (cargc<2) {
+  if (cargc<3) {
     chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "setemail");
     return CMD_ERROR;
   }
@@ -27,27 +32,50 @@ int csa_dosetmail(void *source, int cargc, char **cargv) {
   if (!(rup=findreguser(sender, cargv[0])))
     return CMD_ERROR;
 
+  if(rup->email && !strcasecmp(cargv[1], rup->email->content)) {
+    chanservstdmessage(sender, QM_EMAILMATCHESOLD);
+    return CMD_ERROR;
+  }
+
   if (csa_checkeboy(sender, cargv[1]))
     return CMD_ERROR;
 
-  csdb_accounthistory_insert(sender, NULL, NULL, rup->email, getsstring(cargv[1], EMAILLEN));
+  reason = cargv[2];
+  if(!checkreason(sender, reason))
+    return CMD_ERROR;
+
+  if(UHasStaffPriv(rup)) {
+    cs_log(sender,"SETEMAIL FAILED username %s (reason: %s)",rup->username, reason);
+    chanservwallmessage("%s (%s) just FAILED using SETEMAIL on %s: %s (reason: %s)", sender->nick, vrup->username, rup->username, cargv[1], reason);
+    chanservsendmessage(sender, "Sorry, that user is privileged.");
+    return CMD_ERROR;
+  }
+
+  csdb_accounthistory_insert(sender, NULL, NULL, rup->email?rup->email->content:NULL, cargv[1]);
   delreguserfrommaildomain(rup,rup->domain);
   freesstring(rup->email);
   rup->email=getsstring(cargv[1],EMAILLEN);
   rup->lastemailchange=time(NULL);
+  if(rup->lastemail) {
+    freesstring(rup->lastemail);
+    rup->lastemail=NULL;
+  }
+  rup->lockuntil=0;
   rup->domain=findorcreatemaildomain(rup->email->content);
   addregusertomaildomain(rup, rup->domain);
-  char *dupemail = strdup(rup->email->content);
-  if(local=strchr(strdup(dupemail), '@')) {
+  dupemail = strdup(rup->email->content);
+  if((local=strchr(dupemail, '@'))) {
     *(local++)='\0';
-    rup->localpart=getsstring(local,EMAILLEN);
+    rup->localpart=getsstring(dupemail,EMAILLEN);
   } else {
     rup->localpart=NULL;
   }
   free(dupemail);
 
   chanservstdmessage(sender, QM_EMAILCHANGED, cargv[1]);
-  cs_log(sender,"SETEMAIL OK username %s <%s>",rup->username,rup->email->content);
+  cs_log(sender,"SETEMAIL OK username %s <%s> (reason: %s)",rup->username,rup->email->content, reason);
+  chanservwallmessage("%s (%s) just used SETEMAIL on %s: %s (reason: %s)", sender->nick, vrup->username, rup->username, rup->email->content, reason);
+
   csdb_updateuser(rup);
 
   return CMD_OK;