|
@@ -433,6 +433,23 @@ static config_var_t option_vars_[] = {
|
|
|
VAR("__OwningControllerProcess",STRING,OwningControllerProcess, NULL),
|
|
|
V(MinUptimeHidServDirectoryV2, INTERVAL, "25 hours"),
|
|
|
V(VoteOnHidServDirectoriesV2, BOOL, "1"),
|
|
|
+ V(TestingServerDownloadSchedule, CSV_INTERVAL, "0, 0, 0, 60, 60, 120, "
|
|
|
+ "300, 900, 2147483647"),
|
|
|
+ V(TestingClientDownloadSchedule, CSV_INTERVAL, "0, 0, 60, 300, 600, "
|
|
|
+ "2147483647"),
|
|
|
+ V(TestingServerConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 60, "
|
|
|
+ "300, 600, 1800, 1800, 1800, 1800, "
|
|
|
+ "1800, 3600, 7200"),
|
|
|
+ V(TestingClientConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 60, "
|
|
|
+ "300, 600, 1800, 3600, 3600, 3600, "
|
|
|
+ "10800, 21600, 43200"),
|
|
|
+ V(TestingBridgeDownloadSchedule, CSV_INTERVAL, "3600, 900, 900, 3600"),
|
|
|
+ V(TestingClientMaxIntervalWithoutRequest, INTERVAL, "10 minutes"),
|
|
|
+ V(TestingDirConnectionMaxStall, INTERVAL, "5 minutes"),
|
|
|
+ V(TestingConsensusMaxDownloadTries, UINT, "8"),
|
|
|
+ V(TestingDescriptorMaxDownloadTries, UINT, "8"),
|
|
|
+ V(TestingMicrodescMaxDownloadTries, UINT, "8"),
|
|
|
+ V(TestingCertMaxDownloadTries, UINT, "8"),
|
|
|
VAR("___UsingTestNetworkDefaults", BOOL, UsingTestNetworkDefaults_, "0"),
|
|
|
|
|
|
{ NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
|
|
@@ -461,6 +478,21 @@ static const config_var_t testing_tor_network_defaults[] = {
|
|
|
V(TestingAuthDirTimeToLearnReachability, INTERVAL, "0 minutes"),
|
|
|
V(TestingEstimatedDescriptorPropagationTime, INTERVAL, "0 minutes"),
|
|
|
V(MinUptimeHidServDirectoryV2, INTERVAL, "0 minutes"),
|
|
|
+ V(TestingServerDownloadSchedule, CSV_INTERVAL, "0, 0, 0, 5, 10, 15, "
|
|
|
+ "20, 30, 60"),
|
|
|
+ V(TestingClientDownloadSchedule, CSV_INTERVAL, "0, 0, 5, 10, 15, 20, "
|
|
|
+ "30, 60"),
|
|
|
+ V(TestingServerConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 5, 10, "
|
|
|
+ "15, 20, 30, 60"),
|
|
|
+ V(TestingClientConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 5, 10, "
|
|
|
+ "15, 20, 30, 60"),
|
|
|
+ V(TestingBridgeDownloadSchedule, CSV_INTERVAL, "60, 30, 30, 60"),
|
|
|
+ V(TestingClientMaxIntervalWithoutRequest, INTERVAL, "5 seconds"),
|
|
|
+ V(TestingDirConnectionMaxStall, INTERVAL, "30 seconds"),
|
|
|
+ V(TestingConsensusMaxDownloadTries, UINT, "80"),
|
|
|
+ V(TestingDescriptorMaxDownloadTries, UINT, "80"),
|
|
|
+ V(TestingMicrodescMaxDownloadTries, UINT, "80"),
|
|
|
+ V(TestingCertMaxDownloadTries, UINT, "80"),
|
|
|
VAR("___UsingTestNetworkDefaults", BOOL, UsingTestNetworkDefaults_, "1"),
|
|
|
|
|
|
{ NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
|
|
@@ -475,6 +507,7 @@ static char *get_windows_conf_root(void);
|
|
|
#endif
|
|
|
static int options_validate(or_options_t *old_options,
|
|
|
or_options_t *options,
|
|
|
+ or_options_t *default_options,
|
|
|
int from_setconf, char **msg);
|
|
|
static int options_act_reversible(const or_options_t *old_options, char **msg);
|
|
|
static int options_act(const or_options_t *old_options);
|
|
@@ -1851,7 +1884,8 @@ options_trial_assign(config_line_t *list, int use_defaults,
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
- if (options_validate(get_options_mutable(), trial_options, 1, msg) < 0) {
|
|
|
+ if (options_validate(get_options_mutable(), trial_options,
|
|
|
+ global_default_options, 1, msg) < 0) {
|
|
|
config_free(&options_format, trial_options);
|
|
|
return SETOPT_ERR_PARSE; /*XXX make this a separate return value. */
|
|
|
}
|
|
@@ -2281,10 +2315,11 @@ compute_publishserverdescriptor(or_options_t *options)
|
|
|
* */
|
|
|
#define RECOMMENDED_MIN_CIRCUIT_BUILD_TIMEOUT (10)
|
|
|
|
|
|
-/** Return 0 if every setting in <b>options</b> is reasonable, and a
|
|
|
- * permissible transition from <b>old_options</b>. Else return -1.
|
|
|
- * Should have no side effects, except for normalizing the contents of
|
|
|
- * <b>options</b>.
|
|
|
+/** Return 0 if every setting in <b>options</b> is reasonable, is a
|
|
|
+ * permissible transition from <b>old_options</b>, and none of the
|
|
|
+ * testing-only settings differ from <b>default_options</b> unless in
|
|
|
+ * testing mode. Else return -1. Should have no side effects, except for
|
|
|
+ * normalizing the contents of <b>options</b>.
|
|
|
*
|
|
|
* On error, tor_strdup an error explanation into *<b>msg</b>.
|
|
|
*
|
|
@@ -2295,7 +2330,7 @@ compute_publishserverdescriptor(or_options_t *options)
|
|
|
*/
|
|
|
static int
|
|
|
options_validate(or_options_t *old_options, or_options_t *options,
|
|
|
- int from_setconf, char **msg)
|
|
|
+ or_options_t *default_options, int from_setconf, char **msg)
|
|
|
{
|
|
|
int i;
|
|
|
config_line_t *cl;
|
|
@@ -3177,35 +3212,43 @@ options_validate(or_options_t *old_options, or_options_t *options,
|
|
|
"ignore you.");
|
|
|
}
|
|
|
|
|
|
- /*XXXX checking for defaults manually like this is a bit fragile.*/
|
|
|
-
|
|
|
- /* Keep changes to hard-coded values synchronous to man page and default
|
|
|
- * values table. */
|
|
|
- if (options->TestingV3AuthInitialVotingInterval != 30*60 &&
|
|
|
- !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
|
|
|
- REJECT("TestingV3AuthInitialVotingInterval may only be changed in testing "
|
|
|
- "Tor networks!");
|
|
|
- } else if (options->TestingV3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) {
|
|
|
+#define CHECK_DEFAULT(arg) \
|
|
|
+ STMT_BEGIN if (default_options->arg != options->arg && \
|
|
|
+ !options->TestingTorNetwork && \
|
|
|
+ !options->UsingTestNetworkDefaults_) { \
|
|
|
+ REJECT("Testing* options may only be changed in testing Tor " \
|
|
|
+ "networks!"); \
|
|
|
+ } STMT_END
|
|
|
+ CHECK_DEFAULT(TestingV3AuthInitialVotingInterval);
|
|
|
+ CHECK_DEFAULT(TestingV3AuthInitialVoteDelay);
|
|
|
+ CHECK_DEFAULT(TestingV3AuthInitialDistDelay);
|
|
|
+ CHECK_DEFAULT(TestingAuthDirTimeToLearnReachability);
|
|
|
+ CHECK_DEFAULT(TestingEstimatedDescriptorPropagationTime);
|
|
|
+ CHECK_DEFAULT(TestingServerDownloadSchedule);
|
|
|
+ CHECK_DEFAULT(TestingClientDownloadSchedule);
|
|
|
+ CHECK_DEFAULT(TestingServerConsensusDownloadSchedule);
|
|
|
+ CHECK_DEFAULT(TestingClientConsensusDownloadSchedule);
|
|
|
+ CHECK_DEFAULT(TestingBridgeDownloadSchedule);
|
|
|
+ CHECK_DEFAULT(TestingClientMaxIntervalWithoutRequest);
|
|
|
+ CHECK_DEFAULT(TestingDirConnectionMaxStall);
|
|
|
+ CHECK_DEFAULT(TestingConsensusMaxDownloadTries);
|
|
|
+ CHECK_DEFAULT(TestingDescriptorMaxDownloadTries);
|
|
|
+ CHECK_DEFAULT(TestingMicrodescMaxDownloadTries);
|
|
|
+ CHECK_DEFAULT(TestingCertMaxDownloadTries);
|
|
|
+#undef CHECK_DEFAULT
|
|
|
+
|
|
|
+ if (options->TestingV3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) {
|
|
|
REJECT("TestingV3AuthInitialVotingInterval is insanely low.");
|
|
|
} else if (((30*60) % options->TestingV3AuthInitialVotingInterval) != 0) {
|
|
|
REJECT("TestingV3AuthInitialVotingInterval does not divide evenly into "
|
|
|
"30 minutes.");
|
|
|
}
|
|
|
|
|
|
- if (options->TestingV3AuthInitialVoteDelay != 5*60 &&
|
|
|
- !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
|
|
|
-
|
|
|
- REJECT("TestingV3AuthInitialVoteDelay may only be changed in testing "
|
|
|
- "Tor networks!");
|
|
|
- } else if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS) {
|
|
|
+ if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS) {
|
|
|
REJECT("TestingV3AuthInitialVoteDelay is way too low.");
|
|
|
}
|
|
|
|
|
|
- if (options->TestingV3AuthInitialDistDelay != 5*60 &&
|
|
|
- !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
|
|
|
- REJECT("TestingV3AuthInitialDistDelay may only be changed in testing "
|
|
|
- "Tor networks!");
|
|
|
- } else if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS) {
|
|
|
+ if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS) {
|
|
|
REJECT("TestingV3AuthInitialDistDelay is way too low.");
|
|
|
}
|
|
|
|
|
@@ -3216,26 +3259,54 @@ options_validate(or_options_t *old_options, or_options_t *options,
|
|
|
"must be less than half TestingV3AuthInitialVotingInterval");
|
|
|
}
|
|
|
|
|
|
- if (options->TestingAuthDirTimeToLearnReachability != 30*60 &&
|
|
|
- !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
|
|
|
- REJECT("TestingAuthDirTimeToLearnReachability may only be changed in "
|
|
|
- "testing Tor networks!");
|
|
|
- } else if (options->TestingAuthDirTimeToLearnReachability < 0) {
|
|
|
+ if (options->TestingAuthDirTimeToLearnReachability < 0) {
|
|
|
REJECT("TestingAuthDirTimeToLearnReachability must be non-negative.");
|
|
|
} else if (options->TestingAuthDirTimeToLearnReachability > 2*60*60) {
|
|
|
COMPLAIN("TestingAuthDirTimeToLearnReachability is insanely high.");
|
|
|
}
|
|
|
|
|
|
- if (options->TestingEstimatedDescriptorPropagationTime != 10*60 &&
|
|
|
- !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) {
|
|
|
- REJECT("TestingEstimatedDescriptorPropagationTime may only be changed in "
|
|
|
- "testing Tor networks!");
|
|
|
- } else if (options->TestingEstimatedDescriptorPropagationTime < 0) {
|
|
|
+ if (options->TestingEstimatedDescriptorPropagationTime < 0) {
|
|
|
REJECT("TestingEstimatedDescriptorPropagationTime must be non-negative.");
|
|
|
} else if (options->TestingEstimatedDescriptorPropagationTime > 60*60) {
|
|
|
COMPLAIN("TestingEstimatedDescriptorPropagationTime is insanely high.");
|
|
|
}
|
|
|
|
|
|
+ if (options->TestingClientMaxIntervalWithoutRequest < 1) {
|
|
|
+ REJECT("TestingClientMaxIntervalWithoutRequest is way too low.");
|
|
|
+ } else if (options->TestingClientMaxIntervalWithoutRequest > 3600) {
|
|
|
+ COMPLAIN("TestingClientMaxIntervalWithoutRequest is insanely high.");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (options->TestingDirConnectionMaxStall < 5) {
|
|
|
+ REJECT("TestingDirConnectionMaxStall is way too low.");
|
|
|
+ } else if (options->TestingDirConnectionMaxStall > 3600) {
|
|
|
+ COMPLAIN("TestingDirConnectionMaxStall is insanely high.");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (options->TestingConsensusMaxDownloadTries < 2) {
|
|
|
+ REJECT("TestingConsensusMaxDownloadTries must be greater than 1.");
|
|
|
+ } else if (options->TestingConsensusMaxDownloadTries > 800) {
|
|
|
+ COMPLAIN("TestingConsensusMaxDownloadTries is insanely high.");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (options->TestingDescriptorMaxDownloadTries < 2) {
|
|
|
+ REJECT("TestingDescriptorMaxDownloadTries must be greater than 1.");
|
|
|
+ } else if (options->TestingDescriptorMaxDownloadTries > 800) {
|
|
|
+ COMPLAIN("TestingDescriptorMaxDownloadTries is insanely high.");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (options->TestingMicrodescMaxDownloadTries < 2) {
|
|
|
+ REJECT("TestingMicrodescMaxDownloadTries must be greater than 1.");
|
|
|
+ } else if (options->TestingMicrodescMaxDownloadTries > 800) {
|
|
|
+ COMPLAIN("TestingMicrodescMaxDownloadTries is insanely high.");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (options->TestingCertMaxDownloadTries < 2) {
|
|
|
+ REJECT("TestingCertMaxDownloadTries must be greater than 1.");
|
|
|
+ } else if (options->TestingCertMaxDownloadTries > 800) {
|
|
|
+ COMPLAIN("TestingCertMaxDownloadTries is insanely high.");
|
|
|
+ }
|
|
|
+
|
|
|
if (options->TestingTorNetwork) {
|
|
|
log_warn(LD_CONFIG, "TestingTorNetwork is set. This will make your node "
|
|
|
"almost unusable in the public Tor network, and is "
|
|
@@ -3850,7 +3921,8 @@ options_init_from_string(const char *cf_defaults, const char *cf,
|
|
|
}
|
|
|
|
|
|
/* Validate newoptions */
|
|
|
- if (options_validate(oldoptions, newoptions, 0, msg) < 0) {
|
|
|
+ if (options_validate(oldoptions, newoptions, newdefaultoptions,
|
|
|
+ 0, msg) < 0) {
|
|
|
err = SETOPT_ERR_PARSE; /*XXX make this a separate return value.*/
|
|
|
goto err;
|
|
|
}
|
|
@@ -6087,6 +6159,7 @@ getinfo_helper_config(control_connection_t *conn,
|
|
|
case CONFIG_TYPE_ISOTIME: type = "Time"; break;
|
|
|
case CONFIG_TYPE_ROUTERSET: type = "RouterList"; break;
|
|
|
case CONFIG_TYPE_CSV: type = "CommaList"; break;
|
|
|
+ case CONFIG_TYPE_CSV_INTERVAL: type = "TimeIntervalCommaList"; break;
|
|
|
case CONFIG_TYPE_LINELIST: type = "LineList"; break;
|
|
|
case CONFIG_TYPE_LINELIST_S: type = "Dependant"; break;
|
|
|
case CONFIG_TYPE_LINELIST_V: type = "Virtual"; break;
|