// The previous version of the lookupLedger command would accept the // "ledger_index" argument as a string and silently treat it as a request to // return the current ledger which, while not strictly wrong, could cause a lot // of confusion. // // The code now robustly validates the input and ensures that the only possible // values for the "ledger_index" parameter are the index of a ledger passed as // an integer or one of the strings "current", "closed" or "validated". // Additionally, the code ensures that the value passed in "ledger_hash" is a // string and a valid hash. Invalid values will return an appropriate error // code. // // In the absence of the "ledger_hash" or "ledger_index" parameters, the code // assumes that "ledger_index" has the value "current". // // Returns a Json::objectValue. If there was an error, it will be in that // return value. Otherwise, the object contains the field "validated" and // optionally the fields "ledger_hash", "ledger_index" and // "ledger_current_index", if they are defined. Status lookupLedgerDeprecated ( Ledger::pointer& ledger, Context& context, Json::Value& result) { if (auto status = ledgerFromRequest (ledger, context)) return status; auto& info = ledger->info(); if (!info.open) { result[jss::ledger_hash] = to_string (info.hash); result[jss::ledger_index] = info.seq; } else { result[jss::ledger_current_index] = info.seq; } result[jss::validated] = getApp().getLedgerMaster().isValidLedger(info); return Status::OK; }
// The previous version of the lookupLedger command would accept the // "ledger_index" argument as a string and silently treat it as a request to // return the current ledger which, while not strictly wrong, could cause a lot // of confusion. // // The code now robustly validates the input and ensures that the only possible // values for the "ledger_index" parameter are the index of a ledger passed as // an integer or one of the strings "current", "closed" or "validated". // Additionally, the code ensures that the value passed in "ledger_hash" is a // string and a valid hash. Invalid values will return an appropriate error // code. // // In the absence of the "ledger_hash" or "ledger_index" parameters, the code // assumes that "ledger_index" has the value "current". // // Returns a Json::objectValue. If there was an error, it will be in that // return value. Otherwise, the object contains the field "validated" and // optionally the fields "ledger_hash", "ledger_index" and // "ledger_current_index", if they are defined. Status lookupLedger ( Json::Value const& params, Ledger::pointer& ledger, NetworkOPs& netOps, Json::Value& jsonResult) { if (auto status = ledgerFromRequest (params, ledger, netOps)) return status; if (ledger->isClosed ()) { jsonResult[jss::ledger_hash] = to_string (ledger->getHash()); jsonResult[jss::ledger_index] = ledger->getLedgerSeq(); } else { jsonResult[jss::ledger_current_index] = ledger->getLedgerSeq(); } jsonResult[jss::validated] = isValidated (*ledger); return Status::OK; }
// The previous version of the lookupLedger command would accept the // "ledger_index" argument as a string and silently treat it as a request to // return the current ledger which, while not strictly wrong, could cause a lot // of confusion. // // The code now robustly validates the input and ensures that the only possible // values for the "ledger_index" parameter are the index of a ledger passed as // an integer or one of the strings "current", "closed" or "validated". // Additionally, the code ensures that the value passed in "ledger_hash" is a // string and a valid hash. Invalid values will return an appropriate error // code. // // In the absence of the "ledger_hash" or "ledger_index" parameters, the code // assumes that "ledger_index" has the value "current". // // Returns a Json::objectValue. If there was an error, it will be in that // return value. Otherwise, the object contains the field "validated" and // optionally the fields "ledger_hash", "ledger_index" and // "ledger_current_index", if they are defined. Status lookupLedger ( std::shared_ptr<ReadView const>& ledger, Context& context, Json::Value& result) { if (auto status = ledgerFromRequest (ledger, context)) return status; auto& info = ledger->info(); if (!info.open) { result[jss::ledger_hash] = to_string (info.hash); result[jss::ledger_index] = info.seq; } else { result[jss::ledger_current_index] = info.seq; } result[jss::validated] = isValidated (context.ledgerMaster, *ledger, context.app); return Status::OK; }