aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Winget <tewinget@gmail.com>2015-04-29 21:31:34 -0400
committerThomas Winget <tewinget@gmail.com>2015-04-29 21:31:34 -0400
commitb18368b635ba08aea541ef52ebc74180822644a2 (patch)
tree6182c3a269af8ac820f1306b446c219833a9eef4
parentupdate lmdb64 (diff)
downloadmonero-b18368b635ba08aea541ef52ebc74180822644a2.tar.xz
Allow name@domain.tld for OpenAlias lookups
-rw-r--r--src/common/dns_utils.cpp34
-rw-r--r--src/common/dns_utils.h5
2 files changed, 25 insertions, 14 deletions
diff --git a/src/common/dns_utils.cpp b/src/common/dns_utils.cpp
index ea7f1078b..347cf758a 100644
--- a/src/common/dns_utils.cpp
+++ b/src/common/dns_utils.cpp
@@ -205,13 +205,15 @@ std::vector<std::string> 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<std::string> 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<std::string> 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 a16c7eff7..4e48acb09 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