From b18368b635ba08aea541ef52ebc74180822644a2 Mon Sep 17 00:00:00 2001 From: Thomas Winget Date: Wed, 29 Apr 2015 21:31:34 -0400 Subject: [PATCH] Allow name@domain.tld for OpenAlias lookups --- src/common/dns_utils.cpp | 34 +++++++++++++++++++++------------- src/common/dns_utils.h | 5 ++++- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/common/dns_utils.cpp b/src/common/dns_utils.cpp index ea7f1078..347cf758 100644 --- a/src/common/dns_utils.cpp +++ b/src/common/dns_utils.cpp @@ -205,13 +205,15 @@ std::vector DNSResolver::get_ipv4(const std::string& url, bool& dns dnssec_valid = false; char urlC[1000]; // waaaay too big, but just in case... - strncpy(urlC, url.c_str(), 999); - urlC[999] = '\0'; - if (!check_address_syntax(urlC)) + std::string url_copy{url}; + if (!check_address_syntax(url_copy)) { return addresses; } + strncpy(urlC, url_copy.c_str(), 999); + urlC[999] = '\0'; + // destructor takes care of cleanup ub_result_ptr result; @@ -239,14 +241,15 @@ std::vector DNSResolver::get_ipv6(const std::string& url, bool& dns dnssec_valid = false; char urlC[1000]; // waaaay too big, but just in case... - strncpy(urlC, url.c_str(), 999); - urlC[999] = '\0'; - - if (!check_address_syntax(urlC)) + std::string url_copy{url}; + if (!check_address_syntax(url_copy)) { return addresses; } + strncpy(urlC, url_copy.c_str(), 999); + urlC[999] = '\0'; + ub_result_ptr result; // call DNS resolver, blocking. if return value not zero, something went wrong @@ -273,14 +276,15 @@ std::vector DNSResolver::get_txt_record(const std::string& url, boo dnssec_valid = false; char urlC[1000]; // waaaay too big, but just in case... - strncpy(urlC, url.c_str(), 999); - urlC[999] = '\0'; - - if (!check_address_syntax(urlC)) + std::string url_copy{url}; + if (!check_address_syntax(url_copy)) { return records; } + strncpy(urlC, url_copy.c_str(), 999); + urlC[999] = '\0'; + ub_result_ptr result; // call DNS resolver, blocking. if return value not zero, something went wrong @@ -314,13 +318,17 @@ DNSResolver& DNSResolver::instance() return *staticInstance; } -bool DNSResolver::check_address_syntax(const std::string& addr) +bool DNSResolver::check_address_syntax(std::string& addr) { // if string doesn't contain a dot, we won't consider it a url for now. - if (addr.find(".") == std::string::npos) + auto first_dot = addr.find("."); + if (first_dot == std::string::npos) { return false; } + + // allow name@domain.tld to work + addr.replace(first_dot, 1, "@"); return true; } diff --git a/src/common/dns_utils.h b/src/common/dns_utils.h index a16c7eff..4e48acb0 100644 --- a/src/common/dns_utils.h +++ b/src/common/dns_utils.h @@ -112,11 +112,14 @@ private: /** * @brief Checks a string to see if it looks like a URL * + * If the address looks good, but contains one @ symbol, replace that with a . + * e.g. donate@getmonero.org becomes donate.getmonero.org + * * @param addr the string to be checked * * @return true if it looks enough like a URL, false if not */ - bool check_address_syntax(const std::string& addr); + bool check_address_syntax(std::string& addr); DNSResolverData *m_data; }; // class DNSResolver