]> jfr.im git - irc/quakenet/newserv.git/blame - proxyscan/proxyscandb.c
attempt to tidy P a little:
[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
7eb07f57
P
202int proxyscandolistopen(void *sender, int cargc, char **cargv) {
203 nick *usernick = (nick *)sender;
204
ee8cd7d0 205 dbasyncquery(proxyscandolistopen_real,(void *)usernick->numeric,
7eb07f57
P
206 "SELECT IP,TS,RH FROM openproxies WHERE TS>'%lu' ORDER BY TS",time(NULL)-rescaninterval);
207 return CMD_OK;
c86edd1d 208}
7d228b1d
D
209
210/*
211 * proxyscanspewip
212 * Check db for open proxies matching the given IP, send to user usernick.
213 */
214
ee8cd7d0 215void proxyscanspewip_real(DBConn *dbconn, void *arg) {
c54295ef 216 nick *np=getnickbynumeric((unsigned long)arg);
ee8cd7d0 217 DBResult *pgres;
7d228b1d 218
ee8cd7d0
CP
219 pgres=dbgetresult(dbconn);
220 if (!dbquerysuccessful(pgres)) {
96464e2c 221 Error("proxyscan", ERR_ERROR, "Error loading data.");
7d228b1d
D
222 return;
223 }
224
ee8cd7d0 225 if (dbnumfields(pgres) != 4) {
96464e2c 226 Error("proxyscan", ERR_ERROR, "data format error.");
ee8cd7d0
CP
227 dbclear(pgres);
228 return;
96464e2c
P
229 }
230
96464e2c 231 if (!np) {
ee8cd7d0 232 dbclear(pgres);
7d228b1d
D
233 return;
234 }
235
96464e2c 236 sendnoticetouser(proxyscannick,np,"%-5s %-20s %-22s %s","ID","IP","Found at","What was open");
ee8cd7d0
CP
237 while(dbfetchrow(pgres)) {
238 sendnoticetouser(proxyscannick,np, "%-5s %-20s %-22s %s",dbgetvalue(pgres, 0),
239 dbgetvalue(pgres, 1),
240 dbgetvalue(pgres, 2),
241 dbgetvalue(pgres, 3));
7d228b1d 242 }
ee8cd7d0 243 dbclear(pgres);
96464e2c
P
244 sendnoticetouser(proxyscannick,np,"--- End of list ---");
245}
246
247void proxyscanspewip(nick *mynick, nick *usernick, unsigned long a, unsigned long b, unsigned long c, unsigned long d) {
ee8cd7d0 248 dbasyncquery(proxyscanspewip_real,(void *)usernick->numeric,
96464e2c
P
249 "SELECT ID,IP,TS,RH FROM openproxies WHERE IP='%lu.%lu.%lu.%lu' ORDER BY TS DESC LIMIT 10",a,b,c,d);
250
7d228b1d
D
251}
252
253/*
254 * proxyscanshowkill
255 * Check db for open proxies matching the given kill/gline ID, send to user usernick.
256 */
257
ee8cd7d0 258void proxyscanshowkill_real(DBConn *dbconn, void *arg) {
c54295ef 259 nick *np=getnickbynumeric((unsigned long)arg);
ee8cd7d0 260 DBResult *pgres;
7d228b1d 261
ee8cd7d0
CP
262 pgres=dbgetresult(dbconn);
263 if (!dbquerysuccessful(pgres)) {
96464e2c 264 Error("proxyscan", ERR_ERROR, "Error loading data.");
7d228b1d
D
265 return;
266 }
267
ee8cd7d0 268 if (dbnumfields(pgres) != 4) {
96464e2c 269 Error("proxyscan", ERR_ERROR, "data format error.");
ee8cd7d0
CP
270 dbclear(pgres);
271 return;
96464e2c
P
272 }
273
96464e2c 274 if (!np) {
ee8cd7d0 275 dbclear(pgres);
7d228b1d
D
276 return;
277 }
278
96464e2c 279 sendnoticetouser(proxyscannick,np,"%-5s %-20s %-22s %s","ID","IP","Found at","What was open");
ee8cd7d0
CP
280 while(dbfetchrow(pgres)) {
281 sendnoticetouser(proxyscannick,np, "%-5s %-20s %-22s %s",dbgetvalue(pgres, 0),
282 dbgetvalue(pgres, 1),
283 dbgetvalue(pgres, 2),
284 dbgetvalue(pgres, 3));
7d228b1d 285 }
ee8cd7d0 286 dbclear(pgres);
96464e2c
P
287 sendnoticetouser(proxyscannick,np,"--- End of list ---");
288}
289
96464e2c 290void proxyscanshowkill(nick *mynick, nick *usernick, unsigned long a) {
ee8cd7d0 291 dbasyncquery(proxyscanspewip_real,(void *)usernick->numeric,
96464e2c 292 "SELECT ID,IP,TS,RH FROM openproxies WHERE ID='%lu'",a);
7d228b1d 293}