]> jfr.im git - irc/quakenet/newserv.git/blame - proxyscan/proxyscandb.c
Fix buffer overflow
[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;
c86edd1d
Q
102 }
103
104 return reason;
105}
106
107/*
108 * scantobm:
109 * Given a scan number, returns the bitmask associated (as used in the
110 * previous version of P)
111 */
112
113int scantodm(int scannum) {
114 return (1<<scannum);
115}
116
117/*
118 * loggline:
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).
122 */
123
557c8cb2 124void loggline(cachehost *chp, patricia_node_t *node) {
3f913369
C
125 char reasonlist[200];
126 char reasonesc[400 + 1]; /* reasonlist*2+1 */
c86edd1d
Q
127 int reasonmask=0;
128 int reasonpos=0;
129 foundproxy *fpp;
130
131 if (brokendb) {
132 chp->glineid=1;
133 return;
134 }
135
136 reasonlist[0]='\0';
137 reasonmask=0;
138 for (fpp=chp->proxies;fpp;fpp=fpp->next) {
3f913369
C
139 if ((reasonpos + 20) > sizeof(reasonlist))
140 break;
141
c86edd1d
Q
142 reasonpos += sprintf(reasonlist+reasonpos, "%s:%d ",scantostr(fpp->type), fpp->port);
143 }
144
145 if (chp->glineid==0) {
146 chp->glineid=++lastid;
147
ee8cd7d0
CP
148 dbescapestring(reasonesc,reasonlist,strlen(reasonlist));
149 dbquery("INSERT INTO openproxies VALUES(%u,'%s',%d,%ld,'%s')",chp->glineid,
557c8cb2 150 IPtostr(((patricia_node_t *)node)->prefix->sin),reasonmask,getnettime(),reasonesc);
c86edd1d 151 } else {
ee8cd7d0
CP
152 dbescapestring(reasonesc,reasonlist,strlen(reasonlist));
153 dbquery("UPDATE openproxies SET PM=%d,RH='%s' where ID=%u",
c86edd1d 154 reasonmask,reasonesc,chp->glineid);
c86edd1d
Q
155 }
156}
157
158/*
159 * proxyscandbclose:
160 * Closes the db socket when proxyscan is unloaded
161 */
162
163void proxyscandbclose() {
c86edd1d
Q
164}
165
166/*
167 * proxyscandolistopen:
168 * Lists all the open proxies found since <since> to user usernick.
169 */
170
ee8cd7d0 171void proxyscandolistopen_real(DBConn *dbconn, void *arg) {
c54295ef 172 nick *np=getnickbynumeric((unsigned long)arg);
ee8cd7d0 173 DBResult *pgres;
c86edd1d 174
ee8cd7d0
CP
175 pgres=dbgetresult(dbconn);
176 if (!dbquerysuccessful(pgres)) {
96464e2c 177 Error("proxyscan", ERR_ERROR, "Error loading data.");
c86edd1d
Q
178 return;
179 }
96464e2c 180
ee8cd7d0 181 if (dbnumfields(pgres) != 3) {
96464e2c 182 Error("proxyscan", ERR_ERROR, "data format error.");
ee8cd7d0
CP
183 dbclear(pgres);
184 return;
96464e2c 185 }
c86edd1d 186
96464e2c 187 if (!np) {
ee8cd7d0 188 dbclear(pgres);
c86edd1d
Q
189 return;
190 }
191
96464e2c 192 sendnoticetouser(proxyscannick,np,"%-20s %-22s %s","IP","Found at","What was open");
ee8cd7d0
CP
193 while(dbfetchrow(pgres)) {
194 sendnoticetouser(proxyscannick,np, "%-20s %-22s %s",dbgetvalue(pgres, 0),
195 dbgetvalue(pgres, 1),
196 dbgetvalue(pgres, 2));
c86edd1d 197 }
ee8cd7d0 198 dbclear(pgres);
96464e2c
P
199 sendnoticetouser(proxyscannick,np,"--- End of list ---");
200}
201
202void proxyscandolistopen(nick *mynick, nick *usernick, time_t snce) {
203
ee8cd7d0 204 dbasyncquery(proxyscandolistopen_real,(void *)usernick->numeric,
96464e2c 205 "SELECT IP,TS,RH FROM openproxies WHERE TS>'%lu' ORDER BY TS",snce);
c86edd1d 206}
7d228b1d
D
207
208/*
209 * proxyscanspewip
210 * Check db for open proxies matching the given IP, send to user usernick.
211 */
212
ee8cd7d0 213void proxyscanspewip_real(DBConn *dbconn, void *arg) {
c54295ef 214 nick *np=getnickbynumeric((unsigned long)arg);
ee8cd7d0 215 DBResult *pgres;
7d228b1d 216
ee8cd7d0
CP
217 pgres=dbgetresult(dbconn);
218 if (!dbquerysuccessful(pgres)) {
96464e2c 219 Error("proxyscan", ERR_ERROR, "Error loading data.");
7d228b1d
D
220 return;
221 }
222
ee8cd7d0 223 if (dbnumfields(pgres) != 4) {
96464e2c 224 Error("proxyscan", ERR_ERROR, "data format error.");
ee8cd7d0
CP
225 dbclear(pgres);
226 return;
96464e2c
P
227 }
228
96464e2c 229 if (!np) {
ee8cd7d0 230 dbclear(pgres);
7d228b1d
D
231 return;
232 }
233
96464e2c 234 sendnoticetouser(proxyscannick,np,"%-5s %-20s %-22s %s","ID","IP","Found at","What was open");
ee8cd7d0
CP
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));
7d228b1d 240 }
ee8cd7d0 241 dbclear(pgres);
96464e2c
P
242 sendnoticetouser(proxyscannick,np,"--- End of list ---");
243}
244
245void proxyscanspewip(nick *mynick, nick *usernick, unsigned long a, unsigned long b, unsigned long c, unsigned long d) {
ee8cd7d0 246 dbasyncquery(proxyscanspewip_real,(void *)usernick->numeric,
96464e2c
P
247 "SELECT ID,IP,TS,RH FROM openproxies WHERE IP='%lu.%lu.%lu.%lu' ORDER BY TS DESC LIMIT 10",a,b,c,d);
248
7d228b1d
D
249}
250
251/*
252 * proxyscanshowkill
253 * Check db for open proxies matching the given kill/gline ID, send to user usernick.
254 */
255
ee8cd7d0 256void proxyscanshowkill_real(DBConn *dbconn, void *arg) {
c54295ef 257 nick *np=getnickbynumeric((unsigned long)arg);
ee8cd7d0 258 DBResult *pgres;
7d228b1d 259
ee8cd7d0
CP
260 pgres=dbgetresult(dbconn);
261 if (!dbquerysuccessful(pgres)) {
96464e2c 262 Error("proxyscan", ERR_ERROR, "Error loading data.");
7d228b1d
D
263 return;
264 }
265
ee8cd7d0 266 if (dbnumfields(pgres) != 4) {
96464e2c 267 Error("proxyscan", ERR_ERROR, "data format error.");
ee8cd7d0
CP
268 dbclear(pgres);
269 return;
96464e2c
P
270 }
271
96464e2c 272 if (!np) {
ee8cd7d0 273 dbclear(pgres);
7d228b1d
D
274 return;
275 }
276
96464e2c 277 sendnoticetouser(proxyscannick,np,"%-5s %-20s %-22s %s","ID","IP","Found at","What was open");
ee8cd7d0
CP
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));
7d228b1d 283 }
ee8cd7d0 284 dbclear(pgres);
96464e2c
P
285 sendnoticetouser(proxyscannick,np,"--- End of list ---");
286}
287
288
289void proxyscanshowkill(nick *mynick, nick *usernick, unsigned long a) {
ee8cd7d0 290 dbasyncquery(proxyscanspewip_real,(void *)usernick->numeric,
96464e2c 291 "SELECT ID,IP,TS,RH FROM openproxies WHERE ID='%lu'",a);
7d228b1d 292}