From fa8405df835369bf1f3cd0d816049832e742c967 Mon Sep 17 00:00:00 2001 From: Nathan Nichols Date: Wed, 15 Jun 2022 16:19:08 -0500 Subject: [PATCH] return no offers when an owner directory is not found (#176) --- src/rpc/RPCHelpers.cpp | 2 +- src/rpc/handlers/AccountChannels.cpp | 6 ++++++ src/rpc/handlers/AccountCurrencies.cpp | 6 ++++++ src/rpc/handlers/AccountLines.cpp | 6 ++++++ src/rpc/handlers/AccountObjects.cpp | 7 ++++--- src/rpc/handlers/AccountOffers.cpp | 6 ++++++ 6 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/rpc/RPCHelpers.cpp b/src/rpc/RPCHelpers.cpp index e5ba2189..2f123a06 100644 --- a/src/rpc/RPCHelpers.cpp +++ b/src/rpc/RPCHelpers.cpp @@ -764,7 +764,7 @@ traverseOwnedNodes( backend.fetchLedgerObject(currentIndex.key, sequence, yield); if (!ownerDir) - return Status(ripple::rpcACT_NOT_FOUND); + break; ripple::SerialIter it{ownerDir->data(), ownerDir->size()}; ripple::SLE sle{it, currentIndex.key}; diff --git a/src/rpc/handlers/AccountChannels.cpp b/src/rpc/handlers/AccountChannels.cpp index 07ef86cf..cc95bf7f 100644 --- a/src/rpc/handlers/AccountChannels.cpp +++ b/src/rpc/handlers/AccountChannels.cpp @@ -58,6 +58,12 @@ doAccountChannels(Context const& context) if (auto const status = getAccount(request, accountID); status) return status; + auto rawAcct = context.backend->fetchLedgerObject( + ripple::keylet::account(accountID).key, lgrInfo.seq, context.yield); + + if (!rawAcct) + return Status{Error::rpcACT_NOT_FOUND, "accountNotFound"}; + ripple::AccountID destAccount; if (auto const status = getAccount(request, destAccount, JS(destination_account)); diff --git a/src/rpc/handlers/AccountCurrencies.cpp b/src/rpc/handlers/AccountCurrencies.cpp index 25278dff..1521d5a9 100644 --- a/src/rpc/handlers/AccountCurrencies.cpp +++ b/src/rpc/handlers/AccountCurrencies.cpp @@ -28,6 +28,12 @@ doAccountCurrencies(Context const& context) if (auto const status = getAccount(request, accountID); status) return status; + auto rawAcct = context.backend->fetchLedgerObject( + ripple::keylet::account(accountID).key, lgrInfo.seq, context.yield); + + if (!rawAcct) + return Status{Error::rpcACT_NOT_FOUND, "accountNotFound"}; + std::set send, receive; auto const addToResponse = [&](ripple::SLE const& sle) { if (sle.getType() == ripple::ltRIPPLE_STATE) diff --git a/src/rpc/handlers/AccountLines.cpp b/src/rpc/handlers/AccountLines.cpp index 66eb701c..29af1f4e 100644 --- a/src/rpc/handlers/AccountLines.cpp +++ b/src/rpc/handlers/AccountLines.cpp @@ -103,6 +103,12 @@ doAccountLines(Context const& context) if (auto const status = getAccount(request, accountID); status) return status; + auto rawAcct = context.backend->fetchLedgerObject( + ripple::keylet::account(accountID).key, lgrInfo.seq, context.yield); + + if (!rawAcct) + return Status{Error::rpcACT_NOT_FOUND, "accountNotFound"}; + ripple::AccountID peerAccount; if (auto const status = getAccount(request, peerAccount, JS(peer)); status) return status; diff --git a/src/rpc/handlers/AccountObjects.cpp b/src/rpc/handlers/AccountObjects.cpp index 95caf05a..47150cc9 100644 --- a/src/rpc/handlers/AccountObjects.cpp +++ b/src/rpc/handlers/AccountObjects.cpp @@ -47,9 +47,10 @@ doAccountNFTs(Context const& context) if (!accountID) return Status{Error::rpcINVALID_PARAMS, "malformedAccount"}; - // TODO: just check for existence without pulling - if (!context.backend->fetchLedgerObject( - ripple::keylet::account(accountID).key, lgrInfo.seq, context.yield)) + auto rawAcct = context.backend->fetchLedgerObject( + ripple::keylet::account(accountID).key, lgrInfo.seq, context.yield); + + if (!rawAcct) return Status{Error::rpcACT_NOT_FOUND, "accountNotFound"}; // limit controls the number of pages being returned. each page could have diff --git a/src/rpc/handlers/AccountOffers.cpp b/src/rpc/handlers/AccountOffers.cpp index 675e626d..e056c8d7 100644 --- a/src/rpc/handlers/AccountOffers.cpp +++ b/src/rpc/handlers/AccountOffers.cpp @@ -80,6 +80,12 @@ doAccountOffers(Context const& context) if (auto const status = getAccount(request, accountID); status) return status; + auto rawAcct = context.backend->fetchLedgerObject( + ripple::keylet::account(accountID).key, lgrInfo.seq, context.yield); + + if (!rawAcct) + return Status{Error::rpcACT_NOT_FOUND, "accountNotFound"}; + std::uint32_t limit = 200; if (auto const status = getLimit(request, limit); status) return status;