diff options
author | Nick Mathewson <nickm@torproject.org> | 2013-01-17 18:07:36 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2013-01-17 18:07:36 -0500 |
commit | ff9bdbd56ffdc4d91da377ca5e1624b58aeaab8e (patch) | |
tree | 0c44e10f1a65d15de9e1f203b8594885dd6bd828 /src/or/routerset.c | |
parent | e0581a4b571f13dd0de801792c853e22ac244a36 (diff) | |
download | tor-ff9bdbd56ffdc4d91da377ca5e1624b58aeaab8e.tar.gz tor-ff9bdbd56ffdc4d91da377ca5e1624b58aeaab8e.zip |
When excluding nodes by country, exclude {??} and {A1} too
This is ticket 7706, reported by "bugcatcher." The rationale here
is that if somebody says 'ExcludeNodes {tv}', then they probably
don't just want to block definitely Tuvaluan nodes: they also want
to block nodes that have unknown country, since for all they know
such nodes are also in Tuvalu.
This behavior is controlled by a new GeoIPExcludeUnknown autobool
option. With the default (auto) setting, we exclude ?? and A1 if
any country is excluded. If the option is 1, we add ?? and A1
unconditionally; if the option is 0, we never add them.
(Right now our geoip file doesn't actually seem to include A1: I'm
including it here in case it comes back.)
This feature only takes effect if you have a GeoIP file. Otherwise
you'd be excluding every node.
Diffstat (limited to 'src/or/routerset.c')
-rw-r--r-- | src/or/routerset.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/or/routerset.c b/src/or/routerset.c index 5154e28083..4b519034d3 100644 --- a/src/or/routerset.c +++ b/src/or/routerset.c @@ -226,6 +226,45 @@ routerset_contains(const routerset_t *set, const tor_addr_t *addr, return 0; } +/** If *<b>setp</b> includes at least one country code, or if + * <b>only_some_cc_set</b> is 0, add the ?? and A1 country codes to + * *<b>setp</b>, creating it as needed. Return true iff *<b>setp</b> changed. + */ +int +routerset_add_unknown_ccs(routerset_t **setp, int only_if_some_cc_set) +{ + routerset_t *set; + int add_unknown, add_a1; + if (only_if_some_cc_set) { + if (!*setp || smartlist_len((*setp)->country_names) == 0) + return 0; + } + if (!*setp) + *setp = routerset_new(); + + set = *setp; + + add_unknown = ! smartlist_contains_string_case(set->country_names, "??") && + geoip_get_country("??") >= 0; + add_a1 = ! smartlist_contains_string_case(set->country_names, "a1") && + geoip_get_country("A1") >= 0; + + if (add_unknown) { + smartlist_add(set->country_names, tor_strdup("??")); + smartlist_add(set->list, tor_strdup("{??}")); + } + if (add_a1) { + smartlist_add(set->country_names, tor_strdup("a1")); + smartlist_add(set->country_names, tor_strdup("{a1}")); + } + + if (add_unknown || add_a1) { + routerset_refresh_countries(set); + return 1; + } + return 0; +} + /** Return true iff we can tell that <b>ei</b> is a member of <b>set</b>. */ int routerset_contains_extendinfo(const routerset_t *set, const extend_info_t *ei) |