dns_utils: allow an optional DNS server IP in DNS_PUBLIC

tcp://a.b.c.d
This commit is contained in:
moneromooo-monero 2017-09-30 09:07:43 +01:00
parent 86e9de588c
commit a4b4651cb0
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
4 changed files with 56 additions and 7 deletions

View file

@ -40,6 +40,8 @@ namespace bf = boost::filesystem;
#undef MONERO_DEFAULT_LOG_CATEGORY
#define MONERO_DEFAULT_LOG_CATEGORY "net.dns"
#define DEFAULT_DNS_PUBLIC_ADDR "8.8.4.4"
static boost::mutex instance_lock;
namespace
@ -197,16 +199,19 @@ public:
DNSResolver::DNSResolver() : m_data(new DNSResolverData())
{
int use_dns_public = 0;
const char* dns_public_addr = "8.8.4.4";
std::string dns_public_addr = DEFAULT_DNS_PUBLIC_ADDR;
if (auto res = getenv("DNS_PUBLIC"))
{
std::string dns_public(res);
// TODO: could allow parsing of IP and protocol: e.g. DNS_PUBLIC=tcp:8.8.8.8
if (dns_public == "tcp")
dns_public_addr = tools::dns_utils::parse_dns_public(res);
if (!dns_public_addr.empty())
{
LOG_PRINT_L0("Using public DNS server: " << dns_public_addr << " (TCP)");
MGINFO("Using public DNS server: " << dns_public_addr << " (TCP)");
use_dns_public = 1;
}
else
{
MERROR("Failed to parse DNS_PUBLIC");
}
}
// init libunbound context
@ -214,7 +219,7 @@ DNSResolver::DNSResolver() : m_data(new DNSResolverData())
if (use_dns_public)
{
ub_ctx_set_fwd(m_data->m_ub_context, string_copy(dns_public_addr));
ub_ctx_set_fwd(m_data->m_ub_context, dns_public_addr.c_str());
ub_ctx_set_option(m_data->m_ub_context, string_copy("do-udp:"), string_copy("no"));
ub_ctx_set_option(m_data->m_ub_context, string_copy("do-tcp:"), string_copy("yes"));
}
@ -519,6 +524,34 @@ bool load_txt_records_from_dns(std::vector<std::string> &good_records, const std
return true;
}
std::string parse_dns_public(const char *s)
{
unsigned ip0, ip1, ip2, ip3;
char c;
std::string dns_public_addr;
if (!strcmp(s, "tcp"))
{
dns_public_addr = DEFAULT_DNS_PUBLIC_ADDR;
LOG_PRINT_L0("Using default public DNS server: " << dns_public_addr << " (TCP)");
}
else if (sscanf(s, "tcp://%u.%u.%u.%u%c", &ip0, &ip1, &ip2, &ip3, &c) == 4)
{
if (ip0 > 255 || ip1 > 255 || ip2 > 255 || ip3 > 255)
{
MERROR("Invalid IP: " << s << ", using default");
}
else
{
dns_public_addr = std::string(s + strlen("tcp://"));
}
}
else
{
MERROR("Invalid DNS_PUBLIC contents, ignored");
}
return dns_public_addr;
}
} // namespace tools::dns_utils
} // namespace tools