]>
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";
103 case STYPE_DIRECT_IRC
:
104 reason
="forward (irc)";
113 * Given a scan number, returns the bitmask associated (as used in the
114 * previous version of P)
117 int scantodm(int scannum
) {
123 * This function takes the given scanhost (which is assumed to have
124 * at least one "OPEN" scan) and logs it to the database. It returns
125 * the unique ID assigned to this gline (for the gline message itself).
128 void loggline(cachehost
*chp
, patricia_node_t
*node
) {
129 char reasonlist
[200];
130 char reasonesc
[400 + 1]; /* reasonlist*2+1 */
142 for (fpp
=chp
->proxies
;fpp
;fpp
=fpp
->next
) {
143 if ((reasonpos
+ 20) > sizeof(reasonlist
))
146 reasonpos
+= sprintf(reasonlist
+reasonpos
, "%s:%d ",scantostr(fpp
->type
), fpp
->port
);
149 if (chp
->glineid
==0) {
150 chp
->glineid
=++lastid
;
152 dbescapestring(reasonesc
,reasonlist
,strlen(reasonlist
));
153 dbquery("INSERT INTO openproxies VALUES(%u,'%s',%d,%ld,'%s')",chp
->glineid
,
154 IPtostr(((patricia_node_t
*)node
)->prefix
->sin
),reasonmask
,getnettime(),reasonesc
);
156 dbescapestring(reasonesc
,reasonlist
,strlen(reasonlist
));
157 dbquery("UPDATE openproxies SET PM=%d,RH='%s' where ID=%u",
158 reasonmask
,reasonesc
,chp
->glineid
);
164 * Closes the db socket when proxyscan is unloaded
167 void proxyscandbclose() {
171 * proxyscandolistopen:
172 * Lists all the open proxies found since <since> to user usernick.
175 void proxyscandolistopen_real(DBConn
*dbconn
, void *arg
) {
176 nick
*np
=getnickbynumeric((unsigned long)arg
);
179 pgres
=dbgetresult(dbconn
);
180 if (!dbquerysuccessful(pgres
)) {
181 Error("proxyscan", ERR_ERROR
, "Error loading data.");
185 if (dbnumfields(pgres
) != 3) {
186 Error("proxyscan", ERR_ERROR
, "data format error.");
196 sendnoticetouser(proxyscannick
,np
,"%-20s %-22s %s","IP","Found at","What was open");
197 while(dbfetchrow(pgres
)) {
198 sendnoticetouser(proxyscannick
,np
, "%-20s %-22s %s",dbgetvalue(pgres
, 0),
199 dbgetvalue(pgres
, 1),
200 dbgetvalue(pgres
, 2));
203 sendnoticetouser(proxyscannick
,np
,"--- End of list ---");
206 int proxyscandolistopen(void *sender
, int cargc
, char **cargv
) {
207 nick
*usernick
= (nick
*)sender
;
209 dbasyncquery(proxyscandolistopen_real
,(void *)usernick
->numeric
,
210 "SELECT IP,TS,RH FROM openproxies WHERE TS>'%lu' ORDER BY TS",time(NULL
)-rescaninterval
);
216 * Check db for open proxies matching the given IP, send to user usernick.
219 void proxyscanspewip_real(DBConn
*dbconn
, void *arg
) {
220 nick
*np
=getnickbynumeric((unsigned long)arg
);
223 pgres
=dbgetresult(dbconn
);
224 if (!dbquerysuccessful(pgres
)) {
225 Error("proxyscan", ERR_ERROR
, "Error loading data.");
229 if (dbnumfields(pgres
) != 4) {
230 Error("proxyscan", ERR_ERROR
, "data format error.");
240 sendnoticetouser(proxyscannick
,np
,"%-5s %-20s %-22s %s","ID","IP","Found at","What was open");
241 while(dbfetchrow(pgres
)) {
242 sendnoticetouser(proxyscannick
,np
, "%-5s %-20s %-22s %s",dbgetvalue(pgres
, 0),
243 dbgetvalue(pgres
, 1),
244 dbgetvalue(pgres
, 2),
245 dbgetvalue(pgres
, 3));
248 sendnoticetouser(proxyscannick
,np
,"--- End of list ---");
251 void proxyscanspewip(nick
*mynick
, nick
*usernick
, unsigned long a
, unsigned long b
, unsigned long c
, unsigned long d
) {
252 dbasyncquery(proxyscanspewip_real
,(void *)usernick
->numeric
,
253 "SELECT ID,IP,TS,RH FROM openproxies WHERE IP='%lu.%lu.%lu.%lu' ORDER BY TS DESC LIMIT 10",a
,b
,c
,d
);
259 * Check db for open proxies matching the given kill/gline ID, send to user usernick.
262 void proxyscanshowkill_real(DBConn
*dbconn
, void *arg
) {
263 nick
*np
=getnickbynumeric((unsigned long)arg
);
266 pgres
=dbgetresult(dbconn
);
267 if (!dbquerysuccessful(pgres
)) {
268 Error("proxyscan", ERR_ERROR
, "Error loading data.");
272 if (dbnumfields(pgres
) != 4) {
273 Error("proxyscan", ERR_ERROR
, "data format error.");
283 sendnoticetouser(proxyscannick
,np
,"%-5s %-20s %-22s %s","ID","IP","Found at","What was open");
284 while(dbfetchrow(pgres
)) {
285 sendnoticetouser(proxyscannick
,np
, "%-5s %-20s %-22s %s",dbgetvalue(pgres
, 0),
286 dbgetvalue(pgres
, 1),
287 dbgetvalue(pgres
, 2),
288 dbgetvalue(pgres
, 3));
291 sendnoticetouser(proxyscannick
,np
,"--- End of list ---");
294 void proxyscanshowkill(nick
*mynick
, nick
*usernick
, unsigned long a
) {
295 dbasyncquery(proxyscanspewip_real
,(void *)usernick
->numeric
,
296 "SELECT ID,IP,TS,RH FROM openproxies WHERE ID='%lu'",a
);