]> jfr.im git - irc/quakenet/newserv.git/blame - chanserv/usercmds/rollbackaccount.c
Moved all chanserv tables into schema "chanserv".
[irc/quakenet/newserv.git] / chanserv / usercmds / rollbackaccount.c
CommitLineData
183b8e2f
P
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);
94e4d2f4
CP
10 * CMDHELP: Usage: rollbackaccount <username> <duration>
11 * CMDHELP: Rolls back an account to a previous point, reverting password and email changes.
183b8e2f
P
12 */
13
14#include "../chanserv.h"
15#include "../../lib/irc_string.h"
6b2ca929 16#include "../../pqsql/pqsql.h"
17
18#include <libpq-fe.h>
183b8e2f
P
19#include <stdio.h>
20#include <string.h>
21
6b2ca929 22void csdb_dorollbackaccount_real(PGconn *dbconn, void *arg) {
c54295ef 23 nick *np=getnickbynumeric((unsigned long)arg);
6b2ca929 24 reguser *rup;
25 unsigned int userID;
26 char *oldpass, *newpass, *oldemail, *newemail;
27 time_t changetime, authtime;
28 PGresult *pgres;
29 int i, num;
30
b3565978
CP
31 if(!dbconn)
32 return;
33
6b2ca929 34 pgres=PQgetResult(dbconn);
35
36 if (PQresultStatus(pgres) != PGRES_TUPLES_OK) {
37 Error("chanserv", ERR_ERROR, "Error loading account rollback data.");
38 return;
39 }
40
41 if (PQnfields(pgres) != 7) {
42 Error("chanserv", ERR_ERROR, "Account rollback data format error.");
c34af51f 43 PQclear(pgres);
6b2ca929 44 return;
45 }
46
47 num=PQntuples(pgres);
48
49 if (!np) {
50 PQclear(pgres);
51 return;
52 }
53
54 if (!(rup=getreguserfromnick(np)) || !UHasOperPriv(rup)) {
55 Error("chanserv", ERR_ERROR, "No reguser pointer or oper privs in rollback account.");
56 PQclear(pgres);
57 return;
58 }
59
60 chanservsendmessage(np, "Attempting to rollback account %s:", rup->username);
61 for (i=0; i<num; i++) {
62 userID=strtoul(PQgetvalue(pgres, i, 0), NULL, 10);
63 changetime=strtoul(PQgetvalue(pgres, i, 1), NULL, 10);
64 authtime=strtoul(PQgetvalue(pgres, i, 2), NULL, 10);
65 oldpass=PQgetvalue(pgres, i, 3);
66 newpass=PQgetvalue(pgres, i, 4);
67 oldemail=PQgetvalue(pgres, i, 5);
68 newemail=PQgetvalue(pgres, i, 6);
69 if (strlen(newpass) > 0) {
70 setpassword(rup, oldpass);
71 chanservsendmessage(np, "Restoring old password (%s -> %s)", newpass, oldpass);
72 }
73 else if (strlen(newemail) > 0) {
9708f78f 74 /* WARNING: lastemail untouched */
6b2ca929 75 freesstring(rup->email);
76 rup->email=getsstring(oldemail, EMAILLEN);
77 rup->lastemailchange=changetime;
78 chanservsendmessage(np, "Restoring old email (%s -> %s)", newemail, oldemail);
79 }
80 }
81 csdb_updateuser(rup);
82 chanservstdmessage(np, QM_DONE);
83
84 PQclear(pgres);
85}
86
87void csdb_rollbackaccounthistory(nick *np, reguser* rup, time_t starttime) {
b3565978 88 q9u_asyncquery(csdb_dorollbackaccount_real, (void *)np->numeric,
522e2b8c 89 "SELECT userID, changetime, authtime, oldpassword, newpassword, oldemail, newemail from chanserv.accounthistory where "
6b2ca929 90 "userID=%u and changetime>%lu order by changetime desc limit 10", rup->ID, starttime);
91}
92
183b8e2f
P
93int csa_dorollbackaccount(void *source, int cargc, char **cargv) {
94 reguser *rup, *trup;
95 nick *sender=source;
96 time_t starttime=getnettime();
97 long duration;
98
99 if (!(rup=getreguserfromnick(sender)))
100 return CMD_ERROR;
101
102 if (cargc < 2) {
103 chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "rollbackaccount");
104 return CMD_ERROR;
105 }
106
107 if (!(trup=findreguser(sender, cargv[0])))
108 return CMD_ERROR;
109
110 if (UHasOperPriv(trup)) {
111 chanservstdmessage(sender, QM_NOACCESS, "rollbackaccount", cargv[0]);
112 return CMD_ERROR;
113 }
114
115 if (!(duration=durationtolong(cargv[1]))) {
116 chanservsendmessage(sender, "Invalid duration.");
117 return CMD_ERROR;
118 }
119 starttime-=duration;
120
121 cs_log(sender,"ROLLBACKACCOUNT %s #%s %s", trup->username, rup->username, cargv[1]);
122
123 csdb_rollbackaccounthistory(sender, trup, starttime);
124
125 return CMD_OK;
126}