From a49ee4206735ac16876a01064e5438c719161b17 Mon Sep 17 00:00:00 2001 From: Nsable-sh Date: Thu, 13 Aug 2026 16:37:08 -0300 Subject: net: auto-start bundled managed Tor --- src/main_gui.cpp | 22 +++++++++++++++++----- src/readme.txt | 2 ++ src/tor.cpp | 15 +++++++++++++++ src/tor.h | 1 + 4 files changed, 35 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/main_gui.cpp b/src/main_gui.cpp index f0fe903..3f52e91 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -143,6 +143,7 @@ static void PrintUsage() printf(" /socks=HOST:PORT (SOCKS5 proxy for Nostr, .btf relay, and onion dials)\n"); printf(" /tor[=HOST:PORT] (Tor mode; default SOCKS5 proxy is 127.0.0.1:9050)\n"); printf(" /managedtor[=PATH] (start Tor, create a hidden service, advertise its onion)\n"); + printf(" /nomanagedtor (disable automatic bundled Tor startup)\n"); printf(" /oniononly (do not fall back to rendezvous when a .btf onion dial fails)\n"); printf(" /btfseed=ADDRESS:ENCHEX (extra bootstrap peer, repeatable)\n"); printf("\n"); @@ -322,19 +323,30 @@ static void ParseStartupArguments(int argc, char* argv[]) } bool fManagedTor = arg(argc, argv, "/managedtor") || arg(argc, argv, "-managedtor"); + bool fNoManagedTor = arg(argc, argv, "/nomanagedtor") || arg(argc, argv, "-nomanagedtor"); bool fTorMode = arg(argc, argv, "/tor") || arg(argc, argv, "-tor"); string socksProxy = argval2(argc, argv, "/socks", "-socks"); - if (fManagedTor) + string bundledTorPath; + bool fAutoManagedTor = !fManagedTor && !fNoManagedTor && !fTorMode && + socksProxy.empty() && BtfBundledTorPath(bundledTorPath); + if (fManagedTor || fAutoManagedTor) { - if (fTorMode || !socksProxy.empty()) + if (fManagedTor && (fTorMode || !socksProxy.empty())) fprintf(stderr, "Warning: /managedtor takes precedence over /tor and /socks\n"); - string torPath = argval2(argc, argv, "/managedtor", "-managedtor"); + string torPath = fManagedTor ? argval2(argc, argv, "/managedtor", "-managedtor") : bundledTorPath; string err; if (!BtfStartManagedTor(torPath, err)) - fprintf(stderr, "Ignoring /managedtor=%s: %s\n", torPath.c_str(), err.c_str()); + { + if (fAutoManagedTor) + fprintf(stderr, "Bundled Tor not enabled automatically: %s\n", err.c_str()); + else + fprintf(stderr, "Ignoring /managedtor=%s: %s\n", torPath.c_str(), err.c_str()); + } else - fprintf(stderr, "Managed Tor enabled: %s\n", BtfManagedTorStatus().c_str()); + fprintf(stderr, "Managed Tor enabled%s: %s\n", + fAutoManagedTor ? " automatically" : "", + BtfManagedTorStatus().c_str()); } else if (fTorMode) { diff --git a/src/readme.txt b/src/readme.txt index 9ddbc24..752be66 100644 --- a/src/readme.txt +++ b/src/readme.txt @@ -52,6 +52,8 @@ Command-line options (in addition to the original ones) /managedtor[=PATH] start Tor, create a v3 hidden service for this node, route outbound discovery through it, and advertise the generated onion endpoint + Windows release packages that include tor/tor.exe start this mode + automatically; use /nomanagedtor to force the legacy relay path /solomine mine without requiring a connected peer (local testing) /operator operator mode (run pool server) /participant=ADDR diff --git a/src/tor.cpp b/src/tor.cpp index e47ee44..20b4577 100644 --- a/src/tor.cpp +++ b/src/tor.cpp @@ -500,6 +500,21 @@ static std::string ResolveTorPath(const std::string& torPathOpt) #endif } +bool BtfBundledTorPath(std::string& torPathOut) +{ + torPathOut.clear(); + std::string exeDir = ExecutableDir(); +#ifdef _WIN32 + std::string path = PathJoin(exeDir, "tor/tor.exe"); +#else + std::string path = PathJoin(exeDir, "tor/tor"); +#endif + if (!FileIsExecutableCandidate(path)) + return false; + torPathOut = path; + return true; +} + std::string BtfBuildManagedTorrcForTest(const std::string& dataDir, const std::string& hiddenServiceDir, unsigned short socksPort, diff --git a/src/tor.h b/src/tor.h index 7c5c603..cfb87a5 100644 --- a/src/tor.h +++ b/src/tor.h @@ -13,6 +13,7 @@ bool BtfStartManagedTor(const std::string& torPathOpt, std::string& errOut); void BtfStopManagedTor(); bool BtfManagedTorEnabled(); std::string BtfManagedTorStatus(); +bool BtfBundledTorPath(std::string& torPathOut); std::string BtfBuildManagedTorrcForTest(const std::string& dataDir, const std::string& hiddenServiceDir, -- cgit v1.2.3