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