fix: accept all valid currency codes in API (#4566)

A few methods, including `book_offers`, take currency codes as
parameters. The XRPL doesn't care if the letters in those codes are
lowercase or uppercase, as long as they come from an alphabet defined
internally. rippled doesn't care either, when they are submitted in a
hex representation. When they are submitted in an ASCII string
representation, rippled, but not XRPL, is more restrictive, preventing
clients from interacting with some currencies already in the XRPL.

This change gets rippled out of the way and lets clients submit currency
codes in ASCII using the full alphabet.

Fixes #4112
This commit is contained in:
John Freeman
2023-09-22 19:07:43 -04:00
committed by GitHub
parent e4db0fba2b
commit 6b61505ac2
2 changed files with 9 additions and 9 deletions

View File

@@ -121,7 +121,13 @@ private:
static Json::Value
jvParseCurrencyIssuer(std::string const& strCurrencyIssuer)
{
static boost::regex reCurIss("\\`([[:alpha:]]{3})(?:/(.+))?\\'");
// Matches a sequence of 3 characters from
// `ripple::detail::isoCharSet` (the currency),
// optionally followed by a forward slash and some other characters
// (the issuer).
// https://www.boost.org/doc/libs/1_82_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html
static boost::regex reCurIss(
"\\`([][:alnum:]<>(){}[|?!@#$%^&*]{3})(?:/(.+))?\\'");
boost::smatch smMatch;

View File

@@ -93,14 +93,8 @@ to_currency(Currency& currency, std::string const& code)
currency = beast::zero;
std::transform(
code.begin(),
code.end(),
currency.begin() + detail::isoCodeOffset,
[](auto c) {
return static_cast<unsigned char>(
::toupper(static_cast<unsigned char>(c)));
});
std::copy(
code.begin(), code.end(), currency.begin() + detail::isoCodeOffset);
return true;
}