]> jfr.im git - irc/quakenet/newserv.git/blob - proxyscan/proxyscandb.c
006b0edd088332cf9114966e14213f60cc92a227
[irc/quakenet/newserv.git] / proxyscan / proxyscandb.c
1
2 /*
3 * proxyscandb:
4 * Handles the database interface routines for proxyscan.
5 */
6
7 #include "proxyscan.h"
8
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"
17 #include <string.h>
18 #include <stdio.h>
19
20 unsigned int lastid;
21 int sqlconnected = 0;
22 extern nick *proxyscannick;
23
24 void proxyscan_get_last_id(DBConn *dbconn, void *arg);
25
26 /*
27 * proxyscandbinit():
28 * Connects to the database and recovers the last gline ID
29 */
30
31 int proxyscandbinit() {
32 if(!dbconnected())
33 return 1;
34
35 sqlconnected=1;
36
37 /* Set up the table */
38 dbcreatequery("CREATE TABLE openproxies ("
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,"
44 "PRIMARY KEY (ID))");
45
46 dbcreatequery("CREATE INDEX openproxies_id_index ON openproxies (ID)");
47
48 dbasyncquery(proxyscan_get_last_id, NULL,
49 "SELECT ID FROM openproxies ORDER BY id DESC LIMIT 1");
50
51 return 0;
52 }
53
54 void proxyscan_get_last_id(DBConn *dbconn, void *arg) {
55 DBResult *pgres = dbgetresult(dbconn);
56
57 if(!dbquerysuccessful(pgres)) {
58 Error("proxyscan", ERR_STOP, "Error loading last id.");
59 return;
60 }
61
62 if (dbfetchrow(pgres))
63 lastid = atoi(dbgetvalue(pgres, 0));
64 else
65 lastid = 0;
66
67 dbclear(pgres);
68 Error("proxyscan",ERR_INFO,"Retrieved lastid %d from database.",lastid);
69 }
70 /*
71 * scantostr:
72 * Given a scan number, returns the string associated.
73 */
74
75 const 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;
98
99 case STYPE_DIRECT:
100 reason="forward";
101 break;
102
103 case STYPE_DIRECT_IRC:
104 reason="fwdirc";
105 break;
106 }
107
108 return reason;
109 }
110
111 /*
112 * scantobm:
113 * Given a scan number, returns the bitmask associated (as used in the
114 * previous version of P)
115 */
116
117 int scantodm(int scannum) {
118 return (1<<scannum);
119 }
120
121 /*
122 * loggline:
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).
126 */
127
128 void loggline(cachehost *chp, patricia_node_t *node) {
129 char reasonlist[200];
130 char reasonesc[400 + 1]; /* reasonlist*2+1 */
131 int reasonmask=0;
132 int reasonpos=0;
133 foundproxy *fpp;
134
135 if (brokendb) {
136 chp->glineid=1;
137 return;
138 }
139
140 reasonlist[0]='\0';
141 reasonmask=0;
142 for (fpp=chp->proxies;fpp;fpp=fpp->next) {
143 if ((reasonpos + 20) > sizeof(reasonlist))
144 break;
145
146 reasonpos += sprintf(reasonlist+reasonpos, "%s:%d ",scantostr(fpp->type), fpp->port);
147 }
148
149 if (chp->glineid==0) {
150 chp->glineid=++lastid;
151
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);
155 } else {
156 dbescapestring(reasonesc,reasonlist,strlen(reasonlist));
157 dbquery("UPDATE openproxies SET PM=%d,RH='%s' where ID=%u",
158 reasonmask,reasonesc,chp->glineid);
159 }
160 }
161
162 /*
163 * proxyscandbclose:
164 * Closes the db socket when proxyscan is unloaded
165 */
166
167 void proxyscandbclose() {
168 }
169
170 /*
171 * proxyscandolistopen:
172 * Lists all the open proxies found since <since> to user usernick.
173 */
174
175 void proxyscandolistopen_real(DBConn *dbconn, void *arg) {
176 nick *np=getnickbynumeric((unsigned long)arg);
177 DBResult *pgres;
178
179 pgres=dbgetresult(dbconn);
180 if (!dbquerysuccessful(pgres)) {
181 Error("proxyscan", ERR_ERROR, "Error loading data.");
182 return;
183 }
184
185 if (dbnumfields(pgres) != 3) {
186 Error("proxyscan", ERR_ERROR, "data format error.");
187 dbclear(pgres);
188 return;
189 }
190
191 if (!np) {
192 dbclear(pgres);
193 return;
194 }
195
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));
201 }
202 dbclear(pgres);
203 sendnoticetouser(proxyscannick,np,"--- End of list ---");
204 }
205
206 int proxyscandolistopen(void *sender, int cargc, char **cargv) {
207 nick *usernick = (nick *)sender;
208
209 dbasyncquery(proxyscandolistopen_real,(void *)usernick->numeric,
210 "SELECT IP,TS,RH FROM openproxies WHERE TS>'%lu' ORDER BY TS",time(NULL)-rescaninterval);
211 return CMD_OK;
212 }
213
214 /*
215 * proxyscanspewip
216 * Check db for open proxies matching the given IP, send to user usernick.
217 */
218
219 void proxyscanspewip_real(DBConn *dbconn, void *arg) {
220 nick *np=getnickbynumeric((unsigned long)arg);
221 DBResult *pgres;
222
223 pgres=dbgetresult(dbconn);
224 if (!dbquerysuccessful(pgres)) {
225 Error("proxyscan", ERR_ERROR, "Error loading data.");
226 return;
227 }
228
229 if (dbnumfields(pgres) != 4) {
230 Error("proxyscan", ERR_ERROR, "data format error.");
231 dbclear(pgres);
232 return;
233 }
234
235 if (!np) {
236 dbclear(pgres);
237 return;
238 }
239
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));
246 }
247 dbclear(pgres);
248 sendnoticetouser(proxyscannick,np,"--- End of list ---");
249 }
250
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);
254
255 }
256
257 /*
258 * proxyscanshowkill
259 * Check db for open proxies matching the given kill/gline ID, send to user usernick.
260 */
261
262 void proxyscanshowkill_real(DBConn *dbconn, void *arg) {
263 nick *np=getnickbynumeric((unsigned long)arg);
264 DBResult *pgres;
265
266 pgres=dbgetresult(dbconn);
267 if (!dbquerysuccessful(pgres)) {
268 Error("proxyscan", ERR_ERROR, "Error loading data.");
269 return;
270 }
271
272 if (dbnumfields(pgres) != 4) {
273 Error("proxyscan", ERR_ERROR, "data format error.");
274 dbclear(pgres);
275 return;
276 }
277
278 if (!np) {
279 dbclear(pgres);
280 return;
281 }
282
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));
289 }
290 dbclear(pgres);
291 sendnoticetouser(proxyscannick,np,"--- End of list ---");
292 }
293
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);
297 }