From ecd590d4c1e7f310c6ba3b58373bc30679b491df Mon Sep 17 00:00:00 2001 From: Ryan Ofsky Date: Thu, 19 Dec 2019 18:00:04 -0500 Subject: [PATCH] Normalize inconsistent -noonlynet behavior Treat specifying -noonlynet the same as not specifying -onlynet, instead of marking all networks unreachable. Before this change, specifying -noonlynet cleared list of reachable networks and did not allow connecting to any network. It was basically an undocumented synonym for -noconnect. After this change, specifying -nononlynet just clears previously specifed -onlynet options and allows connecting to all networks, restoring default behavior as if no -onlynet options were specified. Before this change, there was no way to restore default behavior once an -onlynet option was specified. So for example, if a config file specifed onlynet settings, they couldn't be reset on the command line without disabling the entire config file. The previous -noonlynet behavior wasn't neccessarily bad, but it was undocumented, redundant with the -noconnect option, inconsistent with behavior of other list options, and inconsistent with being able to use the command line to selectively override config options. It was also probably unintended, arising from use of the IsArgSet() method and its interaction with negated options. --- src/init.cpp | 15 ++++++++------- src/torcontrol.cpp | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 9273f40bb09..ad097284e04 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -782,8 +782,8 @@ void InitParameterInteraction(ArgsManager& args) if (args.SoftSetBoolArg("-whitelistrelay", true)) LogInfo("parameter interaction: -whitelistforcerelay=1 -> setting -whitelistrelay=1\n"); } - if (args.IsArgSet("-onlynet")) { - const auto onlynets = args.GetArgs("-onlynet"); + const auto onlynets = args.GetArgs("-onlynet"); + if (!onlynets.empty()) { bool clearnet_reachable = std::any_of(onlynets.begin(), onlynets.end(), [](const auto& net) { const auto n = ParseNetwork(net); return n == NET_IPV4 || n == NET_IPV6; @@ -1511,9 +1511,10 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) strSubVersion.size(), MAX_SUBVERSION_LENGTH)); } - if (args.IsArgSet("-onlynet")) { + const auto onlynets = args.GetArgs("-onlynet"); + if (!onlynets.empty()) { g_reachable_nets.RemoveAll(); - for (const std::string& snet : args.GetArgs("-onlynet")) { + for (const std::string& snet : onlynets) { enum Network net = ParseNetwork(snet); if (net == NET_UNROUTABLE) return InitError(strprintf(_("Unknown network specified in -onlynet: '%s'"), snet)); @@ -1522,7 +1523,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) } if (!args.IsArgSet("-cjdnsreachable")) { - if (args.IsArgSet("-onlynet") && g_reachable_nets.Contains(NET_CJDNS)) { + if (!onlynets.empty() && g_reachable_nets.Contains(NET_CJDNS)) { return InitError( _("Outbound connections restricted to CJDNS (-onlynet=cjdns) but " "-cjdnsreachable is not provided")); @@ -1573,7 +1574,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) onion_proxy = addrProxy; } - const bool onlynet_used_with_onion{args.IsArgSet("-onlynet") && g_reachable_nets.Contains(NET_ONION)}; + const bool onlynet_used_with_onion{!onlynets.empty() && g_reachable_nets.Contains(NET_ONION)}; // -onion can be used to set only a proxy for .onion, or override normal proxy for .onion addresses // -noonion (or -onion=0) disables connecting to .onion entirely @@ -2018,7 +2019,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) } SetProxy(NET_I2P, Proxy{addr.value()}); } else { - if (args.IsArgSet("-onlynet") && g_reachable_nets.Contains(NET_I2P)) { + if (!onlynets.empty() && g_reachable_nets.Contains(NET_I2P)) { return InitError( _("Outbound connections restricted to i2p (-onlynet=i2p) but " "-i2psam is not provided")); diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index 407d6085aae..17c51cd8e02 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -403,7 +403,7 @@ void TorController::get_socks_cb(TorControlConnection& _conn, const TorControlRe const auto onlynets = gArgs.GetArgs("-onlynet"); const bool onion_allowed_by_onlynet{ - !gArgs.IsArgSet("-onlynet") || + onlynets.empty() || std::any_of(onlynets.begin(), onlynets.end(), [](const auto& n) { return ParseNetwork(n) == NET_ONION; })};