mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-26 15:42:34 +01:00
Split dirinfo_type_t computation into a new function
This commit is contained in:
parent
2e16856665
commit
c00b397992
2 changed files with 56 additions and 39 deletions
|
@ -63,8 +63,6 @@ static void directory_send_command(dir_connection_t *conn,
|
||||||
time_t if_modified_since);
|
time_t if_modified_since);
|
||||||
static int directory_handle_command(dir_connection_t *conn);
|
static int directory_handle_command(dir_connection_t *conn);
|
||||||
static int body_is_plausible(const char *body, size_t body_len, int purpose);
|
static int body_is_plausible(const char *body, size_t body_len, int purpose);
|
||||||
static int purpose_needs_anonymity(uint8_t dir_purpose,
|
|
||||||
uint8_t router_purpose);
|
|
||||||
static char *http_get_header(const char *headers, const char *which);
|
static char *http_get_header(const char *headers, const char *which);
|
||||||
static void http_set_address_origin(const char *headers, connection_t *conn);
|
static void http_set_address_origin(const char *headers, connection_t *conn);
|
||||||
static void connection_dir_download_routerdesc_failed(dir_connection_t *conn);
|
static void connection_dir_download_routerdesc_failed(dir_connection_t *conn);
|
||||||
|
@ -119,7 +117,7 @@ static void directory_initiate_command_rend(const tor_addr_t *addr,
|
||||||
/** Return true iff the directory purpose <b>dir_purpose</b> (and if it's
|
/** Return true iff the directory purpose <b>dir_purpose</b> (and if it's
|
||||||
* fetching descriptors, it's fetching them for <b>router_purpose</b>)
|
* fetching descriptors, it's fetching them for <b>router_purpose</b>)
|
||||||
* must use an anonymous connection to a directory. */
|
* must use an anonymous connection to a directory. */
|
||||||
static int
|
STATIC int
|
||||||
purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose)
|
purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose)
|
||||||
{
|
{
|
||||||
if (get_options()->AllDirActionsPrivate)
|
if (get_options()->AllDirActionsPrivate)
|
||||||
|
@ -199,6 +197,46 @@ dir_conn_purpose_to_string(int purpose)
|
||||||
return "(unknown)";
|
return "(unknown)";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Return the requisite directory information types. */
|
||||||
|
STATIC dirinfo_type_t
|
||||||
|
dir_fetch_type(int dir_purpose, int router_purpose, const char *resource)
|
||||||
|
{
|
||||||
|
dirinfo_type_t type;
|
||||||
|
switch (dir_purpose) {
|
||||||
|
case DIR_PURPOSE_FETCH_EXTRAINFO:
|
||||||
|
type = EXTRAINFO_DIRINFO;
|
||||||
|
if (router_purpose == ROUTER_PURPOSE_BRIDGE)
|
||||||
|
type |= BRIDGE_DIRINFO;
|
||||||
|
else
|
||||||
|
type |= V3_DIRINFO;
|
||||||
|
break;
|
||||||
|
case DIR_PURPOSE_FETCH_SERVERDESC:
|
||||||
|
if (router_purpose == ROUTER_PURPOSE_BRIDGE)
|
||||||
|
type = BRIDGE_DIRINFO;
|
||||||
|
else
|
||||||
|
type = V3_DIRINFO;
|
||||||
|
break;
|
||||||
|
case DIR_PURPOSE_FETCH_STATUS_VOTE:
|
||||||
|
case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES:
|
||||||
|
case DIR_PURPOSE_FETCH_CERTIFICATE:
|
||||||
|
type = V3_DIRINFO;
|
||||||
|
break;
|
||||||
|
case DIR_PURPOSE_FETCH_CONSENSUS:
|
||||||
|
type = V3_DIRINFO;
|
||||||
|
if (resource && !strcmp(resource, "microdesc"))
|
||||||
|
type |= MICRODESC_DIRINFO;
|
||||||
|
break;
|
||||||
|
case DIR_PURPOSE_FETCH_MICRODESC:
|
||||||
|
type = MICRODESC_DIRINFO;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log_warn(LD_BUG, "Unexpected purpose %d", (int)dir_purpose);
|
||||||
|
type = NO_DIRINFO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
/** Return true iff <b>identity_digest</b> is the digest of a router we
|
/** Return true iff <b>identity_digest</b> is the digest of a router we
|
||||||
* believe to support extrainfo downloads. (If <b>is_authority</b> we do
|
* believe to support extrainfo downloads. (If <b>is_authority</b> we do
|
||||||
* additional checking that's only valid for authorities.) */
|
* additional checking that's only valid for authorities.) */
|
||||||
|
@ -381,47 +419,21 @@ directory_pick_generic_dirserver(dirinfo_type_t type, int pds_flags,
|
||||||
* Use <b>pds_flags</b> as arguments to router_pick_directory_server()
|
* Use <b>pds_flags</b> as arguments to router_pick_directory_server()
|
||||||
* or router_pick_trusteddirserver().
|
* or router_pick_trusteddirserver().
|
||||||
*/
|
*/
|
||||||
void
|
MOCK_IMPL(void, directory_get_from_dirserver, (uint8_t dir_purpose,
|
||||||
directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
|
uint8_t router_purpose,
|
||||||
const char *resource, int pds_flags)
|
const char *resource,
|
||||||
|
int pds_flags))
|
||||||
{
|
{
|
||||||
const routerstatus_t *rs = NULL;
|
const routerstatus_t *rs = NULL;
|
||||||
const or_options_t *options = get_options();
|
const or_options_t *options = get_options();
|
||||||
int prefer_authority = directory_fetches_from_authorities(options);
|
int prefer_authority = directory_fetches_from_authorities(options);
|
||||||
int require_authority = 0;
|
int require_authority = 0;
|
||||||
int get_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose);
|
int get_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose);
|
||||||
dirinfo_type_t type;
|
dirinfo_type_t type = dir_fetch_type(dir_purpose, router_purpose, resource);
|
||||||
time_t if_modified_since = 0;
|
time_t if_modified_since = 0;
|
||||||
|
|
||||||
/* FFFF we could break this switch into its own function, and call
|
if (type == NO_DIRINFO)
|
||||||
* it elsewhere in directory.c. -RD */
|
return;
|
||||||
switch (dir_purpose) {
|
|
||||||
case DIR_PURPOSE_FETCH_EXTRAINFO:
|
|
||||||
type = EXTRAINFO_DIRINFO |
|
|
||||||
(router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_DIRINFO :
|
|
||||||
V3_DIRINFO);
|
|
||||||
break;
|
|
||||||
case DIR_PURPOSE_FETCH_SERVERDESC:
|
|
||||||
type = (router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_DIRINFO :
|
|
||||||
V3_DIRINFO);
|
|
||||||
break;
|
|
||||||
case DIR_PURPOSE_FETCH_STATUS_VOTE:
|
|
||||||
case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES:
|
|
||||||
case DIR_PURPOSE_FETCH_CERTIFICATE:
|
|
||||||
type = V3_DIRINFO;
|
|
||||||
break;
|
|
||||||
case DIR_PURPOSE_FETCH_CONSENSUS:
|
|
||||||
type = V3_DIRINFO;
|
|
||||||
if (resource && !strcmp(resource,"microdesc"))
|
|
||||||
type |= MICRODESC_DIRINFO;
|
|
||||||
break;
|
|
||||||
case DIR_PURPOSE_FETCH_MICRODESC:
|
|
||||||
type = MICRODESC_DIRINFO;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
log_warn(LD_BUG, "Unexpected purpose %d", (int)dir_purpose);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) {
|
if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) {
|
||||||
int flav = FLAV_NS;
|
int flav = FLAV_NS;
|
||||||
|
|
|
@ -16,9 +16,10 @@ int directories_have_accepted_server_descriptor(void);
|
||||||
void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
|
void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
|
||||||
dirinfo_type_t type, const char *payload,
|
dirinfo_type_t type, const char *payload,
|
||||||
size_t payload_len, size_t extrainfo_len);
|
size_t payload_len, size_t extrainfo_len);
|
||||||
void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
|
MOCK_DECL(void, directory_get_from_dirserver, (uint8_t dir_purpose,
|
||||||
const char *resource,
|
uint8_t router_purpose,
|
||||||
int pds_flags);
|
const char *resource,
|
||||||
|
int pds_flags));
|
||||||
void directory_get_from_all_authorities(uint8_t dir_purpose,
|
void directory_get_from_all_authorities(uint8_t dir_purpose,
|
||||||
uint8_t router_purpose,
|
uint8_t router_purpose,
|
||||||
const char *resource);
|
const char *resource);
|
||||||
|
@ -120,7 +121,11 @@ int download_status_get_n_failures(const download_status_t *dls);
|
||||||
|
|
||||||
#ifdef TOR_UNIT_TESTS
|
#ifdef TOR_UNIT_TESTS
|
||||||
/* Used only by directory.c and test_dir.c */
|
/* Used only by directory.c and test_dir.c */
|
||||||
|
|
||||||
STATIC int parse_http_url(const char *headers, char **url);
|
STATIC int parse_http_url(const char *headers, char **url);
|
||||||
|
STATIC int purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose);
|
||||||
|
STATIC dirinfo_type_t dir_fetch_type(int dir_purpose, int router_purpose,
|
||||||
|
const char *resource);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue