Merge pull request #290
fee8424
Allow name@domain.tld for OpenAlias lookups (warptangent)a0fe18f
Revert "Allow name@domain.tld for OpenAlias lookups" (warptangent)
This commit is contained in:
commit
6f15194049
|
@ -205,15 +205,13 @@ std::vector<std::string> DNSResolver::get_ipv4(const std::string& url, bool& dns
|
||||||
dnssec_valid = false;
|
dnssec_valid = false;
|
||||||
char urlC[1000]; // waaaay too big, but just in case...
|
char urlC[1000]; // waaaay too big, but just in case...
|
||||||
|
|
||||||
std::string url_copy{url};
|
strncpy(urlC, url.c_str(), 999);
|
||||||
if (!check_address_syntax(url_copy))
|
urlC[999] = '\0';
|
||||||
|
if (!check_address_syntax(urlC))
|
||||||
{
|
{
|
||||||
return addresses;
|
return addresses;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(urlC, url_copy.c_str(), 999);
|
|
||||||
urlC[999] = '\0';
|
|
||||||
|
|
||||||
// destructor takes care of cleanup
|
// destructor takes care of cleanup
|
||||||
ub_result_ptr result;
|
ub_result_ptr result;
|
||||||
|
|
||||||
|
@ -241,15 +239,14 @@ std::vector<std::string> DNSResolver::get_ipv6(const std::string& url, bool& dns
|
||||||
dnssec_valid = false;
|
dnssec_valid = false;
|
||||||
char urlC[1000]; // waaaay too big, but just in case...
|
char urlC[1000]; // waaaay too big, but just in case...
|
||||||
|
|
||||||
std::string url_copy{url};
|
strncpy(urlC, url.c_str(), 999);
|
||||||
if (!check_address_syntax(url_copy))
|
urlC[999] = '\0';
|
||||||
|
|
||||||
|
if (!check_address_syntax(urlC))
|
||||||
{
|
{
|
||||||
return addresses;
|
return addresses;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(urlC, url_copy.c_str(), 999);
|
|
||||||
urlC[999] = '\0';
|
|
||||||
|
|
||||||
ub_result_ptr result;
|
ub_result_ptr result;
|
||||||
|
|
||||||
// call DNS resolver, blocking. if return value not zero, something went wrong
|
// call DNS resolver, blocking. if return value not zero, something went wrong
|
||||||
|
@ -276,15 +273,14 @@ std::vector<std::string> DNSResolver::get_txt_record(const std::string& url, boo
|
||||||
dnssec_valid = false;
|
dnssec_valid = false;
|
||||||
char urlC[1000]; // waaaay too big, but just in case...
|
char urlC[1000]; // waaaay too big, but just in case...
|
||||||
|
|
||||||
std::string url_copy{url};
|
strncpy(urlC, url.c_str(), 999);
|
||||||
if (!check_address_syntax(url_copy))
|
urlC[999] = '\0';
|
||||||
|
|
||||||
|
if (!check_address_syntax(urlC))
|
||||||
{
|
{
|
||||||
return records;
|
return records;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(urlC, url_copy.c_str(), 999);
|
|
||||||
urlC[999] = '\0';
|
|
||||||
|
|
||||||
ub_result_ptr result;
|
ub_result_ptr result;
|
||||||
|
|
||||||
// call DNS resolver, blocking. if return value not zero, something went wrong
|
// call DNS resolver, blocking. if return value not zero, something went wrong
|
||||||
|
@ -308,6 +304,19 @@ std::vector<std::string> DNSResolver::get_txt_record(const std::string& url, boo
|
||||||
return records;
|
return records;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string DNSResolver::get_dns_format_from_oa_address(const std::string& oa_addr)
|
||||||
|
{
|
||||||
|
std::string addr(oa_addr);
|
||||||
|
auto first_at = addr.find("@");
|
||||||
|
if (first_at == std::string::npos)
|
||||||
|
return addr;
|
||||||
|
|
||||||
|
// convert name@domain.tld to name.domain.tld
|
||||||
|
addr.replace(first_at, 1, ".");
|
||||||
|
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
DNSResolver& DNSResolver::instance()
|
DNSResolver& DNSResolver::instance()
|
||||||
{
|
{
|
||||||
static DNSResolver* staticInstance = NULL;
|
static DNSResolver* staticInstance = NULL;
|
||||||
|
@ -318,17 +327,13 @@ DNSResolver& DNSResolver::instance()
|
||||||
return *staticInstance;
|
return *staticInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DNSResolver::check_address_syntax(std::string& addr)
|
bool DNSResolver::check_address_syntax(const std::string& addr)
|
||||||
{
|
{
|
||||||
// if string doesn't contain a dot, we won't consider it a url for now.
|
// if string doesn't contain a dot, we won't consider it a url for now.
|
||||||
auto first_dot = addr.find(".");
|
if (addr.find(".") == std::string::npos)
|
||||||
if (first_dot == std::string::npos)
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// allow name@domain.tld to work
|
|
||||||
addr.replace(first_dot, 1, "@");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -100,6 +100,18 @@ public:
|
||||||
// TODO: modify this to accomodate DNSSEC
|
// TODO: modify this to accomodate DNSSEC
|
||||||
std::vector<std::string> get_txt_record(const std::string& url, bool& dnssec_available, bool& dnssec_valid);
|
std::vector<std::string> get_txt_record(const std::string& url, bool& dnssec_available, bool& dnssec_valid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets a DNS address from OpenAlias format
|
||||||
|
*
|
||||||
|
* If the address looks good, but contains one @ symbol, replace that with a .
|
||||||
|
* e.g. donate@getmonero.org becomes donate.getmonero.org
|
||||||
|
*
|
||||||
|
* @param oa_addr OpenAlias address
|
||||||
|
*
|
||||||
|
* @return dns_addr DNS address
|
||||||
|
*/
|
||||||
|
std::string get_dns_format_from_oa_address(const std::string& oa_addr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Gets the singleton instance of DNSResolver
|
* @brief Gets the singleton instance of DNSResolver
|
||||||
*
|
*
|
||||||
|
@ -112,14 +124,11 @@ private:
|
||||||
/**
|
/**
|
||||||
* @brief Checks a string to see if it looks like a URL
|
* @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
|
* @param addr the string to be checked
|
||||||
*
|
*
|
||||||
* @return true if it looks enough like a URL, false if not
|
* @return true if it looks enough like a URL, false if not
|
||||||
*/
|
*/
|
||||||
bool check_address_syntax(std::string& addr);
|
bool check_address_syntax(const std::string& addr);
|
||||||
|
|
||||||
DNSResolverData *m_data;
|
DNSResolverData *m_data;
|
||||||
}; // class DNSResolver
|
}; // class DNSResolver
|
||||||
|
|
|
@ -1016,7 +1016,8 @@ std::vector<std::string> wallet2::addresses_from_url(const std::string& url, boo
|
||||||
std::vector<std::string> addresses;
|
std::vector<std::string> addresses;
|
||||||
// get txt records
|
// get txt records
|
||||||
bool dnssec_available, dnssec_isvalid;
|
bool dnssec_available, dnssec_isvalid;
|
||||||
auto records = tools::DNSResolver::instance().get_txt_record(url, dnssec_available, dnssec_isvalid);
|
std::string oa_addr = tools::DNSResolver::instance().get_dns_format_from_oa_address(url);
|
||||||
|
auto records = tools::DNSResolver::instance().get_txt_record(oa_addr, dnssec_available, dnssec_isvalid);
|
||||||
|
|
||||||
// TODO: update this to allow for conveying that dnssec was not available
|
// TODO: update this to allow for conveying that dnssec was not available
|
||||||
if (dnssec_available && dnssec_isvalid)
|
if (dnssec_available && dnssec_isvalid)
|
||||||
|
|
|
@ -93,6 +93,14 @@ TEST(AddressFromURL, Success)
|
||||||
{
|
{
|
||||||
EXPECT_STREQ(addr.c_str(), addresses[0].c_str());
|
EXPECT_STREQ(addr.c_str(), addresses[0].c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OpenAlias address with an @ instead of first .
|
||||||
|
addresses = tools::wallet2::addresses_from_url("donate@getmonero.org", dnssec_result);
|
||||||
|
EXPECT_EQ(1, addresses.size());
|
||||||
|
if (addresses.size() == 1)
|
||||||
|
{
|
||||||
|
EXPECT_STREQ(addr.c_str(), addresses[0].c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(AddressFromURL, Failure)
|
TEST(AddressFromURL, Failure)
|
||||||
|
|
|
@ -148,4 +148,12 @@ TEST(DNSResolver, GetTXTRecord)
|
||||||
{
|
{
|
||||||
std::cout << "TXT record for donate.getmonero.org: " << rec << std::endl;
|
std::cout << "TXT record for donate.getmonero.org: " << rec << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// replace first @ with .
|
||||||
|
std::string addr = tools::DNSResolver::instance().get_dns_format_from_oa_address("donate@getmonero.org");
|
||||||
|
EXPECT_STREQ("donate.getmonero.org", addr.c_str());
|
||||||
|
|
||||||
|
// no change
|
||||||
|
addr = tools::DNSResolver::instance().get_dns_format_from_oa_address("donate.getmonero.org");
|
||||||
|
EXPECT_STREQ("donate.getmonero.org", addr.c_str());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue