mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
handle excludenodes for dir fetch/post
If we're picking a random directory node, never pick an excluded one. But if we've chosen a specific one (or all), allow it unless strictnodes is set (in which case warn so the user knows it's their fault). When warning that we won't connect to a strictly excluded node, log what it was we were trying to do at that node. When ExcludeNodes is set but StrictNodes is not set, we only use non-excluded nodes if we can, but fall back to using excluded nodes if none of those nodes is usable.
This commit is contained in:
parent
ad3da53536
commit
4906188b62
@ -253,10 +253,13 @@ directories_have_accepted_server_descriptor(void)
|
||||
}
|
||||
|
||||
/** Start a connection to every suitable directory authority, using
|
||||
* connection purpose 'purpose' and uploading the payload 'payload'
|
||||
* (length 'payload_len'). dir_purpose should be one of
|
||||
* connection purpose <b>dir_purpose</b> and uploading <b>payload</b>
|
||||
* (of length <b>payload_len</b>). The dir_purpose should be one of
|
||||
* 'DIR_PURPOSE_UPLOAD_DIR' or 'DIR_PURPOSE_UPLOAD_RENDDESC'.
|
||||
*
|
||||
* <b>router_purpose</b> describes the type of descriptor we're
|
||||
* publishing, if we're publishing a descriptor -- e.g. general or bridge.
|
||||
*
|
||||
* <b>type</b> specifies what sort of dir authorities (V1, V2,
|
||||
* HIDSERV, BRIDGE) we should upload to.
|
||||
*
|
||||
@ -272,6 +275,7 @@ directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
|
||||
const char *payload,
|
||||
size_t payload_len, size_t extrainfo_len)
|
||||
{
|
||||
or_options_t *options = get_options();
|
||||
int post_via_tor;
|
||||
smartlist_t *dirservers = router_get_trusted_dir_servers();
|
||||
int found = 0;
|
||||
@ -287,6 +291,16 @@ directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
|
||||
if ((type & ds->type) == 0)
|
||||
continue;
|
||||
|
||||
if (options->ExcludeNodes && options->StrictNodes &&
|
||||
routerset_contains_routerstatus(options->ExcludeNodes, rs)) {
|
||||
log_warn(LD_DIR, "Wanted to contact authority '%s' for %s, but "
|
||||
"it's in our ExcludedNodes list and StrictNodes is set. "
|
||||
"Skipping.",
|
||||
ds->nickname,
|
||||
dir_conn_purpose_to_string(dir_purpose));
|
||||
continue;
|
||||
}
|
||||
|
||||
found = 1; /* at least one authority of this type was listed */
|
||||
if (dir_purpose == DIR_PURPOSE_UPLOAD_DIR)
|
||||
ds->has_accepted_serverdesc = 0;
|
||||
@ -496,12 +510,14 @@ directory_initiate_command_routerstatus_rend(routerstatus_t *status,
|
||||
time_t if_modified_since,
|
||||
const rend_data_t *rend_query)
|
||||
{
|
||||
or_options_t *options = get_options();
|
||||
routerinfo_t *router;
|
||||
char address_buf[INET_NTOA_BUF_LEN+1];
|
||||
struct in_addr in;
|
||||
const char *address;
|
||||
tor_addr_t addr;
|
||||
router = router_get_by_digest(status->identity_digest);
|
||||
|
||||
if (!router && anonymized_connection) {
|
||||
log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we "
|
||||
"don't have its router descriptor.", status->nickname);
|
||||
@ -514,6 +530,17 @@ directory_initiate_command_routerstatus_rend(routerstatus_t *status,
|
||||
address = address_buf;
|
||||
}
|
||||
tor_addr_from_ipv4h(&addr, status->addr);
|
||||
|
||||
if (options->ExcludeNodes && options->StrictNodes &&
|
||||
routerset_contains_routerstatus(options->ExcludeNodes, status)) {
|
||||
log_warn(LD_DIR, "Wanted to contact directory mirror '%s' for %s, but "
|
||||
"it's in our ExcludedNodes list and StrictNodes is set. "
|
||||
"Skipping. This choice might make your Tor not work.",
|
||||
status->nickname,
|
||||
dir_conn_purpose_to_string(dir_purpose));
|
||||
return;
|
||||
}
|
||||
|
||||
directory_initiate_command_rend(address, &addr,
|
||||
status->or_port, status->dir_port,
|
||||
status->version_supports_conditional_consensus,
|
||||
|
@ -1070,6 +1070,7 @@ router_pick_trusteddirserver(authority_type_t type, int flags)
|
||||
static routerstatus_t *
|
||||
router_pick_directory_server_impl(authority_type_t type, int flags)
|
||||
{
|
||||
or_options_t *options = get_options();
|
||||
routerstatus_t *result;
|
||||
smartlist_t *direct, *tunnel;
|
||||
smartlist_t *trusted_direct, *trusted_tunnel;
|
||||
@ -1079,10 +1080,13 @@ router_pick_directory_server_impl(authority_type_t type, int flags)
|
||||
int requireother = ! (flags & PDS_ALLOW_SELF);
|
||||
int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL);
|
||||
int prefer_tunnel = (flags & _PDS_PREFER_TUNNELED_DIR_CONNS);
|
||||
int try_excluding = 1, n_excluded = 0;
|
||||
|
||||
if (!consensus)
|
||||
return NULL;
|
||||
|
||||
retry_without_exclude:
|
||||
|
||||
direct = smartlist_create();
|
||||
tunnel = smartlist_create();
|
||||
trusted_direct = smartlist_create();
|
||||
@ -1114,6 +1118,11 @@ router_pick_directory_server_impl(authority_type_t type, int flags)
|
||||
if ((type & EXTRAINFO_CACHE) &&
|
||||
!router_supports_extrainfo(status->identity_digest, 0))
|
||||
continue;
|
||||
if (try_excluding && options->ExcludeNodes &&
|
||||
routerset_contains_routerstatus(options->ExcludeNodes, status)) {
|
||||
++n_excluded;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* XXXX IP6 proposal 118 */
|
||||
tor_addr_from_ipv4h(&addr, status->addr);
|
||||
@ -1155,6 +1164,15 @@ router_pick_directory_server_impl(authority_type_t type, int flags)
|
||||
smartlist_free(trusted_tunnel);
|
||||
smartlist_free(overloaded_direct);
|
||||
smartlist_free(overloaded_tunnel);
|
||||
|
||||
if (result == NULL && try_excluding && !options->StrictNodes && n_excluded) {
|
||||
/* If we got no result, and we are excluding nodes, and StrictNodes is
|
||||
* not set, try again without excluding nodes. */
|
||||
try_excluding = 0;
|
||||
n_excluded = 0;
|
||||
goto retry_without_exclude;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -1165,6 +1183,7 @@ static routerstatus_t *
|
||||
router_pick_trusteddirserver_impl(authority_type_t type, int flags,
|
||||
int *n_busy_out)
|
||||
{
|
||||
or_options_t *options = get_options();
|
||||
smartlist_t *direct, *tunnel;
|
||||
smartlist_t *overloaded_direct, *overloaded_tunnel;
|
||||
routerinfo_t *me = router_get_my_routerinfo();
|
||||
@ -1175,10 +1194,13 @@ router_pick_trusteddirserver_impl(authority_type_t type, int flags,
|
||||
const int prefer_tunnel = (flags & _PDS_PREFER_TUNNELED_DIR_CONNS);
|
||||
const int no_serverdesc_fetching =(flags & PDS_NO_EXISTING_SERVERDESC_FETCH);
|
||||
int n_busy = 0;
|
||||
int try_excluding = 1, n_excluded = 0;
|
||||
|
||||
if (!trusted_dir_servers)
|
||||
return NULL;
|
||||
|
||||
retry_without_exclude:
|
||||
|
||||
direct = smartlist_create();
|
||||
tunnel = smartlist_create();
|
||||
overloaded_direct = smartlist_create();
|
||||
@ -1197,6 +1219,12 @@ router_pick_trusteddirserver_impl(authority_type_t type, int flags,
|
||||
continue;
|
||||
if (requireother && me && router_digest_is_me(d->digest))
|
||||
continue;
|
||||
if (try_excluding && options->ExcludeNodes &&
|
||||
routerset_contains_routerstatus(options->ExcludeNodes,
|
||||
&d->fake_status)) {
|
||||
++n_excluded;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* XXXX IP6 proposal 118 */
|
||||
tor_addr_from_ipv4h(&addr, d->addr);
|
||||
@ -1243,6 +1271,15 @@ router_pick_trusteddirserver_impl(authority_type_t type, int flags,
|
||||
smartlist_free(tunnel);
|
||||
smartlist_free(overloaded_direct);
|
||||
smartlist_free(overloaded_tunnel);
|
||||
|
||||
if (result == NULL && try_excluding && !options->StrictNodes && n_excluded) {
|
||||
/* If we got no result, and we are excluding nodes, and StrictNodes is
|
||||
* not set, try again without excluding nodes. */
|
||||
try_excluding = 0;
|
||||
n_excluded = 0;
|
||||
goto retry_without_exclude;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user