From f802fdd92ceafc3e9cd14f69bf9d3cd9773a46ef Mon Sep 17 00:00:00 2001 From: John Freeman Date: Fri, 22 Sep 2023 19:07:43 -0400 Subject: [PATCH] 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 --- src/ripple/net/impl/RPCCall.cpp | 8 +++++++- src/ripple/protocol/impl/UintTypes.cpp | 10 ++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/ripple/net/impl/RPCCall.cpp b/src/ripple/net/impl/RPCCall.cpp index df758646540..1242fdc2a68 100644 --- a/src/ripple/net/impl/RPCCall.cpp +++ b/src/ripple/net/impl/RPCCall.cpp @@ -121,7 +121,13 @@ class RPCParser 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; diff --git a/src/ripple/protocol/impl/UintTypes.cpp b/src/ripple/protocol/impl/UintTypes.cpp index ff2644b085b..821e81238b0 100644 --- a/src/ripple/protocol/impl/UintTypes.cpp +++ b/src/ripple/protocol/impl/UintTypes.cpp @@ -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( - ::toupper(static_cast(c))); - }); + std::copy( + code.begin(), code.end(), currency.begin() + detail::isoCodeOffset); return true; }