From 119f3ce2e250c9545396ec055e589ad8ae9d68d2 Mon Sep 17 00:00:00 2001 From: hayzamjs Date: Wed, 7 Dec 2022 02:46:09 +0530 Subject: [PATCH 1/2] dnslink fetching: handle records being empty --- src/diardi/diardi.cpp | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/diardi/diardi.cpp b/src/diardi/diardi.cpp index 66409eae..5b618c1b 100755 --- a/src/diardi/diardi.cpp +++ b/src/diardi/diardi.cpp @@ -18,16 +18,23 @@ namespace cryptonote { Diardi::Diardi() {} bool Diardi::get_checkpoints(network_type nettype, std::string checkpoint_location) { - if (boost::filesystem::exists(checkpoint_location)) { - boost::filesystem::remove_all(checkpoint_location); - } + if(nettype == MAINNET) { + if (boost::filesystem::exists(checkpoint_location)) { + boost::filesystem::remove_all(checkpoint_location); + } + + std::string ipfs_path = fetch_dns_txt_ipfs_path(nettype); + if (ipfs_path.empty()) { + LOG_PRINT_L1("Couldn't fetch DNS TXT record from IPFS"); + return false; + } - std::string ipfs_path = fetch_dns_txt_ipfs_path(nettype); - std::string url = "https://scala.infura-ipfs.io/ipfs/" + ipfs_path; + std::string url = "https://scala.infura-ipfs.io/ipfs/" + ipfs_path; - if (!tools::download(checkpoint_location, url)) { - LOG_PRINT_L1("Error loading checkpoints from IPFS"); - return false; + if (!tools::download(checkpoint_location, url)) { + LOG_PRINT_L1("Error loading checkpoints from IPFS"); + return false; + } } return true; @@ -49,6 +56,10 @@ namespace cryptonote { } std::vector records = tools::DNSResolver::instance().get_txt_record(dns_name, available, valid); + if(records.empty()) { + return ""; + } + std::string ipfs_path = records[0]; boost::replace_all(ipfs_path, "dnslink=\"/ipfs/", ""); boost::replace_all(ipfs_path, "\"", ""); From b951a8cb68c1a63cd4c1bfb71c0aa5adc77926f0 Mon Sep 17 00:00:00 2001 From: hayzamjs Date: Sat, 24 Dec 2022 18:53:02 +0530 Subject: [PATCH 2/2] dnslink: more uncommited stuff --- src/common/dns_utils.cpp | 101 ++++++++++++++++++-- src/common/dns_utils.h | 3 +- src/cryptonote_core/cryptonote_tx_utils.cpp | 24 +---- 3 files changed, 98 insertions(+), 30 deletions(-) diff --git a/src/common/dns_utils.cpp b/src/common/dns_utils.cpp index 4624b0e7..88575a73 100644 --- a/src/common/dns_utils.cpp +++ b/src/common/dns_utils.cpp @@ -38,6 +38,8 @@ #include #include #include +#include + using namespace epee; #undef SCALA_DEFAULT_LOG_CATEGORY @@ -421,9 +423,9 @@ std::string address_from_txt_record(const std::string& s) if (pos2 != std::string::npos) { // length of address == 95, we can at least validate that much here - if (pos2 - pos == 95) + if (pos2 - pos == 97) { - return s.substr(pos, 95); + return s.substr(pos, 97); } else if (pos2 - pos == 106) // length of address == 106 --> integrated address { @@ -451,9 +453,14 @@ std::vector addresses_from_url(const std::string& url, bool& dnssec std::vector addresses; // get txt records bool dnssec_available, dnssec_isvalid; + + LOG_ERROR("Getting TXT record for " << url); + std::string oa_addr = DNSResolver::instance().get_dns_format_from_oa_address(url); auto records = DNSResolver::instance().get_txt_record(oa_addr, dnssec_available, dnssec_isvalid); + LOG_ERROR("Got " << records.size() << " records for " << url); + // TODO: update this to allow for conveying that dnssec was not available if (dnssec_available && dnssec_isvalid) { @@ -464,6 +471,7 @@ std::vector addresses_from_url(const std::string& url, bool& dnssec // for each txt record, try to find a scala address in it. for (auto& rec : records) { + LOG_ERROR("TXT record: " << rec); std::string addr = address_from_txt_record(rec); if (addr.size()) { @@ -475,14 +483,91 @@ std::vector addresses_from_url(const std::string& url, bool& dnssec std::string get_account_address_as_str_from_url(const std::string& url, bool& dnssec_valid, std::function&, bool)> dns_confirm) { - // attempt to get address from dns query - auto addresses = addresses_from_url(url, dnssec_valid); - if (addresses.empty()) + + std::vector valid_ud_tlds{ ".crypto", ".nft", ".blockchain", ".bitcoin", ".wallet", ".888", ".dao", ".x", ".klever", ".zil", ".eth" }; + + /* Check if url contains a valid TLD */ + bool valid_tld = false; + + for (const auto& tld : valid_ud_tlds) { - LOG_ERROR("wrong address: " << url); - return {}; + if (url.find(tld) != std::string::npos) + { + valid_tld = true; + break; + } + } + + if (!valid_tld) + { + // attempt to get address from dns query + auto addresses = addresses_from_url(url, dnssec_valid); + if (addresses.empty()) + { + LOG_ERROR("wrong address: " << url); + return {}; + } + return dns_confirm(url, addresses, dnssec_valid); + } + + else { + std::vector ud_addresses; + std::string ud_bridge_api = "http://ud-bridge.scalaproject.io/fetch-records/" + url; + + epee::net_utils::http::http_simple_client client; + epee::net_utils::http::url_content u_c; + + if (!epee::net_utils::parse_url(ud_bridge_api, u_c)){ + MERROR("Failed to parse URL " << ud_bridge_api); + return {}; + } + + epee::net_utils::ssl_support_t ssl_requirement = epee::net_utils::ssl_support_t::e_ssl_support_disabled; + uint16_t port = 80; + + client.set_server(u_c.host, std::to_string(port), boost::none, ssl_requirement); + epee::net_utils::http::fields_list fields; + const epee::net_utils::http::http_response_info *info = NULL; + + + if (!client.invoke_get(u_c.uri, std::chrono::seconds(5), "", &info, fields)){ + LOG_ERROR(ud_bridge_api << " is not responding, skipping."); + return {}; + } else{ + if (info->m_response_code != 200){ + LOG_ERROR("Failed to get address from " << ud_bridge_api << ", skipping."); + return {}; + } + + std::string response = info->m_body; + rapidjson::Document doc; + + + if (doc.Parse(response.c_str()).HasParseError()){ + LOG_ERROR("Failed to parse response from " << ud_bridge_api << ", skipping."); + return {}; + } + + if (!doc.HasMember("records")){ + LOG_ERROR("Failed to get records from " << ud_bridge_api << ", skipping."); + return {}; + } + + if (!doc["records"].HasMember("records")){ + LOG_ERROR("Failed to get records from " << ud_bridge_api << ", skipping."); + return {}; + } + + if (!doc["records"]["records"].HasMember("crypto.XMR.address")){ + LOG_ERROR("Failed to get XLA address from " << ud_bridge_api << ", skipping."); + return {}; + } else { + std::string address = doc["records"]["records"]["crypto.XMR.address"].GetString(); + + return address; + } + } } - return dns_confirm(url, addresses, dnssec_valid); } namespace diff --git a/src/common/dns_utils.h b/src/common/dns_utils.h index 1593b6ba..c02c61c6 100644 --- a/src/common/dns_utils.h +++ b/src/common/dns_utils.h @@ -33,6 +33,8 @@ #include #include +#include "net/http_client.h" + namespace tools { @@ -170,7 +172,6 @@ std::string get_account_address_as_str_from_url(const std::string& url, bool& dn bool load_txt_records_from_dns(std::vector &records, const std::vector &dns_urls); std::vector parse_dns_public(const char *s); - } // namespace tools::dns_utils } // namespace tools diff --git a/src/cryptonote_core/cryptonote_tx_utils.cpp b/src/cryptonote_core/cryptonote_tx_utils.cpp index 6746e58c..d9888981 100644 --- a/src/cryptonote_core/cryptonote_tx_utils.cpp +++ b/src/cryptonote_core/cryptonote_tx_utils.cpp @@ -188,30 +188,12 @@ namespace cryptonote std::list mainnet_addresses = {}; std::list testnet_addresses = { - "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" + "", + "" }; std::list stagenet_addresses = { - "StS1K3UWjCYfPUaK3cCR9t8EcEBwK2ttYUkX7VF2UJW6YCfqUHghttoXAwUcd97MkaJPJ6zrbYh6tfKJHYx1PdRg8A6q8CwBuz:43852ce87de58100462cd48b8b2b40be723710f6e1a5e88bfc8760ba03ba8a2f", + "", "StS1Bvcb33MQ9EpqUVzBwEfsU3523GfZr8Rwm2tA1KjbCs9p4L8xK3h5eJ3HEx3b9HEqYTceqB3r1Tw2u6EqmYSZ46kd5arWS4:046d45a0f08a5b72d754100ab9e863a130fe5647e12c6be6f20a6d10de46ef30", "StS1ef6jTsWDDZ7CDpAYVEFhEQNANgSX26bfscJUuUNSci4R9tchPwQeDTvXf1yY9ARddZiNXnXo2eck5XpxY3Hx7PkEfn8qnb:f15f3854f949098e48719fde5957d8f7ba398d2a1921778276b51fddd7d57bd1", "StS1X45Z1QEQGvY2EYz3BHHWkFyWiEKTu2ExjtdGe9CqFeRmMPDk2uhYukGUmYbHJeKzqEhD5msQqcxidHakujUc3EvPuZhrvq:adf9a925e38b263be592dd805462b953c46adf3f58076aeeaee06846c6578ef8"