From: Nick Mathewson Date: Mon, 13 Aug 2007 18:47:22 +0000 (+0000) Subject: r14531@catbus: nickm | 2007-08-13 14:46:25 -0400 X-Git-Tag: tor-0.2.0.5-alpha~75 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce1f01c3e6b55700baf46365aaef5a83fbae858e;p=thirdparty%2Ftor.git r14531@catbus: nickm | 2007-08-13 14:46:25 -0400 Cache v3 networkstatus consensuses on disk. svn:r11086 --- diff --git a/ChangeLog b/ChangeLog index 564cc02ec0..83cca79e42 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,6 +11,10 @@ Changes in version 0.2.0.5-alpha - 2007-??-?? - Fix compile on platforms without getaddrinfo: bug found by Li-Hui Zhou. + o Minor features (directory voting): + - Store v3 consensus status consensuses on disk, and reload them + on startup. + o Minor featuers (security): - Warn about unsafe ControlPort configurations. diff --git a/doc/TODO b/doc/TODO index 238946f3dc..98f32308b1 100644 --- a/doc/TODO +++ b/doc/TODO @@ -92,7 +92,7 @@ Things we'd like to do in 0.2.0.x: * Detect whether votes are really all for the same period. - Push/pull documents as appropriate. - Pull votes and signatures if we don't get them. - - Store consensuses + o Store consensuses - Cache votes and signatures on disk. o Have clients know which authorities are v3 authorities, and what their keys are. diff --git a/src/or/dirvote.c b/src/or/dirvote.c index ad15c04226..e9b991d39e 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -1400,7 +1400,7 @@ dirvote_publish_consensus(void) networkstatus_check_consensus_signature(pending_consensus)<0) return -1; - networkstatus_set_current_consensus(pending_consensus_body); + networkstatus_set_current_consensus(pending_consensus_body, 0); return 0; } diff --git a/src/or/main.c b/src/or/main.c index 0086168a4d..3719afe58c 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -1353,6 +1353,9 @@ do_main_loop(void) if (router_reload_networkstatus()) { return -1; } + if (router_reload_consensus_networkstatus()) { + return -1; + } directory_info_has_arrived(time(NULL),1); if (authdir_mode_tests_reachability(get_options())) { diff --git a/src/or/or.h b/src/or/or.h index 142f5352c0..96d0e74153 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -3427,9 +3427,10 @@ local_routerstatus_t *router_get_combined_status_by_descriptor_digest( const char *digest); /* for consensuses. */ +int router_reload_consensus_networkstatus(void); networkstatus_vote_t *networkstatus_get_latest_consensus(void); networkstatus_vote_t *networkstatus_get_live_consensus(time_t now); -int networkstatus_set_current_consensus(const char *consensus); +int networkstatus_set_current_consensus(const char *consensus, int from_cache); //routerstatus_t *routerstatus_get_by_hexdigest(const char *hexdigest); int should_delay_dir_fetches(or_options_t *options); diff --git a/src/or/routerlist.c b/src/or/routerlist.c index 0cff1709fd..39518b6fac 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -175,6 +175,27 @@ router_reload_networkstatus(void) return 0; } +/**DOCDOC */ +int +router_reload_consensus_networkstatus(void) +{ + char filename[512]; + char *s; + + tor_snprintf(filename,sizeof(filename),"%s"PATH_SEPARATOR"cached-consensus", + get_options()->DataDirectory); + s = read_file_to_str(filename, 0, NULL); + if (!s) + return 0; + + if (networkstatus_set_current_consensus(s, 1)) { + log_warn(LD_FS, "Couldn't load consensus networkstatus from \"%s\"", + filename); + } + tor_free(s); + return 0; +} + /** Reload the cached v3 key certificates from the cached-certs file in * the data directory. Return 0 on success, -1 on failure. */ int @@ -3837,8 +3858,9 @@ networkstatus_get_live_consensus(time_t now) return current_consensus; } +/** DOCDOC */ int -networkstatus_set_current_consensus(const char *consensus) +networkstatus_set_current_consensus(const char *consensus, int from_cache) { networkstatus_vote_t *c; /* Make sure it's parseable. */ @@ -3857,6 +3879,15 @@ networkstatus_set_current_consensus(const char *consensus) current_consensus = c; + if (!from_cache) { + or_options_t *options = get_options(); + char filename[512]; + tor_snprintf(filename, sizeof(filename), + "%s"PATH_SEPARATOR"cached-consensus", + options->DataDirectory); + write_str_to_file(filename, consensus, 0); + } + if (get_options()->DirPort) dirserv_set_cached_networkstatus_v3(consensus, c->valid_after);