From e6c91a15721b4886a2b0c5e228cbbb17ee87b182 Mon Sep 17 00:00:00 2001 From: Ayaz Salikhov Date: Thu, 20 Aug 2026 15:57:56 +0100 Subject: [PATCH] fix: Use credentialTypeValidator in LedgerEntry (#3185) --- src/rpc/common/Validators.hpp | 3 ++- src/rpc/handlers/LedgerEntry.cpp | 17 +++++++++++------ src/rpc/handlers/LedgerEntry.hpp | 1 + 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/rpc/common/Validators.hpp b/src/rpc/common/Validators.hpp index 5c5cccbc3..ee9527b51 100644 --- a/src/rpc/common/Validators.hpp +++ b/src/rpc/common/Validators.hpp @@ -590,7 +590,8 @@ struct CustomValidators final { /** * @brief Provides a validator for validating credential_type. * - * Used by AuthorizeCredentialValidator in deposit_preauth. + * Used by AuthorizeCredentialValidator in deposit_preauth and by the credential + * object lookup in ledger_entry. */ static CustomValidator credentialTypeValidator; }; diff --git a/src/rpc/handlers/LedgerEntry.cpp b/src/rpc/handlers/LedgerEntry.cpp index 20982b628..bef9c8666 100644 --- a/src/rpc/handlers/LedgerEntry.cpp +++ b/src/rpc/handlers/LedgerEntry.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -32,6 +33,7 @@ #include #include +#include #include #include #include @@ -422,20 +424,23 @@ tag_invoke(boost::json::value_to_tag, boost::json::va return xrpl::keylet::oracle(*account, documentId).key; }; - auto const parseCredentialFromJson = [](boost::json::value const& json) { + auto const parseCredentialFromJson = + [](boost::json::value const& json) -> std::optional { auto const subject = util::parseBase58Wrapper( boost::json::value_to(json.at(JS(subject))) ); auto const issuer = util::parseBase58Wrapper( boost::json::value_to(json.at(JS(issuer))) ); - auto const credType = + auto const credTypeOpt = xrpl::strUnHex(boost::json::value_to(json.at(JS(credential_type)))); - return xrpl::keylet::credential( - *subject, *issuer, xrpl::Slice(credType->data(), credType->size()) - ) - .key; + return credTypeOpt.transform([&](xrpl::Blob const& credType) -> xrpl::uint256 { + return xrpl::keylet::credential( + *subject, *issuer, xrpl::Slice(credType.data(), credType.size()) + ) + .key; + }); }; auto const indexFieldType = diff --git a/src/rpc/handlers/LedgerEntry.hpp b/src/rpc/handlers/LedgerEntry.hpp index 8c5b0702e..ea32d9450 100644 --- a/src/rpc/handlers/LedgerEntry.hpp +++ b/src/rpc/handlers/LedgerEntry.hpp @@ -380,6 +380,7 @@ public: meta::WithCustomError{ validation::Type{}, Status(ClioError::RpcMalformedRequest) }, + validation::CustomValidators::credentialTypeValidator, }, }}}, {JS(mpt_issuance),