diff --git a/src/ripple/net/impl/RPCCall.cpp b/src/ripple/net/impl/RPCCall.cpp index b9de9880b..1c872732b 100644 --- a/src/ripple/net/impl/RPCCall.cpp +++ b/src/ripple/net/impl/RPCCall.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -568,37 +569,67 @@ private: // account_offers | [] Json::Value parseAccountItems (Json::Value const& jvParams) { - return parseAccountRaw (jvParams, false); + return parseAccountRaw1 (jvParams); } Json::Value parseAccountCurrencies (Json::Value const& jvParams) { - return parseAccountRaw (jvParams, false); + return parseAccountRaw1 (jvParams); } // account_lines |"" [] Json::Value parseAccountLines (Json::Value const& jvParams) { - return parseAccountRaw (jvParams, true); + return parseAccountRaw2 (jvParams, "peer"); + } + + Json::Value parseAccountRaw2 (Json::Value const& jvParams, + char const * const acc2Field) + { + std::array accFields{{jss::account, acc2Field}}; + auto const nParams = jvParams.size (); + Json::Value jvRequest (Json::objectValue); + for (auto i = 0; i < nParams; ++i) + { + std::string const strParam = jvParams[i].asString (); + + // Parameters 0 and 1 may be accounts + if ((i < 2) && (parseBase58 ( + TokenType::TOKEN_ACCOUNT_PUBLIC, strParam) || + parseBase58 (strParam) || + parseGenericSeed (strParam))) + { + jvRequest[accFields[i]] = strParam; + continue; + } + + // Parameters 1 and 2 may be ledgers, but only if it's the last param + if (i > 0 && i == nParams - 1) + { + if (jvParseLedger (jvRequest, strParam)) + return jvRequest; + } + if (i == 3) + return rpcError (rpcLGR_IDX_MALFORMED); + return rpcError (rpcACT_MALFORMED); + } + + return jvRequest; } // TODO: Get index from an alternate syntax: rXYZ: - Json::Value parseAccountRaw (Json::Value const& jvParams, bool bPeer) + Json::Value parseAccountRaw1 (Json::Value const& jvParams) { std::string strIdent = jvParams[0u].asString (); unsigned int iCursor = jvParams.size (); bool bStrict = false; - std::string strPeer; - if (!bPeer && iCursor >= 2 && jvParams[iCursor - 1] == jss::strict) + if (iCursor >= 2 && jvParams[iCursor - 1] == jss::strict) { bStrict = true; --iCursor; } - if (bPeer && iCursor >= 2) - strPeer = jvParams[iCursor].asString (); - if (! parseBase58(TokenType::TOKEN_ACCOUNT_PUBLIC, strIdent) && ! parseBase58(strIdent) && ! parseGenericSeed(strIdent)) @@ -612,17 +643,7 @@ private: if (bStrict) jvRequest[jss::strict] = 1; - if (!strPeer.empty ()) - { - if (! parseBase58(TokenType::TOKEN_ACCOUNT_PUBLIC, strPeer) && - ! parseBase58(strPeer) && - ! parseGenericSeed (strPeer)) - return rpcError (rpcACT_MALFORMED); - - jvRequest["peer"] = strPeer; - } - - if (iCursor == (2 + bPeer) && !jvParseLedger (jvRequest, jvParams[1u + bPeer].asString ())) + if (iCursor == 2 && !jvParseLedger (jvRequest, jvParams[1u].asString ())) return rpcError (rpcLGR_IDX_MALFORMED); return jvRequest;