w00p. We on a roll now girls. libopm works. Detects Open Proxies. Cleans up after itself. Now have toadd new /msg opsb set interface etc... leave that for another day... I'm melting now!

This commit is contained in:
Fish 2003-10-28 12:45:28 +00:00
parent 7cb4295207
commit 48daac5382
3 changed files with 50 additions and 31 deletions

6
opsb.c
View file

@ -217,7 +217,6 @@ int __Bot_Message(char *origin, char **argv, int argc)
scandata = malloc(sizeof(scaninfo)); scandata = malloc(sizeof(scaninfo));
scandata->doneban = 0; scandata->doneban = 0;
scandata->u = u; scandata->u = u;
scandata->socks = NULL;
if ((u2 = finduser(argv[2])) != NULL) { if ((u2 = finduser(argv[2])) != NULL) {
/* don't scan users from my server */ /* don't scan users from my server */
if (!strcasecmp(u2->server->name, me.name)) { if (!strcasecmp(u2->server->name, me.name)) {
@ -843,7 +842,6 @@ static int ScanNick(char **av, int ac) {
scandata = malloc(sizeof(scaninfo)); scandata = malloc(sizeof(scaninfo));
scandata->u = NULL; scandata->u = NULL;
scandata->doneban = 0; scandata->doneban = 0;
scandata->socks = NULL;
strncpy(scandata->who, u->nick, MAXHOST); strncpy(scandata->who, u->nick, MAXHOST);
strncpy(scandata->lookup, u->hostname, MAXHOST); strncpy(scandata->lookup, u->hostname, MAXHOST);
strncpy(scandata->server, u->server->name, MAXHOST); strncpy(scandata->server, u->server->name, MAXHOST);
@ -1034,10 +1032,12 @@ void dnsblscan(char *data, adns_answer *a) {
do_ban(scandata); do_ban(scandata);
#endif #endif
checkqueue(); checkqueue();
} else } else {
if (scandata->u) prefmsg(scandata->u->nick, s_opsb, "%s does not appear in DNS black list", scandata->lookup); if (scandata->u) prefmsg(scandata->u->nick, s_opsb, "%s does not appear in DNS black list", scandata->lookup);
nlog(LOG_DEBUG1, LOG_MOD, "Got Negative OPM lookup for %s (%s)", scandata->who, scandata->lookup); nlog(LOG_DEBUG1, LOG_MOD, "Got Negative OPM lookup for %s (%s)", scandata->who, scandata->lookup);
scandata->dnsstate = NOOPMLIST; scandata->dnsstate = NOOPMLIST;
}
check_scan_free(scandata);
break; break;
default: default:
nlog(LOG_WARNING, LOG_MOD, "Warning, Unknown Status in dnsblscan()"); nlog(LOG_WARNING, LOG_MOD, "Warning, Unknown Status in dnsblscan()");

18
opsb.h
View file

@ -16,7 +16,6 @@
typedef struct proxy_types { typedef struct proxy_types {
char *type; char *type;
int port; int port;
int (*scan)(int sock);
int nofound; int nofound;
int noopen; int noopen;
} proxy_types; } proxy_types;
@ -43,7 +42,6 @@ struct scanq {
struct in_addr ipaddr; struct in_addr ipaddr;
User *u; User *u;
int doreport; int doreport;
list_t *socks;
time_t started; time_t started;
int doneban; int doneban;
char connectstring[BUFSIZE]; char connectstring[BUFSIZE];
@ -72,14 +70,6 @@ struct opsb {
int opmhits; int opmhits;
} opsb; } opsb;
struct sockinfo {
int sock;
int (*function)(int sock);
int flags;
int type;
int bytes;
char buf[2048];
};
typedef struct sockinfo socklist; typedef struct sockinfo socklist;
@ -122,12 +112,8 @@ list_t *exempt;
#define GOTOPENPROXY 0x0010 #define GOTOPENPROXY 0x0010
#define OPMLIST 0x0020 #define OPMLIST 0x0020
#define NOOPMLIST 0x0040 #define NOOPMLIST 0x0040
#define FIN_SCAN 0x0080
/* this is some socklist flags */
#define CONNECTING 0x0001
#define SOCKCONNECTED 0x0002
#define UNCONNECTED 0x0004
#define OPENPROXY 0x0008
/* opsb.c */ /* opsb.c */
int findscan(const void *key1, const void *key2); int findscan(const void *key1, const void *key2);
@ -139,6 +125,6 @@ void addtocache(unsigned long ipaddr);
/* proxy.c */ /* proxy.c */
void start_proxy_scan(lnode_t *scannode); void start_proxy_scan(lnode_t *scannode);
void send_status(User *u); void send_status(User *u);
void check_scan_free(scaninfo *scandata);
#endif /* OPSB_H */ #endif /* OPSB_H */

57
proxy.c
View file

@ -84,7 +84,21 @@ int init_libopm() {
opm_config(scanner, OPM_CONFIG_MAX_READ, &opsb.maxbytes); opm_config(scanner, OPM_CONFIG_MAX_READ, &opsb.maxbytes);
opm_addtype(scanner, OPM_TYPE_HTTP, 8080); opm_addtype(scanner, OPM_TYPE_HTTP, 8080);
opm_addtype(scanner, OPM_TYPE_HTTP, 80);
opm_addtype(scanner, OPM_TYPE_HTTP, 3128);
opm_addtype(scanner, OPM_TYPE_HTTP, 31);
opm_addtype(scanner, OPM_TYPE_HTTP, 8000);
opm_addtype(scanner, OPM_TYPE_HTTPPOST, 8080);
opm_addtype(scanner, OPM_TYPE_HTTPPOST, 80);
opm_addtype(scanner, OPM_TYPE_HTTPPOST, 3128);
opm_addtype(scanner, OPM_TYPE_HTTPPOST, 31);
opm_addtype(scanner, OPM_TYPE_HTTPPOST, 8000);
opm_addtype(scanner, OPM_TYPE_WINGATE, 23);
opm_addtype(scanner, OPM_TYPE_ROUTER, 23);
opm_addtype(scanner, OPM_TYPE_SOCKS4, 1080);
opm_addtype(scanner, OPM_TYPE_SOCKS5, 1080);
/* add the sock poll interface into neo */ /* add the sock poll interface into neo */
add_sockpoll("libopm_before_poll", "libopm_after_poll", "opsb", "opsb", scanner); add_sockpoll("libopm_before_poll", "libopm_after_poll", "opsb", "opsb", scanner);
@ -119,10 +133,10 @@ void open_proxy(OPM_T *scanner, OPM_REMOTE_T *remote, int notused, void *unused)
fclose(fp); fclose(fp);
#endif #endif
/* no point continuing the scan if they are found open */ /* no point continuing the scan if they are found open */
scandata->state = GOTOPENPROXY;
opm_end(scanner, remote); opm_end(scanner, remote);
#if 0 #if 0
if (scandata->dnsstate == OPMLIST) { if (scandata->dnsstate == OPMLIST) {
scandata->doneban = 1; scandata->doneban = 1;
@ -145,7 +159,6 @@ void negfailed(OPM_T *scanner, OPM_REMOTE_T *remote, int notused, void *unused)
if (scandata->u) { if (scandata->u) {
prefmsg(scandata->u->nick, s_opsb, "Negitiation failed for protocol %d (%d)", remote->protocol, remote->port); prefmsg(scandata->u->nick, s_opsb, "Negitiation failed for protocol %d (%d)", remote->protocol, remote->port);
} }
/*XXX Do anything.. I dont think so */
} }
void timeout(OPM_T *scanner, OPM_REMOTE_T *remote, int notused, void *unused) { void timeout(OPM_T *scanner, OPM_REMOTE_T *remote, int notused, void *unused) {
@ -157,7 +170,6 @@ void timeout(OPM_T *scanner, OPM_REMOTE_T *remote, int notused, void *unused) {
if (scandata->u) { if (scandata->u) {
prefmsg(scandata->u->nick, s_opsb, "Timeout on Protocol %d (%d)", remote->protocol, remote->port); prefmsg(scandata->u->nick, s_opsb, "Timeout on Protocol %d (%d)", remote->protocol, remote->port);
} }
/*XXX Do anything? I don't think so */
} }
void scan_end(OPM_T *scanner, OPM_REMOTE_T *remote, int notused, void *unused) { void scan_end(OPM_T *scanner, OPM_REMOTE_T *remote, int notused, void *unused) {
@ -169,7 +181,8 @@ void scan_end(OPM_T *scanner, OPM_REMOTE_T *remote, int notused, void *unused) {
if (scandata->u) { if (scandata->u) {
prefmsg(scandata->u->nick, s_opsb, "scan finished %d %d", remote->protocol, remote->port); prefmsg(scandata->u->nick, s_opsb, "scan finished %d %d", remote->protocol, remote->port);
} }
/*XXX we have to cleanup here */ if (scandata->state != GOTOPENPROXY) scandata->state = FIN_SCAN;
check_scan_free(scandata);
} }
void scan_error(OPM_T *scanner, OPM_REMOTE_T *remote, int opmerr, void *unused) { void scan_error(OPM_T *scanner, OPM_REMOTE_T *remote, int opmerr, void *unused) {
@ -190,9 +203,8 @@ void scan_error(OPM_T *scanner, OPM_REMOTE_T *remote, int opmerr, void *unused)
#endif #endif
scandata = remote->data; scandata = remote->data;
if (scandata->u) { if (scandata->u) {
prefmsg(scandata->u->nick, s_opsb, "scan error on Protocol %d (%d)", remote->protocol, remote->port); prefmsg(scandata->u->nick, s_opsb, "scan error on Protocol %d (%d) - %d", remote->protocol, remote->port, opmerr);
} }
/*XXX cleanup */ /*XXX cleanup */
} }
@ -273,20 +285,41 @@ void start_proxy_scan(lnode_t *scannode) {
scandata->started = time(NULL); scandata->started = time(NULL);
if ((opsb.doscan == 1) || (scandata->u)) { if ((opsb.doscan == 1) || (scandata->u)) {
nlog(LOG_DEBUG2, LOG_MOD, "Starting Scan on %s", inet_ntoa(scandata->ipaddr));
remote = opm_remote_create(inet_ntoa(scandata->ipaddr)); remote = opm_remote_create(inet_ntoa(scandata->ipaddr));
remote->data = scandata; remote->data = scandata;
switch(i = opm_scan(scanner, remote)) switch(i = opm_scan(scanner, remote))
{ {
case OPM_SUCCESS: case OPM_SUCCESS:
nlog(LOG_DEBUG2, LOG_MOD, "Starting Scan on %s", inet_ntoa(scandata->ipaddr));
break; break;
case OPM_ERR_BADADDR: case OPM_ERR_BADADDR:
printf("Bad address\n"); nlog(LOG_WARNING, LOG_MOD, "Scan of %s %s Failed. Bad Address?", scandata->who, inet_ntoa(scandata->ipaddr));
opm_remote_free(remote); opm_remote_free(remote);
/* XXX do what else ? */ scandata->state = FIN_SCAN;
default: check_scan_free(scandata);
printf("Unknown Error %d\n", i);
} }
} }
} }
void check_scan_free(scaninfo *scandata) {
lnode_t *scannode;
if ((scandata->dnsstate == DO_OPM_LOOKUP) || (scandata->dnsstate == GET_NICK_IP) || (scandata->state == DOING_SCAN)) {
nlog(LOG_DEBUG2, LOG_MOD, "Not Cleaning up Scaninfo for %s yet. Scan hasn't completed", scandata->who);
return;
}
if ((scandata->dnsstate != OPMLIST) && (scandata->state != GOTOPENPROXY)) {
addtocache(scandata->ipaddr.s_addr);
nlog(LOG_DEBUG1, LOG_MOD, "%s's Host is clean. Adding to Cache", scandata->who);
}
scannode = list_find(opsbl, scandata->who, findscan);
if (scannode) {
nlog(LOG_DEBUG1, LOG_MOD, "%s scan finished. Cleaning up", scandata->who);
list_delete(opsbl, scannode);
lnode_destroy(scannode);
scandata->u = NULL;
free(scandata);
} else {
nlog(LOG_WARNING, LOG_MOD, "Damn, Can't find ScanNode %s. Something is fubar", scandata->who);
}
checkqueue();
}