diff options
author | Nick Mathewson <nickm@torproject.org> | 2004-10-19 18:19:59 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2004-10-19 18:19:59 +0000 |
commit | e5049d5aa32574ad6f5a1a73151e80b0db606237 (patch) | |
tree | 4244a3d0f28bd2b4e2d07bb745df5f08a5cd8544 | |
parent | 62094ebd32c61421a24982c88b767826cdae75db (diff) | |
download | tor-e5049d5aa32574ad6f5a1a73151e80b0db606237.tar.gz tor-e5049d5aa32574ad6f5a1a73151e80b0db606237.zip |
Remove routerinfo_t->is_trusted_dir, and all the twisted machinery used to
maintain it.
Have clients default to the nickname "client" in their certificates.
Give a less frightening warning on obsolete (pre-0.0.8) routerinfo_t's.
svn:r2568
-rw-r--r-- | doc/TODO | 2 | ||||
-rw-r--r-- | src/or/or.h | 4 | ||||
-rw-r--r-- | src/or/router.c | 9 | ||||
-rw-r--r-- | src/or/routerlist.c | 97 | ||||
-rw-r--r-- | src/or/routerparse.c | 31 | ||||
-rw-r--r-- | src/or/test.c | 1 |
6 files changed, 22 insertions, 122 deletions
@@ -102,7 +102,7 @@ R - learn from ben about his openssl-reinitialization-trick to o stop reading dirservers file. o add some default TrustedDir lines if none defined, or if no torrc. - - remove notion of ->is_trusted_dir from the routerlist. that's + o remove notion of ->is_trusted_dir from the routerlist. that's no longer where you look. - clean up router parsing flow, since it's simpler now? o when checking signature on a directory, look it up in diff --git a/src/or/or.h b/src/or/or.h index 196a1dc9a5..a6dd45193b 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -595,7 +595,6 @@ typedef struct { int is_running; /**< As far as we know, is this OR currently running? */ time_t status_set_at; /**< When did we last update is_running? */ int is_verified; /**< Has a trusted dirserver validated this OR? */ - int is_trusted_dir; /**< Do we trust this OR as a directory server? */ smartlist_t *declared_family; /**< Nicknames of router which this router * claims are its family. */ @@ -1451,13 +1450,10 @@ routerinfo_t *router_get_by_digest(const char *digest); int router_digest_is_trusted_dir(const char *digest); void router_get_routerlist(routerlist_t **prouterlist); void routerlist_free(routerlist_t *routerlist); -void routerlist_clear_trusted_directories(void); void routerinfo_free(routerinfo_t *router); routerinfo_t *routerinfo_copy(const routerinfo_t *router); void router_mark_as_down(const char *digest); void routerlist_remove_old_routers(int age); -int router_load_routerlist_from_file(char *routerfile, int trusted); -int router_load_routerlist_from_string(const char *s, int trusted); int router_load_routerlist_from_directory(const char *s,crypto_pk_env_t *pkey, int check_version); int router_compare_addr_to_exit_policy(uint32_t addr, uint16_t port, diff --git a/src/or/router.c b/src/or/router.c index cb1f5b3169..3475882cc8 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -242,8 +242,10 @@ int init_keys(void) { if (crypto_pk_generate_key(prkey)) return -1; set_identity_key(prkey); -/* XXX NM: do we have a convention for what client's Nickname is? */ - if (tor_tls_context_new(get_identity_key(), 1, options.Nickname, + /* XXX NM: do we have a convention for what client's Nickname is? + * No. Let me propose one: */ + if (tor_tls_context_new(get_identity_key(), 1, + options.Nickname ? options.Nickname : "client", MAX_SSL_KEY_LIFETIME) < 0) { log_fn(LOG_ERR, "Error creating TLS context for OP."); return -1; @@ -398,7 +400,7 @@ void router_retry_connections(void) { } int router_is_clique_mode(routerinfo_t *router) { - if(router->is_trusted_dir) + if(router_digest_is_trusted_dir(router->identity_digest)) return 1; return 0; } @@ -541,7 +543,6 @@ int router_rebuild_descriptor(void) { ri->bandwidthburst = options.BandwidthBurst; ri->bandwidthcapacity = router_get_bandwidth_capacity(); router_add_exit_policy_from_config(ri); - ri->is_trusted_dir = authdir_mode(); if(desc_routerinfo) /* inherit values */ ri->is_verified = desc_routerinfo->is_verified; if (options.MyFamily) { diff --git a/src/or/routerlist.c b/src/or/routerlist.c index 0eeda7b589..0aca4028c3 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -48,7 +48,6 @@ extern int has_fetched_directory; /**< from main.c */ int router_reload_router_list(void) { char filename[512]; - routerlist_clear_trusted_directories(); if (get_data_directory(&options)) { char *s; snprintf(filename,sizeof(filename),"%s/cached-directory", get_data_directory(&options)); @@ -107,7 +106,6 @@ routerinfo_t *router_pick_directory_server(int requireothers, log_fn(LOG_INFO,"Still no %s router entries. Reloading and trying again.", options.FascistFirewall ? "reachable" : "known"); has_fetched_directory=0; /* reset it */ - routerlist_clear_trusted_directories(); if(router_reload_router_list()) { return NULL; } @@ -135,7 +133,6 @@ trusted_dir_server_t *router_pick_trusteddirserver(int requireothers, log_fn(LOG_WARN,"Still no dirservers %s. Reloading and trying again.", options.FascistFirewall ? "reachable" : "known"); has_fetched_directory=0; /* reset it */ - routerlist_clear_trusted_directories(); if(router_reload_router_list()) { return NULL; } @@ -221,11 +218,11 @@ router_pick_trusteddirserver_impl(int requireother, int fascistfirewall) static void mark_all_trusteddirservers_up(void) { if(routerlist) { SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, router, - if(router->is_trusted_dir) { - tor_assert(router->dir_port > 0); - router->is_running = 1; - router->status_set_at = time(NULL); - }); + if(router_digest_is_trusted_dir(router->identity_digest)) { + tor_assert(router->dir_port > 0); + router->is_running = 1; + router->status_set_at = time(NULL); + }); } if (trusted_dir_servers) { SMARTLIST_FOREACH(trusted_dir_servers, trusted_dir_server_t *, dir, @@ -737,8 +734,6 @@ int router_add_to_routerlist(routerinfo_t *router) { for (i = 0; i < smartlist_len(routerlist->routers); ++i) { r = smartlist_get(routerlist->routers, i); - r->is_trusted_dir = router_digest_is_trusted_dir(r->identity_digest); - if (!crypto_pk_cmp_keys(router->identity_pkey, r->identity_pkey)) { if (router->published_on > r->published_on) { log_fn(LOG_DEBUG, "Replacing entry for router '%s/%s' [%s]", @@ -809,9 +804,8 @@ routerlist_remove_old_routers(int age) cutoff = time(NULL) - age; for (i = 0; i < smartlist_len(routerlist->routers); ++i) { router = smartlist_get(routerlist->routers, i); - if (router->published_on <= cutoff && - !router->is_trusted_dir) { - /* Too old. Remove it. But never remove dirservers! */ + if (router->published_on <= cutoff) { + /* Too old. Remove it. */ log_fn(LOG_INFO,"Forgetting obsolete routerinfo for node %s.", router->nickname); routerinfo_free(router); smartlist_del(routerlist->routers, i--); @@ -823,83 +817,6 @@ routerlist_remove_old_routers(int age) * Code to parse router descriptors and directories. */ -/** Update the current router list with the one stored in - * <b>routerfile</b>. If <b>trusted</b> is true, then we'll use - * directory servers from the file. */ -int router_load_routerlist_from_file(char *routerfile, int trusted) -{ - char *string; - - string = read_file_to_str(routerfile,0); - if(!string) { - log_fn(LOG_WARN,"Failed to load routerfile %s.",routerfile); - return -1; - } - - if(router_load_routerlist_from_string(string, trusted) < 0) { - log_fn(LOG_WARN,"The routerfile itself was corrupt."); - tor_free(string); - return -1; - } - /* dump_onion_keys(LOG_NOTICE); */ - - tor_free(string); - return 0; -} - -/** Mark all directories in the routerlist as nontrusted. */ -void routerlist_clear_trusted_directories(void) -{ - if (routerlist) { - SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, r, - r->is_trusted_dir = 0); - } -} - -/** Helper function: read routerinfo elements from s, and throw out the - * ones that don't parse and resolve. Add all remaining elements to the - * routerlist. If <b>trusted</b> is true, then we'll use - * directory servers from the string - */ -int router_load_routerlist_from_string(const char *s, int trusted) -{ - routerlist_t *new_list=NULL; - - if (router_parse_list_from_string(&s, &new_list, NULL, 0)) { - log(LOG_WARN, "Error parsing router file"); - return -1; - } - if (*s) { - log(LOG_WARN, "Extraneous text at start of router file"); - return -1; - } - if (trusted) { - int i; - for (i=0;i<smartlist_len(new_list->routers);++i) { - routerinfo_t *r = smartlist_get(new_list->routers, i); - if (r->dir_port) { - log_fn(LOG_DEBUG,"Trusting router %s.", r->nickname); - r->is_trusted_dir = 1; - add_trusted_dir_server(r->address, r->dir_port, r->identity_digest); - } - } - } - if (routerlist) { - SMARTLIST_FOREACH(new_list->routers, routerinfo_t *, r, - router_add_to_routerlist(r)); - smartlist_clear(new_list->routers); - routerlist_free(new_list); - } else { - routerlist = new_list; - } - if (router_resolve_routerlist(routerlist)) { - log(LOG_WARN, "Error resolving routerlist"); - return -1; - } - /* dump_onion_keys(LOG_NOTICE); */ - - return 0; -} /** Add to the current routerlist each router stored in the * signed directory <b>s</b>. If pkey is provided, check the signature against diff --git a/src/or/routerparse.c b/src/or/routerparse.c index 7811881dfb..476c8af989 100644 --- a/src/or/routerparse.c +++ b/src/or/routerparse.c @@ -599,9 +599,7 @@ static int dir_signing_key_is_trusted(crypto_pk_env_t *key) * was used to sign it, so we will use that key only if it is an * authoritative directory signing key. * - * Otherwise, try to look up the router whose nickname is given in the - * directory-signature token. If this fails, or the named router is - * not authoritative, try to use pkey. + * Otherwise, if pkey is provided, try to use it. * * (New callers should always use <b>declared_key</b> when possible; * <b>pkey is only for debugging.) @@ -612,7 +610,6 @@ static int check_directory_signature(const char *digest, crypto_pk_env_t *declared_key) { char signed_digest[PK_BYTES]; - routerinfo_t *r; crypto_pk_env_t *_pkey = NULL; if (tok->n_args != 1) { @@ -624,24 +621,13 @@ static int check_directory_signature(const char *digest, if (dir_signing_key_is_trusted(declared_key)) _pkey = declared_key; } + if (!_pkey && pkey) { + /* pkey provided for debugging purposes */ + _pkey = pkey; + } if (!_pkey) { - log_fn(LOG_WARN, "Processing directory in old (before 0.0.9pre3) format--this may fail."); - r = router_get_by_nickname(tok->args[0]); - log_fn(LOG_DEBUG, "Got directory signed (allegedly) by %s", tok->args[0]); - if (r && r->is_trusted_dir) { - _pkey = r->identity_pkey; - } else if (!r && pkey) { - /* pkey provided for debugging purposes. */ - _pkey = pkey; - } else if (!r) { - log_fn(LOG_WARN, "No server descriptor loaded for signer %s", - tok->args[0]); - return -1; - } else if (r && !r->is_trusted_dir) { - log_fn(LOG_WARN, "Directory was signed by non-trusted server %s", - tok->args[0]); - return -1; - } + log_fn(LOG_WARN, "Found directory in old (before 0.0.9pre3) format--rejecting."); + return -1; } if (strcmp(tok->object_type, "SIGNATURE") || tok->object_size != 128) { @@ -825,7 +811,8 @@ routerinfo_t *router_parse_entry_from_string(const char *s, goto err; } else if (tok) { if (tok->n_args < 3) { - log_fn(LOG_WARN,"Not enough arguments to \"bandwidth\""); + /* XXXX Once 0.0.7 is *really* dead, restore this warning to its old form*/ + log_fn(LOG_WARN,"Not enough arguments to \"bandwidth\": must be an obsolete server. Rejecting."); goto err; } router->bandwidthrate = tor_parse_long(tok->args[0],10,0,INT_MAX,NULL,NULL); diff --git a/src/or/test.c b/src/or/test.c index 8706600eb5..745a8fedc0 100644 --- a/src/or/test.c +++ b/src/or/test.c @@ -927,7 +927,6 @@ test_dir_format() r1.or_port = 9000; r1.socks_port = 9002; r1.dir_port = 9003; - r1.is_trusted_dir = 1; r1.onion_pkey = pk1; r1.identity_pkey = pk2; r1.bandwidthrate = 1000; |