static service_filegetter_download_tp service_filegetter_get_download_from_args(
		service_filegetter_tp sfg, service_filegetter_server_args_tp http_server,
		service_filegetter_server_args_tp socks_proxy, gchar* filepath,
		service_filegetter_hostbyname_cb hostbyname_cb) {

	/* absolute file path to get from server */
	if(filepath[0] != '/') {
		service_filegetter_log(sfg, SFG_CRITICAL, "filepath %s does not begin with '/'", filepath);
		return NULL;
	}

	/* we require http info */
	if(http_server == NULL) {
		service_filegetter_log(sfg, SFG_CRITICAL, "no HTTP server specified");
		return NULL;
	}

	GString* strbuf = g_string_new(http_server->host);
	gint hostlength = strbuf->len;
	gboolean isOnionAddress = g_strstr_len(strbuf->str, strbuf->len, ".onion") ? TRUE : FALSE;
	g_string_free(strbuf, TRUE);

	in_addr_t http_addr = 0;
	if(!isOnionAddress) {
		http_addr = service_filegetter_getaddr(sfg, http_server, hostbyname_cb);
	}
	in_port_t http_port = htons((in_port_t) atoi(http_server->port));
	if((!isOnionAddress && http_addr == 0) || http_port == 0) {
		service_filegetter_log(sfg, SFG_CRITICAL, "HTTP server specified but 0");
		return NULL;
	}

	/* there may not be a socks proxy, so NULL is ok */
	in_addr_t socks_addr = 0;
	in_port_t socks_port = 0;
	if(socks_proxy != NULL) {
		socks_addr = service_filegetter_getaddr(sfg, socks_proxy, hostbyname_cb);
		socks_port = htons((in_port_t) atoi(socks_proxy->port));
	}

	if(isOnionAddress && !socks_addr) {
		service_filegetter_log(sfg, SFG_WARNING, "it probably wont work to specify an .onion address without a Tor socks proxy");
		return NULL;
	}

	/* validation successful */
	service_filegetter_download_tp dl = calloc(1, sizeof(service_filegetter_download_t));
	strncpy(dl->fspec.remote_path, filepath, sizeof(dl->fspec.remote_path));
	strncpy(dl->sspec.http_hostname, http_server->host, sizeof(dl->sspec.http_hostname));
	dl->sspec.http_addr = http_addr;
	dl->sspec.http_port = http_port;
	dl->sspec.socks_addr = socks_addr;
	dl->sspec.socks_port = socks_port;
	dl->sspec.useHostname = isOnionAddress;
	dl->sspec.hostnameLength = hostlength;
	return dl;
}
Exemplo n.º 2
0
static service_filegetter_download_tp service_filegetter_get_download_from_args(
		service_filegetter_tp sfg, service_filegetter_server_args_tp http_server,
		service_filegetter_server_args_tp socks_proxy, gchar* filepath,
		service_filegetter_hostbyname_cb hostbyname_cb) {

	/* absolute file path to get from server */
	if(filepath[0] != '/') {
		service_filegetter_log(sfg, SFG_CRITICAL, "filepath %s does not begin with '/'", filepath);
		return NULL;
	}

	/* we require http info */
	if(http_server == NULL) {
		service_filegetter_log(sfg, SFG_CRITICAL, "no HTTP server specified");
		return NULL;
	}

	in_addr_t http_addr = service_filegetter_getaddr(sfg, http_server, hostbyname_cb);
	in_port_t http_port = htons((in_port_t) atoi(http_server->port));
	if(http_addr == 0 || http_port == 0) {
		service_filegetter_log(sfg, SFG_CRITICAL, "HTTP server specified but 0");
		return NULL;
	}

	/* there may not be a socks proxy, so NULL is ok */
	in_addr_t socks_addr = 0;
	in_port_t socks_port = 0;
	if(socks_proxy != NULL) {
		socks_addr = service_filegetter_getaddr(sfg, socks_proxy, hostbyname_cb);
		socks_port = htons((in_port_t) atoi(socks_proxy->port));
	}

	/* validation successful */
	service_filegetter_download_tp dl = calloc(1, sizeof(service_filegetter_download_t));
	strncpy(dl->fspec.remote_path, filepath, sizeof(dl->fspec.remote_path));
	strncpy(dl->sspec.http_hostname, http_server->host, sizeof(dl->sspec.http_hostname));
	dl->sspec.http_addr = http_addr;
	dl->sspec.http_port = http_port;
	dl->sspec.socks_addr = socks_addr;
	dl->sspec.socks_port = socks_port;

	return dl;
}