]> jfr.im git - irc/quakenet/newserv.git/blame - chanserv/chanserv_relay.c
Merge.
[irc/quakenet/newserv.git] / chanserv / chanserv_relay.c
CommitLineData
354b3c0a
CP
1#include "chanserv.h"
2#include "../control/control.h"
7f32dbdf 3#include "../lib/version.h"
07bed5f4
CP
4#include "../lib/irc_string.h"
5#include "authlib.h"
6
7#include <stdio.h>
8#include <string.h>
7f32dbdf
P
9
10MODULE_VERSION(QVERSION);
354b3c0a
CP
11
12int csa_docheckhashpass(void *source, int cargc, char **cargv);
07bed5f4
CP
13int csa_docreateaccount(void *source, int cargc, char **cargv);
14int csa_dosettempemail(void *source, int cargc, char **cargv);
15int csa_doresendemail(void *source, int cargc, char **cargv);
16int csa_doactivateuser(void *source, int cargc, char **cargv);
354b3c0a
CP
17
18void _init(void) {
19 registercontrolhelpcmd("checkhashpass", NO_RELAY, 3, csa_docheckhashpass, "Usage: checkhashpass <username> <digest> ?junk?");
07bed5f4
CP
20 registercontrolhelpcmd("createaccount", NO_RELAY, 4, csa_docreateaccount, "Usage: createaccount <execute> <username> <email address> <password>");
21 registercontrolhelpcmd("settempemail", NO_RELAY, 2, csa_dosettempemail, "Usage: settempemail <username> <email address>");
22 registercontrolhelpcmd("resendemail", NO_RELAY, 1, csa_doresendemail, "Usage: resendemail <username>");
23 registercontrolhelpcmd("activateuser", NO_RELAY, 1, csa_doactivateuser, "Usage: activateuser <username>");
354b3c0a
CP
24}
25
26void _fini(void) {
27 deregistercontrolcmd("checkhashpass", csa_docheckhashpass);
07bed5f4
CP
28 deregistercontrolcmd("createaccount", csa_docreateaccount);
29 deregistercontrolcmd("settempemail", csa_dosettempemail);
30 deregistercontrolcmd("resendemail", csa_doresendemail);
31 deregistercontrolcmd("activateuser", csa_doactivateuser);
354b3c0a
CP
32}
33
34int csa_docheckhashpass(void *source, int cargc, char **cargv) {
35 nick *sender=(nick *)source;
caee16ec 36 reguser *rup;
354b3c0a
CP
37 char *flags;
38
39 if(cargc<3) {
40 controlreply(sender, "CHECKHASHPASS FAIL args");
41 return CMD_ERROR;
42 }
43
44 if (!(rup=findreguserbynick(cargv[0]))) {
45 controlreply(sender, "CHECKHASHPASS FAIL user");
46 return CMD_OK;
47 }
48
49 flags = printflags(QUFLAG_ALL & rup->flags, ruflags);
50 if(UHasSuspension(rup)) {
51 controlreply(sender, "CHECKHASHPASS FAIL suspended %s %s %u", rup->username, flags, rup->ID);
caee16ec
CP
52 } else if(UIsInactive(rup)) {
53 controlreply(sender, "CHECKHASHPASS FAIL inactive %s %s %u", rup->username, flags, rup->ID);
354b3c0a
CP
54 } else if(!checkhashpass(rup, cargc<3?NULL:cargv[2], cargv[1])) {
55 controlreply(sender, "CHECKHASHPASS FAIL digest %s %s %u", rup->username, flags, rup->ID);
56 } else {
57 controlreply(sender, "CHECKHASHPASS OK %s %s %u %s", rup->username, flags, rup->ID, rup->email?rup->email->content:"-");
58 }
59
60 return CMD_OK;
61}
07bed5f4
CP
62
63static char *email_to_error(char *email) {
64 maildomain *mdp, *smdp;
65 char *local;
66 char *dupemail;
67 int found = 0;
68 maillock *mlp;
69 reguser *ruh;
70
3cfa791f 71 switch(csa_checkeboy_r(email)) {
07bed5f4 72 case -1: break;
3cfa791f
CP
73 case QM_EMAILTOOSHORT: return "emailshort";
74 case QM_EMAILNOAT: return "emailinvalid";
75 case QM_EMAILATEND: return "emailinvalid";
76 case QM_EMAILINVCHR: return "emailinvalid";
77 case QM_NOTYOUREMAIL: return "emailnotyours";
78 case QM_INVALIDEMAIL: return "emailinvalid";
79 default: return "emailunknown";
07bed5f4
CP
80 }
81
82 /* maildomain BS... c&p from hello.c */
83 for(mlp=maillocks;mlp;mlp=mlp->next) {
84 if(!match(mlp->pattern->content, email)) {
3cfa791f 85 return "emaillocked";
07bed5f4
CP
86 }
87 }
88
89 dupemail = strdup(email);
90 local=strchr(dupemail, '@');
91 if(!local) {
92 free(dupemail);
3cfa791f 93 return "emailunknown";
07bed5f4
CP
94 }
95 *(local++)='\0';
96
97 mdp=findnearestmaildomain(local);
98 if(mdp) {
99 for(smdp=mdp; smdp; smdp=smdp->parent) {
100 if(MDIsBanned(smdp)) {
101 free(dupemail);
3cfa791f 102 return "emaillocked";
07bed5f4
CP
103 }
104 if((smdp->count >= smdp->limit) && (smdp->limit > 0)) {
105 free(dupemail);
3cfa791f 106 return "emaildomainlimit";
07bed5f4
CP
107 }
108 }
109 }
110
111 mdp=findmaildomainbydomain(local);
112 if(mdp) {
113 for (ruh=mdp->users; ruh; ruh=ruh->nextbydomain) {
114 if (ruh->localpart)
115 if (!strcasecmp(dupemail, ruh->localpart->content)) {
116 found++;
117 }
118 }
119
120 if((found >= mdp->actlimit) && (mdp->actlimit > 0)) {
121 free(dupemail);
3cfa791f 122 return "emailaddresslimit";
07bed5f4
CP
123 }
124 }
125
126 return NULL;
127}
128
129static void sendemail(reguser *rup) {
130 csdb_createmail(rup, QMAIL_ACTIVATEEMAIL);
131}
132
133int csa_docreateaccount(void *source, int cargc, char **cargv) {
134 nick *sender=(nick *)source;
135 int execute;
136 char *error_username = NULL, *error_password = NULL, *error_email = NULL;
137 char *username = NULL, *password = NULL, *email = NULL;
138 int do_create;
139
140 if(cargc<4) {
141 controlreply(sender, "CREATEACCOUNT FALSE args");
142 return CMD_ERROR;
143 }
144
145 execute = cargv[0][0] == '1';
146 if(strcmp(cargv[1], "0"))
147 username = cargv[1];
148 if(strcmp(cargv[2], "0"))
149 email = cargv[2];
150 if(strcmp(cargv[3], "0"))
151 password = cargv[3];
152
153 if(username) {
154 if (findreguserbynick(username)) {
3cfa791f 155 error_username = "usernameinuse";
07bed5f4 156 } else if(csa_checkaccountname_r(username)) {
3cfa791f 157 error_username = "usernameinvalid";
07bed5f4
CP
158 }
159 }
160
161 if(email)
162 error_email = email_to_error(email);
163
164 if(password) {
165 int r = csa_checkpasswordquality(password);
166 if(r == QM_PWTOSHORT) {
3cfa791f 167 error_password = "passwordshort";
07bed5f4 168 } else if(r == QM_PWTOWEAK) {
3cfa791f 169 error_password = "passwordweak";
07bed5f4 170 } else if(r != -1) {
3cfa791f 171 error_password = "passwordunknown";
07bed5f4
CP
172 }
173 }
174
175 if(execute && email && password && username && !error_email && !error_password && !error_username) {
176 reguser *rup;
177 do_create = 1;
178
179 rup = csa_createaccount(username, password, email);
180 USetInactive(rup);
181
182 cs_log(sender,"CREATEACCOUNT created auth %s (%s)",rup->username,rup->email->content);
183 csdb_createuser(rup);
184
185 sendemail(rup);
186 } else {
187 do_create = 0;
188 }
189
3cfa791f 190 controlreply(sender, "CREATEACCOUNT %s%s%s%s%s%s%s",
07bed5f4 191 do_create ? "TRUE" : "FALSE",
3cfa791f
CP
192 email && error_email ? " " : "", email && error_email ? error_email : "",
193 password && error_password ? " " : "", password && error_password ? error_password : "",
194 username && error_username ? " " : "", username && error_username ? error_username : ""
07bed5f4
CP
195 );
196
197 return CMD_OK;
198}
199
200int csa_dosettempemail(void *source, int cargc, char **cargv) {
201 char *email;
202 char *error;
203 reguser *rup;
204 nick *sender=(nick *)source;
205
206 if(cargc<2) {
207 controlreply(sender, "SETTEMPEMAIL FALSE args");
208 return CMD_ERROR;
209 }
210
211 rup = findreguserbynick(cargv[0]);
212 if(rup == NULL) {
3cfa791f 213 controlreply(sender, "SETTEMPEMAIL FALSE usernamenotexist");
07bed5f4
CP
214 return CMD_ERROR;
215 }
216
217 if(!UIsInactive(rup)) {
3cfa791f 218 controlreply(sender, "SETTEMPEMAIL FALSE accountactive");
07bed5f4
CP
219 return CMD_ERROR;
220 }
221
222 email = cargv[1];
223 error = email_to_error(email);
224 if(error) {
225 controlreply(sender, "SETTEMPEMAIL FALSE %s", error);
226 return CMD_ERROR;
227 }
228
229 freesstring(rup->email);
230 rup->email=getsstring(email,EMAILLEN);
231 cs_log(sender,"SETTEMPEMAIL OK username %s email %s",rup->username, rup->email->content);
232
233 csdb_updateuser(rup);
234 sendemail(rup);
235
236 controlreply(sender, "SETTEMPEMAIL TRUE");
237
238 return CMD_OK;
239}
240
241int csa_doresendemail(void *source, int cargc, char **cargv) {
242 reguser *rup;
243 nick *sender=(nick *)source;
244
245 if(cargc<1) {
246 controlreply(sender, "RESENDEMAIL FALSE args");
247 return CMD_ERROR;
248 }
249
250 rup = findreguserbynick(cargv[0]);
251 if(rup == NULL) {
3cfa791f 252 controlreply(sender, "RESENDEMAIL FALSE usernamenotexist");
07bed5f4
CP
253 return CMD_ERROR;
254 }
255
256 if(!UIsInactive(rup)) {
3cfa791f 257 controlreply(sender, "RESENDEMAIL FALSE accountactive");
07bed5f4
CP
258 return CMD_ERROR;
259 }
260
261 sendemail(rup);
262 controlreply(sender, "RESENDEMAIL TRUE");
263 cs_log(sender,"RESENDEMAIL OK username %s",rup->username);
264
265 return CMD_OK;
266}
267
268int csa_doactivateuser(void *source, int cargc, char **cargv) {
269 reguser *rup;
270 nick *sender=(nick *)source;
271
272 if(cargc<1) {
273 controlreply(sender, "ACTIVATEUSER FALSE args");
274 return CMD_ERROR;
275 }
276
277 rup = findreguserbynick(cargv[0]);
278 if(rup == NULL) {
3cfa791f 279 controlreply(sender, "ACTIVATEUSER FALSE usernamenotexist");
07bed5f4
CP
280 return CMD_ERROR;
281 }
282
283 if(!UIsInactive(rup)) {
3cfa791f 284 controlreply(sender, "ACTIVATEUSER FALSE accountactive");
07bed5f4
CP
285 return CMD_ERROR;
286 }
287
288 UClearInactive(rup);
289 csdb_updateuser(rup);
290
291 cs_log(sender,"ACTIVATEUSER OK username %s",rup->username);
292 controlreply(sender, "ACTIVATEUSER TRUE");
293
294 return CMD_OK;
295}