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