]>
jfr.im git - irc/quakenet/newserv.git/blob - chanserv/authcmds.c
3 #include "../lib/irc_string.h"
8 int csa_dohello(void *source
, int cargc
, char **cargv
);
9 int csa_doauth(void *source
, int cargc
, char **cargv
);
10 int csa_doreqpw(void *source
, int cargc
, char **cargv
);
11 int csa_doreqmasterpw(void *source
, int cargc
, char **cargv
);
12 int csa_donewpw(void *source
, int cargc
, char **cargv
);
13 int csa_doemail(void *source
, int cargc
, char **cargv
);
14 int csa_dosetpw(void *source
, int cargc
, char **cargv
);
15 int csa_dosetmail(void *source
, int cargc
, char **cargv
);
16 int csa_dosetmasterpw(void *source
, int cargc
, char **cargv
);
20 chanservaddcommand("hello", QCMD_NOTAUTHED
, 2, csa_dohello
, "Creates a new user account.");
21 chanservaddcommand("auth", QCMD_ALIAS
| QCMD_SECURE
| QCMD_NOTAUTHED
, 2, csa_doauth
, "Authenticates you on the bot.");
22 chanservaddcommand("login", QCMD_SECURE
| QCMD_NOTAUTHED
, 2, csa_doauth
, "Authenticates you on the bot.");
23 chanservaddcommand("newpass", QCMD_AUTHED
, 3, csa_donewpw
, "Change your password.");
24 chanservaddcommand("email", QCMD_AUTHED
, 3, csa_doemail
, "Change your email address.");
25 chanservaddcommand("requestpassword", QCMD_NOTAUTHED
, 2, csa_doreqpw
, "Requests the current password by email.");
26 chanservaddcommand("requestmasterpassword", QCMD_AUTHED
, 1, csa_doreqmasterpw
, "Requests a new master password by email.");
27 chanservaddcommand("setpassword", QCMD_OPER
, 2, csa_dosetpw
, "Set a new password.");
28 chanservaddcommand("setemail", QCMD_OPER
, 2, csa_dosetmail
, "Set the email address.");
29 chanservaddcommand("setmasterpassword", QCMD_OPER
, 2, csa_dosetmasterpw
, "Set the master password.");
30 // chanservaddcommand("getpassword", QCMD_DEV, 2, csa_dogetpw, "Get the password.");
31 // chanservaddcommand("getmasterpassword", QCMD_DEV, 2, csa_dogetmasterpw, "Get the master password.");
36 chanservremovecommand("hello", csa_dohello
);
37 chanservremovecommand("auth", csa_doauth
);
38 chanservremovecommand("login", csa_doauth
);
39 chanservremovecommand("requestpassword", csa_doreqpw
);
40 chanservremovecommand("requestmasterpassword", csa_doreqmasterpw
);
41 chanservremovecommand("newpass", csa_donewpw
);
42 chanservremovecommand("email", csa_doemail
);
43 chanservremovecommand("setpassword", csa_dosetpw
);
44 chanservremovecommand("setemail", csa_dosetmail
);
45 chanservremovecommand("setmasterpassword", csa_dosetmasterpw
);
49 * check if account is "throttled"
51 int csa_checkthrottled(nick
*sender
, reguser
*rup
, char *s
)
58 d
=MAX_RESEND_TIME
+rup
->lastemailchange
-now
;
60 if (d
>MAX_RESEND_TIME
)
64 t
= ((float) d
) / ((float) 3600);
65 chanservstdmessage(sender
, QM_MAILTHROTTLED
, t
);
66 cs_log(sender
,"%s FAIL username %s, new request throttled for %.1f hours",s
,rup
->username
,t
);
73 * /msg Q HELLO <email address> <email address>
75 int csa_dohello(void *source
, int cargc
, char **cargv
) {
78 char userhost
[USERLEN
+HOSTLEN
+2];
80 if (getreguserfromnick(sender
))
84 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "hello");
88 if (findreguserbynick(sender
->nick
)) {
89 chanservstdmessage(sender
, QM_AUTHNAMEINUSE
, sender
->nick
);
93 if (strcmp(cargv
[0],cargv
[1])) {
94 chanservstdmessage(sender
, QM_EMAILDONTMATCH
);
95 cs_log(sender
,"HELLO FAIL username %s email don't match (%s vs %s)",sender
->nick
,cargv
[0],cargv
[1]);
99 if (csa_checkeboy(sender
, cargv
[0]))
104 rup
->ID
=++lastuserID
;
105 strncpy(rup
->username
,sender
->nick
,NICKLEN
); rup
->username
[NICKLEN
]='\0';
106 rup
->created
=time(NULL
);
107 rup
->lastauth
=time(NULL
);
108 rup
->lastemailchange
=time(NULL
);
109 rup
->flags
=QUFLAG_NOTICE
;
113 rup
->password
[0]='\0';
114 rup
->masterpass
[0]='\0';
115 rup
->email
=getsstring(cargv
[0],EMAILLEN
);
117 sprintf(userhost
,"%s@%s",sender
->ident
,sender
->host
->name
->content
);
118 rup
->lastuserhost
=getsstring(userhost
,USERLEN
+HOSTLEN
+1);
119 rup
->suspendreason
=NULL
;
126 addregusertohash(rup
);
127 csa_createrandompw(rup
->password
, PASSLEN
);
128 csa_createrandompw(rup
->masterpass
, PASSLEN
);
129 chanservstdmessage(sender
, QM_NEWACCOUNT
, rup
->username
,rup
->email
->content
);
130 cs_log(sender
,"HELLO OK created auth %s (%s)",rup
->username
,rup
->email
->content
);
131 csdb_createuser(rup
);
132 csdb_createmail(rup
, QMAIL_NEWACCOUNT
);
138 * /msg Q AUTH <account> <password>
140 int csa_doauth(void *source
, int cargc
, char **cargv
) {
145 char userhost
[USERLEN
+HOSTLEN
+2];
149 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "auth");
153 if (!(aup
= getactiveuserfromnick(sender
)))
157 if (aup
->authattempts
> MAXAUTHATTEMPT
) {
158 if ((aup
->authattempts
% 100) == 0)
159 chanservwallmessage("Warning: User %s!%s@%s attempted to auth %d times. Last attempt: AUTH %s %s",
160 nl
->np
->nick
, nl
->np
->ident
, nl
->np
->host
->name
->content
, cargv
[0], cargv
[1]);
161 chanservstdmessage(sender
, QM_AUTHFAIL
);
162 cs_log(sender
,"AUTH FAIL too many auth attempts (last attempt: AUTH %s %s)",cargv
[0], cargv
[1]);
166 if (!(rup
=findreguserbynick(cargv
[0]))) {
167 chanservstdmessage(sender
, QM_AUTHFAIL
);
168 cs_log(sender
,"AUTH FAIL bad username %s",cargv
[0]);
172 if (!checkpassword(rup
, cargv
[1])) {
173 chanservstdmessage(sender
, QM_AUTHFAIL
);
174 cs_log(sender
,"AUTH FAIL username %s bad password %s",rup
->username
,cargv
[1]);
178 rup
->lastauth
=time(NULL
);
179 sprintf(userhost
,"%s@%s",sender
->ident
,sender
->host
->name
->content
);
180 if (rup
->lastuserhost
)
181 freesstring(rup
->lastuserhost
);
182 rup
->lastuserhost
=getsstring(userhost
,USERLEN
+HOSTLEN
+1);
184 if (UHasSuspension(rup
) && rup
->suspendexp
&& (time(0) >= rup
->suspendexp
)) {
185 /* suspension has expired, remove it */
186 rup
->flags
&=(~(QUFLAG_SUSPENDED
|QUFLAG_GLINE
|QUFLAG_DELAYEDGLINE
));
189 freesstring(rup
->suspendreason
);
190 rup
->suspendreason
=0;
193 if (UIsNeedAuth(rup
))
194 rup
->flags
&=~(QUFLAG_NEEDAUTH
);
195 csdb_updateuser(rup
);
197 if (UIsDelayedGline(rup
)) {
198 /* delayed-gline - schedule the user's squelching */
199 deleteschedule(NULL
, &chanservdgline
, (void*)rup
); /* icky, but necessary unless we stick more stuff in reguser structure */
200 scheduleoneshot(time(NULL
)+rand()%900
, &chanservdgline
, (void*)rup
);
202 else if (UIsGline(rup
)) {
203 /* instant-gline - lets be lazy and set a schedule expiring now :) */
204 deleteschedule(NULL
, &chanservdgline
, (void*)rup
); /* icky, but necessary unless we stick more stuff in reguser structure */
205 scheduleoneshot(time(NULL
), &chanservdgline
, (void*)rup
);
207 else if (UIsSuspended(rup
)) {
209 chanservstdmessage(sender
, QM_AUTHSUSPENDED
);
210 chanservstdmessage(sender
, QM_REASON
, rup
->suspendreason
->content
);
211 if (rup
->suspendexp
) {
215 tmp
=gmtime(&(rup
->suspendexp
));
216 strftime(buf
, 15, "%d/%m/%y %H:%M", tmp
);
217 chanservstdmessage(sender
, QM_EXPIRES
, buf
);
222 if (!UHasHelperPriv(rup
) && !UIsNoAuthLimit(rup
)) {
223 for (nl
=rup
->nicks
; nl
; nl
=nl
->next
)
226 if (ucount
>= MAXAUTHCOUNT
) {
227 chanservstdmessage(sender
, QM_TOOMANYAUTHS
);
232 chanservstdmessage(sender
, QM_AUTHOK
, rup
->username
);
233 cs_log(sender
,"AUTH OK username %s", rup
->username
);
234 localusersetaccount(sender
, rup
->username
);
240 * /msg Q REQUESTPASSWORD <account> <email>
242 int csa_doreqpw(void *source
, int cargc
, char **cargv
) {
247 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "requestpassword");
251 if (!(rup
=findreguser(sender
, cargv
[0])))
254 if (ircd_strcmp(cargv
[1],rup
->email
->content
)) {
255 chanservstdmessage(sender
, QM_BADEMAIL
, rup
->username
);
256 cs_log(sender
,"REQUESTPASSWORD FAIL wrong email, username %s email %s",rup
->username
,cargv
[1]);
260 if (csa_checkthrottled(sender
, rup
, "REQUESTPASSWORD"))
263 rup
->lastemailchange
=time(NULL
);
264 csdb_updateuser(rup
);
265 csdb_createmail(rup
, QMAIL_REQPW
);
266 chanservstdmessage(sender
, QM_MAILQUEUED
, rup
->username
);
267 cs_log(sender
,"REQUESTPASSWORD OK username %s email %s", rup
->username
,rup
->email
->content
);
273 * /msg Q NEWPASS <master password> <new password> <new password>
275 int csa_donewpw(void *source
, int cargc
, char **cargv
) {
280 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "newpass");
284 if (!(rup
=getreguserfromnick(sender
)))
287 if (!checkmasterpassword(rup
, cargv
[0])) {
288 chanservstdmessage(sender
, QM_AUTHFAIL
);
289 cs_log(sender
,"NEWPASS FAIL username %s bad masterpassword %s",rup
->username
,cargv
[0]);
293 if (strcmp(cargv
[1],cargv
[2])) {
294 chanservstdmessage(sender
, QM_PWDONTMATCH
); /* Sorry, passwords do not match */
295 cs_log(sender
,"NEWPASS FAIL username %s new passwords don't match (%s vs %s)",rup
->username
,cargv
[1],cargv
[2]);
299 if (strlen(cargv
[1]) < 6) {
300 chanservstdmessage(sender
, QM_PWTOSHORT
); /* new password to short */
301 cs_log(sender
,"NEWPASS FAIL username %s password to short %s (%d characters)",rup
->username
,cargv
[1],strlen(cargv
[1]));
305 setpassword(rup
, cargv
[1]);
306 rup
->lastauth
=time(NULL
);
307 chanservstdmessage(sender
, QM_PWCHANGED
);
308 cs_log(sender
,"NEWPASS OK username %s", rup
->username
);
309 csdb_updateuser(rup
);
310 csdb_createmail(rup
, QMAIL_NEWPW
);
316 * /msg Q REQUESTMASTERPASSWORD
318 int csa_doreqmasterpw(void *source
, int cargc
, char **cargv
) {
322 if (!(rup
=getreguserfromnick(sender
)))
325 if (csa_checkthrottled(sender
, rup
, "REQUESTMASTERPASSWORD"))
328 csa_createrandompw(rup
->masterpass
, PASSLEN
);
329 chanservstdmessage(sender
, QM_MASTERPWCHANGED
);
330 cs_log(sender
,"REQUESTMASTERPASSWORD OK username %s",rup
->username
);
331 csdb_updateuser(rup
);
332 csdb_createmail(rup
, QMAIL_NEWMASTERPW
);
338 * /msg Q EMAIL <master password> <email address> <email address>
340 int csa_doemail(void *source
, int cargc
, char **cargv
) {
345 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "email");
349 if (!(rup
=getreguserfromnick(sender
)))
352 if (!checkmasterpassword(rup
, cargv
[0])) {
353 chanservstdmessage(sender
, QM_AUTHFAIL
);
354 cs_log(sender
,"EMAIL FAIL username %s bad masterpass %s",rup
->username
,cargv
[0]);
358 if (strcmp(cargv
[1],cargv
[2])) {
359 chanservstdmessage(sender
, QM_EMAILDONTMATCH
);
360 cs_log(sender
,"EMAIL FAIL username %s email don't match (%s vs %s)",rup
->username
,cargv
[1],cargv
[2]);
364 if (csa_checkeboy(sender
, cargv
[1]))
367 // rup2->ID = rup->ID;
368 // rup2->email=getsstring(rup->email->content,EMAILLEN); /* save previous email addy */
370 csdb_createmail(rup
, QMAIL_NEWEMAIL
);
371 freesstring(rup
->email
);
372 rup
->email
=getsstring(cargv
[1],EMAILLEN
);
373 rup
->lastemailchange
=time(NULL
);
374 chanservstdmessage(sender
, QM_EMAILCHANGED
, cargv
[1]);
375 cs_log(sender
,"EMAIL OK username %s",rup
->username
);
376 csdb_updateuser(rup
);
382 * /msg Q SETPASSWORD <account> <new password>
384 int csa_dosetpw(void *source
, int cargc
, char **cargv
) {
389 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "setpassword");
393 if (!(rup
=findreguser(sender
, cargv
[0])))
396 strncpy(rup
->password
,cargv
[1],PASSLEN
);
397 rup
->password
[PASSLEN
]='\0';
398 chanservstdmessage(sender
, QM_PWCHANGED
);
399 cs_log(sender
,"SETPASSWORD OK username %s",rup
->username
);
400 csdb_updateuser(rup
);
406 * /msg Q SETEMAIL <account> <email address>
408 int csa_dosetmail(void *source
, int cargc
, char **cargv
) {
413 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "setemail");
417 if (!(rup
=findreguser(sender
, cargv
[0])))
420 if (csa_checkeboy(sender
, cargv
[1]))
423 freesstring(rup
->email
);
424 rup
->email
=getsstring(cargv
[1],EMAILLEN
);
425 rup
->lastemailchange
=time(NULL
);
426 chanservstdmessage(sender
, QM_EMAILCHANGED
, cargv
[1]);
427 cs_log(sender
,"SETEMAIL OK username %s <%s>",rup
->username
,rup
->email
->content
);
428 csdb_updateuser(rup
);
434 * /msg Q SETMASTERPASSWORD <account>
436 int csa_dosetmasterpw(void *source
, int cargc
, char **cargv
) {
441 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "setmasterpassword");
445 if (!(rup
=findreguser(sender
, cargv
[0])))
448 csa_createrandompw(rup
->masterpass
, PASSLEN
);
449 chanservstdmessage(sender
, QM_MASTERPWCHANGED
);
450 cs_log(sender
,"SETMASTERPASSWORD OK username %s",rup
->username
);
451 csdb_updateuser(rup
);