]> jfr.im git - irc/quakenet/newserv.git/blame - proxyscan/proxyscandb.c
PROXYSCAN: format time in spew output
[irc/quakenet/newserv.git] / proxyscan / proxyscandb.c
CommitLineData
c86edd1d
Q
1
2/*
3 * proxyscandb:
4 * Handles the database interface routines for proxyscan.
5 */
6
7#include "proxyscan.h"
8
ee8cd7d0 9#include "../dbapi/dbapi.h"
c86edd1d
Q
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"
17#include <string.h>
18#include <stdio.h>
19
c86edd1d 20unsigned int lastid;
96464e2c
P
21int sqlconnected = 0;
22extern nick *proxyscannick;
23
ee8cd7d0 24void proxyscan_get_last_id(DBConn *dbconn, void *arg);
c86edd1d
Q
25
26/*
27 * proxyscandbinit():
28 * Connects to the database and recovers the last gline ID
29 */
30
31int proxyscandbinit() {
ee8cd7d0 32 if(!dbconnected())
c86edd1d 33 return 1;
c86edd1d 34
c86edd1d
Q
35 sqlconnected=1;
36
37 /* Set up the table */
ee8cd7d0 38 dbcreatequery("CREATE TABLE openproxies ("
96464e2c
P
39 "ID int8 not null,"
40 "IP inet not null,"
41 "PM int4 not null,"
42 "TS int4 not null,"
43 "RH varchar not null,"
0a85c6ba 44 "PRIMARY KEY (ID))");
c86edd1d 45
ee8cd7d0 46 dbcreatequery("CREATE INDEX openproxies_id_index ON openproxies (ID)");
96464e2c 47
ee8cd7d0 48 dbasyncquery(proxyscan_get_last_id, NULL,
96464e2c 49 "SELECT ID FROM openproxies ORDER BY id DESC LIMIT 1");
c86edd1d 50
c86edd1d
Q
51 return 0;
52}
53
ee8cd7d0
CP
54void proxyscan_get_last_id(DBConn *dbconn, void *arg) {
55 DBResult *pgres = dbgetresult(dbconn);
96464e2c 56
ee8cd7d0
CP
57 if(!dbquerysuccessful(pgres)) {
58 Error("proxyscan", ERR_STOP, "Error loading last id.");
59 return;
96464e2c
P
60 }
61
ee8cd7d0
CP
62 if (dbfetchrow(pgres))
63 lastid = atoi(dbgetvalue(pgres, 0));
96464e2c
P
64 else
65 lastid = 0;
66
ee8cd7d0
CP
67 dbclear(pgres);
68 Error("proxyscan",ERR_INFO,"Retrieved lastid %d from database.",lastid);
96464e2c 69}
c86edd1d
Q
70/*
71 * scantostr:
72 * Given a scan number, returns the string associated.
73 */
74
75const char *scantostr(int type) {
76 char *reason="UNKNOWN";
77
78 switch (type) {
79 case STYPE_SOCKS4:
80 reason="socks4";
81 break;
82
83 case STYPE_SOCKS5:
84 reason="socks5";
85 break;
86
87 case STYPE_HTTP:
88 reason="http";
89 break;
90
91 case STYPE_WINGATE:
92 reason="wingate";
93 break;
94
95 case STYPE_CISCO:
96 reason="router";
97 break;
905c2ba2 98
99 case STYPE_DIRECT:
100 reason="forward";
101 break;
c7be40f8
CP
102
103 case STYPE_DIRECT_IRC:
468b83b2 104 reason="fwdirc";
c7be40f8 105 break;
e95140be
CP
106
107 case STYPE_ROUTER:
108 reason="router";
109 break;
c86edd1d
Q
110 }
111
112 return reason;
113}
114
115/*
116 * scantobm:
117 * Given a scan number, returns the bitmask associated (as used in the
118 * previous version of P)
119 */
120
121int scantodm(int scannum) {
122 return (1<<scannum);
123}
124
125/*
126 * loggline:
127 * This function takes the given scanhost (which is assumed to have
128 * at least one "OPEN" scan) and logs it to the database. It returns
129 * the unique ID assigned to this gline (for the gline message itself).
130 */
131
557c8cb2 132void loggline(cachehost *chp, patricia_node_t *node) {
3f913369
C
133 char reasonlist[200];
134 char reasonesc[400 + 1]; /* reasonlist*2+1 */
c86edd1d
Q
135 int reasonmask=0;
136 int reasonpos=0;
137 foundproxy *fpp;
138
139 if (brokendb) {
140 chp->glineid=1;
141 return;
142 }
143
144 reasonlist[0]='\0';
145 reasonmask=0;
146 for (fpp=chp->proxies;fpp;fpp=fpp->next) {
3f913369
C
147 if ((reasonpos + 20) > sizeof(reasonlist))
148 break;
149
c86edd1d
Q
150 reasonpos += sprintf(reasonlist+reasonpos, "%s:%d ",scantostr(fpp->type), fpp->port);
151 }
152
153 if (chp->glineid==0) {
154 chp->glineid=++lastid;
155
ee8cd7d0
CP
156 dbescapestring(reasonesc,reasonlist,strlen(reasonlist));
157 dbquery("INSERT INTO openproxies VALUES(%u,'%s',%d,%ld,'%s')",chp->glineid,
557c8cb2 158 IPtostr(((patricia_node_t *)node)->prefix->sin),reasonmask,getnettime(),reasonesc);
c86edd1d 159 } else {
ee8cd7d0
CP
160 dbescapestring(reasonesc,reasonlist,strlen(reasonlist));
161 dbquery("UPDATE openproxies SET PM=%d,RH='%s' where ID=%u",
c86edd1d 162 reasonmask,reasonesc,chp->glineid);
c86edd1d
Q
163 }
164}
165
166/*
167 * proxyscandbclose:
168 * Closes the db socket when proxyscan is unloaded
169 */
170
171void proxyscandbclose() {
c86edd1d
Q
172}
173
174/*
175 * proxyscandolistopen:
176 * Lists all the open proxies found since <since> to user usernick.
177 */
178
ee8cd7d0 179void proxyscandolistopen_real(DBConn *dbconn, void *arg) {
c54295ef 180 nick *np=getnickbynumeric((unsigned long)arg);
ee8cd7d0 181 DBResult *pgres;
c86edd1d 182
ee8cd7d0
CP
183 pgres=dbgetresult(dbconn);
184 if (!dbquerysuccessful(pgres)) {
96464e2c 185 Error("proxyscan", ERR_ERROR, "Error loading data.");
c86edd1d
Q
186 return;
187 }
96464e2c 188
ee8cd7d0 189 if (dbnumfields(pgres) != 3) {
96464e2c 190 Error("proxyscan", ERR_ERROR, "data format error.");
ee8cd7d0
CP
191 dbclear(pgres);
192 return;
96464e2c 193 }
c86edd1d 194
96464e2c 195 if (!np) {
ee8cd7d0 196 dbclear(pgres);
c86edd1d
Q
197 return;
198 }
199
96464e2c 200 sendnoticetouser(proxyscannick,np,"%-20s %-22s %s","IP","Found at","What was open");
ee8cd7d0
CP
201 while(dbfetchrow(pgres)) {
202 sendnoticetouser(proxyscannick,np, "%-20s %-22s %s",dbgetvalue(pgres, 0),
203 dbgetvalue(pgres, 1),
204 dbgetvalue(pgres, 2));
c86edd1d 205 }
ee8cd7d0 206 dbclear(pgres);
96464e2c
P
207 sendnoticetouser(proxyscannick,np,"--- End of list ---");
208}
209
7ab80d0c
P
210int proxyscandolistopen(void *sender, int cargc, char **cargv) {
211 nick *usernick = (nick *)sender;
212
ee8cd7d0 213 dbasyncquery(proxyscandolistopen_real,(void *)usernick->numeric,
7ab80d0c
P
214 "SELECT IP,TS,RH FROM openproxies WHERE TS>'%lu' ORDER BY TS",time(NULL)-rescaninterval);
215 return CMD_OK;
c86edd1d 216}
7d228b1d
D
217
218/*
219 * proxyscanspewip
220 * Check db for open proxies matching the given IP, send to user usernick.
221 */
222
ee8cd7d0 223void proxyscanspewip_real(DBConn *dbconn, void *arg) {
c54295ef 224 nick *np=getnickbynumeric((unsigned long)arg);
ee8cd7d0 225 DBResult *pgres;
64c6653d 226 char timebuf[30];
7d228b1d 227
ee8cd7d0
CP
228 pgres=dbgetresult(dbconn);
229 if (!dbquerysuccessful(pgres)) {
96464e2c 230 Error("proxyscan", ERR_ERROR, "Error loading data.");
7d228b1d
D
231 return;
232 }
233
ee8cd7d0 234 if (dbnumfields(pgres) != 4) {
96464e2c 235 Error("proxyscan", ERR_ERROR, "data format error.");
ee8cd7d0
CP
236 dbclear(pgres);
237 return;
96464e2c
P
238 }
239
96464e2c 240 if (!np) {
ee8cd7d0 241 dbclear(pgres);
7d228b1d
D
242 return;
243 }
244
96464e2c 245 sendnoticetouser(proxyscannick,np,"%-5s %-20s %-22s %s","ID","IP","Found at","What was open");
ee8cd7d0 246 while(dbfetchrow(pgres)) {
64c6653d
GB
247 time_t t = strtoul(dbgetvalue(pgres, 2), NULL, 10);
248 strftime(timebuf, sizeof(timebuf), "%d/%m/%y %H:%M GMT", gmtime(&t));
249
ee8cd7d0
CP
250 sendnoticetouser(proxyscannick,np, "%-5s %-20s %-22s %s",dbgetvalue(pgres, 0),
251 dbgetvalue(pgres, 1),
64c6653d 252 timebuf,
ee8cd7d0 253 dbgetvalue(pgres, 3));
7d228b1d 254 }
ee8cd7d0 255 dbclear(pgres);
96464e2c
P
256 sendnoticetouser(proxyscannick,np,"--- End of list ---");
257}
258
259void proxyscanspewip(nick *mynick, nick *usernick, unsigned long a, unsigned long b, unsigned long c, unsigned long d) {
ee8cd7d0 260 dbasyncquery(proxyscanspewip_real,(void *)usernick->numeric,
96464e2c
P
261 "SELECT ID,IP,TS,RH FROM openproxies WHERE IP='%lu.%lu.%lu.%lu' ORDER BY TS DESC LIMIT 10",a,b,c,d);
262
7d228b1d
D
263}
264
265/*
266 * proxyscanshowkill
267 * Check db for open proxies matching the given kill/gline ID, send to user usernick.
268 */
269
ee8cd7d0 270void proxyscanshowkill_real(DBConn *dbconn, void *arg) {
c54295ef 271 nick *np=getnickbynumeric((unsigned long)arg);
ee8cd7d0 272 DBResult *pgres;
7d228b1d 273
ee8cd7d0
CP
274 pgres=dbgetresult(dbconn);
275 if (!dbquerysuccessful(pgres)) {
96464e2c 276 Error("proxyscan", ERR_ERROR, "Error loading data.");
7d228b1d
D
277 return;
278 }
279
ee8cd7d0 280 if (dbnumfields(pgres) != 4) {
96464e2c 281 Error("proxyscan", ERR_ERROR, "data format error.");
ee8cd7d0
CP
282 dbclear(pgres);
283 return;
96464e2c
P
284 }
285
96464e2c 286 if (!np) {
ee8cd7d0 287 dbclear(pgres);
7d228b1d
D
288 return;
289 }
290
96464e2c 291 sendnoticetouser(proxyscannick,np,"%-5s %-20s %-22s %s","ID","IP","Found at","What was open");
ee8cd7d0
CP
292 while(dbfetchrow(pgres)) {
293 sendnoticetouser(proxyscannick,np, "%-5s %-20s %-22s %s",dbgetvalue(pgres, 0),
294 dbgetvalue(pgres, 1),
295 dbgetvalue(pgres, 2),
296 dbgetvalue(pgres, 3));
7d228b1d 297 }
ee8cd7d0 298 dbclear(pgres);
96464e2c
P
299 sendnoticetouser(proxyscannick,np,"--- End of list ---");
300}
301
96464e2c 302void proxyscanshowkill(nick *mynick, nick *usernick, unsigned long a) {
ee8cd7d0 303 dbasyncquery(proxyscanspewip_real,(void *)usernick->numeric,
96464e2c 304 "SELECT ID,IP,TS,RH FROM openproxies WHERE ID='%lu'",a);
7d228b1d 305}