diff --git a/src/init.cpp b/src/init.cpp --- a/src/init.cpp +++ b/src/init.cpp @@ -2978,7 +2978,7 @@ LogPrintf("nBestHeight = %d\n", chain_active_height); if (args.GetBoolArg("-listenonion", DEFAULT_LISTEN_ONION)) { - StartTorControl(); + StartTorControl(DefaultOnionServiceTarget()); } Discover(); diff --git a/src/torcontrol.h b/src/torcontrol.h --- a/src/torcontrol.h +++ b/src/torcontrol.h @@ -10,11 +10,15 @@ #include +class CService; + extern const std::string DEFAULT_TOR_CONTROL; static const bool DEFAULT_LISTEN_ONION = true; -void StartTorControl(); +void StartTorControl(CService onion_service_target); void InterruptTorControl(); void StopTorControl(); +CService DefaultOnionServiceTarget(); + #endif // BITCOIN_TORCONTROL_H diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -3,11 +3,13 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include #include +#include +#include #include #include +#include #include #include #include @@ -463,7 +465,8 @@ class TorController { public: TorController(struct event_base *base, - const std::string &tor_control_center); + const std::string &tor_control_center, + const CService &target); ~TorController(); /** Get name fo file to store private key in */ @@ -482,6 +485,7 @@ struct event *reconnect_ev; float reconnect_timeout; CService service; + const CService m_target; /** Cookie for SAFECOOKIE auth */ std::vector cookie; /** ClientNonce for SAFECOOKIE auth */ @@ -507,10 +511,11 @@ }; TorController::TorController(struct event_base *_base, - const std::string &tor_control_center) + const std::string &tor_control_center, + const CService &target) : base(_base), m_tor_control_center(tor_control_center), conn(base), reconnect(true), reconnect_ev(0), - reconnect_timeout(RECONNECT_TIMEOUT_START) { + reconnect_timeout(RECONNECT_TIMEOUT_START), m_target(target) { reconnect_ev = event_new(base, -1, 0, reconnect_cb, this); if (!reconnect_ev) { LogPrintf( @@ -610,9 +615,9 @@ // Note that the 'virtual' port doesn't have to be the same as our // internal port, but this is just a convenient choice. TODO; refactor // the shutdown sequence some day. - _conn.Command(strprintf("ADD_ONION %s Port=%i,127.0.0.1:%i", - private_key, Params().GetDefaultPort(), - GetListenPort()), + _conn.Command(strprintf("ADD_ONION %s Port=%i,%s", private_key, + Params().GetDefaultPort(), + m_target.ToStringIPPort()), std::bind(&TorController::add_onion_cb, this, std::placeholders::_1, std::placeholders::_2)); } else { @@ -866,13 +871,14 @@ static struct event_base *gBase; static std::thread torControlThread; -static void TorControlThread() { - TorController ctrl(gBase, gArgs.GetArg("-torcontrol", DEFAULT_TOR_CONTROL)); +static void TorControlThread(CService onion_service_target) { + TorController ctrl(gBase, gArgs.GetArg("-torcontrol", DEFAULT_TOR_CONTROL), + onion_service_target); event_base_dispatch(gBase); } -void StartTorControl() { +void StartTorControl(CService onion_service_target) { assert(!gBase); #ifdef WIN32 evthread_use_windows_threads(); @@ -886,7 +892,8 @@ } torControlThread = std::thread( - std::bind(&TraceThread, "torcontrol", &TorControlThread)); + &TraceThread>, "torcontrol", + [onion_service_target] { TorControlThread(onion_service_target); }); } void InterruptTorControl() { @@ -906,3 +913,9 @@ gBase = nullptr; } } + +CService DefaultOnionServiceTarget() { + struct in_addr onion_service_target; + onion_service_target.s_addr = htonl(INADDR_LOOPBACK); + return {onion_service_target, BaseParams().OnionServiceTargetPort()}; +}