mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-24 22:58:50 +01:00
Move dirclient-related functions out of dirserv, and reenable them
I had incorrectly identified these functions as dircache-only, when in fact they apply to everyone who acts a directory client.
This commit is contained in:
parent
a1bc471dd4
commit
773bcf5629
14 changed files with 119 additions and 100 deletions
|
@ -88,7 +88,7 @@
|
|||
#include "feature/control/control.h"
|
||||
#include "feature/control/control_auth.h"
|
||||
#include "feature/control/control_events.h"
|
||||
#include "feature/dircache/dirserv.h"
|
||||
#include "feature/dirclient/dirclient_modes.h"
|
||||
#include "feature/hibernate/hibernate.h"
|
||||
#include "feature/hs/hs_config.h"
|
||||
#include "feature/nodelist/dirlist.h"
|
||||
|
|
|
@ -92,6 +92,7 @@ LIBTOR_APP_A_SOURCES = \
|
|||
src/feature/control/fmt_serverstatus.c \
|
||||
src/feature/control/getinfo_geoip.c \
|
||||
src/feature/dirclient/dirclient.c \
|
||||
src/feature/dirclient/dirclient_modes.c \
|
||||
src/feature/dirclient/dlstatus.c \
|
||||
src/feature/dircommon/consdiff.c \
|
||||
src/feature/dircommon/directory.c \
|
||||
|
@ -391,6 +392,7 @@ noinst_HEADERS += \
|
|||
src/feature/dircache/dirserv.h \
|
||||
src/feature/dirclient/dir_server_st.h \
|
||||
src/feature/dirclient/dirclient.h \
|
||||
src/feature/dirclient/dirclient_modes.h \
|
||||
src/feature/dirclient/dlstatus.h \
|
||||
src/feature/dirclient/download_status_st.h \
|
||||
src/feature/dircommon/consdiff.h \
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
#include "feature/control/control_events.h"
|
||||
#include "feature/dirauth/authmode.h"
|
||||
#include "feature/dircache/consdiffmgr.h"
|
||||
#include "feature/dircache/dirserv.h"
|
||||
#include "feature/dirclient/dirclient_modes.h"
|
||||
#include "feature/dircommon/directory.h"
|
||||
#include "feature/hibernate/hibernate.h"
|
||||
#include "feature/hs/hs_cache.h"
|
||||
|
|
|
@ -30,27 +30,6 @@ connection_dirserv_flushed_some(dir_connection_t *conn)
|
|||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
directory_fetches_from_authorities(const or_options_t *options)
|
||||
{
|
||||
(void) options;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
directory_fetches_dir_info_early(const or_options_t *options)
|
||||
{
|
||||
(void) options;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
directory_fetches_dir_info_later(const or_options_t *options)
|
||||
{
|
||||
(void) options;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
directory_caches_unknown_auth_certs(const or_options_t *options)
|
||||
{
|
||||
|
@ -72,15 +51,6 @@ directory_permits_begindir_requests(const or_options_t *options)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
directory_too_idle_to_fetch_descriptors(const or_options_t *options,
|
||||
time_t now)
|
||||
{
|
||||
(void)options;
|
||||
(void)now;
|
||||
return 0;
|
||||
}
|
||||
|
||||
cached_dir_t *
|
||||
dirserv_get_consensus(const char *flavor_name)
|
||||
{
|
||||
|
|
|
@ -68,55 +68,7 @@ static cached_dir_t *lookup_cached_dir_by_fp(const uint8_t *fp);
|
|||
/********************************************************************/
|
||||
|
||||
/* A set of functions to answer questions about how we'd like to behave
|
||||
* as a directory mirror/client. */
|
||||
|
||||
/** Return 1 if we fetch our directory material directly from the
|
||||
* authorities, rather than from a mirror. */
|
||||
int
|
||||
directory_fetches_from_authorities(const or_options_t *options)
|
||||
{
|
||||
const routerinfo_t *me;
|
||||
uint32_t addr;
|
||||
int refuseunknown;
|
||||
if (options->FetchDirInfoEarly)
|
||||
return 1;
|
||||
if (options->BridgeRelay == 1)
|
||||
return 0;
|
||||
if (server_mode(options) &&
|
||||
router_pick_published_address(options, &addr, 1) < 0)
|
||||
return 1; /* we don't know our IP address; ask an authority. */
|
||||
refuseunknown = ! router_my_exit_policy_is_reject_star() &&
|
||||
should_refuse_unknown_exits(options);
|
||||
if (!dir_server_mode(options) && !refuseunknown)
|
||||
return 0;
|
||||
if (!server_mode(options) || !advertised_server_mode())
|
||||
return 0;
|
||||
me = router_get_my_routerinfo();
|
||||
if (!me || (!me->supports_tunnelled_dir_requests && !refuseunknown))
|
||||
return 0; /* if we don't service directory requests, return 0 too */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** Return 1 if we should fetch new networkstatuses, descriptors, etc
|
||||
* on the "mirror" schedule rather than the "client" schedule.
|
||||
*/
|
||||
int
|
||||
directory_fetches_dir_info_early(const or_options_t *options)
|
||||
{
|
||||
return directory_fetches_from_authorities(options);
|
||||
}
|
||||
|
||||
/** Return 1 if we should fetch new networkstatuses, descriptors, etc
|
||||
* on a very passive schedule -- waiting long enough for ordinary clients
|
||||
* to probably have the info we want. These would include bridge users,
|
||||
* and maybe others in the future e.g. if a Tor client uses another Tor
|
||||
* client as a directory guard.
|
||||
*/
|
||||
int
|
||||
directory_fetches_dir_info_later(const or_options_t *options)
|
||||
{
|
||||
return options->UseBridges != 0;
|
||||
}
|
||||
* as a directory mirror */
|
||||
|
||||
/** Return true iff we want to serve certificates for authorities
|
||||
* that we don't acknowledge as authorities ourself.
|
||||
|
@ -160,19 +112,6 @@ directory_permits_begindir_requests(const or_options_t *options)
|
|||
return options->BridgeRelay != 0 || dir_server_mode(options);
|
||||
}
|
||||
|
||||
/** Return 1 if we have no need to fetch new descriptors. This generally
|
||||
* happens when we're not a dir cache and we haven't built any circuits
|
||||
* lately.
|
||||
*/
|
||||
int
|
||||
directory_too_idle_to_fetch_descriptors(const or_options_t *options,
|
||||
time_t now)
|
||||
{
|
||||
return !directory_caches_dir_info(options) &&
|
||||
!options->FetchUselessDescriptors &&
|
||||
rep_hist_circbuilding_dormant(now);
|
||||
}
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
/** Map from flavor name to the cached_dir_t for the v3 consensuses that we're
|
||||
|
|
|
@ -80,14 +80,9 @@ int dir_split_resource_into_spoolable(const char *resource,
|
|||
int *compressed_out,
|
||||
int flags);
|
||||
|
||||
int directory_fetches_from_authorities(const or_options_t *options);
|
||||
int directory_fetches_dir_info_early(const or_options_t *options);
|
||||
int directory_fetches_dir_info_later(const or_options_t *options);
|
||||
int directory_caches_unknown_auth_certs(const or_options_t *options);
|
||||
int directory_caches_dir_info(const or_options_t *options);
|
||||
int directory_permits_begindir_requests(const or_options_t *options);
|
||||
int directory_too_idle_to_fetch_descriptors(const or_options_t *options,
|
||||
time_t now);
|
||||
|
||||
MOCK_DECL(cached_dir_t *, dirserv_get_consensus, (const char *flavor_name));
|
||||
void dirserv_set_cached_consensus_networkstatus(const char *consensus,
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "feature/dirauth/shared_random.h"
|
||||
#include "feature/dircache/dirserv.h"
|
||||
#include "feature/dirclient/dirclient.h"
|
||||
#include "feature/dirclient/dirclient_modes.h"
|
||||
#include "feature/dirclient/dlstatus.h"
|
||||
#include "feature/dircommon/consdiff.h"
|
||||
#include "feature/dircommon/directory.h"
|
||||
|
|
85
src/feature/dirclient/dirclient_modes.c
Normal file
85
src/feature/dirclient/dirclient_modes.c
Normal file
|
@ -0,0 +1,85 @@
|
|||
/* Copyright (c) 2001 Matej Pfajfar.
|
||||
* Copyright (c) 2001-2004, Roger Dingledine.
|
||||
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
||||
* Copyright (c) 2007-2020, The Tor Project, Inc. */
|
||||
/* See LICENSE for licensing information */
|
||||
|
||||
/**
|
||||
* @file dirclient_modes.c
|
||||
* @brief Functions to answer questions about how we'd like to behave
|
||||
* as a directory client
|
||||
**/
|
||||
|
||||
#include "orconfig.h"
|
||||
|
||||
#include "core/or/or.h"
|
||||
|
||||
#include "feature/dirclient/dirclient_modes.h"
|
||||
#include "feature/dircache/dirserv.h"
|
||||
#include "feature/relay/router.h"
|
||||
#include "feature/relay/routermode.h"
|
||||
#include "feature/stats/predict_ports.h"
|
||||
|
||||
#include "app/config/or_options_st.h"
|
||||
#include "feature/nodelist/routerinfo_st.h"
|
||||
|
||||
/** Return 1 if we fetch our directory material directly from the
|
||||
* authorities, rather than from a mirror. */
|
||||
int
|
||||
directory_fetches_from_authorities(const or_options_t *options)
|
||||
{
|
||||
const routerinfo_t *me;
|
||||
uint32_t addr;
|
||||
int refuseunknown;
|
||||
if (options->FetchDirInfoEarly)
|
||||
return 1;
|
||||
if (options->BridgeRelay == 1)
|
||||
return 0;
|
||||
if (server_mode(options) &&
|
||||
router_pick_published_address(options, &addr, 1) < 0)
|
||||
return 1; /* we don't know our IP address; ask an authority. */
|
||||
refuseunknown = ! router_my_exit_policy_is_reject_star() &&
|
||||
should_refuse_unknown_exits(options);
|
||||
if (!dir_server_mode(options) && !refuseunknown)
|
||||
return 0;
|
||||
if (!server_mode(options) || !advertised_server_mode())
|
||||
return 0;
|
||||
me = router_get_my_routerinfo();
|
||||
if (!me || (!me->supports_tunnelled_dir_requests && !refuseunknown))
|
||||
return 0; /* if we don't service directory requests, return 0 too */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** Return 1 if we should fetch new networkstatuses, descriptors, etc
|
||||
* on the "mirror" schedule rather than the "client" schedule.
|
||||
*/
|
||||
int
|
||||
directory_fetches_dir_info_early(const or_options_t *options)
|
||||
{
|
||||
return directory_fetches_from_authorities(options);
|
||||
}
|
||||
|
||||
/** Return 1 if we should fetch new networkstatuses, descriptors, etc
|
||||
* on a very passive schedule -- waiting long enough for ordinary clients
|
||||
* to probably have the info we want. These would include bridge users,
|
||||
* and maybe others in the future e.g. if a Tor client uses another Tor
|
||||
* client as a directory guard.
|
||||
*/
|
||||
int
|
||||
directory_fetches_dir_info_later(const or_options_t *options)
|
||||
{
|
||||
return options->UseBridges != 0;
|
||||
}
|
||||
|
||||
/** Return 1 if we have no need to fetch new descriptors. This generally
|
||||
* happens when we're not a dir cache and we haven't built any circuits
|
||||
* lately.
|
||||
*/
|
||||
int
|
||||
directory_too_idle_to_fetch_descriptors(const or_options_t *options,
|
||||
time_t now)
|
||||
{
|
||||
return !directory_caches_dir_info(options) &&
|
||||
!options->FetchUselessDescriptors &&
|
||||
rep_hist_circbuilding_dormant(now);
|
||||
}
|
23
src/feature/dirclient/dirclient_modes.h
Normal file
23
src/feature/dirclient/dirclient_modes.h
Normal file
|
@ -0,0 +1,23 @@
|
|||
/* Copyright (c) 2001 Matej Pfajfar.
|
||||
* Copyright (c) 2001-2004, Roger Dingledine.
|
||||
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
||||
* Copyright (c) 2007-2020, The Tor Project, Inc. */
|
||||
/* See LICENSE for licensing information */
|
||||
|
||||
/**
|
||||
* @file dirclient_modes.h
|
||||
* @brief Header for feature/dirclient/dirclient_modes.c
|
||||
**/
|
||||
|
||||
#ifndef TOR_FEATURE_DIRCLIENT_DIRCLIENT_MODES_H
|
||||
#define TOR_FEATURE_DIRCLIENT_DIRCLIENT_MODES_H
|
||||
|
||||
struct or_options_t;
|
||||
|
||||
int directory_fetches_from_authorities(const struct or_options_t *options);
|
||||
int directory_fetches_dir_info_early(const struct or_options_t *options);
|
||||
int directory_fetches_dir_info_later(const struct or_options_t *options);
|
||||
int directory_too_idle_to_fetch_descriptors(const struct or_options_t *options,
|
||||
time_t now);
|
||||
|
||||
#endif /* !defined(TOR_FEATURE_DIRCLIENT_DIRCLIENT_MODES_H) */
|
|
@ -18,6 +18,7 @@
|
|||
#include "feature/client/entrynodes.h"
|
||||
#include "feature/dircache/dirserv.h"
|
||||
#include "feature/dirclient/dlstatus.h"
|
||||
#include "feature/dirclient/dirclient_modes.h"
|
||||
#include "feature/dircommon/directory.h"
|
||||
#include "feature/dirparse/microdesc_parse.h"
|
||||
#include "feature/nodelist/dirlist.h"
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
#include "feature/dircache/consdiffmgr.h"
|
||||
#include "feature/dircache/dirserv.h"
|
||||
#include "feature/dirclient/dirclient.h"
|
||||
#include "feature/dirclient/dirclient_modes.h"
|
||||
#include "feature/dirclient/dlstatus.h"
|
||||
#include "feature/dircommon/directory.h"
|
||||
#include "feature/dircommon/voting_schedule.h"
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
#include "feature/client/entrynodes.h"
|
||||
#include "feature/control/control_events.h"
|
||||
#include "feature/dirauth/process_descs.h"
|
||||
#include "feature/dircache/dirserv.h"
|
||||
#include "feature/dirclient/dirclient_modes.h"
|
||||
#include "feature/hs/hs_client.h"
|
||||
#include "feature/hs/hs_common.h"
|
||||
#include "feature/nodelist/describe.h"
|
||||
|
|
|
@ -73,6 +73,7 @@
|
|||
#include "feature/dirauth/reachability.h"
|
||||
#include "feature/dircache/dirserv.h"
|
||||
#include "feature/dirclient/dirclient.h"
|
||||
#include "feature/dirclient/dirclient_modes.h"
|
||||
#include "feature/dirclient/dlstatus.h"
|
||||
#include "feature/dircommon/directory.h"
|
||||
#include "feature/nodelist/authcert.h"
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "feature/control/control.h"
|
||||
#include "core/mainloop/cpuworker.h"
|
||||
#include "feature/dircache/dirserv.h"
|
||||
#include "feature/dirclient/dirclient_modes.h"
|
||||
#include "feature/dirauth/dirvote.h"
|
||||
#include "feature/relay/dns.h"
|
||||
#include "feature/client/entrynodes.h"
|
||||
|
|
Loading…
Add table
Reference in a new issue