Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement an DormantCanceledByStartup option #800

Merged
1 commit merged into from Apr 5, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 7 additions & 0 deletions changes/ticket29357
@@ -0,0 +1,7 @@
o Minor features (dormant mode):
- Add a DormantCanceledByStartup option to tell Tor that it should
treat a startup event as cancelling any previous dormant state.
Integrators should use this option with caution: it should
only be used if Tor is being started because of something that the
user did, and not if Tor is being automatically started in the
background. Closes ticket 29357.
15 changes: 15 additions & 0 deletions doc/tor.1.txt
Expand Up @@ -1850,6 +1850,21 @@ The following options are useful only for clients (that is, if
After the first time Tor starts, it begins in dormant mode if it was
dormant before, and not otherwise. (Default: 0)

[[DormantCanceledByStartup]] **DormantCanceledByStartup** **0**|**1**::
By default, Tor starts in active mode if it was active the last time
it was shut down, and in dormant mode if it was dormant. But if
this option is true, Tor treats every startup event as user
activity, and Tor will never start in Dormant mode, even if it has
been unused for a long time on previous runs. (Default: 0)
+
Note: Packagers and application developers should change the value of
this option only with great caution: it has the potential to
create spurious traffic on the network. This option should only
be used if Tor is started by an affirmative user activity (like
clicking on an applcation or running a command), and not if Tor
is launched for some other reason (for example, by a startup
process, or by an application that launches itself on every login.)

SERVER OPTIONS
--------------

Expand Down
1 change: 1 addition & 0 deletions src/app/config/config.c
Expand Up @@ -396,6 +396,7 @@ static config_var_t option_vars_[] = {
V(DormantClientTimeout, INTERVAL, "24 hours"),
V(DormantTimeoutDisabledByIdleStreams, BOOL, "1"),
V(DormantOnFirstStartup, BOOL, "0"),
V(DormantCanceledByStartup, BOOL, "0"),
/* DoS circuit creation options. */
V(DoSCircuitCreationEnabled, AUTOBOOL, "auto"),
V(DoSCircuitCreationMinConnections, UINT, "0"),
Expand Down
5 changes: 5 additions & 0 deletions src/app/config/or_options_st.h
Expand Up @@ -1092,6 +1092,11 @@ struct or_options_t {
/** Boolean: true if Tor should be dormant the first time it starts with
* a datadirectory; false otherwise. */
int DormantOnFirstStartup;
/**
* Boolean: true if Tor should treat every startup event as cancelling
* a possible previous dormant state.
**/
int DormantCanceledByStartup;
};

#endif
4 changes: 4 additions & 0 deletions src/core/mainloop/netstatus.c
Expand Up @@ -144,6 +144,10 @@ netstatus_load_from_state(const or_state_t *state, time_t now)
last_activity = now - 60 * state->MinutesSinceUserActivity;
participating_on_network = true;
}
if (get_options()->DormantCanceledByStartup) {
last_activity = now;
participating_on_network = true;
}
reset_user_activity(last_activity);
}

Expand Down
8 changes: 8 additions & 0 deletions src/test/test_mainloop.c
Expand Up @@ -317,6 +317,14 @@ test_mainloop_dormant_load_state(void *arg)
tt_assert(is_participating_on_network());
tt_i64_op(get_last_user_activity_time(), OP_EQ, start - 123*60);

// If we would start dormant, but DormantCanceledByStartup is set, then
// we start up non-dormant.
state->Dormant = 1;
get_options_mutable()->DormantCanceledByStartup = 1;
netstatus_load_from_state(state, start);
tt_assert(is_participating_on_network());
tt_i64_op(get_last_user_activity_time(), OP_EQ, start);

done:
or_state_free(state);
}
Expand Down