]> jfr.im git - irc/quakenet/newserv.git/blame - chanserv/authcmds/reset.c
Fix timing attacks in HMAC functions.
[irc/quakenet/newserv.git] / chanserv / authcmds / reset.c
CommitLineData
30a66d6c
CP
1/* Automatically generated by refactor.pl.
2 *
3 *
4 * CMDNAME: reset
5 * CMDLEVEL: QCMD_NOTAUTHED
6 * CMDARGS: 2
7 * CMDDESC: Restores the old details on an account after a change.
8 * CMDFUNC: csa_doreset
9 * CMDPROTO: int csa_doreset(void *source, int cargc, char **cargv);
10 * CMDHELP: Usage: RESET <username> <code>
11 * CMDHELP: Restores your old email address and password if any of these
12 * CMDHELP: have recently changed, where the following parameters are:
13 * CMDHELP: username - your username
14 * CMDHELP: code - the code received in the RESET email.
15 */
16
17#include "../chanserv.h"
18#include "../authlib.h"
19#include "../../lib/irc_string.h"
20#include <stdio.h>
21#include <string.h>
86d2bc73 22#include <time.h>
30a66d6c
CP
23
24int csa_doreset(void *source, int cargc, char **cargv) {
25 reguser *rup;
26 nick *sender=source;
0f32b411 27 char newpassword[PASSLEN+1];
86d2bc73
CP
28 time_t t;
29
30a66d6c
CP
30 if (cargc<2) {
31 chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "reset");
32 return CMD_ERROR;
33 }
34
35 if (!(rup=findreguser(sender, cargv[0])))
36 return CMD_ERROR;
37
86d2bc73 38 t=time(NULL);
372e4f1d 39 if(UHasStaffPriv(rup) || (!rup->lockuntil || rup->lockuntil <= t)) {
30a66d6c
CP
40 chanservstdmessage(sender, QM_ACCOUNTNOTLOCKED);
41 return CMD_ERROR;
42 }
43
0bd91417 44 if(hmac_strcmp(cargv[1], csc_generateresetcode(rup->lockuntil, rup->username))) {
30a66d6c
CP
45 chanservstdmessage(sender, QM_BADRESETCODE);
46 return CMD_ERROR;
47 }
48
0f32b411
CP
49 csa_createrandompw(newpassword, PASSLEN);
50
30a66d6c 51 if(rup->lastemail) {
0f32b411 52 csdb_accounthistory_insert(sender, rup->password, newpassword, rup->email?rup->email->content:NULL, rup->lastemail->content);
30a66d6c
CP
53 if(rup->email)
54 freesstring(rup->email);
55 rup->email=rup->lastemail;
56 rup->lastemail=NULL;
0f32b411
CP
57 } else {
58 csdb_accounthistory_insert(sender, rup->password, newpassword, NULL, NULL);
30a66d6c 59 }
0f32b411
CP
60 setpassword(rup, newpassword);
61
30a66d6c 62 rup->lockuntil=0;
86d2bc73
CP
63 rup->lastpasschange=t;
64
30a66d6c
CP
65 cs_log(sender,"RESET OK username %s", rup->username);
66 csdb_updateuser(rup);
67 csdb_createmail(rup, QMAIL_RESET);
68 chanservstdmessage(sender, QM_RESETOK);
69
70 return CMD_OK;
71}