]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/authcmds/email.c
fix indentation
[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 time_t t = time(NULL);
33 maillock *mlp;
34
35 if (cargc<3) {
36 chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "email");
37 return CMD_ERROR;
38 }
39
40 if (!(rup=getreguserfromnick(sender)))
41 return CMD_ERROR;
42
43 if (!checkpassword(rup, cargv[0])) {
44 chanservstdmessage(sender, QM_AUTHFAIL);
45 cs_log(sender,"EMAIL FAIL username %s bad password %s",rup->username,cargv[0]);
46 return CMD_ERROR;
47 }
48
49 if (strcmp(cargv[1],cargv[2])) {
50 chanservstdmessage(sender, QM_EMAILDONTMATCH);
51 cs_log(sender,"EMAIL FAIL username %s email don't match (%s vs %s)",rup->username,cargv[1],cargv[2]);
52 return CMD_ERROR;
53 }
54
55 if(!UHasHelperPriv(rup) && (rup->lockuntil && rup->lockuntil > t)) {
56 chanservstdmessage(sender, QM_ACCOUNTLOCKED, rup->lockuntil);
57 return CMD_ERROR;
58 }
59
60 if(rup->email && !strcasecmp(cargv[1], rup->email->content)) {
61 chanservstdmessage(sender, QM_EMAILMATCHESOLD);
62 return CMD_ERROR;
63 }
64
65 if (csa_checkeboy(sender, cargv[1]))
66 return CMD_ERROR;
67
68 for(mlp=maillocks;mlp;mlp=mlp->next) {
69 if(!match(mlp->pattern->content, cargv[1])) {
70 chanservstdmessage(sender, QM_MAILLOCKED);
71 return CMD_ERROR;
72 }
73 }
74
75 dupemail = strdup(cargv[1]);
76 local=strchr(dupemail, '@');
77 if(!local)
78 return CMD_ERROR;
79 *(local++)='\0';
80
81 mdp=findnearestmaildomain(local);
82 if(mdp) {
83 for(smdp=mdp; smdp; smdp=smdp->parent) {
84 if(MDIsBanned(smdp)) {
85 free(dupemail);
86 chanservstdmessage(sender, QM_MAILLOCKED);
87 return CMD_ERROR;
88 }
89 if((smdp->count >= smdp->limit) && (smdp->limit > 0)) {
90 free(dupemail);
91 chanservstdmessage(sender, QM_DOMAINLIMIT);
92 return CMD_ERROR;
93 }
94 }
95 }
96
97 mdp=findmaildomainbydomain(local);
98 if(mdp) {
99 for (ruh=mdp->users; ruh; ruh=ruh->nextbydomain) {
100 if (ruh->localpart)
101 if (!strcasecmp(dupemail, ruh->localpart->content)) {
102 found++;
103 }
104 }
105
106 if((found >= mdp->actlimit) && (mdp->actlimit > 0)) {
107 free(dupemail);
108 chanservstdmessage(sender, QM_ADDRESSLIMIT);
109 return CMD_ERROR;
110 }
111 }
112
113 mdp=findorcreatemaildomain(cargv[1]);
114
115 csdb_createmail(rup, QMAIL_NEWEMAIL);
116 csdb_accounthistory_insert(sender, NULL, NULL, rup->email?rup->email->content:NULL, cargv[1]);
117 delreguserfrommaildomain(rup,rup->domain);
118
119 if(rup->lastemail)
120 freesstring(rup->lastemail);
121 rup->lastemail=rup->email;
122 rup->email=getsstring(cargv[1],EMAILLEN);
123 rup->lastemailchange=t;
124 rup->domain=findorcreatemaildomain(rup->email->content);
125 if(!UHasHelperPriv(rup)) {
126 rup->lockuntil=t+7*24*3600;
127 } else {
128 rup->lockuntil=0;
129 }
130 addregusertomaildomain(rup, rup->domain);
131
132 if(local) {
133 rup->localpart=getsstring(dupemail,EMAILLEN);
134 } else {
135 rup->localpart=NULL;
136 }
137 free(dupemail);
138
139 chanservstdmessage(sender, QM_EMAILCHANGED, cargv[1]);
140 cs_log(sender,"EMAIL OK username %s",rup->username);
141
142 #ifdef AUTHGATE_WARNINGS
143 if(UHasOperPriv(rup))
144 chanservsendmessage(sender, "WARNING FOR PRIVILEGED USERS: you MUST go to https://auth.quakenet.org and login successfully to update the cache.");
145 #endif
146
147 csdb_updateuser(rup);
148
149 return CMD_OK;
150 }