Unverified Commit f90bfaae authored by teor (Tim Wilson-Brown)'s avatar teor (Tim Wilson-Brown)
Browse files

Refactor duplicate code in authority_certs_fetch_missing

parent d3ca6fe4
Loading
Loading
Loading
Loading
+31 −38
Original line number Diff line number Diff line
@@ -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 */