tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit 066748c9cde058db4c12dec0675c036ac11d7e84
parent e8d224dfb14a73e6b47ab09def56217f66a2ea46
Author: Nick Mathewson <nickm@torproject.org>
Date:   Fri, 12 Mar 2021 08:40:26 -0500

Add a DormantTimeoutEnabled to disable dormant mode entirely

(If you need to do this in an older version you can just set
DormantClientTimeout to something huge.)

Closes #40228.

Diffstat:
Achanges/ticket40228 | 4++++
Mdoc/man/tor.1.txt | 6++++++
Msrc/app/config/config.c | 5+++--
Msrc/app/config/or_options_st.h | 7+++++++
Msrc/core/mainloop/mainloop.c | 6++++++
Msrc/core/mainloop/netstatus.c | 3+++
Msrc/test/test_mainloop.c | 2++
7 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/changes/ticket40228 b/changes/ticket40228 @@ -0,0 +1,4 @@ + o Minor features (dormant mode): + - Add a new 'DormantTimeoutEnabled' option to allow coarse-grained + control over whether the client ever becomes dormant from inactivity. + Most people won't need this. Closes ticket 40228. diff --git a/doc/man/tor.1.txt b/doc/man/tor.1.txt @@ -1888,6 +1888,12 @@ The following options control when Tor enters and leaves dormant mode: counts as client activity for the purpose of DormantClientTimeout. If false, then only network activity counts. (Default: 1) +[[DormantTimeoutEnabled]] **DormantTimeoutEnabled** **0**|**1**:: + If false, then no amount of time without activity is sufficient to + make Tor go dormant. Setting this option to zero is only recommended for + special-purpose applications that need to use the Tor binary for + something other than sending or receiving Tor traffic. (Default: 1) + == NODE SELECTION OPTIONS // These options are in alphabetical order, with exceptions as noted. diff --git a/src/app/config/config.c b/src/app/config/config.c @@ -424,8 +424,9 @@ static const config_var_t option_vars_[] = { OBSOLETE("DynamicDHGroups"), VPORT(DNSPort), OBSOLETE("DNSListenAddress"), - V(DormantClientTimeout, INTERVAL, "24 hours"), - V(DormantTimeoutDisabledByIdleStreams, BOOL, "1"), + V(DormantClientTimeout, INTERVAL, "24 hours"), + V(DormantTimeoutEnabled, BOOL, "1"), + V(DormantTimeoutDisabledByIdleStreams, BOOL, "1"), V(DormantOnFirstStartup, BOOL, "0"), V(DormantCanceledByStartup, BOOL, "0"), /* DoS circuit creation options. */ diff --git a/src/app/config/or_options_st.h b/src/app/config/or_options_st.h @@ -1065,6 +1065,13 @@ struct or_options_t { **/ int DormantClientTimeout; + /** + * Boolean: If enabled, then we consider the timeout when deciding whether + * to be dormant. If not enabled, then only the SIGNAL ACTIVE/DORMANT + * controls can change our status. + **/ + int DormantTimeoutEnabled; + /** Boolean: true if having an idle stream is sufficient to prevent a client * from becoming dormant. **/ diff --git a/src/core/mainloop/mainloop.c b/src/core/mainloop/mainloop.c @@ -1823,6 +1823,12 @@ check_network_participation_callback(time_t now, const or_options_t *options) goto found_activity; } + /* If we aren't allowed to become dormant, then participation doesn't + matter */ + if (! options->DormantTimeoutEnabled) { + goto found_activity; + } + /* If we're running an onion service, we can't become dormant. */ /* XXXX this would be nice to change, so that we can be dormant with a * service. */ diff --git a/src/core/mainloop/netstatus.c b/src/core/mainloop/netstatus.c @@ -154,6 +154,9 @@ netstatus_load_from_state(const mainloop_state_t *state, time_t now) last_activity = now; participating_on_network = true; } + if (! get_options()->DormantTimeoutEnabled) { + participating_on_network = true; + } reset_user_activity(last_activity); } diff --git a/src/test/test_mainloop.c b/src/test/test_mainloop.c @@ -231,6 +231,8 @@ test_mainloop_check_participation(void *arg) const time_t start = 1542658829; const time_t ONE_DAY = 24*60*60; + options->DormantTimeoutEnabled = 1; + // Suppose we've been idle for a day or two reset_user_activity(start - 2*ONE_DAY); set_network_participation(true);