init: allow UNIX socket path for -proxy and -onion

This commit is contained in:
Matthew Zipkin 2023-05-26 14:23:57 -04:00
parent c3bd43142e
commit c65c0d0163
No known key found for this signature in database
GPG key ID: E7E2984B6289C93A

View file

@ -1298,7 +1298,14 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
std::string host_out; std::string host_out;
uint16_t port_out{0}; uint16_t port_out{0};
if (!SplitHostPort(socket_addr, port_out, host_out)) { if (!SplitHostPort(socket_addr, port_out, host_out)) {
#if HAVE_SOCKADDR_UN
// Allow unix domain sockets for -proxy and -onion e.g. unix:/some/file/path
if ((port_option != "-proxy" && port_option != "-onion") || socket_addr.find(ADDR_PREFIX_UNIX) != 0) {
return InitError(InvalidPortErrMsg(port_option, socket_addr));
}
#else
return InitError(InvalidPortErrMsg(port_option, socket_addr)); return InitError(InvalidPortErrMsg(port_option, socket_addr));
#endif
} }
} }
} }
@ -1365,12 +1372,18 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
// -noproxy (or -proxy=0) as well as the empty string can be used to not set a proxy, this is the default // -noproxy (or -proxy=0) as well as the empty string can be used to not set a proxy, this is the default
std::string proxyArg = args.GetArg("-proxy", ""); std::string proxyArg = args.GetArg("-proxy", "");
if (proxyArg != "" && proxyArg != "0") { if (proxyArg != "" && proxyArg != "0") {
const std::optional<CService> proxyAddr{Lookup(proxyArg, 9050, fNameLookup)}; Proxy addrProxy;
if (!proxyAddr.has_value()) { if (IsUnixSocketPath(proxyArg)) {
return InitError(strprintf(_("Invalid -proxy address or hostname: '%s'"), proxyArg)); addrProxy = Proxy(proxyArg, proxyRandomize);
} else {
const std::optional<CService> proxyAddr{Lookup(proxyArg, 9050, fNameLookup)};
if (!proxyAddr.has_value()) {
return InitError(strprintf(_("Invalid -proxy address or hostname: '%s'"), proxyArg));
}
addrProxy = Proxy(proxyAddr.value(), proxyRandomize);
} }
Proxy addrProxy = Proxy(proxyAddr.value(), proxyRandomize);
if (!addrProxy.IsValid()) if (!addrProxy.IsValid())
return InitError(strprintf(_("Invalid -proxy address or hostname: '%s'"), proxyArg)); return InitError(strprintf(_("Invalid -proxy address or hostname: '%s'"), proxyArg));
@ -1396,11 +1409,16 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
"reaching the Tor network is explicitly forbidden: -onion=0")); "reaching the Tor network is explicitly forbidden: -onion=0"));
} }
} else { } else {
const std::optional<CService> addr{Lookup(onionArg, 9050, fNameLookup)}; if (IsUnixSocketPath(onionArg)) {
if (!addr.has_value() || !addr->IsValid()) { onion_proxy = Proxy(onionArg, proxyRandomize);
return InitError(strprintf(_("Invalid -onion address or hostname: '%s'"), onionArg)); } else {
const std::optional<CService> addr{Lookup(onionArg, 9050, fNameLookup)};
if (!addr.has_value() || !addr->IsValid()) {
return InitError(strprintf(_("Invalid -onion address or hostname: '%s'"), onionArg));
}
onion_proxy = Proxy(addr.value(), proxyRandomize);
} }
onion_proxy = Proxy{addr.value(), proxyRandomize};
} }
} }