aboutsummaryrefslogtreecommitdiff
path: root/src/or/networkstatus.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2007-10-19 18:56:24 +0000
committerNick Mathewson <nickm@torproject.org>2007-10-19 18:56:24 +0000
commit7bb202fd1944d49f294420bbf7b874a5ccbf0f34 (patch)
tree59fda12d90f960c8300b1311e5c7fef68eec0d3c /src/or/networkstatus.c
parentee2b770deebba5b4cd80416ad8e757e478723987 (diff)
downloadtor-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.c43
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);
+ }
}