diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-10-19 18:56:24 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-10-19 18:56:24 +0000 |
commit | 7bb202fd1944d49f294420bbf7b874a5ccbf0f34 (patch) | |
tree | 59fda12d90f960c8300b1311e5c7fef68eec0d3c /src/or/networkstatus.c | |
parent | ee2b770deebba5b4cd80416ad8e757e478723987 (diff) | |
download | tor-7bb202fd1944d49f294420bbf7b874a5ccbf0f34.tar tor-7bb202fd1944d49f294420bbf7b874a5ccbf0f34.tar.gz |
r15965@catbus: nickm | 2007-10-19 13:32:11 -0400
Client-side implementation for proposal 122.
svn:r12051
Diffstat (limited to 'src/or/networkstatus.c')
-rw-r--r-- | src/or/networkstatus.c | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c index 154d82676..aa70c2703 100644 --- a/src/or/networkstatus.c +++ b/src/or/networkstatus.c @@ -25,8 +25,11 @@ static smartlist_t *networkstatus_v2_list = NULL; * time we called download_status_map_update_from_v2_networkstatus() */ static int networkstatus_v2_list_has_changed = 0; -/** Map from lowercase nickname to digest of named server, if any. */ +/** Map from lowercase nickname to identity digest of named server, if any. */ static strmap_t *named_server_map = NULL; +/** Map from lowercase nickname to (void*)1 for all names that are listed + * as unnamed for some server in the consensus. */ +static strmap_t *unnamed_server_map = NULL; /** Most recently received and validated v3 consensus network status. */ static networkstatus_vote_t *current_consensus = NULL; @@ -579,6 +582,7 @@ router_get_consensus_status_by_nickname(const char *nickname, routerstatus_t *best=NULL; smartlist_t *matches=NULL; const char *named_id=NULL; + int any_unnamed=0; if (!current_consensus || !nickname) return NULL; @@ -597,6 +601,10 @@ router_get_consensus_status_by_nickname(const char *nickname, if (named_id) return networkstatus_vote_find_entry(current_consensus, named_id); + if (unnamed_server_map && + strmap_get_lc(named_server_map, nickname)) + return NULL; /* XXXX020 should we warn? */ + /*XXXX020 is this behavior really what we want? */ matches = smartlist_create(); SMARTLIST_FOREACH(current_consensus->routerstatus_list, @@ -604,16 +612,22 @@ router_get_consensus_status_by_nickname(const char *nickname, { if (!strcasecmp(lrs->nickname, nickname)) { if (lrs->is_named) { + /* XXXX020 this should never happen. */ smartlist_free(matches); return lrs; } else { + if (lrs->is_unnamed) + smartlist_free(matches); /* nor should this. */ smartlist_add(matches, lrs); best = lrs; } } }); - if (smartlist_len(matches)>1 && warn_if_unnamed) { + if (any_unnamed) { + /* XXXX020 should we warn? */ + return NULL; + } else if (smartlist_len(matches)>1 && warn_if_unnamed) { int any_unwarned=0; SMARTLIST_FOREACH(matches, routerstatus_t *, lrs, { @@ -654,6 +668,13 @@ networkstatus_get_router_digest_by_nickname(const char *nickname) return strmap_get_lc(named_server_map, nickname); } +/** DOCDOC */ +int +networkstatus_nickname_is_unnamed(const char *nickname) +{ + return strmap_get_lc(named_server_map, nickname) != NULL; +} + /** How frequently do directory authorities re-download fresh networkstatus * documents? */ #define AUTHORITY_NS_CACHE_INTERVAL (5*60) @@ -1061,6 +1082,11 @@ routers_update_all_from_networkstatus(time_t now) log_info(LD_GENERAL, "The latest consensus does not list us." "Are you misconfigured?"); have_warned_about_invalid_status = 1; + } else if (rs->is_unnamed) { + /* XXXX020 this isn't a useful warning. */ + log_info(LD_GENERAL, "The directory have assigned the nickname " + "you're using to a different identity."); + have_warned_about_invalid_status = 1; } else if (!rs->is_named) { /*XXXX020 this isn't a correct warning. */ log_info(LD_GENERAL, "The directory authorities do not recognize " @@ -1150,11 +1176,17 @@ routerstatus_list_update_named_server_map(void) if (named_server_map) strmap_free(named_server_map, _tor_free); named_server_map = strmap_new(); + if (unnamed_server_map) + strmap_free(unnamed_server_map, NULL); + named_server_map = strmap_new(); SMARTLIST_FOREACH(current_consensus->routerstatus_list, routerstatus_t *, rs, { if (rs->is_named) { - strmap_set(named_server_map, rs->nickname, - tor_memdup(rs->identity_digest, DIGEST_LEN)); + strmap_set_lc(named_server_map, rs->nickname, + tor_memdup(rs->identity_digest, DIGEST_LEN)); + } + if (rs->is_unnamed) { + strmap_set_lc(unnamed_server_map, rs->nickname, (void*)1); } }); } @@ -1348,5 +1380,8 @@ networkstatus_free_all(void) if (named_server_map) { strmap_free(named_server_map, _tor_free); } + if (unnamed_server_map) { + strmap_free(unnamed_server_map, NULL); + } } |