diff options
author | teor (Tim Wilson-Brown) <teor2345@gmail.com> | 2016-07-01 10:18:28 +1000 |
---|---|---|
committer | teor (Tim Wilson-Brown) <teor2345@gmail.com> | 2016-07-01 14:00:25 +1000 |
commit | f90bfaae8dabb6acf7656b20f1bc0513a683a0dd (patch) | |
tree | 7485daa2b888eae2ce8d5e5116c229b8bf8851ac /src/or/routerlist.c | |
parent | d3ca6fe475ab5e0cc9c80e0ff984bebe4160f689 (diff) | |
download | tor-f90bfaae8dabb6acf7656b20f1bc0513a683a0dd.tar.gz tor-f90bfaae8dabb6acf7656b20f1bc0513a683a0dd.zip |
Refactor duplicate code in authority_certs_fetch_missing
Diffstat (limited to 'src/or/routerlist.c')
-rw-r--r-- | src/or/routerlist.c | 69 |
1 files changed, 31 insertions, 38 deletions
diff --git a/src/or/routerlist.c b/src/or/routerlist.c index cae0241343..c08d1a33f3 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -834,6 +834,33 @@ authority_cert_dl_looks_uncertain(const char *id_digest) return n_failures >= N_AUTH_CERT_DL_FAILURES_TO_BUG_USER; } +/* Fetch the authority certificates specified in resource. + * If rs is not NULL, fetch from rs, otherwise, fetch from a random directory + * mirror. */ +static void +authority_certs_fetch_resource_impl(const char *resource, + const routerstatus_t *rs) +{ + if (rs) { + /* If we've just downloaded a consensus from a directory, re-use that + * directory */ + int get_via_tor = purpose_needs_anonymity( + DIR_PURPOSE_FETCH_CERTIFICATE, 0); + const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS + : DIRIND_ONEHOP; + directory_initiate_command_routerstatus(rs, + DIR_PURPOSE_FETCH_CERTIFICATE, + 0, indirection, resource, NULL, + 0, 0); + } else { + /* Otherwise, we want certs from a random fallback or directory + * mirror, because they will almost always succeed. */ + directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0, + resource, PDS_RETRY_IF_NO_SERVERS, + DL_WANT_ANY_DIRSERVER); + } +} + /** Try to download any v3 authority certificates that we may be missing. If * <b>status</b> is provided, try to get all the ones that were used to sign * <b>status</b>. Additionally, try to have a non-expired certificate for @@ -1072,25 +1099,8 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, if (smartlist_len(fps) > 1) { resource = smartlist_join_strings(fps, "", 0, NULL); - - /* If we've just downloaded a consensus from a directory, re-use that - * directory */ - if (rs) { - int get_via_tor = purpose_needs_anonymity( - DIR_PURPOSE_FETCH_CERTIFICATE, 0); - const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS - : DIRIND_ONEHOP; - directory_initiate_command_routerstatus(rs, - DIR_PURPOSE_FETCH_CERTIFICATE, - 0, indirection, resource, NULL, - 0, 0); - } else { - /* Otherwise, we want certs from a random fallback or directory - * mirror, because they will almost always succeed. */ - directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0, - resource, PDS_RETRY_IF_NO_SERVERS, - DL_WANT_ANY_DIRSERVER); - } + /* rs is the directory that just gave us a consensus or certificates */ + authority_certs_fetch_resource_impl(resource, rs); tor_free(resource); } /* else we didn't add any: they were all pending */ @@ -1133,25 +1143,8 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, if (smartlist_len(fp_pairs) > 1) { resource = smartlist_join_strings(fp_pairs, "", 0, NULL); - - /* If we've just downloaded a consensus from a directory, re-use that - * directory */ - if (rs) { - int get_via_tor = purpose_needs_anonymity( - DIR_PURPOSE_FETCH_CERTIFICATE, 0); - const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS - : DIRIND_ONEHOP; - directory_initiate_command_routerstatus(rs, - DIR_PURPOSE_FETCH_CERTIFICATE, - 0, indirection, resource, NULL, - 0, 0); - } else { - /* Otherwise, we want certs from a random fallback or directory - * mirror, because they will almost always succeed. */ - directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0, - resource, PDS_RETRY_IF_NO_SERVERS, - DL_WANT_ANY_DIRSERVER); - } + /* rs is the directory that just gave us a consensus or certificates */ + authority_certs_fetch_resource_impl(resource, rs); tor_free(resource); } /* else they were all pending */ |