]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/disabledcmds/rollbackaccount.c
Bumped version to 1.00-RC3 and disabled some commands.
[irc/quakenet/newserv.git] / chanserv / disabledcmds / rollbackaccount.c
1 /* Automatically generated by refactor.pl.
2 *
3 *
4 * CMDNAME: rollbackaccount
5 * CMDLEVEL: QCMD_OPER
6 * CMDARGS: 2
7 * CMDDESC: Roll back password/email changes on an account.
8 * CMDFUNC: csa_dorollbackaccount
9 * CMDPROTO: int csa_dorollbackaccount(void *source, int cargc, char **cargv);
10 * CMDHELP: Usage: rollbackaccount <username> <duration>
11 * CMDHELP: Rolls back an account to a previous point, reverting password and email changes.
12 */
13
14 #include "../chanserv.h"
15 #include "../../lib/irc_string.h"
16 #include "../../dbapi/dbapi.h"
17
18 #include <stdio.h>
19 #include <string.h>
20
21 void csdb_dorollbackaccount_real(DBConn *dbconn, void *arg) {
22 nick *np=getnickbynumeric((unsigned long)arg);
23 reguser *rup;
24 unsigned int userID;
25 char *oldpass, *newpass, *oldemail, *newemail;
26 time_t changetime, authtime;
27 DBResult *pgres;
28
29 if(!dbconn)
30 return;
31
32 pgres=dbgetresult(dbconn);
33
34 if (!dbquerysuccessful(pgres)) {
35 Error("chanserv", ERR_ERROR, "Error loading account rollback data.");
36 return;
37 }
38
39 if (dbnumfields(pgres) != 7) {
40 Error("chanserv", ERR_ERROR, "Account rollback data format error.");
41 dbclear(pgres);
42 return;
43 }
44
45 if (!np) {
46 dbclear(pgres);
47 return;
48 }
49
50 if (!(rup=getreguserfromnick(np)) || !UHasOperPriv(rup)) {
51 Error("chanserv", ERR_ERROR, "No reguser pointer or oper privs in rollback account.");
52 dbclear(pgres);
53 return;
54 }
55
56 chanservsendmessage(np, "Attempting to rollback account %s:", rup->username);
57 while(dbfetchrow(pgres)) {
58 userID=strtoul(dbgetvalue(pgres, 0), NULL, 10);
59 changetime=strtoul(dbgetvalue(pgres, 1), NULL, 10);
60 authtime=strtoul(dbgetvalue(pgres, 2), NULL, 10);
61 oldpass=dbgetvalue(pgres, 3);
62 newpass=dbgetvalue(pgres, 4);
63 oldemail=dbgetvalue(pgres, 5);
64 newemail=dbgetvalue(pgres, 6);
65 if (strlen(newpass) > 0) {
66 setpassword(rup, oldpass);
67 chanservsendmessage(np, "Restoring old password (%s -> %s)", newpass, oldpass);
68 }
69 else if (strlen(newemail) > 0) {
70 /* WARNING: lastemail untouched */
71 freesstring(rup->email);
72 rup->email=getsstring(oldemail, EMAILLEN);
73 rup->lastemailchange=changetime;
74 chanservsendmessage(np, "Restoring old email (%s -> %s)", newemail, oldemail);
75 }
76 }
77 csdb_updateuser(rup);
78 chanservstdmessage(np, QM_DONE);
79
80 dbclear(pgres);
81 }
82
83 void csdb_rollbackaccounthistory(nick *np, reguser* rup, time_t starttime) {
84 q9u_asyncquery(csdb_dorollbackaccount_real, (void *)np->numeric,
85 "SELECT userID, changetime, authtime, oldpassword, newpassword, oldemail, newemail from chanserv.accounthistory where "
86 "userID=%u and changetime>%lu order by changetime desc limit 10", rup->ID, starttime);
87 }
88
89 int csa_dorollbackaccount(void *source, int cargc, char **cargv) {
90 reguser *rup, *trup;
91 nick *sender=source;
92 time_t starttime=getnettime();
93 long duration;
94
95 if (!(rup=getreguserfromnick(sender)))
96 return CMD_ERROR;
97
98 if (cargc < 2) {
99 chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "rollbackaccount");
100 return CMD_ERROR;
101 }
102
103 if (!(trup=findreguser(sender, cargv[0])))
104 return CMD_ERROR;
105
106 if (UHasOperPriv(trup)) {
107 chanservstdmessage(sender, QM_NOACCESS, "rollbackaccount", cargv[0]);
108 return CMD_ERROR;
109 }
110
111 if (!(duration=durationtolong(cargv[1]))) {
112 chanservsendmessage(sender, "Invalid duration.");
113 return CMD_ERROR;
114 }
115 starttime-=duration;
116
117 cs_log(sender,"ROLLBACKACCOUNT %s #%s %s", trup->username, rup->username, cargv[1]);
118
119 csdb_rollbackaccounthistory(sender, trup, starttime);
120
121 return CMD_OK;
122 }