Beispiel #1
0
int
telnet_makeconnect(struct bufferevent *bev, struct argument *arg)
{
	extern struct addr *socks_dst_addr;
	struct evbuffer *input = EVBUFFER_INPUT(bev);
	struct telnet_state *state = arg->a_state;
	ip_addr_t address;

	socks_resolveaddress("www.google.com", &address);

	if (evbuffer_find(input, CCPROXY, strlen(CCPROXY)) != NULL) {
		state->response = "telnet-proxy: CCproxy";
		state->connect_wait = "OK!";
		evbuffer_add_printf(EVBUFFER_OUTPUT(bev),
		    "open %s:80\r\n", addr_ntoa(socks_dst_addr));
		bufferevent_enable(bev, EV_WRITE);
		return (1);
	} else if (evbuffer_find(input, GATEWAY1, strlen(GATEWAY1)) != NULL) {
		state->response = "telnet-proxy: Gateway";
		state->connect_wait = "Connected to:";
		evbuffer_add_printf(EVBUFFER_OUTPUT(bev),
		    "%s:80\r\n", addr_ntoa(socks_dst_addr));
		bufferevent_enable(bev, EV_WRITE);
		return (1);
	} else if (evbuffer_find(input, GATEWAY2, strlen(GATEWAY2)) != NULL) {
		state->response = "telnet-proxy: Gateway";
		/* 
		 * We do not get a connection confirmation, just the echoed
		 * string.  So, we wait for the echo and then send our command.
		 */
		state->connect_wait = ":80";
		evbuffer_add_printf(EVBUFFER_OUTPUT(bev),
		    "%s:80\r\n", addr_ntoa(socks_dst_addr));
		bufferevent_enable(bev, EV_WRITE);
		return (1);
	} else if (evbuffer_find(input, WINGATE, strlen(WINGATE)) != NULL) {
		state->response = "telnet-proxy: WinGate";
		state->connect_wait = "...Connected";
		evbuffer_add_printf(EVBUFFER_OUTPUT(bev),
		    "%s:80\r\n", addr_ntoa(socks_dst_addr));
		bufferevent_enable(bev, EV_WRITE);
		return (1);
	} else if (EVBUFFER_LENGTH(input) > 512) {
		return (-1);
	}

	return (0);
}
Beispiel #2
0
static void
http_readcb(struct bufferevent *bev, void *arg)
{
	const char *what = "This is funny";

 	event_debug(("%s: %s\n", __func__, EVBUFFER_DATA(bev->input)));
	
	if (evbuffer_find(bev->input,
		(const unsigned char*) what, strlen(what)) != NULL) {
		struct evhttp_request *req = evhttp_request_new(NULL, NULL);
		enum message_read_status done;

		req->kind = EVHTTP_RESPONSE;
		done = evhttp_parse_firstline(req, bev->input);
		if (done != ALL_DATA_READ)
			goto out;

		done = evhttp_parse_headers(req, bev->input);
		if (done != ALL_DATA_READ)
			goto out;

		if (done == 1 &&
		    evhttp_find_header(req->input_headers,
			"Content-Type") != NULL)
			test_ok++;

	out:
		evhttp_request_free(req);
		bufferevent_disable(bev, EV_READ);
		if (base)
			event_base_loopexit(base, NULL);
		else
			event_loopexit(NULL);
	}
}
Beispiel #3
0
void
rrdtool_evb_readcb(struct bufferevent *bev, void *parameter)
{
	struct rrdtool_drv *req = parameter;

	char *start, *end;

	start = EVBUFFER_DATA(bev->input);
	if ((end = evbuffer_find(bev->input, "OK ", 3)) == NULL)
		return;
	
	/* Find the end of the line */
	if (strchr(end, '\n') == NULL)
		return;

	/* Communicate everything before the OK to the call back */
	*end = '\0';

	rrdtool_command_done(req, start);
	
	/* 
	 * We drain all the input because we do not currently interleave
	 * commands.
	 */
	evbuffer_drain(bev->input, -1);

	return;
}
Beispiel #4
0
static void
http_failure_readcb(struct bufferevent *bev, void *arg)
{
	const char *what = "400 Bad Request";
	if (evbuffer_find(bev->input, (const unsigned char*) what, strlen(what)) != NULL) {
		test_ok = 2;
		bufferevent_disable(bev, EV_READ);
		event_loopexit(NULL);
	}
}
Beispiel #5
0
static void http_read_cb(evutil_socket_t fd, short events, void *arg)
{
	int ret = 0;
	struct http_connection *hc = arg;

	if (events & EV_TIMEOUT) {
		printf("timeout on fd %d, hc %p\n", fd, hc);
		goto failed;
	}

	if (events & EV_READ) {
		ret = evbuffer_read(hc->evbin, fd, 4096);
		if (ret == -1 || ret == 0) {
			goto failed;
		}

		if (hc->connection_status == HTTP_CONNECTION_STATUS_READ_HEADER) {
			if (evbuffer_find(hc->evbin, (const unsigned char *)"\r\n\r\n", 4) == NULL &&
				evbuffer_get_length(hc->evbin) < 4096)
			{
				// wait to read more data
				return;
			} else {
				//dbprintf("evbuffer_get_length: %d\n", evbuffer_get_length(hc->evbin));
			}

			ret = http_parse_first_line(hc, hc->evbin);
			if (ret) {
				goto failed;
			}

			ret = http_parse_headers(hc, hc->evbin);
			if (ret) {
				goto failed;
			}

			/* set no-timeout read */
			event_del(hc->ev_read);
			event_add(hc->ev_read, NULL);
			hc->connection_status = HTTP_CONNECTION_STATUS_READ_BODY;
		} else if (hc->connection_status == HTTP_CONNECTION_STATUS_READ_BODY) {

		}

		/* dispatch to handler */
		ret = http_dispatch_uri_handler_cb(hc);
		if (ret) {
			goto failed;
		}
	}

	return;
failed:
	http_connection_free(hc);
}
Beispiel #6
0
void OnBufferedRead(struct bufferevent *bev, void *arg) {
    struct Poll *poll=(struct Poll *)arg;
    struct evbuffer *buffer = EVBUFFER_INPUT(bev);
    u_char *data = EVBUFFER_DATA(buffer);
    u_int len = EVBUFFER_LENGTH(buffer);
        fprintf(stderr,cBLUE"%s:%d - "cEND,ipString(poll->IP),poll->port);
    if(evbuffer_find(buffer,Pattern,PatternLen)) {
	fprintf(fp,"%s:%d\n",ipString(poll->IP),poll->port);
	fflush(fp);
	fprintf(stderr,cGREEN" PROXY\n"cEND);
    } else {
        fprintf(stderr,cRED"  NO"cEND);
    }
    
    OnBufferedError(bev, EV_TIMEOUT,arg);
}
Beispiel #7
0
void
handle_proxy_callback(struct evhttp_request *request, void *arg)
{
	struct site *site;
	char *data, *url;
	int length;

	fprintf(stderr, "[PROXY] Received control callback from %s\n",
	    request->remote_host);

	data = (char *)evbuffer_find(request->input_buffer,
	    (unsigned char *)"site=", 5);
	if (data == NULL)
		goto error;

	length = EVBUFFER_LENGTH(request->input_buffer) - 5;
	url = malloc(length + 1);
	assert(url != NULL);
	memcpy(url, data + 5, length);
	url[length] = '\0';

	site = site_find(url);
	if (site == NULL) {
		free(url);
		goto error;
	}

	fprintf(stderr, "[PROXY] Control callback for site %s\n", url);

	/* break the link to the parent, as this is a new page */
	site_disassociate_parent(site);

	if (site->danger == DANGEROUS) {
		/* the control callback sometimes arrives later */
		handle_result_callback(site, request);
	} else {
		site_insert_callback(site, handle_result_callback, request);
	}

	free(url);
	return;

error:
	/* no data that we can understand */
	evhttp_send_error(request, HTTP_SERVUNAVAIL, "Unknown error");
	return;
}
Beispiel #8
0
void
telnet_readcb(struct bufferevent *bev, void *parameter)
{
	struct argument *arg = parameter;
	struct evbuffer *input = EVBUFFER_INPUT(bev);
	struct telnet_state *state = arg->a_state;

	DFPRINTF((stderr, "%s: called\n", __func__));

	if (arg->a_flags == 0) {
		int res = telnet_makeconnect(bev, arg);
		if (res == -1) {
			evbuffer_add(input, "", 1);
			printres(arg, arg->a_ports[0].port, 
			    EVBUFFER_DATA(input));
			scanhost_return(bev, arg, 0);
			return;
		} else if (res == 1) {
			arg->a_flags = TELNET_WAITING_CONNECT;
			bufferevent_disable(bev, EV_READ);
		}
	} else if (arg->a_flags & TELNET_READING_CONNECT) {
		if (evbuffer_find(input, state->connect_wait,
			strlen(state->connect_wait)) == NULL)
			return;
		evbuffer_drain(input, EVBUFFER_LENGTH(input));

		arg->a_flags = TELNET_WRITING_COMMAND;
		bufferevent_disable(bev, EV_READ);
		http_makerequest(bev, arg, socks_getword(), 0);
	} else if (arg->a_flags & TELNET_WAITING_RESPONSE) {
		int res = http_bufferanalyse(bev, arg);
		if (res == -1)
			return;
		if (res == 1) {
			postres(arg, state->response);
			scanhost_return(bev, arg, 1);
		}
	}

	return;
}
Beispiel #9
0
int
http_bufferanalyse(struct bufferevent *bev, struct argument *arg)
{
	struct evbuffer *input = EVBUFFER_INPUT(bev);
	
	if (!(arg->a_flags & HTTP_GOT_HEADERS)) {
		if (http_getheaders(bev, arg) == -1) {
			postres(arg, "<error: response code>");
			scanhost_return(bev, arg, 0);
			return (-1);
		}
	}

	if (arg->a_flags & HTTP_GOT_HEADERS) {
		if (evbuffer_find(input, "\r\n", 2) == NULL)
			return (0);
	
		return (1);
	}

	return (0);
}
Beispiel #10
0
int
http_getheaders(struct bufferevent *bev, struct argument *arg)
{
	struct evbuffer *input = EVBUFFER_INPUT(bev);
	size_t off;
	char *p;

	while ((p = evbuffer_find(input, "\n", 1)) != NULL) {
		off = (size_t)p - (size_t)EVBUFFER_DATA(input) + 1;
		if (off > 1 && *(p-1) == '\r')
			*(p-1) = '\0';
		*p = '\0';

		if (strlen(EVBUFFER_DATA(input)) == 0) {
			arg->a_flags |= HTTP_GOT_HEADERS;
			evbuffer_drain(input, off);
			break;
		} else {
			DFPRINTF((stderr, "Header: %s\n",
				     EVBUFFER_DATA(input)));
		}

		/* Check that we got an okay */
		if (!(arg->a_flags & HTTP_GOT_OK)) {
			if (http_response(EVBUFFER_DATA(input)) == -1) {
				return (-1);
			}
			arg->a_flags |= HTTP_GOT_OK;
		}
		evbuffer_drain(input, off);
	}

	if ((arg->a_flags & HTTP_GOT_HEADERS) &&
	    !(arg->a_flags & HTTP_GOT_OK))
		return (-1);

	return (0);
}