1 /* Automatically generated by refactor.pl.
4 * CMDNAME: rollbackaccount
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.
14 #include "../chanserv.h"
15 #include "../../lib/irc_string.h"
16 #include "../../dbapi/dbapi.h"
21 void csdb_dorollbackaccount_real(DBConn
*dbconn
, void *arg
) {
22 nick
*np
=getnickbynumeric((unsigned long)arg
);
25 char *oldpass
, *newpass
, *oldemail
, *newemail
;
26 time_t changetime
, authtime
;
32 pgres
=dbgetresult(dbconn
);
34 if (!dbquerysuccessful(pgres
)) {
35 Error("chanserv", ERR_ERROR
, "Error loading account rollback data.");
39 if (dbnumfields(pgres
) != 7) {
40 Error("chanserv", ERR_ERROR
, "Account rollback data format error.");
50 if (!(rup
=getreguserfromnick(np
)) || !UHasOperPriv(rup
)) {
51 Error("chanserv", ERR_ERROR
, "No reguser pointer or oper privs in rollback account.");
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
);
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
);
78 chanservstdmessage(np
, QM_DONE
);
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
);
89 int csa_dorollbackaccount(void *source
, int cargc
, char **cargv
) {
92 time_t starttime
=getnettime();
95 if (!(rup
=getreguserfromnick(sender
)))
99 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "rollbackaccount");
103 if (!(trup
=findreguser(sender
, cargv
[0])))
106 if (UHasOperPriv(trup
)) {
107 chanservstdmessage(sender
, QM_NOACCESS
, "rollbackaccount", cargv
[0]);
111 if (!(duration
=durationtolong(cargv
[1]))) {
112 chanservsendmessage(sender
, "Invalid duration.");
117 cs_log(sender
,"ROLLBACKACCOUNT %s #%s %s", trup
->username
, rup
->username
, cargv
[1]);
119 csdb_rollbackaccounthistory(sender
, trup
, starttime
);