]> jfr.im git - irc/quakenet/newserv.git/blame - chanserv/chanservdb_updates.c
CHANNEL/LUA: Add ability to see old modes to HOOK_CHANNEL_MODECHANGE.
[irc/quakenet/newserv.git] / chanserv / chanservdb_updates.c
CommitLineData
b263aa79 1/*
2 * chanservdb_updates.c:
3 * Handle all the update requests for the database.
4 */
5
183b8e2f 6#include "chanserv.h"
ee8cd7d0 7#include "../dbapi/dbapi.h"
183b8e2f
P
8#include "../core/config.h"
9#include "../lib/sstring.h"
10#include "../parser/parser.h"
11#include "../core/events.h"
b263aa79 12
13#include <string.h>
b263aa79 14#include <stdio.h>
15#include <sys/poll.h>
16#include <stdarg.h>
17
18void csdb_updateauthinfo(reguser *rup) {
80d2de64 19 char eschost[2*HOSTLEN+1];
b263aa79 20
ee8cd7d0
CP
21 dbescapestring(eschost,rup->lastuserhost->content,rup->lastuserhost->length);
22 dbquery("UPDATE chanserv.users SET lastauth=%lu,lastuserhost='%s' WHERE ID=%u",
b263aa79 23 rup->lastauth,eschost,rup->ID);
24}
25
26void csdb_updatelastjoin(regchanuser *rcup) {
ee8cd7d0 27 dbquery("UPDATE chanserv.chanusers SET usetime=%lu WHERE userID=%u and channelID=%u",
b263aa79 28 rcup->usetime, rcup->user->ID, rcup->chan->ID);
29}
30
31void csdb_updatetopic(regchan *rcp) {
32 char esctopic[TOPICLEN*2+5];
33
34 if (rcp->topic) {
ee8cd7d0 35 dbescapestring(esctopic,rcp->topic->content,rcp->topic->length);
b263aa79 36 } else {
37 esctopic[0]='\0';
38 }
ee8cd7d0 39 dbquery("UPDATE chanserv.channels SET topic='%s' WHERE ID=%u",esctopic,rcp->ID);
b263aa79 40}
41
42void csdb_updatechannel(regchan *rcp) {
80d2de64
P
43 char escwelcome[WELCOMELEN*2+1];
44 char esctopic[TOPICLEN*2+1];
b263aa79 45 char esckey[70];
46 char escreason[510];
47 char esccomment[510];
48 char escname[1000];
49
ee8cd7d0 50 dbescapestring(escname, rcp->index->name->content, rcp->index->name->length);
b263aa79 51
52 if (rcp->welcome)
ee8cd7d0 53 dbescapestring(escwelcome, rcp->welcome->content,
b263aa79 54 rcp->welcome->length);
55 else
56 escwelcome[0]='\0';
57
58 if (rcp->topic)
ee8cd7d0 59 dbescapestring(esctopic, rcp->topic->content, rcp->topic->length);
b263aa79 60 else
61 esctopic[0]='\0';
62
63 if (rcp->key)
ee8cd7d0 64 dbescapestring(esckey, rcp->key->content, rcp->key->length);
b263aa79 65 else
66 esckey[0]='\0';
67
68 if (rcp->suspendreason)
ee8cd7d0 69 dbescapestring(escreason, rcp->suspendreason->content,
b263aa79 70 rcp->suspendreason->length);
71 else
72 escreason[0]='\0';
73
74 if (rcp->comment)
ee8cd7d0 75 dbescapestring(esccomment, rcp->comment->content,
b263aa79 76 rcp->comment->length);
77 else
78 esccomment[0]='\0';
79
ee8cd7d0 80 dbquery("UPDATE chanserv.channels SET name='%s', flags=%d, forcemodes=%d,"
b263aa79 81 "denymodes=%d, chanlimit=%d, autolimit=%d, banstyle=%d,"
82 "lastactive=%lu,statsreset=%lu, banduration=%lu, founder=%u,"
e086bfee 83 "addedby=%u, suspendby=%u, suspendtime=%lu, chantype=%d, totaljoins=%u,"
b263aa79 84 "tripjoins=%u, maxusers=%u, tripusers=%u,"
85 "welcome='%s', topic='%s', chankey='%s', suspendreason='%s',"
16739dbe 86 "comment='%s', lasttimestamp=%jd WHERE ID=%u",escname,rcp->flags,rcp->forcemodes,
b263aa79 87 rcp->denymodes,rcp->limit,rcp->autolimit, rcp->banstyle,
88 rcp->lastactive,rcp->statsreset,rcp->banduration,
88d191e3 89 rcp->founder, rcp->addedby, rcp->suspendby, rcp->suspendtime,
b263aa79 90 rcp->chantype,rcp->totaljoins,rcp->tripjoins,
91 rcp->maxusers,rcp->tripusers,
58a4da4a 92 escwelcome,esctopic,esckey,escreason,esccomment,(intmax_t)rcp->ltimestamp,rcp->ID);
b263aa79 93}
94
95void csdb_updatechannelcounters(regchan *rcp) {
ee8cd7d0 96 dbquery("UPDATE chanserv.channels SET "
b263aa79 97 "lastactive=%lu, totaljoins=%u,"
98 "tripjoins=%u, maxusers=%u, tripusers=%u "
99 "WHERE ID=%u",
100 rcp->lastactive,
101 rcp->totaljoins,rcp->tripjoins,
102 rcp->maxusers,rcp->tripusers,
103 rcp->ID);
104}
105
106void csdb_updatechanneltimestamp(regchan *rcp) {
ee8cd7d0 107 dbquery("UPDATE chanserv.channels SET "
16739dbe 108 "lasttimestamp=%jd WHERE ID=%u",
58a4da4a 109 (intmax_t)rcp->ltimestamp, rcp->ID);
b263aa79 110}
111
112void csdb_createchannel(regchan *rcp) {
80d2de64
P
113 char escwelcome[WELCOMELEN*2+1];
114 char esctopic[TOPICLEN*2+1];
b263aa79 115 char esckey[70];
116 char escreason[510];
117 char esccomment[510];
118 char escname[510];
119
ee8cd7d0 120 dbescapestring(escname, rcp->index->name->content, rcp->index->name->length);
b263aa79 121
122 if (rcp->welcome)
ee8cd7d0 123 dbescapestring(escwelcome, rcp->welcome->content,
b263aa79 124 rcp->welcome->length);
125 else
126 escwelcome[0]='\0';
127
128 if (rcp->topic)
ee8cd7d0 129 dbescapestring(esctopic, rcp->topic->content, rcp->topic->length);
b263aa79 130 else
131 esctopic[0]='\0';
132
133 if (rcp->key)
ee8cd7d0 134 dbescapestring(esckey, rcp->key->content, rcp->key->length);
b263aa79 135 else
136 esckey[0]='\0';
137
138 if (rcp->suspendreason)
ee8cd7d0 139 dbescapestring(escreason, rcp->suspendreason->content,
b263aa79 140 rcp->suspendreason->length);
141 else
142 escreason[0]='\0';
143
144 if (rcp->comment)
ee8cd7d0 145 dbescapestring(esccomment, rcp->comment->content,
b263aa79 146 rcp->comment->length);
147 else
148 esccomment[0]='\0';
149
ee8cd7d0 150 dbquery("INSERT INTO chanserv.channels (ID, name, flags, forcemodes, denymodes,"
b263aa79 151 "chanlimit, autolimit, banstyle, created, lastactive, statsreset, "
88d191e3 152 "banduration, founder, addedby, suspendby, suspendtime, chantype, totaljoins, tripjoins,"
b263aa79 153 "maxusers, tripusers, welcome, topic, chankey, suspendreason, "
154 "comment, lasttimestamp) VALUES (%u,'%s',%d,%d,%d,%d,%d,%d,%lu,%lu,%lu,%lu,%u,"
16739dbe 155 "%u,%u,%lu,%d,%u,%u,%u,%u,'%s','%s','%s','%s','%s',%jd)",
b263aa79 156 rcp->ID, escname, rcp->flags,rcp->forcemodes,
157 rcp->denymodes,rcp->limit,rcp->autolimit, rcp->banstyle, rcp->created,
158 rcp->lastactive,rcp->statsreset,rcp->banduration,
88d191e3 159 rcp->founder, rcp->addedby, rcp->suspendby, rcp->suspendtime,
b263aa79 160 rcp->chantype,rcp->totaljoins,rcp->tripjoins,
161 rcp->maxusers,rcp->tripusers,
58a4da4a 162 escwelcome,esctopic,esckey,escreason,esccomment,(intmax_t)rcp->ltimestamp);
b263aa79 163}
164
165void csdb_deletechannel(regchan *rcp) {
ee8cd7d0
CP
166 dbquery("DELETE FROM chanserv.channels WHERE ID=%u",rcp->ID);
167 dbquery("DELETE FROM chanserv.chanusers WHERE channelID=%u",rcp->ID);
168 dbquery("DELETE FROM chanserv.bans WHERE channelID=%u",rcp->ID);
b263aa79 169}
170
171void csdb_deleteuser(reguser *rup) {
ee8cd7d0
CP
172 dbquery("DELETE FROM chanserv.users WHERE ID=%u",rup->ID);
173 dbquery("DELETE FROM chanserv.chanusers WHERE userID=%u",rup->ID);
b263aa79 174}
175
176void csdb_updateuser(reguser *rup) {
177 char escpassword[25];
b263aa79 178 char escemail[210];
179 char esclastuserhost[160];
180 char escreason[510];
181 char esccomment[510];
182 char escinfo[210];
9708f78f
CP
183 char esclastemail[210];
184
ee8cd7d0 185 dbescapestring(escpassword, rup->password, strlen(rup->password));
b263aa79 186
187 if (rup->email)
ee8cd7d0 188 dbescapestring(escemail, rup->email->content, rup->email->length);
b263aa79 189 else
190 escemail[0]='\0';
191
9708f78f 192 if (rup->lastemail)
ee8cd7d0 193 dbescapestring(esclastemail, rup->lastemail->content, rup->lastemail->length);
9708f78f
CP
194 else
195 esclastemail[0]='\0';
196
b263aa79 197 if (rup->lastuserhost)
ee8cd7d0 198 dbescapestring(esclastuserhost, rup->lastuserhost->content, rup->lastuserhost->length);
b263aa79 199 else
200 esclastuserhost[0]='\0';
201
202 if (rup->suspendreason)
ee8cd7d0 203 dbescapestring(escreason, rup->suspendreason->content, rup->suspendreason->length);
b263aa79 204 else
205 escreason[0]='\0';
206
207 if (rup->comment)
ee8cd7d0 208 dbescapestring(esccomment, rup->comment->content, rup->comment->length);
b263aa79 209 else
210 esccomment[0]='\0';
211
212 if (rup->info)
ee8cd7d0 213 dbescapestring(escinfo, rup->info->content, rup->info->length);
b263aa79 214 else
215 escinfo[0]='\0';
216
ee8cd7d0 217 dbquery("UPDATE chanserv.users SET lastauth=%lu, lastemailchng=%lu, flags=%u,"
b438f642 218 "language=%u, suspendby=%u, suspendexp=%lu, suspendtime=%lu, lockuntil=%lu, password='%s', email='%s',"
86d2bc73
CP
219 "lastuserhost='%s', suspendreason='%s', comment='%s', info='%s', lastemail='%s', lastpasschng=%lu "
220 " WHERE ID=%u",
b263aa79 221 rup->lastauth, rup->lastemailchange, rup->flags, rup->languageid, rup->suspendby, rup->suspendexp,
9708f78f 222 rup->suspendtime, rup->lockuntil, escpassword, escemail, esclastuserhost, escreason, esccomment, escinfo, esclastemail,
86d2bc73 223 rup->lastpasschange,
b263aa79 224 rup->ID);
225}
226
227void csdb_createuser(reguser *rup) {
228 char escpassword[25];
b263aa79 229 char escemail[210];
230 char esclastuserhost[160];
231 char escreason[510];
232 char esccomment[510];
233 char escusername[35];
234 char escinfo[210];
9708f78f 235 char esclastemail[210];
b263aa79 236
ee8cd7d0
CP
237 dbescapestring(escusername, rup->username, strlen(rup->username));
238 dbescapestring(escpassword, rup->password, strlen(rup->password));
b263aa79 239
240 if (rup->email)
ee8cd7d0 241 dbescapestring(escemail, rup->email->content, rup->email->length);
b263aa79 242 else
243 escemail[0]='\0';
244
9708f78f 245 if (rup->lastemail)
ee8cd7d0 246 dbescapestring(esclastemail, rup->lastemail->content, rup->lastemail->length);
9708f78f
CP
247 else
248 esclastemail[0]='\0';
249
b263aa79 250 if (rup->lastuserhost)
ee8cd7d0 251 dbescapestring(esclastuserhost, rup->lastuserhost->content, rup->lastuserhost->length);
b263aa79 252 else
253 esclastuserhost[0]='\0';
254
255 if (rup->suspendreason)
ee8cd7d0 256 dbescapestring(escreason, rup->suspendreason->content, rup->suspendreason->length);
b263aa79 257 else
258 escreason[0]='\0';
259
260 if (rup->comment)
ee8cd7d0 261 dbescapestring(esccomment, rup->comment->content, rup->comment->length);
b263aa79 262 else
263 esccomment[0]='\0';
264
265 if (rup->info)
ee8cd7d0 266 dbescapestring(escinfo, rup->info->content, rup->info->length);
b263aa79 267 else
268 escinfo[0]='\0';
269
ee8cd7d0 270 dbquery("INSERT INTO chanserv.users (ID, username, created, lastauth, lastemailchng, "
b438f642 271 "flags, language, suspendby, suspendexp, suspendtime, lockuntil, password, email, lastuserhost, "
86d2bc73
CP
272 "suspendreason, comment, info, lastemail, lastpasschng)"
273 "VALUES (%u,'%s',%lu,%lu,%lu,%u,%u,%u,%lu,%lu,%lu,'%s','%s','%s','%s','%s','%s','%s',%lu)",
b263aa79 274 rup->ID, escusername, rup->created, rup->lastauth, rup->lastemailchange, rup->flags,
b438f642 275 rup->languageid, rup->suspendby, rup->suspendexp, rup->suspendtime, rup->lockuntil,
86d2bc73
CP
276 escpassword, escemail, esclastuserhost, escreason, esccomment, escinfo, esclastemail,
277 rup->lastpasschange);
b263aa79 278}
279
280
281void csdb_updatechanuser(regchanuser *rcup) {
282 char escinfo[210];
283
284 if (rcup->info)
ee8cd7d0 285 dbescapestring(escinfo, rcup->info->content, rcup->info->length);
b263aa79 286 else
287 escinfo[0]='\0';
288
ee8cd7d0 289 dbquery("UPDATE chanserv.chanusers SET flags=%u, changetime=%lu, "
b263aa79 290 "usetime=%lu, info='%s' WHERE channelID=%u and userID=%u",
291 rcup->flags, rcup->changetime, rcup->usetime, escinfo, rcup->chan->ID,rcup->user->ID);
292}
293
294void csdb_createchanuser(regchanuser *rcup) {
295 char escinfo[210];
296
297 if (rcup->info)
ee8cd7d0 298 dbescapestring(escinfo, rcup->info->content, rcup->info->length);
b263aa79 299 else
300 escinfo[0]='\0';
301
ee8cd7d0 302 dbquery("INSERT INTO chanserv.chanusers VALUES(%u, %u, %u, %lu, %lu, '%s')",
b263aa79 303 rcup->user->ID, rcup->chan->ID, rcup->flags, rcup->changetime,
304 rcup->usetime, escinfo);
305}
306
307void csdb_deletechanuser(regchanuser *rcup) {
ee8cd7d0 308 dbquery("DELETE FROM chanserv.chanusers WHERE channelid=%u AND userID=%u",
b263aa79 309 rcup->chan->ID, rcup->user->ID);
310}
311
312void csdb_createban(regchan *rcp, regban *rbp) {
313 char escreason[500];
314 char banstr[100];
315 char escban[200];
316
317 strcpy(banstr,bantostring(rbp->cbp));
ee8cd7d0 318 dbescapestring(escban,banstr,strlen(banstr));
b263aa79 319
320 if (rbp->reason)
ee8cd7d0 321 dbescapestring(escreason, rbp->reason->content, rbp->reason->length);
b263aa79 322 else
323 escreason[0]='\0';
324
ee8cd7d0 325 dbquery("INSERT INTO chanserv.bans (banID, channelID, userID, hostmask, "
b263aa79 326 "expiry, reason) VALUES (%u,%u,%u,'%s',%lu,'%s')", rbp->ID, rcp->ID,
327 rbp->setby, escban, rbp->expiry, escreason);
328}
329
3fbc2554
CP
330void csdb_updateban(regchan *rcp, regban *rbp) {
331 char escreason[500];
332 char banstr[100];
333 char escban[200];
334
335 strcpy(banstr,bantostring(rbp->cbp));
ee8cd7d0 336 dbescapestring(escban,banstr,strlen(banstr));
3fbc2554
CP
337
338 if (rbp->reason)
ee8cd7d0 339 dbescapestring(escreason, rbp->reason->content, rbp->reason->length);
3fbc2554
CP
340 else
341 escreason[0]='\0';
342
ee8cd7d0 343 dbquery("UPDATE chanserv.bans set channelID=%u, userID=%u, hostmask='%s', expiry=%lu, reason='%s' "
3fbc2554
CP
344 "WHERE banID=%u", rcp->ID, rbp->setby, escban, rbp->expiry, escreason, rbp->ID);
345}
346
b263aa79 347void csdb_deleteban(regban *rbp) {
ee8cd7d0 348 dbquery("DELETE FROM chanserv.bans WHERE banID=%u", rbp->ID);
b263aa79 349}
350
351void csdb_createmail(reguser *rup, int type) {
352 char sqlquery[6000];
353 char escemail[210];
354
355 if (type == QMAIL_NEWEMAIL) {
356 if (rup->email) {
ee8cd7d0 357 dbescapestring(escemail, rup->email->content, rup->email->length);
522e2b8c 358 sprintf(sqlquery, "INSERT INTO chanserv.email (userID, emailType, prevEmail) "
b263aa79 359 "VALUES (%u,%u,'%s')", rup->ID, type, escemail);
360 }
361 } else {
522e2b8c 362 sprintf(sqlquery, "INSERT INTO chanserv.email (userID, emailType) VALUES (%u,%u)", rup->ID, type);
b263aa79 363 }
364
ee8cd7d0 365 dbquery("%s", sqlquery);
183b8e2f
P
366}
367
368void csdb_deletemaildomain(maildomain *mdp) {
ee8cd7d0 369 dbquery("DELETE FROM chanserv.maildomain WHERE ID=%u", mdp->ID);
183b8e2f
P
370}
371
372void csdb_createmaildomain(maildomain *mdp) {
373 char escdomain[210];
ee8cd7d0 374 dbescapestring(escdomain, mdp->name->content, mdp->name->length);
183b8e2f 375
ee8cd7d0 376 dbquery("INSERT INTO chanserv.maildomain (id, name, domainlimit, actlimit, flags) VALUES(%u, '%s', %u, %u, %u)", mdp->ID,escdomain,mdp->limit,mdp->actlimit,mdp->flags);
183b8e2f
P
377}
378
379void csdb_updatemaildomain(maildomain *mdp) {
380 char escdomain[210];
ee8cd7d0 381 dbescapestring(escdomain, mdp->name->content, mdp->name->length);
183b8e2f 382
ee8cd7d0 383 dbquery("UPDATE chanserv.maildomain SET domainlimit=%u, actlimit=%u, flags=%u, name='%s' WHERE ID=%u", mdp->limit,mdp->actlimit,mdp->flags,escdomain,mdp->ID);
183b8e2f
P
384}
385
183b8e2f
P
386void csdb_chanlevhistory_insert(regchan *rcp, nick *np, reguser *trup, flag_t oldflags, flag_t newflags) {
387 reguser *rup=getreguserfromnick(np);
388
ee8cd7d0 389 dbquery("INSERT INTO chanserv.chanlevhistory (userID, channelID, targetID, changetime, authtime, "
183b8e2f
P
390 "oldflags, newflags) VALUES (%u, %u, %u, %lu, %lu, %u, %u)", rup->ID, rcp->ID, trup->ID, getnettime(), np->accountts,
391 oldflags, newflags);
392}
393
0f32b411 394void csdb_accounthistory_insert(nick *np, char *oldpass, char *newpass, char *oldemail, char *newemail) {
183b8e2f 395 reguser *rup=getreguserfromnick(np);
5f4ba446
CP
396 char escoldpass[PASSLEN*2+5];
397 char escnewpass[PASSLEN*2+5];
398 char escoldemail[EMAILLEN*2+5];
399 char escnewemail[EMAILLEN*2+5];
183b8e2f
P
400
401 if (!rup || UHasOperPriv(rup))
402 return;
403
404 if (oldpass)
5f4ba446 405 dbescapestring(escoldpass, oldpass, CSMIN(strlen(oldpass), PASSLEN));
183b8e2f
P
406 else
407 escoldpass[0]='\0';
408
409 if (newpass)
5f4ba446 410 dbescapestring(escnewpass, newpass, CSMIN(strlen(newpass), PASSLEN));
183b8e2f
P
411 else
412 escnewpass[0]='\0';
413
414 if (oldemail)
5f4ba446 415 dbescapestring(escoldemail, oldemail, CSMIN(strlen(oldemail), EMAILLEN));
183b8e2f
P
416 else
417 escoldemail[0]='\0';
418 if (newemail)
5f4ba446 419 dbescapestring(escnewemail, newemail, CSMIN(strlen(newemail), EMAILLEN));
183b8e2f
P
420 else
421 escnewemail[0]='\0';
422
ee8cd7d0 423 dbquery("INSERT INTO chanserv.accounthistory (userID, changetime, authtime, oldpassword, newpassword, oldemail, "
183b8e2f
P
424 "newemail) VALUES (%u, %lu, %lu, '%s', '%s', '%s', '%s')", rup->ID, getnettime(), np->accountts, escoldpass, escnewpass,
425 escoldemail, escnewemail);
183b8e2f
P
426}
427
86a73ca1 428void csdb_cleanuphistories(time_t expire_time) {
183b8e2f 429 Error("chanserv", ERR_INFO, "Cleaning histories.");
86a73ca1 430 dbquery("DELETE FROM chanserv.authhistory WHERE disconnecttime < %lu AND disconnecttime <> 0", expire_time);
431 dbquery("DELETE FROM chanserv.chanlevhistory WHERE authtime < %lu", expire_time);
432 dbquery("DELETE FROM chanserv.accounthistory WHERE authtime < %lu", expire_time);
183b8e2f
P
433}
434
97390b65 435void csdb_deletemaillock(maillock *mlp) {
ee8cd7d0 436 dbquery("DELETE FROM chanserv.maillocks WHERE ID=%u", mlp->id);
97390b65
CP
437}
438
439void csdb_createmaillock(maillock *mlp) {
440 char escpattern[1024], escreason[1024];
441
ee8cd7d0 442 dbescapestring(escpattern, mlp->pattern->content, mlp->pattern->length);
97390b65
CP
443
444 if (mlp->reason)
ee8cd7d0 445 dbescapestring(escreason, mlp->reason->content, mlp->reason->length);
97390b65
CP
446 else
447 escreason[0]='\0';
448
16739dbe 449 dbquery("INSERT INTO chanserv.maillocks (id, pattern, reason, createdby, created) VALUES(%u, '%s', '%s', %u, %jd)",
58a4da4a 450 mlp->id,escpattern,escreason,mlp->createdby,(intmax_t)mlp->created);
97390b65
CP
451}
452
453void csdb_updatemaillock(maillock *mlp) {
454 char escpattern[1024], escreason[1024];
455
ee8cd7d0 456 dbescapestring(escpattern, mlp->pattern->content, mlp->pattern->length);
97390b65
CP
457
458 if (mlp->reason)
ee8cd7d0 459 dbescapestring(escreason, mlp->reason->content, mlp->reason->length);
97390b65
CP
460 else
461 escreason[0]='\0';
462
58a4da4a 463 dbquery("UPDATE chanserv.maillocks SET pattern='%s', reason='%s', createdby=%u, created=%jd WHERE ID=%u", escpattern, escreason, mlp->createdby, (intmax_t)mlp->created, mlp->id);
97390b65
CP
464}
465