mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Merge branch 'ticket32487_squashed' into ticket32487_squashed_and_merged
Resolved conflicts in src/core/include.am
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
o Minor features (disabling relay support):
|
||||
- When Tor is compiled --disable-module-relay, we also omit the
|
||||
code used to act as a directory cache. Closes ticket 32487.
|
||||
+9
-1
@@ -278,7 +278,7 @@ dnl Tor modules options. These options are namespaced with --disable-module-XXX
|
||||
dnl ---
|
||||
|
||||
dnl All our modules.
|
||||
m4_define(MODULES, relay dirauth)
|
||||
m4_define(MODULES, relay dirauth dircache)
|
||||
|
||||
dnl Relay module.
|
||||
AC_ARG_ENABLE([module-relay],
|
||||
@@ -289,6 +289,14 @@ AM_COND_IF(BUILD_MODULE_RELAY,
|
||||
AC_DEFINE([HAVE_MODULE_RELAY], [1],
|
||||
[Compile with Relay feature support]))
|
||||
|
||||
dnl Dircache module. (This cannot be enabled or disabled independently of
|
||||
dnl the relay module. It is not listed by --list-modules for this reason.)
|
||||
AM_CONDITIONAL(BUILD_MODULE_DIRCACHE,
|
||||
[test "x$enable_module_relay" != "xno"])
|
||||
AM_COND_IF(BUILD_MODULE_DIRCACHE,
|
||||
AC_DEFINE([HAVE_MODULE_DIRCACHE], [1],
|
||||
[Compile with directory cache support]))
|
||||
|
||||
dnl Directory Authority module.
|
||||
AC_ARG_ENABLE([module-dirauth],
|
||||
AS_HELP_STRING([--disable-module-dirauth],
|
||||
|
||||
@@ -11,12 +11,18 @@ selectively enable or disable, at `configure` time.
|
||||
Currently, tor has these modules:
|
||||
|
||||
- Relay subsystem (relay)
|
||||
- Directory cache system (dircache).
|
||||
- Directory Authority subsystem (dirauth)
|
||||
|
||||
dirauth is located in its own directory in `src/feature/dirauth/`.
|
||||
The dirauth code is located in its own directory in `src/feature/dirauth/`.
|
||||
|
||||
Relay is located in directories named `src/*/*relay` and `src/*/*dircache`,
|
||||
which are being progressively refactored and disabled.
|
||||
The relay code is located in a directory named `src/*/*relay`, which is
|
||||
being progressively refactored and disabled.
|
||||
|
||||
The dircache code is located in `src/*/*dircache`. Right now, it is
|
||||
disabled if and only if the relay module is disabled. (We are treating
|
||||
them as separate modules because they are logically independent, not
|
||||
because you would actually want to run one without the other.)
|
||||
|
||||
To disable a module, pass `--disable-module-{dirauth,relay}` at configure
|
||||
time. All modules are currently enabled by default.
|
||||
|
||||
@@ -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"
|
||||
@@ -2424,10 +2424,10 @@ options_act,(const or_options_t *old_options))
|
||||
|
||||
/* We may need to reschedule some directory stuff if our status changed. */
|
||||
if (old_options) {
|
||||
if (!bool_eq(directory_fetches_dir_info_early(options),
|
||||
directory_fetches_dir_info_early(old_options)) ||
|
||||
!bool_eq(directory_fetches_dir_info_later(options),
|
||||
directory_fetches_dir_info_later(old_options)) ||
|
||||
if (!bool_eq(dirclient_fetches_dir_info_early(options),
|
||||
dirclient_fetches_dir_info_early(old_options)) ||
|
||||
!bool_eq(dirclient_fetches_dir_info_later(options),
|
||||
dirclient_fetches_dir_info_later(old_options)) ||
|
||||
!config_lines_eq(old_options->Bridges, options->Bridges)) {
|
||||
/* Make sure update_router_have_minimum_dir_info() gets called. */
|
||||
router_dir_info_changed();
|
||||
@@ -2738,6 +2738,9 @@ list_enabled_modules(void)
|
||||
{
|
||||
printf("%s: %s\n", "relay", have_module_relay() ? "yes" : "no");
|
||||
printf("%s: %s\n", "dirauth", have_module_dirauth() ? "yes" : "no");
|
||||
// We don't list dircache, because it cannot be enabled or disabled
|
||||
// independently from relay. Listing it here would proliferate
|
||||
// test variants in test_parseconf.sh to no useful purpose.
|
||||
}
|
||||
|
||||
/** Last value actually set by resolve_my_address. */
|
||||
|
||||
+1
-1
@@ -7,7 +7,6 @@
|
||||
#
|
||||
LIBTOR_APP_TESTING_A_SOURCES = $(LIBTOR_APP_A_SOURCES)
|
||||
|
||||
|
||||
src_core_libtor_app_a_SOURCES = \
|
||||
$(LIBTOR_APP_A_SOURCES) \
|
||||
$(LIBTOR_APP_A_STUB_SOURCES)
|
||||
@@ -16,6 +15,7 @@ if UNITTESTS_ENABLED
|
||||
|
||||
# Add the sources of the modules that are needed for tests to work here.
|
||||
LIBTOR_APP_TESTING_A_SOURCES += $(MODULE_RELAY_SOURCES)
|
||||
LIBTOR_APP_TESTING_A_SOURCES += $(MODULE_DIRCACHE_SOURCES)
|
||||
LIBTOR_APP_TESTING_A_SOURCES += $(MODULE_DIRAUTH_SOURCES)
|
||||
|
||||
src_core_libtor_app_testing_a_SOURCES = $(LIBTOR_APP_TESTING_A_SOURCES)
|
||||
|
||||
@@ -719,11 +719,7 @@ connection_free_minimal(connection_t *conn)
|
||||
tor_free(dir_conn->requested_resource);
|
||||
|
||||
tor_compress_free(dir_conn->compress_state);
|
||||
if (dir_conn->spool) {
|
||||
SMARTLIST_FOREACH(dir_conn->spool, spooled_resource_t *, spooled,
|
||||
spooled_resource_free(spooled));
|
||||
smartlist_free(dir_conn->spool);
|
||||
}
|
||||
dir_conn_clear_spool(dir_conn);
|
||||
|
||||
rend_data_free(dir_conn->rend_data);
|
||||
hs_ident_dir_conn_free(dir_conn->hs_ident);
|
||||
|
||||
@@ -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"
|
||||
@@ -1133,14 +1133,14 @@ directory_info_has_arrived(time_t now, int from_cache, int suppress_logs)
|
||||
|
||||
if (!router_have_minimum_dir_info()) {
|
||||
int quiet = suppress_logs || from_cache ||
|
||||
directory_too_idle_to_fetch_descriptors(options, now);
|
||||
dirclient_too_idle_to_fetch_descriptors(options, now);
|
||||
tor_log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR,
|
||||
"I learned some more directory information, but not enough to "
|
||||
"build a circuit: %s", get_dir_info_status_string());
|
||||
update_all_descriptor_downloads(now);
|
||||
return;
|
||||
} else {
|
||||
if (directory_fetches_from_authorities(options)) {
|
||||
if (dirclient_fetches_from_authorities(options)) {
|
||||
update_all_descriptor_downloads(now);
|
||||
}
|
||||
|
||||
@@ -2069,7 +2069,7 @@ fetch_networkstatus_callback(time_t now, const or_options_t *options)
|
||||
* documents? */
|
||||
const int we_are_bootstrapping = networkstatus_consensus_is_bootstrapping(
|
||||
now);
|
||||
const int prefer_mirrors = !directory_fetches_from_authorities(
|
||||
const int prefer_mirrors = !dirclient_fetches_from_authorities(
|
||||
get_options());
|
||||
int networkstatus_dl_check_interval = 60;
|
||||
/* check more often when testing, or when bootstrapping from mirrors
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "feature/dircache/dirserv.h"
|
||||
#include "feature/dirclient/dirclient.h"
|
||||
#include "feature/dirclient/dlstatus.h"
|
||||
#include "feature/dircommon/directory.h"
|
||||
#include "feature/hibernate/hibernate.h"
|
||||
#include "feature/hs/hs_cache.h"
|
||||
#include "feature/hs_common/shared_random_client.h"
|
||||
@@ -361,6 +362,86 @@ getinfo_helper_current_consensus(consensus_flavor_t flavor,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Helper for getinfo_helper_dir.
|
||||
*
|
||||
* Add a signed_descriptor_t to <b>descs_out</b> for each router matching
|
||||
* <b>key</b>. The key should be either
|
||||
* - "/tor/server/authority" for our own routerinfo;
|
||||
* - "/tor/server/all" for all the routerinfos we have, concatenated;
|
||||
* - "/tor/server/fp/FP" where FP is a plus-separated sequence of
|
||||
* hex identity digests; or
|
||||
* - "/tor/server/d/D" where D is a plus-separated sequence
|
||||
* of server descriptor digests, in hex.
|
||||
*
|
||||
* Return 0 if we found some matching descriptors, or -1 if we do not
|
||||
* have any descriptors, no matching descriptors, or if we did not
|
||||
* recognize the key (URL).
|
||||
* If -1 is returned *<b>msg</b> will be set to an appropriate error
|
||||
* message.
|
||||
*/
|
||||
static int
|
||||
controller_get_routerdescs(smartlist_t *descs_out, const char *key,
|
||||
const char **msg)
|
||||
{
|
||||
*msg = NULL;
|
||||
|
||||
if (!strcmp(key, "/tor/server/all")) {
|
||||
routerlist_t *rl = router_get_routerlist();
|
||||
SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r,
|
||||
smartlist_add(descs_out, &(r->cache_info)));
|
||||
} else if (!strcmp(key, "/tor/server/authority")) {
|
||||
const routerinfo_t *ri = router_get_my_routerinfo();
|
||||
if (ri)
|
||||
smartlist_add(descs_out, (void*) &(ri->cache_info));
|
||||
} else if (!strcmpstart(key, "/tor/server/d/")) {
|
||||
smartlist_t *digests = smartlist_new();
|
||||
key += strlen("/tor/server/d/");
|
||||
dir_split_resource_into_fingerprints(key, digests, NULL,
|
||||
DSR_HEX|DSR_SORT_UNIQ);
|
||||
SMARTLIST_FOREACH(digests, const char *, d,
|
||||
{
|
||||
signed_descriptor_t *sd = router_get_by_descriptor_digest(d);
|
||||
if (sd)
|
||||
smartlist_add(descs_out,sd);
|
||||
});
|
||||
SMARTLIST_FOREACH(digests, char *, d, tor_free(d));
|
||||
smartlist_free(digests);
|
||||
} else if (!strcmpstart(key, "/tor/server/fp/")) {
|
||||
smartlist_t *digests = smartlist_new();
|
||||
time_t cutoff = time(NULL) - ROUTER_MAX_AGE_TO_PUBLISH;
|
||||
key += strlen("/tor/server/fp/");
|
||||
dir_split_resource_into_fingerprints(key, digests, NULL,
|
||||
DSR_HEX|DSR_SORT_UNIQ);
|
||||
SMARTLIST_FOREACH_BEGIN(digests, const char *, d) {
|
||||
if (router_digest_is_me(d)) {
|
||||
/* calling router_get_my_routerinfo() to make sure it exists */
|
||||
const routerinfo_t *ri = router_get_my_routerinfo();
|
||||
if (ri)
|
||||
smartlist_add(descs_out, (void*) &(ri->cache_info));
|
||||
} else {
|
||||
const routerinfo_t *ri = router_get_by_id_digest(d);
|
||||
/* Don't actually serve a descriptor that everyone will think is
|
||||
* expired. This is an (ugly) workaround to keep buggy 0.1.1.10
|
||||
* Tors from downloading descriptors that they will throw away.
|
||||
*/
|
||||
if (ri && ri->cache_info.published_on > cutoff)
|
||||
smartlist_add(descs_out, (void*) &(ri->cache_info));
|
||||
}
|
||||
} SMARTLIST_FOREACH_END(d);
|
||||
SMARTLIST_FOREACH(digests, char *, d, tor_free(d));
|
||||
smartlist_free(digests);
|
||||
} else {
|
||||
*msg = "Key not recognized";
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!smartlist_len(descs_out)) {
|
||||
*msg = "Servers unavailable";
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Implementation helper for GETINFO: knows the answers for questions about
|
||||
* directory information. */
|
||||
STATIC int
|
||||
@@ -590,7 +671,7 @@ getinfo_helper_dir(control_connection_t *control_conn,
|
||||
int res;
|
||||
char *cp;
|
||||
tor_asprintf(&url, "/tor/%s", question+4);
|
||||
res = dirserv_get_routerdescs(descs, url, &msg);
|
||||
res = controller_get_routerdescs(descs, url, &msg);
|
||||
if (res) {
|
||||
log_warn(LD_CONTROL, "getinfo '%s': %s", question, msg);
|
||||
smartlist_free(descs);
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
/* 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 dircache_stub.c
|
||||
* @brief Stub declarations for use when dircache module is disabled.
|
||||
**/
|
||||
|
||||
#include "core/or/or.h"
|
||||
#include "feature/dircache/consdiffmgr.h"
|
||||
#include "feature/dircache/dircache.h"
|
||||
#include "feature/dircache/dirserv.h"
|
||||
#include "feature/dircommon/dir_connection_st.h"
|
||||
|
||||
int
|
||||
directory_handle_command(dir_connection_t *conn)
|
||||
{
|
||||
(void) conn;
|
||||
tor_assert_nonfatal_unreached_once();
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
connection_dirserv_flushed_some(dir_connection_t *conn)
|
||||
{
|
||||
(void) conn;
|
||||
tor_assert_nonfatal_unreached_once();
|
||||
return -1;
|
||||
}
|
||||
|
||||
void
|
||||
dir_conn_clear_spool(dir_connection_t *conn)
|
||||
{
|
||||
if (!conn)
|
||||
return;
|
||||
tor_assert_nonfatal_once(conn->spool == NULL);
|
||||
}
|
||||
|
||||
void
|
||||
consdiffmgr_enable_background_compression(void)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
consdiffmgr_add_consensus(const char *consensus,
|
||||
size_t consensus_len,
|
||||
const networkstatus_t *as_parsed)
|
||||
{
|
||||
(void)consensus;
|
||||
(void)consensus_len;
|
||||
(void)as_parsed;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
consdiffmgr_register_with_sandbox(struct sandbox_cfg_elem_t **cfg)
|
||||
{
|
||||
(void)cfg;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
consdiffmgr_cleanup(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
consdiffmgr_free_all(void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
dirserv_free_all(void)
|
||||
{
|
||||
}
|
||||
+32
-143
@@ -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
|
||||
@@ -266,6 +205,37 @@ dirserv_get_consensus,(const char *flavor_name))
|
||||
return strmap_get(cached_consensuses, flavor_name);
|
||||
}
|
||||
|
||||
/** As dir_split_resource_into_fingerprints, but instead fills
|
||||
* <b>spool_out</b> with a list of spoolable_resource_t for the resource
|
||||
* identified through <b>source</b>. */
|
||||
int
|
||||
dir_split_resource_into_spoolable(const char *resource,
|
||||
dir_spool_source_t source,
|
||||
smartlist_t *spool_out,
|
||||
int *compressed_out,
|
||||
int flags)
|
||||
{
|
||||
smartlist_t *fingerprints = smartlist_new();
|
||||
|
||||
tor_assert(flags & (DSR_HEX|DSR_BASE64));
|
||||
const size_t digest_len =
|
||||
(flags & DSR_DIGEST256) ? DIGEST256_LEN : DIGEST_LEN;
|
||||
|
||||
int r = dir_split_resource_into_fingerprints(resource, fingerprints,
|
||||
compressed_out, flags);
|
||||
/* This is not a very efficient implementation XXXX */
|
||||
SMARTLIST_FOREACH_BEGIN(fingerprints, uint8_t *, digest) {
|
||||
spooled_resource_t *spooled =
|
||||
spooled_resource_new(source, digest, digest_len);
|
||||
if (spooled)
|
||||
smartlist_add(spool_out, spooled);
|
||||
tor_free(digest);
|
||||
} SMARTLIST_FOREACH_END(digest);
|
||||
|
||||
smartlist_free(fingerprints);
|
||||
return r;
|
||||
}
|
||||
|
||||
/** As dirserv_get_routerdescs(), but instead of getting signed_descriptor_t
|
||||
* pointers, adds copies of digests to fps_out, and doesn't use the
|
||||
* /tor/server/ prefix. For a /d/ request, adds descriptor digests; for other
|
||||
@@ -332,87 +302,6 @@ dirserv_get_routerdesc_spool(smartlist_t *spool_out,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Add a signed_descriptor_t to <b>descs_out</b> for each router matching
|
||||
* <b>key</b>. The key should be either
|
||||
* - "/tor/server/authority" for our own routerinfo;
|
||||
* - "/tor/server/all" for all the routerinfos we have, concatenated;
|
||||
* - "/tor/server/fp/FP" where FP is a plus-separated sequence of
|
||||
* hex identity digests; or
|
||||
* - "/tor/server/d/D" where D is a plus-separated sequence
|
||||
* of server descriptor digests, in hex.
|
||||
*
|
||||
* Return 0 if we found some matching descriptors, or -1 if we do not
|
||||
* have any descriptors, no matching descriptors, or if we did not
|
||||
* recognize the key (URL).
|
||||
* If -1 is returned *<b>msg</b> will be set to an appropriate error
|
||||
* message.
|
||||
*
|
||||
* XXXX rename this function. It's only called from the controller.
|
||||
* XXXX in fact, refactor this function, merging as much as possible.
|
||||
*/
|
||||
int
|
||||
dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
|
||||
const char **msg)
|
||||
{
|
||||
*msg = NULL;
|
||||
|
||||
if (!strcmp(key, "/tor/server/all")) {
|
||||
routerlist_t *rl = router_get_routerlist();
|
||||
SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r,
|
||||
smartlist_add(descs_out, &(r->cache_info)));
|
||||
} else if (!strcmp(key, "/tor/server/authority")) {
|
||||
const routerinfo_t *ri = router_get_my_routerinfo();
|
||||
if (ri)
|
||||
smartlist_add(descs_out, (void*) &(ri->cache_info));
|
||||
} else if (!strcmpstart(key, "/tor/server/d/")) {
|
||||
smartlist_t *digests = smartlist_new();
|
||||
key += strlen("/tor/server/d/");
|
||||
dir_split_resource_into_fingerprints(key, digests, NULL,
|
||||
DSR_HEX|DSR_SORT_UNIQ);
|
||||
SMARTLIST_FOREACH(digests, const char *, d,
|
||||
{
|
||||
signed_descriptor_t *sd = router_get_by_descriptor_digest(d);
|
||||
if (sd)
|
||||
smartlist_add(descs_out,sd);
|
||||
});
|
||||
SMARTLIST_FOREACH(digests, char *, d, tor_free(d));
|
||||
smartlist_free(digests);
|
||||
} else if (!strcmpstart(key, "/tor/server/fp/")) {
|
||||
smartlist_t *digests = smartlist_new();
|
||||
time_t cutoff = time(NULL) - ROUTER_MAX_AGE_TO_PUBLISH;
|
||||
key += strlen("/tor/server/fp/");
|
||||
dir_split_resource_into_fingerprints(key, digests, NULL,
|
||||
DSR_HEX|DSR_SORT_UNIQ);
|
||||
SMARTLIST_FOREACH_BEGIN(digests, const char *, d) {
|
||||
if (router_digest_is_me(d)) {
|
||||
/* calling router_get_my_routerinfo() to make sure it exists */
|
||||
const routerinfo_t *ri = router_get_my_routerinfo();
|
||||
if (ri)
|
||||
smartlist_add(descs_out, (void*) &(ri->cache_info));
|
||||
} else {
|
||||
const routerinfo_t *ri = router_get_by_id_digest(d);
|
||||
/* Don't actually serve a descriptor that everyone will think is
|
||||
* expired. This is an (ugly) workaround to keep buggy 0.1.1.10
|
||||
* Tors from downloading descriptors that they will throw away.
|
||||
*/
|
||||
if (ri && ri->cache_info.published_on > cutoff)
|
||||
smartlist_add(descs_out, (void*) &(ri->cache_info));
|
||||
}
|
||||
} SMARTLIST_FOREACH_END(d);
|
||||
SMARTLIST_FOREACH(digests, char *, d, tor_free(d));
|
||||
smartlist_free(digests);
|
||||
} else {
|
||||
*msg = "Key not recognized";
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!smartlist_len(descs_out)) {
|
||||
*msg = "Servers unavailable";
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ==========
|
||||
* Spooling code.
|
||||
* ========== */
|
||||
|
||||
@@ -73,15 +73,19 @@ typedef struct spooled_resource_t {
|
||||
|
||||
int connection_dirserv_flushed_some(dir_connection_t *conn);
|
||||
|
||||
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);
|
||||
enum dir_spool_source_t;
|
||||
int dir_split_resource_into_spoolable(const char *resource,
|
||||
enum dir_spool_source_t source,
|
||||
smartlist_t *spool_out,
|
||||
int *compressed_out,
|
||||
int flags);
|
||||
|
||||
#ifdef HAVE_MODULE_DIRCACHE
|
||||
/** Is the dircache module enabled? */
|
||||
#define have_module_dircache() (1)
|
||||
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,
|
||||
size_t consensus_len,
|
||||
@@ -89,13 +93,32 @@ void dirserv_set_cached_consensus_networkstatus(const char *consensus,
|
||||
const common_digests_t *digests,
|
||||
const uint8_t *sha3_as_signed,
|
||||
time_t published);
|
||||
#else
|
||||
#define have_module_dircache() (0)
|
||||
#define directory_caches_unknown_auth_certs(opt) \
|
||||
((void)(opt), 0)
|
||||
#define directory_caches_dir_info(opt) \
|
||||
((void)(opt), 0)
|
||||
#define directory_permits_begindir_requests(opt) \
|
||||
((void)(opt), 0)
|
||||
#define dirserv_get_consensus(flav) \
|
||||
((void)(flav), NULL)
|
||||
#define dirserv_set_cached_consensus_networkstatus(a,b,c,d,e,f) \
|
||||
STMT_BEGIN { \
|
||||
(void)(a); \
|
||||
(void)(b); \
|
||||
(void)(c); \
|
||||
(void)(d); \
|
||||
(void)(e); \
|
||||
(void)(f); \
|
||||
} STMT_END
|
||||
#endif
|
||||
|
||||
void dirserv_clear_old_networkstatuses(time_t cutoff);
|
||||
int dirserv_get_routerdesc_spool(smartlist_t *spools_out, const char *key,
|
||||
dir_spool_source_t source,
|
||||
int conn_is_encrypted,
|
||||
const char **msg_out);
|
||||
int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
|
||||
const char **msg);
|
||||
|
||||
void dirserv_free_all(void);
|
||||
void cached_dir_decref(cached_dir_t *d);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
# ADD_C_FILE: INSERT SOURCES HERE.
|
||||
LIBTOR_APP_A_SOURCES += \
|
||||
MODULE_DIRCACHE_SOURCES = \
|
||||
src/feature/dircache/conscache.c \
|
||||
src/feature/dircache/consdiffmgr.c \
|
||||
src/feature/dircache/dircache.c \
|
||||
@@ -13,3 +13,9 @@ noinst_HEADERS += \
|
||||
src/feature/dircache/consdiffmgr.h \
|
||||
src/feature/dircache/dircache.h \
|
||||
src/feature/dircache/dirserv.h
|
||||
|
||||
if BUILD_MODULE_DIRCACHE
|
||||
LIBTOR_APP_A_SOURCES += $(MODULE_DIRCACHE_SOURCES)
|
||||
else
|
||||
LIBTOR_APP_A_STUB_SOURCES += src/feature/dircache/dircache_stub.c
|
||||
endif
|
||||
|
||||
@@ -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"
|
||||
@@ -453,7 +454,7 @@ directory_get_from_dirserver,(
|
||||
{
|
||||
const routerstatus_t *rs = NULL;
|
||||
const or_options_t *options = get_options();
|
||||
int prefer_authority = (directory_fetches_from_authorities(options)
|
||||
int prefer_authority = (dirclient_fetches_from_authorities(options)
|
||||
|| want_authority == DL_WANT_AUTHORITY);
|
||||
int require_authority = 0;
|
||||
int get_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose,
|
||||
@@ -672,7 +673,7 @@ directory_choose_address_routerstatus(const routerstatus_t *status,
|
||||
if (indirection == DIRIND_DIRECT_CONN ||
|
||||
indirection == DIRIND_ANON_DIRPORT ||
|
||||
(indirection == DIRIND_ONEHOP
|
||||
&& !directory_must_use_begindir(options))) {
|
||||
&& !dirclient_must_use_begindir(options))) {
|
||||
fascist_firewall_choose_address_rs(status, FIREWALL_DIR_CONNECTION, 0,
|
||||
use_dir_ap);
|
||||
have_dir = tor_addr_port_is_valid_ap(use_dir_ap, 0);
|
||||
@@ -871,16 +872,6 @@ connection_dir_download_cert_failed(dir_connection_t *conn, int status)
|
||||
update_certificate_downloads(time(NULL));
|
||||
}
|
||||
|
||||
/* Should this tor instance only use begindir for all its directory requests?
|
||||
*/
|
||||
int
|
||||
directory_must_use_begindir(const or_options_t *options)
|
||||
{
|
||||
/* Clients, onion services, and bridges must use begindir,
|
||||
* relays and authorities do not have to */
|
||||
return !public_server_mode(options);
|
||||
}
|
||||
|
||||
/** Evaluate the situation and decide if we should use an encrypted
|
||||
* "begindir-style" connection for this directory request.
|
||||
* 0) If there is no DirPort, yes.
|
||||
@@ -932,7 +923,7 @@ directory_command_should_use_begindir(const or_options_t *options,
|
||||
}
|
||||
/* Reasons why we want to avoid using begindir */
|
||||
if (indirection == DIRIND_ONEHOP) {
|
||||
if (!directory_must_use_begindir(options)) {
|
||||
if (!dirclient_must_use_begindir(options)) {
|
||||
*reason = "in relay mode";
|
||||
return 0;
|
||||
}
|
||||
@@ -1294,7 +1285,7 @@ directory_initiate_request,(directory_request_t *request))
|
||||
|
||||
/* use encrypted begindir connections for everything except relays
|
||||
* this provides better protection for directory fetches */
|
||||
if (!use_begindir && directory_must_use_begindir(options)) {
|
||||
if (!use_begindir && dirclient_must_use_begindir(options)) {
|
||||
log_warn(LD_BUG, "Client could not use begindir connection: %s",
|
||||
begindir_reason ? begindir_reason : "(NULL)");
|
||||
return;
|
||||
@@ -3093,7 +3084,7 @@ dir_routerdesc_download_failed(smartlist_t *failed, int status_code,
|
||||
{
|
||||
char digest[DIGEST_LEN];
|
||||
time_t now = time(NULL);
|
||||
int server = directory_fetches_from_authorities(get_options());
|
||||
int server = dirclient_fetches_from_authorities(get_options());
|
||||
if (!was_descriptor_digests) {
|
||||
if (router_purpose == ROUTER_PURPOSE_BRIDGE) {
|
||||
tor_assert(!was_extrainfo);
|
||||
@@ -3138,7 +3129,7 @@ dir_microdesc_download_failed(smartlist_t *failed,
|
||||
routerstatus_t *rs;
|
||||
download_status_t *dls;
|
||||
time_t now = time(NULL);
|
||||
int server = directory_fetches_from_authorities(get_options());
|
||||
int server = dirclient_fetches_from_authorities(get_options());
|
||||
|
||||
if (! consensus)
|
||||
return;
|
||||
|
||||
@@ -41,8 +41,6 @@ typedef enum {
|
||||
DIRIND_ANON_DIRPORT,
|
||||
} dir_indirection_t;
|
||||
|
||||
int directory_must_use_begindir(const or_options_t *options);
|
||||
|
||||
/**
|
||||
* A directory_request_t describes the information about a directory request
|
||||
* at the client side. It describes what we're going to ask for, which
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
/* 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"
|
||||
|
||||
/* Should this tor instance only use begindir for all its directory requests?
|
||||
*/
|
||||
int
|
||||
dirclient_must_use_begindir(const or_options_t *options)
|
||||
{
|
||||
/* Clients, onion services, and bridges must use begindir,
|
||||
* relays and authorities do not have to */
|
||||
return !public_server_mode(options);
|
||||
}
|
||||
|
||||
/** Return 1 if we fetch our directory material directly from the
|
||||
* authorities, rather than from a mirror. */
|
||||
int
|
||||
dirclient_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
|
||||
dirclient_fetches_dir_info_early(const or_options_t *options)
|
||||
{
|
||||
return dirclient_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
|
||||
dirclient_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
|
||||
dirclient_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);
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/* 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 dirclient_must_use_begindir(const or_options_t *options);
|
||||
int dirclient_fetches_from_authorities(const struct or_options_t *options);
|
||||
int dirclient_fetches_dir_info_early(const struct or_options_t *options);
|
||||
int dirclient_fetches_dir_info_later(const struct or_options_t *options);
|
||||
int dirclient_too_idle_to_fetch_descriptors(const struct or_options_t *options,
|
||||
time_t now);
|
||||
|
||||
#endif /* !defined(TOR_FEATURE_DIRCLIENT_DIRCLIENT_MODES_H) */
|
||||
@@ -2,11 +2,13 @@
|
||||
# ADD_C_FILE: INSERT SOURCES HERE.
|
||||
LIBTOR_APP_A_SOURCES += \
|
||||
src/feature/dirclient/dirclient.c \
|
||||
src/feature/dirclient/dirclient_modes.c \
|
||||
src/feature/dirclient/dlstatus.c
|
||||
|
||||
# ADD_C_FILE: INSERT HEADERS HERE.
|
||||
noinst_HEADERS += \
|
||||
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
|
||||
|
||||
@@ -702,34 +702,3 @@ dir_split_resource_into_fingerprints(const char *resource,
|
||||
smartlist_free(fp_tmp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** As dir_split_resource_into_fingerprints, but instead fills
|
||||
* <b>spool_out</b> with a list of spoolable_resource_t for the resource
|
||||
* identified through <b>source</b>. */
|
||||
int
|
||||
dir_split_resource_into_spoolable(const char *resource,
|
||||
dir_spool_source_t source,
|
||||
smartlist_t *spool_out,
|
||||
int *compressed_out,
|
||||
int flags)
|
||||
{
|
||||
smartlist_t *fingerprints = smartlist_new();
|
||||
|
||||
tor_assert(flags & (DSR_HEX|DSR_BASE64));
|
||||
const size_t digest_len =
|
||||
(flags & DSR_DIGEST256) ? DIGEST256_LEN : DIGEST_LEN;
|
||||
|
||||
int r = dir_split_resource_into_fingerprints(resource, fingerprints,
|
||||
compressed_out, flags);
|
||||
/* This is not a very efficient implementation XXXX */
|
||||
SMARTLIST_FOREACH_BEGIN(fingerprints, uint8_t *, digest) {
|
||||
spooled_resource_t *spooled =
|
||||
spooled_resource_new(source, digest, digest_len);
|
||||
if (spooled)
|
||||
smartlist_add(spool_out, spooled);
|
||||
tor_free(digest);
|
||||
} SMARTLIST_FOREACH_END(digest);
|
||||
|
||||
smartlist_free(fingerprints);
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -108,12 +108,6 @@ void connection_dir_about_to_close(dir_connection_t *dir_conn);
|
||||
int dir_split_resource_into_fingerprints(const char *resource,
|
||||
smartlist_t *fp_out, int *compressed_out,
|
||||
int flags);
|
||||
enum dir_spool_source_t;
|
||||
int dir_split_resource_into_spoolable(const char *resource,
|
||||
enum dir_spool_source_t source,
|
||||
smartlist_t *spool_out,
|
||||
int *compressed_out,
|
||||
int flags);
|
||||
int dir_split_resource_into_fingerprint_pairs(const char *res,
|
||||
smartlist_t *pairs_out);
|
||||
char *directory_dump_request_log(void);
|
||||
|
||||
@@ -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"
|
||||
@@ -997,7 +998,7 @@ update_microdesc_downloads(time_t now)
|
||||
|
||||
if (should_delay_dir_fetches(options, NULL))
|
||||
return;
|
||||
if (directory_too_idle_to_fetch_descriptors(options, now))
|
||||
if (dirclient_too_idle_to_fetch_descriptors(options, now))
|
||||
return;
|
||||
|
||||
/* Give up if we don't have a reasonably live consensus. */
|
||||
|
||||
@@ -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"
|
||||
@@ -1162,7 +1163,7 @@ update_consensus_networkstatus_fetch_time_impl(time_t now, int flav)
|
||||
}
|
||||
}
|
||||
|
||||
if (directory_fetches_dir_info_early(options)) {
|
||||
if (dirclient_fetches_dir_info_early(options)) {
|
||||
/* We want to cache the next one at some point after this one
|
||||
* is no longer fresh... */
|
||||
start = (time_t)(c->fresh_until + min_sec_before_caching);
|
||||
@@ -1184,7 +1185,7 @@ update_consensus_networkstatus_fetch_time_impl(time_t now, int flav)
|
||||
|
||||
/* If we're a bridge user, make use of the numbers we just computed
|
||||
* to choose the rest of the interval *after* them. */
|
||||
if (directory_fetches_dir_info_later(options)) {
|
||||
if (dirclient_fetches_dir_info_later(options)) {
|
||||
/* Give all the *clients* enough time to download the consensus. */
|
||||
start = (time_t)(start + dl_interval + min_sec_before_caching);
|
||||
/* But try to get it before ours actually expires. */
|
||||
@@ -1537,7 +1538,7 @@ networkstatus_consensus_can_use_extra_fallbacks,(const or_options_t *options))
|
||||
>= smartlist_len(router_get_trusted_dir_servers()));
|
||||
/* If we don't fetch from the authorities, and we have additional mirrors,
|
||||
* we can use them. */
|
||||
return (!directory_fetches_from_authorities(options)
|
||||
return (!dirclient_fetches_from_authorities(options)
|
||||
&& (smartlist_len(router_get_fallback_dir_servers())
|
||||
> smartlist_len(router_get_trusted_dir_servers())));
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "core/or/reasons.h"
|
||||
#include "feature/client/entrynodes.h"
|
||||
#include "feature/dirclient/dirclient.h"
|
||||
#include "feature/dirclient/dirclient_modes.h"
|
||||
#include "feature/dircommon/directory.h"
|
||||
#include "feature/nodelist/describe.h"
|
||||
#include "feature/nodelist/dirlist.h"
|
||||
@@ -322,7 +323,7 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags,
|
||||
|
||||
const int skip_or_fw = router_skip_or_reachability(options, try_ip_pref);
|
||||
const int skip_dir_fw = router_skip_dir_reachability(options, try_ip_pref);
|
||||
const int must_have_or = directory_must_use_begindir(options);
|
||||
const int must_have_or = dirclient_must_use_begindir(options);
|
||||
|
||||
/* Find all the running dirservers we know about. */
|
||||
SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), const node_t *, node) {
|
||||
@@ -1121,7 +1122,7 @@ router_pick_trusteddirserver_impl(const smartlist_t *sourcelist,
|
||||
|
||||
const int skip_or_fw = router_skip_or_reachability(options, try_ip_pref);
|
||||
const int skip_dir_fw = router_skip_dir_reachability(options, try_ip_pref);
|
||||
const int must_have_or = directory_must_use_begindir(options);
|
||||
const int must_have_or = dirclient_must_use_begindir(options);
|
||||
|
||||
SMARTLIST_FOREACH_BEGIN(sourcelist, const dir_server_t *, d)
|
||||
{
|
||||
|
||||
@@ -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"
|
||||
@@ -2752,7 +2752,7 @@ update_router_have_minimum_dir_info(void)
|
||||
|
||||
/* If paths have just become unavailable in this update. */
|
||||
if (!res && have_min_dir_info) {
|
||||
int quiet = directory_too_idle_to_fetch_descriptors(options, now);
|
||||
int quiet = dirclient_too_idle_to_fetch_descriptors(options, now);
|
||||
tor_log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR,
|
||||
"Our directory information is no longer up-to-date "
|
||||
"enough to build circuits: %s", dir_info_status);
|
||||
|
||||
@@ -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"
|
||||
@@ -2404,7 +2405,7 @@ max_dl_per_request(const or_options_t *options, int purpose)
|
||||
}
|
||||
/* If we're going to tunnel our connections, we can ask for a lot more
|
||||
* in a request. */
|
||||
if (directory_must_use_begindir(options)) {
|
||||
if (dirclient_must_use_begindir(options)) {
|
||||
max = 500;
|
||||
}
|
||||
return max;
|
||||
@@ -2447,7 +2448,7 @@ launch_descriptor_downloads(int purpose,
|
||||
if (!n_downloadable)
|
||||
return;
|
||||
|
||||
if (!directory_fetches_dir_info_early(options)) {
|
||||
if (!dirclient_fetches_dir_info_early(options)) {
|
||||
if (n_downloadable >= MAX_DL_TO_DELAY) {
|
||||
log_debug(LD_DIR,
|
||||
"There are enough downloadable %ss to launch requests.",
|
||||
@@ -2538,7 +2539,7 @@ update_consensus_router_descriptor_downloads(time_t now, int is_vote,
|
||||
int n_delayed=0, n_have=0, n_would_reject=0, n_wouldnt_use=0,
|
||||
n_inprogress=0, n_in_oldrouters=0;
|
||||
|
||||
if (directory_too_idle_to_fetch_descriptors(options, now))
|
||||
if (dirclient_too_idle_to_fetch_descriptors(options, now))
|
||||
goto done;
|
||||
if (!consensus)
|
||||
goto done;
|
||||
|
||||
+14
-13
@@ -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"
|
||||
@@ -3705,7 +3706,7 @@ test_config_directory_fetch(void *arg)
|
||||
options->ClientOnly = 1;
|
||||
tt_assert(server_mode(options) == 0);
|
||||
tt_assert(public_server_mode(options) == 0);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 1);
|
||||
|
||||
@@ -3715,7 +3716,7 @@ test_config_directory_fetch(void *arg)
|
||||
options->UseBridges = 1;
|
||||
tt_assert(server_mode(options) == 0);
|
||||
tt_assert(public_server_mode(options) == 0);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 1);
|
||||
|
||||
@@ -3727,7 +3728,7 @@ test_config_directory_fetch(void *arg)
|
||||
options->ORPort_set = 1;
|
||||
tt_assert(server_mode(options) == 1);
|
||||
tt_assert(public_server_mode(options) == 0);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 1);
|
||||
|
||||
@@ -3738,7 +3739,7 @@ test_config_directory_fetch(void *arg)
|
||||
options->FetchDirInfoEarly = 1;
|
||||
tt_assert(server_mode(options) == 0);
|
||||
tt_assert(public_server_mode(options) == 0);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 1);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 1);
|
||||
|
||||
@@ -3752,14 +3753,14 @@ test_config_directory_fetch(void *arg)
|
||||
mock_router_pick_published_address_result = -1;
|
||||
tt_assert(server_mode(options) == 1);
|
||||
tt_assert(public_server_mode(options) == 1);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 1);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 0);
|
||||
|
||||
mock_router_pick_published_address_result = 0;
|
||||
tt_assert(server_mode(options) == 1);
|
||||
tt_assert(public_server_mode(options) == 1);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 0);
|
||||
|
||||
@@ -3780,7 +3781,7 @@ test_config_directory_fetch(void *arg)
|
||||
options->RefuseUnknownExits = 1;
|
||||
tt_assert(server_mode(options) == 1);
|
||||
tt_assert(public_server_mode(options) == 1);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 1);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 0);
|
||||
|
||||
@@ -3788,7 +3789,7 @@ test_config_directory_fetch(void *arg)
|
||||
mock_router_pick_published_address_result = 0;
|
||||
tt_assert(server_mode(options) == 1);
|
||||
tt_assert(public_server_mode(options) == 1);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 0);
|
||||
|
||||
@@ -3810,7 +3811,7 @@ test_config_directory_fetch(void *arg)
|
||||
mock_router_get_my_routerinfo_result = &routerinfo;
|
||||
tt_assert(server_mode(options) == 1);
|
||||
tt_assert(public_server_mode(options) == 1);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 1);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 0);
|
||||
|
||||
@@ -3819,7 +3820,7 @@ test_config_directory_fetch(void *arg)
|
||||
mock_router_get_my_routerinfo_result = &routerinfo;
|
||||
tt_assert(server_mode(options) == 1);
|
||||
tt_assert(public_server_mode(options) == 1);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 0);
|
||||
|
||||
@@ -3827,7 +3828,7 @@ test_config_directory_fetch(void *arg)
|
||||
mock_router_get_my_routerinfo_result = NULL;
|
||||
tt_assert(server_mode(options) == 1);
|
||||
tt_assert(public_server_mode(options) == 1);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 0);
|
||||
|
||||
@@ -3837,7 +3838,7 @@ test_config_directory_fetch(void *arg)
|
||||
mock_router_get_my_routerinfo_result = &routerinfo;
|
||||
tt_assert(server_mode(options) == 1);
|
||||
tt_assert(public_server_mode(options) == 1);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 0);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 0);
|
||||
|
||||
@@ -3847,7 +3848,7 @@ test_config_directory_fetch(void *arg)
|
||||
mock_router_get_my_routerinfo_result = &routerinfo;
|
||||
tt_assert(server_mode(options) == 1);
|
||||
tt_assert(public_server_mode(options) == 1);
|
||||
tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1);
|
||||
tt_int_op(dirclient_fetches_from_authorities(options), OP_EQ, 1);
|
||||
tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
|
||||
OP_EQ, 0);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user