]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/authcmds/email.c
Merge.
[irc/quakenet/newserv.git] / chanserv / authcmds / email.c
1 /* Automatically generated by refactor.pl.
2 *
3 * CMDNAME: email
4 * CMDLEVEL: QCMD_SECURE | QCMD_AUTHED
5 * CMDARGS: 3
6 * CMDDESC: Change your email address.
7 * CMDFUNC: csa_doemail
8 * CMDPROTO: int csa_doemail(void *source, int cargc, char **cargv);
9 * CMDHELP: Usage: EMAIL <password> <email> <email>
10 * CMDHELP: Changes your register email address. Confirmation of the change will be sent
11 * CMDHELP: both old and new addresses. Where:
12 * CMDHELP: password - your password
13 * CMDHELP: email - new email address. Must be entered exactly the same way twice to avoid
14 * CMDHELP: mistakes.
15 * CMDHELP: Note: due to the sensitive nature of this command, you must send the message
16 * CMDHELP: to Q@CServe.quakenet.org when using it.
17 */
18
19 #include "../chanserv.h"
20 #include "../authlib.h"
21 #include "../../lib/irc_string.h"
22 #include <stdio.h>
23 #include <string.h>
24
25 int csa_doemail(void *source, int cargc, char **cargv) {
26 reguser *rup, *ruh;
27 nick *sender=source;
28 maildomain *mdp, *smdp;
29 char *local;
30 char *dupemail;
31 int found = 0;
32
33 if (cargc<3) {
34 chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "email");
35 return CMD_ERROR;
36 }
37
38 if (!(rup=getreguserfromnick(sender)))
39 return CMD_ERROR;
40
41 if (!checkpassword(rup, cargv[0])) {
42 chanservstdmessage(sender, QM_AUTHFAIL);
43 cs_log(sender,"EMAIL FAIL username %s bad password %s",rup->username,cargv[0]);
44 return CMD_ERROR;
45 }
46
47 if (strcmp(cargv[1],cargv[2])) {
48 chanservstdmessage(sender, QM_EMAILDONTMATCH);
49 cs_log(sender,"EMAIL FAIL username %s email don't match (%s vs %s)",rup->username,cargv[1],cargv[2]);
50 return CMD_ERROR;
51 }
52
53 if(rup->email && !strcasecmp(cargv[1], rup->email->content)) {
54 chanservstdmessage(sender, QM_EMAILMATCHESOLD);
55 return CMD_ERROR;
56 }
57
58 if (csa_checkeboy(sender, cargv[1]))
59 return CMD_ERROR;
60
61 dupemail = strdup(cargv[1]);
62 local=strchr(dupemail, '@');
63 if(!local)
64 return CMD_ERROR;
65 *(local++)='\0';
66
67 mdp=findnearestmaildomain(local);
68 if(mdp) {
69 for(smdp=mdp; smdp; smdp=smdp->parent) {
70 if(MDIsBanned(smdp)) {
71 free(dupemail);
72 chanservstdmessage(sender, QM_DOMAINBANNED);
73 return CMD_ERROR;
74 }
75 if((smdp->count >= smdp->limit) && (smdp->limit > 0)) {
76 free(dupemail);
77 chanservstdmessage(sender, QM_DOMAINLIMIT);
78 return CMD_ERROR;
79 }
80 }
81 }
82
83 mdp=findmaildomainbydomain(local);
84 if(mdp) {
85 for (ruh=mdp->users; ruh; ruh=ruh->nextbydomain) {
86 if (ruh->localpart)
87 if (!strcasecmp(dupemail, ruh->localpart->content)) {
88 found++;
89 }
90 }
91
92 if((found >= mdp->actlimit) && (mdp->actlimit > 0)) {
93 free(dupemail);
94 chanservstdmessage(sender, QM_ADDRESSLIMIT);
95 return CMD_ERROR;
96 }
97 }
98
99 mdp=findorcreatemaildomain(cargv[1]);
100
101 csdb_createmail(rup, QMAIL_NEWEMAIL);
102 csdb_accounthistory_insert(sender, NULL, NULL, rup->email, getsstring(cargv[1], EMAILLEN));
103 delreguserfrommaildomain(rup,rup->domain);
104 freesstring(rup->email);
105 rup->email=getsstring(cargv[1],EMAILLEN);
106 rup->lastemailchange=time(NULL);
107 rup->domain=findorcreatemaildomain(rup->email->content);
108 addregusertomaildomain(rup, rup->domain);
109
110 if(local) {
111 rup->localpart=getsstring(dupemail,EMAILLEN);
112 } else {
113 rup->localpart=NULL;
114 }
115 free(dupemail);
116
117 chanservstdmessage(sender, QM_EMAILCHANGED, cargv[1]);
118 cs_log(sender,"EMAIL OK username %s",rup->username);
119 csdb_updateuser(rup);
120
121 return CMD_OK;
122 }