[tor-commits] [tor/master] Add a DormantTimeoutEnabled to disable dormant mode entirely

dgoulet at torproject.org dgoulet at torproject.org
Tue Mar 23 13:43:10 UTC 2021


commit 08a1b4d6b160e0ebed379e66927114498e66122a
Author: Nick Mathewson <nickm at torproject.org>
Date:   Fri Mar 12 08:40:26 2021 -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.
---
 changes/ticket40228            | 4 ++++
 doc/man/tor.1.txt              | 6 ++++++
 src/app/config/config.c        | 5 +++--
 src/app/config/or_options_st.h | 7 +++++++
 src/core/mainloop/mainloop.c   | 6 ++++++
 src/core/mainloop/netstatus.c  | 3 +++
 src/test/test_mainloop.c       | 2 ++
 7 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/changes/ticket40228 b/changes/ticket40228
new file mode 100644
index 0000000000..297204decd
--- /dev/null
+++ 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
index b57c6ec70a..bec45dee6a 100644
--- 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
index fa74907b3d..5b36554851 100644
--- 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
index 4364f145ed..af38be585f 100644
--- 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
index 77ab6f26c8..dcd88b1a86 100644
--- 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
index 7367c68219..fc386c191e 100644
--- 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
index c4e60d9da5..a9bb714a0f 100644
--- 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);





More information about the tor-commits mailing list