Skip to content

Commit

Permalink
Update parse_uri to support single tx
Browse files Browse the repository at this point in the history
  • Loading branch information
U65535F committed Jan 29, 2025
1 parent bfa2c35 commit cd922c6
Showing 1 changed file with 63 additions and 14 deletions.
77 changes: 63 additions & 14 deletions src/wallet/wallet2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15146,20 +15146,69 @@ bool wallet2::parse_uri(const std::string &uri, std::vector<uri_data> &data, std

bool wallet2::parse_uri(const std::string& uri, std::string& address, std::string& payment_id, uint64_t& amount, std::string& description, std::string& recipient_name, std::unordered_map<std::string, std::string>& unknown_parameters, std::string& error)
{
std::vector<tools::wallet2::uri_data> data;
if (!this->parse_uri(uri, data, payment_id, "", unknown_parameters, error))
{
throw std::runtime_error("failed to parse URI" + uri);
return false;
}
if (data.size() > 1)
{
throw std::runtime_error("multi-recipient URIs currently unsupported");
return false;
}
address = data[0].address;
amount = data[0].amount;
recipient_name = data[0].recipient_name;
if (uri.substr(0, 7) != "monero:") {
error = std::string("URI has wrong scheme (expected \"monero:\"): ") + uri;
return false;
}

std::string remainder = uri.substr(7);
const char* ptr = strchr(remainder.c_str(), '?');
std::string address_string = ptr ? remainder.substr(0, ptr - remainder.c_str()) : remainder;

cryptonote::address_parse_info info;
if (!get_account_address_from_str(info, nettype(), address_string)) {
error = std::string("URI contains improper address: ") + address_string;
return false;
}

// Assign the parsed address
address = address_string;

if (ptr == nullptr) { // No parameters to process
return true;
}

std::string params(ptr + 1);
std::vector<std::string> arguments;
boost::split(arguments, params, boost::is_any_of("&"));
std::set<std::string> have_arg;

amount = 0; // Default amount
for (const std::string& arg : arguments) {
std::vector<std::string> kv;
boost::split(kv, arg, boost::is_any_of("="));
if (kv.size() != 2) {
error = std::string("URI has wrong parameter: ") + arg;
return false;
}

if (have_arg.find(kv[0]) != have_arg.end()) {
error = std::string("URI has more than one instance of ") + kv[0];
return false;
}
have_arg.insert(kv[0]);

if (kv[0] == "tx_amount") {
if (!cryptonote::parse_amount(amount, kv[1])) {
error = std::string("URI has invalid amount: ") + kv[1];
return false;
}
} else if (kv[0] == "tx_payment_id") {
crypto::hash hash;
if (!wallet2::parse_long_payment_id(kv[1], hash)) {
error = "Invalid payment ID: " + kv[1];
return false;
}
payment_id = kv[1];
} else if (kv[0] == "recipient_name") {
recipient_name = epee::net_utils::convert_from_url_format(kv[1]);
} else if (kv[0] == "tx_description") {
description = epee::net_utils::convert_from_url_format(kv[1]);
} else {
unknown_parameters[kv[0]] = kv[1];
}
}

return true;
}
//----------------------------------------------------------------------------------------------------
Expand Down

0 comments on commit cd922c6

Please sign in to comment.