Be clearer on the various roles for auth dir types.

Bridge authorities no longer write bridge descriptors to their
cached-routers file -- this gets complex because of extrainfo documents.


svn:r10545
This commit is contained in:
Roger Dingledine 2007-06-09 07:05:19 +00:00
parent 8dfde75ef6
commit a97c3b8c2d
8 changed files with 70 additions and 26 deletions

View file

@ -87,7 +87,7 @@ Things we'd like to do in 0.2.0.x:
- While we're at it, let v3 authorities have fqdns lines.
- Start caching consensus documents once authorities make them
- Start downloading and using consensus documents once caches serve them
. 104: Long and Short Router Descriptors (by Jun 1)
. 104: Long and Short Router Descriptors
. Finalize proposal
o Implement parsing for extra-info documents
o Have routers generate extra-info documents.
@ -102,7 +102,7 @@ Things we'd like to do in 0.2.0.x:
o Implement option to download and cache extra-info documents.
o Improve the 'retry' logic on extra-info documents.
- Drop bandwidth history from router-descriptors
- 105: Version negotiation for the Tor protocol (finalize by Jun 1)
- 105: Version negotiation for the Tor protocol
- 108: Base "Stable" Flag on Mean Time Between Failures
- 109: No more than one server per IP address
o 103: Splitting identity key from regularly used signing key
@ -194,7 +194,7 @@ Things we'd like to do in 0.2.0.x:
networkstatus generation; eliminate duplicate code.
- Include "v" line in getinfo values.
- Features:
- Traffic priorities (by Jun 1)
- Traffic priorities
- Ability to prioritize own traffic over relayed traffic.
o Implement a DNS proxy
o Make a listener type.
@ -208,13 +208,13 @@ Things we'd like to do in 0.2.0.x:
- A better UI for authority ops.
- Follow weasel's proposal, crossed with mixminion dir config format
- Write a proposal
- Bridges users (rudimentary version) (By Jun 1)
- Ability to specify bridges manually
D cache of bridges that we've learned about and use but aren't
- Bridges users (rudimentary version)
o Ability to specify bridges manually
- cache of bridges that we've learned about and use but aren't
manually listed in the torrc.
D and some mechanism for specifying that we want to stop using
a given bridge in this cache.
- Config option 'UseBridges' that bridge users can turn on.
. Config option 'UseBridges' that bridge users can turn on.
- uses bridges as first hop rather than entry guards.
D Do we want to maintain our own set of entryguards that we use
after the bridge? Open research question; let's say no for 0.2.0
@ -223,20 +223,22 @@ Things we'd like to do in 0.2.0.x:
N - Design/implement the "local-status" or something like it, from the
"Descriptor purposes: how to tell them apart" section of
http://archives.seul.org/or/dev/May-2007/msg00008.html
- Bridges operators (rudimentary version) (By Jun 1)
- Bridges operators (rudimentary version)
- Ability to act as dir cache without a dir port.
- Bridges publish to bridge authorities
o Bridges publish to bridge authorities
- Fix BEGIN_DIR so that you connect to bridge of which you only
know IP (and optionally fingerprint), and then use BEGIN_DIR to learn
more about it.
- Bridges authorities (rudimentary version) (By Jun 1)
- Rudimentary "do not publish networkstatus" option for bridge
- Bridges authorities (rudimentary version)
o Rudimentary "do not publish networkstatus" option for bridge
authorities.
- Clients can ask bridge authorities for more bridges.
- Bridges (not necessarily by Jun 1)
D Should do reachability testing but only on the purpose==bridge
descriptors we have.
- Bridges
- Clients can ask bridge authorities for updates on known bridges.
- More TLS normalization work: make Tor less easily
fingerprinted. (Researched by Jun 1)
fingerprinted.
- Directory system improvements
- config option to publish what ports you listen on, beyond
ORPort/DirPort. It should support ranges and bit prefixes (?) too.
@ -266,7 +268,7 @@ N - Design/implement the "local-status" or something like it, from the
- can we deprecate 'getinfo network-status'?
- can we deprecate the FastFirstHopPK config option?
P - Packaging:
P - Can we switch to polipo? (Jun 1)
P - Can we switch to polipo?
P - If we haven't replaced privoxy, lock down its configuration in all
packages, as documented in tor-doc-unix.html
P - Figure out why dll's compiled in mingw don't work right in WinXP.

View file

@ -3713,7 +3713,8 @@ parse_dir_server_line(const char *line, int validate_only)
fingerprint = smartlist_join_strings(items, "", 0, NULL);
if (strlen(fingerprint) != HEX_DIGEST_LEN) {
log_warn(LD_CONFIG, "Key digest for DirServer is wrong length.");
log_warn(LD_CONFIG, "Key digest for DirServer is wrong length %d.",
(int)strlen(fingerprint));
goto err;
}
if (base16_decode(digest, DIGEST_LEN, fingerprint, HEX_DIGEST_LEN)<0) {

View file

@ -676,7 +676,7 @@ connection_or_check_valid_handshake(or_connection_t *conn, int started_here,
END_OR_CONN_REASON_OR_IDENTITY);
as_advertised = 0;
}
if (authdir_mode_handles_descs(options)) {
if (authdir_mode_tests_reachability(options)) {
/* We initiated this connection to address:port. Drop all routers
* with the same address:port and a different key.
*/

View file

@ -1997,7 +1997,9 @@ directory_handle_command_post(dir_connection_t *conn, const char *headers,
if (authdir_mode_handles_descs(options) &&
!strcmp(url,"/tor/")) { /* server descriptor post */
const char *msg = NULL;
int r = dirserv_add_multiple_descriptors(body, &msg);
uint8_t purpose = authdir_mode_bridge(options) ?
ROUTER_PURPOSE_CONTROLLER : ROUTER_PURPOSE_GENERAL;
int r = dirserv_add_multiple_descriptors(body, purpose, &msg);
tor_assert(msg);
if (r > 0)
dirserv_get_directory(); /* rebuild and write to disk */

View file

@ -515,7 +515,8 @@ authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg,
/** As for dirserv_add_descriptor, but accepts multiple documents, and
* returns the most severe error that occurred for any one of them. */
int
dirserv_add_multiple_descriptors(const char *desc, const char **msg)
dirserv_add_multiple_descriptors(const char *desc, uint8_t purpose,
const char **msg)
{
int r=100; /* higher than any actual return value. */
int r_tmp;
@ -530,6 +531,17 @@ dirserv_add_multiple_descriptors(const char *desc, const char **msg)
if (!router_parse_list_from_string(&s, NULL, list, SAVED_NOWHERE, 0)) {
SMARTLIST_FOREACH(list, routerinfo_t *, ri, {
msg_out = NULL;
/* Assign the purpose.
* XXX020 Perhaps this should get pushed into
* router_parse_list_from_string()? Also, tie it somehow into
* router_load_single_router()? Lastly, does extrainfo_t want
* a purpose field too, or can we just piggyback off the one
* in routerinfo_t? */
ri->purpose = purpose;
if (purpose != ROUTER_PURPOSE_GENERAL)
ri->cache_info.do_not_cache = 1;
r_tmp = dirserv_add_descriptor(ri, &msg_out);
if (r_tmp < r) {
r = r_tmp;
@ -544,6 +556,11 @@ dirserv_add_multiple_descriptors(const char *desc, const char **msg)
if (!router_parse_list_from_string(&s, NULL, list, SAVED_NOWHERE, 1)) {
SMARTLIST_FOREACH(list, extrainfo_t *, ei, {
msg_out = NULL;
/* XXX020 see above note on purpose fields */
if (purpose != ROUTER_PURPOSE_GENERAL)
ei->cache_info.do_not_cache = 1;
r_tmp = dirserv_add_extrainfo(ei, &msg_out);
if (r_tmp < r) {
r = r_tmp;
@ -842,7 +859,7 @@ list_server_status(smartlist_t *routers, char **router_status_out,
or_options_t *options = get_options();
/* We include v2 dir auths here too, because they need to answer
* controllers. Eventually we'll deprecate this whole function. */
int authdir = authdir_mode_handles_descs(options);
int authdir = authdir_mode_publishes_statuses(options);
tor_assert(router_status_out);
rs_entries = smartlist_create();
@ -1260,8 +1277,9 @@ dirserv_pick_cached_dir_obj(cached_dir_t *cache_src,
or_options_t *options = get_options();
int authority = (auth_type == V1_AUTHORITY && authdir_mode_v1(options)) ||
(auth_type == V2_AUTHORITY && authdir_mode_v2(options));
/* XXX020 eventually use authdir_mode_publishes_statuses() here */
if (!authority || authdir_mode_bridge(options)) { /* XXX020 */
if (!authority || authdir_mode_bridge(options)) {
return cache_src;
} else {
/* We're authoritative. */

View file

@ -916,7 +916,7 @@ run_scheduled_events(time_t now)
if (accounting_is_enabled(options))
accounting_run_housekeeping(now);
if (now % 10 == 0 && (authdir_mode_handles_descs(options)) &&
if (now % 10 == 0 && (authdir_mode_tests_reachability(options)) &&
!we_are_hibernating()) {
/* try to determine reachability of the other Tor servers */
dirserv_test_reachability(0);
@ -1329,7 +1329,7 @@ do_main_loop(void)
}
directory_info_has_arrived(time(NULL),1);
if (authdir_mode_handles_descs(get_options())) {
if (authdir_mode_tests_reachability(get_options())) {
/* the directory is already here, run startup things */
dirserv_test_reachability(1);
}

View file

@ -2684,7 +2684,8 @@ int dirserv_add_own_fingerprint(const char *nickname, crypto_pk_env_t *pk);
int dirserv_load_fingerprint_file(void);
void dirserv_free_fingerprint_list(void);
const char *dirserv_get_nickname_by_digest(const char *digest);
int dirserv_add_multiple_descriptors(const char *desc, const char **msg);
int dirserv_add_multiple_descriptors(const char *desc, uint8_t purpose,
const char **msg);
int dirserv_add_descriptor(routerinfo_t *ri, const char **msg);
int getinfo_helper_dirserv_unregistered(control_connection_t *conn,
const char *question, char **answer);
@ -3127,6 +3128,8 @@ int authdir_mode(or_options_t *options);
int authdir_mode_v1(or_options_t *options);
int authdir_mode_v2(or_options_t *options);
int authdir_mode_handles_descs(or_options_t *options);
int authdir_mode_publishes_statuses(or_options_t *options);
int authdir_mode_tests_reachability(or_options_t *options);
int authdir_mode_bridge(or_options_t *options);
int clique_mode(or_options_t *options);
int server_mode(or_options_t *options);

View file

@ -714,11 +714,29 @@ authdir_mode_v2(or_options_t *options)
return authdir_mode(options) && options->V2AuthoritativeDir != 0;
}
/** Return true iff we are an authoritative directory server that
* handles descriptors -- including receiving posts, creating directories,
* and testing reachability.
* is willing to receive or serve descriptors on its dirport.
*/
int
authdir_mode_handles_descs(or_options_t *options)
{
return authdir_mode_v1(options) || authdir_mode_v2(options) ||
authdir_mode_bridge(options);
}
/** Return true iff we are an authoritative directory server that
* publishes its own network statuses.
*/
int
authdir_mode_publishes_statuses(or_options_t *options)
{
if (authdir_mode_bridge(options))
return 0;
return authdir_mode_v1(options) || authdir_mode_v2(options);
}
/** Return true iff we are an authoritative directory server that
* tests reachability of the descriptors it learns about.
*/
int
authdir_mode_tests_reachability(or_options_t *options)
{
return authdir_mode_v1(options) || authdir_mode_v2(options);
}
@ -735,7 +753,7 @@ authdir_mode_bridge(or_options_t *options)
int
clique_mode(or_options_t *options)
{
return authdir_mode_handles_descs(options);
return authdir_mode_tests_reachability(options);
}
/** Return true iff we are trying to be a server.