]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/authcmds/newpass.c
Merge.
[irc/quakenet/newserv.git] / chanserv / authcmds / newpass.c
1 /* Automatically generated by refactor.pl.
2 *
3 *
4 * CMDNAME: newpass
5 * CMDALIASES: newpassword
6 * CMDLEVEL: QCMD_SECURE | QCMD_AUTHED
7 * CMDARGS: 3
8 * CMDDESC: Change your password.
9 * CMDFUNC: csa_donewpw
10 * CMDPROTO: int csa_donewpw(void *source, int cargc, char **cargv);
11 * CMDHELP: Usage: @UCOMMAND@ <oldpassword> <newpassword> <newpassword>
12 * CMDHELP: Changes your account password. Your new password must be at least 6 characters
13 * CMDHELP: long, contain at least one number and one letter, and may not contain sequences
14 * CMDHELP: of letters or numbers. Your new password will be sent to your registered email
15 * CMDHELP: address. Where:
16 * CMDHELP: oldpassword - your existing account password
17 * CMDHELP: newpassword - your desired new password. Must be entered the same both times.
18 * CMDHELP: Note: due to the sensitive nature of this command, you must send the message to
19 * CMDHELP: Q@CServe.quakenet.org when using it.
20 */
21
22 #include "../chanserv.h"
23 #include "../authlib.h"
24 #include "../../lib/irc_string.h"
25 #include "../../core/hooks.h"
26 #include <stdio.h>
27 #include <string.h>
28 #include <ctype.h>
29
30 int csa_donewpw(void *source, int cargc, char **cargv) {
31 reguser *rup;
32 nick *sender=source;
33 int i, cntweak = 0, cntdigits = 0, cntletters = 0;
34 unsigned int same=0;
35 time_t t;
36
37 if (cargc<3) {
38 chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "newpass");
39 return CMD_ERROR;
40 }
41
42 if (!(rup=getreguserfromnick(sender)))
43 return CMD_ERROR;
44
45 if (!checkpassword(rup, cargv[0])) {
46 chanservstdmessage(sender, QM_AUTHFAIL);
47 cs_log(sender,"NEWPASS FAIL username %s bad password %s",rup->username,cargv[0]);
48 return CMD_ERROR;
49 }
50
51 if (strcmp(cargv[1],cargv[2])) {
52 chanservstdmessage(sender, QM_PWDONTMATCH); /* Sorry, passwords do not match */
53 cs_log(sender,"NEWPASS FAIL username %s new passwords don't match (%s vs %s)",rup->username,cargv[1],cargv[2]);
54 return CMD_ERROR;
55 }
56
57 if (strlen(cargv[1]) < 6) {
58 chanservstdmessage(sender, QM_PWTOSHORT); /* new password to short */
59 cs_log(sender,"NEWPASS FAIL username %s password to short %s (%zu characters)",rup->username,cargv[1],strlen(cargv[1]));
60 return CMD_ERROR;
61 }
62
63 if (!strcmp(cargv[0],cargv[1])) {
64 /* If they are the same then continue anyway but don't send the hook later. */
65 same=1;
66 }
67
68 for ( i = 0; cargv[1][i] && i < PASSLEN; i++ ) {
69 if ( cargv[1][i] == cargv[1][i+1] || cargv[1][i] + 1 == cargv[1][i+1] || cargv[1][i] - 1 == cargv[1][i+1] )
70 cntweak++;
71 if(isdigit(cargv[1][i]))
72 cntdigits++;
73 if(islower(cargv[1][i]) || isupper(cargv[1][i]))
74 cntletters++;
75 }
76
77 if( cntweak > 3 || !cntdigits || !cntletters) {
78 chanservstdmessage(sender, QM_PWTOWEAK); /* new password is weak */
79 cs_log(sender,"NEWPASS FAIL username %s password to weak %s",rup->username,cargv[1]);
80 return CMD_ERROR;
81 }
82
83 t=time(NULL);
84 if(!UHasStaffPriv(rup)) {
85 if(rup->lockuntil && rup->lockuntil > t) {
86 chanservstdmessage(sender, QM_ACCOUNTLOCKED, rup->lockuntil);
87 return CMD_ERROR;
88 }
89 rup->lockuntil=t+7*24*3600;
90 } else {
91 rup->lockuntil=0;
92 }
93
94 if(rup->lastemail) {
95 freesstring(rup->lastemail);
96 rup->lastemail=NULL;
97 }
98
99 rup->lastpasschange=t;
100 csdb_accounthistory_insert(sender, rup->password, cargv[1], NULL, NULL);
101 setpassword(rup, cargv[1]);
102
103 rup->lastauth=time(NULL);
104 chanservstdmessage(sender, QM_PWCHANGED);
105 cs_log(sender,"NEWPASS OK username %s", rup->username);
106
107 #ifdef AUTHGATE_WARNINGS
108 if(UHasOperPriv(rup))
109 chanservsendmessage(sender, "WARNING FOR PRIVILEGED USERS: you MUST go to https://auth.quakenet.org and login successfully to update the cache, if you do not your old password will still be usable in certain circumstances.");
110 #endif
111
112 csdb_updateuser(rup);
113 csdb_createmail(rup, QMAIL_NEWPW);
114
115 if (!same)
116 triggerhook(HOOK_CHANSERV_PWCHANGE, sender);
117
118 return CMD_OK;
119 }