]>
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
[200];
126 char reasonesc
[400 + 1]; /* reasonlist*2+1 */
138 for (fpp
=chp
->proxies
;fpp
;fpp
=fpp
->next
) {
139 if ((reasonpos
+ 20) > sizeof(reasonlist
))
142 reasonpos
+= sprintf(reasonlist
+reasonpos
, "%s:%d ",scantostr(fpp
->type
), fpp
->port
);
145 if (chp
->glineid
==0) {
146 chp
->glineid
=++lastid
;
148 dbescapestring(reasonesc
,reasonlist
,strlen(reasonlist
));
149 dbquery("INSERT INTO openproxies VALUES(%u,'%s',%d,%ld,'%s')",chp
->glineid
,
150 IPtostr(((patricia_node_t
*)node
)->prefix
->sin
),reasonmask
,getnettime(),reasonesc
);
152 dbescapestring(reasonesc
,reasonlist
,strlen(reasonlist
));
153 dbquery("UPDATE openproxies SET PM=%d,RH='%s' where ID=%u",
154 reasonmask
,reasonesc
,chp
->glineid
);
160 * Closes the db socket when proxyscan is unloaded
163 void proxyscandbclose() {
167 * proxyscandolistopen:
168 * Lists all the open proxies found since <since> to user usernick.
171 void proxyscandolistopen_real(DBConn
*dbconn
, void *arg
) {
172 nick
*np
=getnickbynumeric((unsigned long)arg
);
175 pgres
=dbgetresult(dbconn
);
176 if (!dbquerysuccessful(pgres
)) {
177 Error("proxyscan", ERR_ERROR
, "Error loading data.");
181 if (dbnumfields(pgres
) != 3) {
182 Error("proxyscan", ERR_ERROR
, "data format error.");
192 sendnoticetouser(proxyscannick
,np
,"%-20s %-22s %s","IP","Found at","What was open");
193 while(dbfetchrow(pgres
)) {
194 sendnoticetouser(proxyscannick
,np
, "%-20s %-22s %s",dbgetvalue(pgres
, 0),
195 dbgetvalue(pgres
, 1),
196 dbgetvalue(pgres
, 2));
199 sendnoticetouser(proxyscannick
,np
,"--- End of list ---");
202 void proxyscandolistopen(nick
*mynick
, nick
*usernick
, time_t snce
) {
204 dbasyncquery(proxyscandolistopen_real
,(void *)usernick
->numeric
,
205 "SELECT IP,TS,RH FROM openproxies WHERE TS>'%lu' ORDER BY TS",snce
);
210 * Check db for open proxies matching the given IP, send to user usernick.
213 void proxyscanspewip_real(DBConn
*dbconn
, void *arg
) {
214 nick
*np
=getnickbynumeric((unsigned long)arg
);
217 pgres
=dbgetresult(dbconn
);
218 if (!dbquerysuccessful(pgres
)) {
219 Error("proxyscan", ERR_ERROR
, "Error loading data.");
223 if (dbnumfields(pgres
) != 4) {
224 Error("proxyscan", ERR_ERROR
, "data format error.");
234 sendnoticetouser(proxyscannick
,np
,"%-5s %-20s %-22s %s","ID","IP","Found at","What was open");
235 while(dbfetchrow(pgres
)) {
236 sendnoticetouser(proxyscannick
,np
, "%-5s %-20s %-22s %s",dbgetvalue(pgres
, 0),
237 dbgetvalue(pgres
, 1),
238 dbgetvalue(pgres
, 2),
239 dbgetvalue(pgres
, 3));
242 sendnoticetouser(proxyscannick
,np
,"--- End of list ---");
245 void proxyscanspewip(nick
*mynick
, nick
*usernick
, unsigned long a
, unsigned long b
, unsigned long c
, unsigned long d
) {
246 dbasyncquery(proxyscanspewip_real
,(void *)usernick
->numeric
,
247 "SELECT ID,IP,TS,RH FROM openproxies WHERE IP='%lu.%lu.%lu.%lu' ORDER BY TS DESC LIMIT 10",a
,b
,c
,d
);
253 * Check db for open proxies matching the given kill/gline ID, send to user usernick.
256 void proxyscanshowkill_real(DBConn
*dbconn
, void *arg
) {
257 nick
*np
=getnickbynumeric((unsigned long)arg
);
260 pgres
=dbgetresult(dbconn
);
261 if (!dbquerysuccessful(pgres
)) {
262 Error("proxyscan", ERR_ERROR
, "Error loading data.");
266 if (dbnumfields(pgres
) != 4) {
267 Error("proxyscan", ERR_ERROR
, "data format error.");
277 sendnoticetouser(proxyscannick
,np
,"%-5s %-20s %-22s %s","ID","IP","Found at","What was open");
278 while(dbfetchrow(pgres
)) {
279 sendnoticetouser(proxyscannick
,np
, "%-5s %-20s %-22s %s",dbgetvalue(pgres
, 0),
280 dbgetvalue(pgres
, 1),
281 dbgetvalue(pgres
, 2),
282 dbgetvalue(pgres
, 3));
285 sendnoticetouser(proxyscannick
,np
,"--- End of list ---");
289 void proxyscanshowkill(nick
*mynick
, nick
*usernick
, unsigned long a
) {
290 dbasyncquery(proxyscanspewip_real
,(void *)usernick
->numeric
,
291 "SELECT ID,IP,TS,RH FROM openproxies WHERE ID='%lu'",a
);