]>
jfr.im git - irc/quakenet/newserv.git/blob - trusts/db.c
1 #include "../dbapi2/dbapi2.h"
2 #include "../core/error.h"
3 #include "../core/hooks.h"
4 #include "../core/schedule.h"
8 static int tgmaxid
, thmaxid
;
10 static void *flushschedule
;
14 void createtrusttables(int migration
);
15 void trusts_flush(void);
16 void trusts_freeall(void);
18 void createtrusttables(int migration
) {
22 groups
= "migration_groups";
23 hosts
= "migration_hosts";
29 trustsdb
->createtable(trustsdb
, NULL
, NULL
,
30 "CREATE TABLE ? (id INT PRIMARY KEY, name VARCHAR(?), trustedfor INT, mode INT, maxperident INT, maxusage INT, expires INT, lastseen INT, lastmaxuserreset INT, createdby VARCHAR(?), contact VARCHAR(?), comment VARCHAR(?))",
31 "Tdddd", groups
, TRUSTNAMELEN
, NICKLEN
, CONTACTLEN
, COMMENTLEN
34 /* I'd like multiple keys here but that's not gonna happen on a cross-database platform :( */
35 trustsdb
->createtable(trustsdb
, NULL
, NULL
, "CREATE TABLE ? (id INT PRIMARY KEY, groupid INT, host VARCHAR(?), maxusage INT, lastseen INT)", "Td", hosts
, TRUSTHOSTLEN
);
38 static void flushdatabase(void *arg
) {
42 static void triggerdbloaded(void *arg
) {
43 triggerhook(HOOK_TRUSTS_DB_LOADED
, NULL
);
46 static void loadcomplete(void) {
47 /* error has already been shown */
53 flushschedule
= schedulerecurring(time(NULL
) + 300, 0, 300, flushdatabase
, NULL
);
55 scheduleoneshot(time(NULL
), triggerdbloaded
, NULL
);
58 static void loadhosts_data(const DBAPIResult
*result
, void *tag
) {
64 if(!result
->success
) {
65 Error("trusts", ERR_ERROR
, "Error loading hosts table.");
68 result
->clear(result
);
72 if(result
->fields
!= 5) {
73 Error("trusts", ERR_ERROR
, "Wrong number of fields in hosts table.");
76 result
->clear(result
);
80 while(result
->next(result
)) {
81 unsigned int groupid
, id
;
83 unsigned int maxusage
, lastseen
;
86 id
= strtoul(result
->get(result
, 0), NULL
, 10);
90 groupid
= strtoul(result
->get(result
, 1), NULL
, 10);
92 tg
= tg_getbyid(groupid
);
94 Error("trusts", ERR_WARNING
, "Orphaned trust group host: %d", groupid
);
98 /* NOTE: 2 is at the bottom */
99 maxusage
= strtoul(result
->get(result
, 3), NULL
, 10);
100 lastseen
= (time_t)strtoul(result
->get(result
, 4), NULL
, 10);
101 host
= result
->get(result
, 2);
103 if(!th_add(tg
, id
, host
, maxusage
, lastseen
))
104 Error("trusts", ERR_WARNING
, "Error adding host to trust %d: %s", groupid
, host
);
107 result
->clear(result
);
112 static void loadhosts_fini(const DBAPIResult
*result
, void *tag
) {
113 Error("trusts", ERR_INFO
, "Finished loading hosts, maximum id: %d", thmaxid
);
116 static void loadgroups_data(const DBAPIResult
*result
, void *tag
) {
122 if(!result
->success
) {
123 Error("trusts", ERR_ERROR
, "Error loading group table.");
126 result
->clear(result
);
130 if(result
->fields
!= 12) {
131 Error("trusts", ERR_ERROR
, "Wrong number of fields in groups table.");
134 result
->clear(result
);
138 while(result
->next(result
)) {
140 sstring
*name
, *createdby
, *contact
, *comment
;
141 unsigned int trustedfor
, mode
, maxperident
, maxusage
;
142 time_t expires
, lastseen
, lastmaxuserreset
;
144 id
= strtoul(result
->get(result
, 0), NULL
, 10);
148 name
= getsstring(result
->get(result
, 1), TRUSTNAMELEN
);
149 trustedfor
= strtoul(result
->get(result
, 2), NULL
, 10);
150 mode
= atoi(result
->get(result
, 3));
151 maxperident
= strtoul(result
->get(result
, 4), NULL
, 10);
152 maxusage
= strtoul(result
->get(result
, 5), NULL
, 10);
153 expires
= (time_t)strtoul(result
->get(result
, 6), NULL
, 10);
154 lastseen
= (time_t)strtoul(result
->get(result
, 7), NULL
, 10);
155 lastmaxuserreset
= (time_t)strtoul(result
->get(result
, 8), NULL
, 10);
156 createdby
= getsstring(result
->get(result
, 9), NICKLEN
);
157 contact
= getsstring(result
->get(result
, 10), CONTACTLEN
);
158 comment
= getsstring(result
->get(result
, 11), COMMENTLEN
);
160 if(name
&& createdby
&& contact
&& comment
) {
161 if(!tg_add(id
, name
->content
, trustedfor
, mode
, maxperident
, maxusage
, expires
, lastseen
, lastmaxuserreset
, createdby
->content
, contact
->content
, comment
->content
))
162 Error("trusts", ERR_WARNING
, "Error adding trustgroup %d: %s", id
, name
->content
);
164 Error("trusts", ERR_ERROR
, "Error allocating sstring in group loader, id: %d", id
);
168 freesstring(createdby
);
169 freesstring(contact
);
170 freesstring(comment
);
173 result
->clear(result
);
176 static void loadgroups_fini(const DBAPIResult
*result
, void *tag
) {
177 Error("trusts", ERR_INFO
, "Finished loading groups, maximum id: %d.", tgmaxid
);
180 int trusts_loaddb(void) {
182 trustsdb
= dbapi2open(NULL
, "trusts");
184 Error("trusts", ERR_WARNING
, "Unable to connect to db -- not loaded.");
189 createtrusttables(0);
193 trustsdb
->loadtable(trustsdb
, NULL
, loadgroups_data
, loadgroups_fini
, NULL
, "groups");
194 trustsdb
->loadtable(trustsdb
, NULL
, loadhosts_data
, loadhosts_fini
, NULL
, "hosts");
199 void trusts_closedb(int closeconnection
) {
204 deleteschedule(flushschedule
, flushdatabase
, NULL
);
205 flushschedule
= NULL
;
213 thmaxid
= tgmaxid
= 0;
215 if(closeconnection
) {
216 trustsdb
->close(trustsdb
);
220 triggerhook(HOOK_TRUSTS_DB_CLOSED
, NULL
);
223 void th_dbupdatecounts(trusthost
*th
) {
224 trustsdb
->squery(trustsdb
, "UPDATE ? SET lastseen = ?, maxusage = ? WHERE id = ?", "Ttuu", "hosts", th
->lastseen
, th
->maxusage
, th
->id
);
227 void tg_dbupdatecounts(trustgroup
*tg
) {
228 trustsdb
->squery(trustsdb
, "UPDATE ? SET lastseen = ?, maxusage = ? WHERE id = ?", "Ttuu", "groups", tg
->lastseen
, tg
->maxusage
, tg
->id
);
231 trusthost
*th_new(trustgroup
*tg
, char *host
) {
232 trusthost
*th
, *superset
, *subset
;
236 if(!trusts_str2cidr(host
, &ip
, &mask
))
239 th_getsuperandsubsets(ip
, mask
, &superset
, &subset
);
241 th
= th_add(tg
, thmaxid
+ 1, host
, 0, 0);
247 trustsdb
->squery(trustsdb
,
248 "INSERT INTO ? (id, groupid, host, maxusage, lastseen) VALUES (?, ?, ?, ?, ?)",
249 "Tuusut", "hosts", th
->id
, tg
->id
, trusts_cidr2str(th
->ip
, th
->mask
), th
->maxusage
, th
->lastseen
252 th_adjusthosts(th
, subset
, superset
);
258 trustgroup
*tg_new(char *name
, unsigned int trustedfor
, int mode
, unsigned int maxperident
, time_t expires
, char *createdby
, char *contact
, char *comment
) {
259 trustgroup
*tg
= tg_add(tgmaxid
+ 1, name
, trustedfor
, mode
, maxperident
, 0, expires
, 0, 0, createdby
, contact
, comment
);
265 trustsdb
->squery(trustsdb
,
266 "INSERT INTO ? (id, name, trustedfor, mode, maxperident, maxusage, expires, lastseen, lastmaxuserreset, createdby, contact, comment) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
267 "Tusuuuutttsss", "groups", tg
->id
, tg
->name
->content
, tg
->trustedfor
, tg
->mode
, tg
->maxperident
, tg
->maxusage
, tg
->expires
, tg
->lastseen
, tg
->lastmaxuserreset
, tg
->createdby
->content
, tg
->contact
->content
, tg
->comment
->content