]>
jfr.im git - irc/quakenet/newserv.git/blob - proxyscan/proxyscandb.c
4 * Handles the database interface routines for proxyscan.
9 #include "../dbapi/dbapi.h"
10 #include "../core/config.h"
11 #include "../lib/sstring.h"
12 #include "../irc/irc_config.h"
13 #include "../lib/irc_string.h"
14 #include "../core/error.h"
15 #include "../nick/nick.h"
16 #include "../localuser/localuser.h"
22 extern nick
*proxyscannick
;
24 void proxyscan_get_last_id(DBConn
*dbconn
, void *arg
);
28 * Connects to the database and recovers the last gline ID
31 int proxyscandbinit() {
37 /* Set up the table */
38 dbcreatequery("CREATE TABLE openproxies ("
43 "RH varchar not null,"
46 dbcreatequery("CREATE INDEX openproxies_id_index ON openproxies (ID)");
48 dbasyncquery(proxyscan_get_last_id
, NULL
,
49 "SELECT ID FROM openproxies ORDER BY id DESC LIMIT 1");
54 void proxyscan_get_last_id(DBConn
*dbconn
, void *arg
) {
55 DBResult
*pgres
= dbgetresult(dbconn
);
57 if(!dbquerysuccessful(pgres
)) {
58 Error("proxyscan", ERR_STOP
, "Error loading last id.");
62 if (dbfetchrow(pgres
))
63 lastid
= atoi(dbgetvalue(pgres
, 0));
68 Error("proxyscan",ERR_INFO
,"Retrieved lastid %d from database.",lastid
);
72 * Given a scan number, returns the string associated.
75 const char *scantostr(int type
) {
76 char *reason
="UNKNOWN";
109 * Given a scan number, returns the bitmask associated (as used in the
110 * previous version of P)
113 int scantodm(int scannum
) {
119 * This function takes the given scanhost (which is assumed to have
120 * at least one "OPEN" scan) and logs it to the database. It returns
121 * the unique ID assigned to this gline (for the gline message itself).
124 void loggline(cachehost
*chp
, patricia_node_t
*node
) {
125 char reasonlist
[100];
126 char reasonesc
[200 + 1]; /* reasonlist*2+1 */
138 for (fpp
=chp
->proxies
;fpp
;fpp
=fpp
->next
) {
139 reasonpos
+= sprintf(reasonlist
+reasonpos
, "%s:%d ",scantostr(fpp
->type
), fpp
->port
);
142 if (chp
->glineid
==0) {
143 chp
->glineid
=++lastid
;
145 dbescapestring(reasonesc
,reasonlist
,strlen(reasonlist
));
146 dbquery("INSERT INTO openproxies VALUES(%u,'%s',%d,%ld,'%s')",chp
->glineid
,
147 IPtostr(((patricia_node_t
*)node
)->prefix
->sin
),reasonmask
,getnettime(),reasonesc
);
149 dbescapestring(reasonesc
,reasonlist
,strlen(reasonlist
));
150 dbquery("UPDATE openproxies SET PM=%d,RH='%s' where ID=%u",
151 reasonmask
,reasonesc
,chp
->glineid
);
157 * Closes the db socket when proxyscan is unloaded
160 void proxyscandbclose() {
164 * proxyscandolistopen:
165 * Lists all the open proxies found since <since> to user usernick.
168 void proxyscandolistopen_real(DBConn
*dbconn
, void *arg
) {
169 nick
*np
=getnickbynumeric((unsigned long)arg
);
172 pgres
=dbgetresult(dbconn
);
173 if (!dbquerysuccessful(pgres
)) {
174 Error("proxyscan", ERR_ERROR
, "Error loading data.");
178 if (dbnumfields(pgres
) != 3) {
179 Error("proxyscan", ERR_ERROR
, "data format error.");
189 sendnoticetouser(proxyscannick
,np
,"%-20s %-22s %s","IP","Found at","What was open");
190 while(dbfetchrow(pgres
)) {
191 sendnoticetouser(proxyscannick
,np
, "%-20s %-22s %s",dbgetvalue(pgres
, 0),
192 dbgetvalue(pgres
, 1),
193 dbgetvalue(pgres
, 2));
196 sendnoticetouser(proxyscannick
,np
,"--- End of list ---");
199 void proxyscandolistopen(nick
*mynick
, nick
*usernick
, time_t snce
) {
201 dbasyncquery(proxyscandolistopen_real
,(void *)usernick
->numeric
,
202 "SELECT IP,TS,RH FROM openproxies WHERE TS>'%lu' ORDER BY TS",snce
);
207 * Check db for open proxies matching the given IP, send to user usernick.
210 void proxyscanspewip_real(DBConn
*dbconn
, void *arg
) {
211 nick
*np
=getnickbynumeric((unsigned long)arg
);
214 pgres
=dbgetresult(dbconn
);
215 if (!dbquerysuccessful(pgres
)) {
216 Error("proxyscan", ERR_ERROR
, "Error loading data.");
220 if (dbnumfields(pgres
) != 4) {
221 Error("proxyscan", ERR_ERROR
, "data format error.");
231 sendnoticetouser(proxyscannick
,np
,"%-5s %-20s %-22s %s","ID","IP","Found at","What was open");
232 while(dbfetchrow(pgres
)) {
233 sendnoticetouser(proxyscannick
,np
, "%-5s %-20s %-22s %s",dbgetvalue(pgres
, 0),
234 dbgetvalue(pgres
, 1),
235 dbgetvalue(pgres
, 2),
236 dbgetvalue(pgres
, 3));
239 sendnoticetouser(proxyscannick
,np
,"--- End of list ---");
242 void proxyscanspewip(nick
*mynick
, nick
*usernick
, unsigned long a
, unsigned long b
, unsigned long c
, unsigned long d
) {
243 dbasyncquery(proxyscanspewip_real
,(void *)usernick
->numeric
,
244 "SELECT ID,IP,TS,RH FROM openproxies WHERE IP='%lu.%lu.%lu.%lu' ORDER BY TS DESC LIMIT 10",a
,b
,c
,d
);
250 * Check db for open proxies matching the given kill/gline ID, send to user usernick.
253 void proxyscanshowkill_real(DBConn
*dbconn
, void *arg
) {
254 nick
*np
=getnickbynumeric((unsigned long)arg
);
257 pgres
=dbgetresult(dbconn
);
258 if (!dbquerysuccessful(pgres
)) {
259 Error("proxyscan", ERR_ERROR
, "Error loading data.");
263 if (dbnumfields(pgres
) != 4) {
264 Error("proxyscan", ERR_ERROR
, "data format error.");
274 sendnoticetouser(proxyscannick
,np
,"%-5s %-20s %-22s %s","ID","IP","Found at","What was open");
275 while(dbfetchrow(pgres
)) {
276 sendnoticetouser(proxyscannick
,np
, "%-5s %-20s %-22s %s",dbgetvalue(pgres
, 0),
277 dbgetvalue(pgres
, 1),
278 dbgetvalue(pgres
, 2),
279 dbgetvalue(pgres
, 3));
282 sendnoticetouser(proxyscannick
,np
,"--- End of list ---");
286 void proxyscanshowkill(nick
*mynick
, nick
*usernick
, unsigned long a
) {
287 dbasyncquery(proxyscanspewip_real
,(void *)usernick
->numeric
,
288 "SELECT ID,IP,TS,RH FROM openproxies WHERE ID='%lu'",a
);