Change vault_info to take vault_id or owner&seq

This commit is contained in:
Bronek Kozicki
2025-04-07 11:29:04 +01:00
parent e1e8859137
commit 442795bfeb
7 changed files with 194 additions and 50 deletions

View File

@@ -687,6 +687,7 @@ JSS(validations); // out: AmendmentTableImpl
JSS(validator_list_threshold); // out: ValidatorList JSS(validator_list_threshold); // out: ValidatorList
JSS(validator_sites); // out: ValidatorSites JSS(validator_sites); // out: ValidatorSites
JSS(value); // out: STAmount JSS(value); // out: STAmount
JSS(vault_id); // in: VaultInfo
JSS(version); // out: RPCVersion JSS(version); // out: RPCVersion
JSS(vetoed); // out: AmendmentTableImpl JSS(vetoed); // out: AmendmentTableImpl
JSS(volume_a); // out: BookChanges JSS(volume_a); // out: BookChanges

View File

@@ -1575,11 +1575,10 @@ class Vault_test : public beast::unit_test::suite
} }
{ {
testcase("RPC vault_info json by owner and sequence"); testcase("RPC vault_info json");
Json::Value jvParams; Json::Value jvParams;
jvParams[jss::ledger_index] = jss::validated; jvParams[jss::ledger_index] = jss::validated;
jvParams[jss::vault][jss::owner] = owner.human(); jvParams[jss::vault_id] = strHex(keylet.key);
jvParams[jss::vault][jss::seq] = sequence;
auto jv = env.rpc("json", "vault_info", to_string(jvParams)); auto jv = env.rpc("json", "vault_info", to_string(jvParams));
BEAST_EXPECT(!jv[jss::result].isMember(jss::error)); BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
@@ -1589,18 +1588,126 @@ class Vault_test : public beast::unit_test::suite
jv[jss::result][jss::vault][jss::shares]); jv[jss::result][jss::vault][jss::shares]);
} }
{
testcase("RPC vault_info json invalid index");
Json::Value jvParams;
jvParams[jss::ledger_index] = jss::validated;
jvParams[jss::vault_id] = 0;
auto jv = env.rpc("json", "vault_info", to_string(jvParams));
BEAST_EXPECT(
jv[jss::result][jss::error].asString() == "malformedRequest");
}
{
testcase("RPC vault_info json by owner and sequence");
Json::Value jvParams;
jvParams[jss::ledger_index] = jss::validated;
jvParams[jss::owner] = owner.human();
jvParams[jss::seq] = sequence;
auto jv = env.rpc("json", "vault_info", to_string(jvParams));
BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
check(
jv[jss::result][jss::vault],
jv[jss::result][jss::vault][jss::shares]);
}
{
testcase("RPC vault_info json malformed sequence");
Json::Value jvParams;
jvParams[jss::ledger_index] = jss::validated;
jvParams[jss::owner] = owner.human();
jvParams[jss::seq] = "foobar";
auto jv = env.rpc("json", "vault_info", to_string(jvParams));
BEAST_EXPECT(
jv[jss::result][jss::error].asString() == "malformedRequest");
}
{
testcase("RPC vault_info json malformed owner");
Json::Value jvParams;
jvParams[jss::ledger_index] = jss::validated;
jvParams[jss::owner] = "foobar";
jvParams[jss::seq] = sequence;
auto jv = env.rpc("json", "vault_info", to_string(jvParams));
BEAST_EXPECT(
jv[jss::result][jss::error].asString() == "malformedRequest");
}
{
testcase("RPC vault_info json invalid combination only owner");
Json::Value jvParams;
jvParams[jss::ledger_index] = jss::validated;
jvParams[jss::owner] = owner.human();
auto jv = env.rpc("json", "vault_info", to_string(jvParams));
BEAST_EXPECT(
jv[jss::result][jss::error].asString() == "malformedRequest");
}
{
testcase("RPC vault_info json invalid combination only seq");
Json::Value jvParams;
jvParams[jss::ledger_index] = jss::validated;
jvParams[jss::seq] = sequence;
auto jv = env.rpc("json", "vault_info", to_string(jvParams));
BEAST_EXPECT(
jv[jss::result][jss::error].asString() == "malformedRequest");
}
{
testcase("RPC vault_info json invalid combination seq vault_id");
Json::Value jvParams;
jvParams[jss::ledger_index] = jss::validated;
jvParams[jss::vault_id] = strHex(keylet.key);
jvParams[jss::seq] = sequence;
auto jv = env.rpc("json", "vault_info", to_string(jvParams));
BEAST_EXPECT(
jv[jss::result][jss::error].asString() == "malformedRequest");
}
{
testcase("RPC vault_info json invalid combination owner vault_id");
Json::Value jvParams;
jvParams[jss::ledger_index] = jss::validated;
jvParams[jss::vault_id] = strHex(keylet.key);
jvParams[jss::owner] = owner.human();
auto jv = env.rpc("json", "vault_info", to_string(jvParams));
BEAST_EXPECT(
jv[jss::result][jss::error].asString() == "malformedRequest");
}
{
testcase(
"RPC vault_info json invalid combination owner seq vault_id");
Json::Value jvParams;
jvParams[jss::ledger_index] = jss::validated;
jvParams[jss::vault_id] = strHex(keylet.key);
jvParams[jss::seq] = sequence;
jvParams[jss::owner] = owner.human();
auto jv = env.rpc("json", "vault_info", to_string(jvParams));
BEAST_EXPECT(
jv[jss::result][jss::error].asString() == "malformedRequest");
}
{
testcase("RPC vault_info json no input");
Json::Value jvParams;
jvParams[jss::ledger_index] = jss::validated;
auto jv = env.rpc("json", "vault_info", to_string(jvParams));
BEAST_EXPECT(
jv[jss::result][jss::error].asString() == "malformedRequest");
}
{ {
testcase("RPC vault_info command line invalid index"); testcase("RPC vault_info command line invalid index");
Json::Value jv = env.rpc("vault_info", "0", "validated"); Json::Value jv = env.rpc("vault_info", "foobar", "validated");
BEAST_EXPECT(jv[jss::error].asString() == "invalidParams"); BEAST_EXPECT(jv[jss::error].asString() == "invalidParams");
} }
{ {
testcase("RPC vault_info json invalid index"); testcase("RPC vault_info command line invalid index");
Json::Value jvParams; Json::Value jv = env.rpc("vault_info", "0", "validated");
jvParams[jss::ledger_index] = jss::validated;
jvParams[jss::vault] = 0;
auto jv = env.rpc("json", "vault_info", to_string(jvParams));
BEAST_EXPECT( BEAST_EXPECT(
jv[jss::result][jss::error].asString() == "malformedRequest"); jv[jss::result][jss::error].asString() == "malformedRequest");
} }

View File

@@ -870,11 +870,9 @@ private:
uint256 id = beast::zero; uint256 id = beast::zero;
if (!id.parseHex(strVaultID)) if (!id.parseHex(strVaultID))
return rpcError(rpcINVALID_PARAMS); return rpcError(rpcINVALID_PARAMS);
if (id == beast::zero)
return rpcError(rpcINVALID_PARAMS);
Json::Value jvRequest(Json::objectValue); Json::Value jvRequest(Json::objectValue);
jvRequest[jss::vault] = strVaultID; jvRequest[jss::vault_id] = strVaultID;
if (jvParams.size() > 1) if (jvParams.size() > 1)
jvParseLedger(jvRequest, jvParams[1u].asString()); jvParseLedger(jvRequest, jvParams[1u].asString());

View File

@@ -1141,36 +1141,5 @@ getLedgerByContext(RPC::JsonContext& context)
rpcNOT_READY, "findCreate failed to return an inbound ledger"); rpcNOT_READY, "findCreate failed to return an inbound ledger");
} }
std::optional<uint256>
parseVault(Json::Value const& params, Json::Value& jvResult)
{
if (!params.isObject())
{
uint256 uNodeIndex;
if (!uNodeIndex.parseHex(params.asString()))
{
jvResult[jss::error] = "malformedRequest";
return std::nullopt;
}
return uNodeIndex;
}
if (!params.isMember(jss::owner) || !params.isMember(jss::seq) ||
!params[jss::seq].isIntegral())
{
jvResult[jss::error] = "malformedRequest";
return std::nullopt;
}
auto const id = parseBase58<AccountID>(params[jss::owner].asString());
if (!id)
{
jvResult[jss::error] = "malformedOwner";
return std::nullopt;
}
return keylet::vault(*id, params[jss::seq].asUInt()).key;
}
} // namespace RPC } // namespace RPC
} // namespace ripple } // namespace ripple

View File

@@ -270,10 +270,6 @@ keypairForSignature(
Json::Value& error, Json::Value& error,
unsigned int apiVersion = apiVersionIfUnspecified); unsigned int apiVersion = apiVersionIfUnspecified);
// Used by both VaultInfo and LedgerEntry
std::optional<uint256>
parseVault(Json::Value const& params, Json::Value& jvResult);
} // namespace RPC } // namespace RPC
} // namespace ripple } // namespace ripple

View File

@@ -856,7 +856,32 @@ parsePermissionedDomains(Json::Value const& pd, Json::Value& jvResult)
static std::optional<uint256> static std::optional<uint256>
parseVault(Json::Value const& params, Json::Value& jvResult) parseVault(Json::Value const& params, Json::Value& jvResult)
{ {
return RPC::parseVault(params, jvResult); if (!params.isObject())
{
uint256 uNodeIndex;
if (!uNodeIndex.parseHex(params.asString()))
{
jvResult[jss::error] = "malformedRequest";
return std::nullopt;
}
return uNodeIndex;
}
if (!params.isMember(jss::owner) || !params.isMember(jss::seq) ||
!params[jss::seq].isIntegral())
{
jvResult[jss::error] = "malformedRequest";
return std::nullopt;
}
auto const id = parseBase58<AccountID>(params[jss::owner].asString());
if (!id)
{
jvResult[jss::error] = "malformedOwner";
return std::nullopt;
}
return keylet::vault(*id, params[jss::seq].asUInt()).key;
} }
using FunctionType = using FunctionType =

View File

@@ -29,6 +29,55 @@
namespace ripple { namespace ripple {
static std::optional<uint256>
parseVault(Json::Value const& params, Json::Value& jvResult)
{
if (!params.isObject())
{
jvResult[jss::error] = "malformedRequest";
return std::nullopt;
}
auto const hasVaultId = params.isMember(jss::vault_id);
auto const hasOwner = params.isMember(jss::owner);
auto const hasSeq = params.isMember(jss::seq);
uint256 uNodeIndex = beast::zero;
if (hasVaultId && !hasOwner && !hasSeq)
{
if (!uNodeIndex.parseHex(params[jss::vault_id].asString()))
{
jvResult[jss::error] = "malformedRequest";
return std::nullopt;
}
// else uNodeIndex holds the value we need
}
else if (!hasVaultId && hasOwner && hasSeq)
{
auto const id = parseBase58<AccountID>(params[jss::owner].asString());
if (!id)
{
jvResult[jss::error] = "malformedOwner";
return std::nullopt;
}
else if (!params[jss::seq].isIntegral())
{
jvResult[jss::error] = "malformedRequest";
return std::nullopt;
}
uNodeIndex = keylet::vault(*id, params[jss::seq].asUInt()).key;
}
else
{
// Invalid combination of fields vault_id/owner/seq
jvResult[jss::error] = "malformedRequest";
return std::nullopt;
}
return uNodeIndex;
}
Json::Value Json::Value
doVaultInfo(RPC::JsonContext& context) doVaultInfo(RPC::JsonContext& context)
{ {
@@ -39,8 +88,7 @@ doVaultInfo(RPC::JsonContext& context)
return jvResult; return jvResult;
auto const uNodeIndex = auto const uNodeIndex =
RPC::parseVault(context.params[jss::vault], jvResult) parseVault(context.params, jvResult).value_or(beast::zero);
.value_or(beast::zero);
if (uNodeIndex == beast::zero) if (uNodeIndex == beast::zero)
{ {
jvResult[jss::error] = "malformedRequest"; jvResult[jss::error] = "malformedRequest";