aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/dns_utils.cpp13
-rw-r--r--src/common/dns_utils.h12
-rw-r--r--src/wallet/wallet2.cpp3
-rw-r--r--tests/unit_tests/address_from_url.cpp8
-rw-r--r--tests/unit_tests/dns_resolver.cpp8
5 files changed, 43 insertions, 1 deletions
diff --git a/src/common/dns_utils.cpp b/src/common/dns_utils.cpp
index ea7f1078b..98e3d0ea6 100644
--- a/src/common/dns_utils.cpp
+++ b/src/common/dns_utils.cpp
@@ -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;
diff --git a/src/common/dns_utils.h b/src/common/dns_utils.h
index a16c7eff7..d98523a30 100644
--- a/src/common/dns_utils.h
+++ b/src/common/dns_utils.h
@@ -101,6 +101,18 @@ public:
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
*
* @return returns a pointer to the singleton
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 6698e7296..7928e1c62 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -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)
diff --git a/tests/unit_tests/address_from_url.cpp b/tests/unit_tests/address_from_url.cpp
index fe2f072de..99df75d74 100644
--- a/tests/unit_tests/address_from_url.cpp
+++ b/tests/unit_tests/address_from_url.cpp
@@ -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)
diff --git a/tests/unit_tests/dns_resolver.cpp b/tests/unit_tests/dns_resolver.cpp
index 6717e990a..0709a773f 100644
--- a/tests/unit_tests/dns_resolver.cpp
+++ b/tests/unit_tests/dns_resolver.cpp
@@ -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());
}