Allow name@domain.tld for OpenAlias lookups
Based on tewinget's update. Make OpenAlias address format independent of existing DNS functions. Add tests. Test: make debug-test cd build/debug/tests/unit_tests # test that regular DNS functions work, including IPv4 lookups. # also test function that converts OpenAlias address format make && ./unit_tests --gtest_filter=DNSResolver* # test that OpenAlias addresses like donate@getmonero.org work from # wallet tools make && ./unit_tests --gtest_filter=AddressFromURL.Success
This commit is contained in:
parent
a0fe18f63a
commit
fee8424938
|
@ -304,6 +304,19 @@ std::vector<std::string> DNSResolver::get_txt_record(const std::string& url, boo
|
|||
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()
|
||||
{
|
||||
static DNSResolver* staticInstance = NULL;
|
||||
|
|
|
@ -100,6 +100,18 @@ public:
|
|||
// TODO: modify this to accomodate DNSSEC
|
||||
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
|
||||
*
|
||||
|
|
|
@ -1016,7 +1016,8 @@ std::vector<std::string> wallet2::addresses_from_url(const std::string& url, boo
|
|||
std::vector<std::string> addresses;
|
||||
// get txt records
|
||||
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
|
||||
if (dnssec_available && dnssec_isvalid)
|
||||
|
|
|
@ -93,6 +93,14 @@ TEST(AddressFromURL, Success)
|
|||
{
|
||||
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)
|
||||
|
|
|
@ -148,4 +148,12 @@ TEST(DNSResolver, GetTXTRecord)
|
|||
{
|
||||
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