refactor: Structure global validators better (#1484)

refactor: #1170 Structure global validators better
This commit is contained in:
yinyiqian1
2024-06-27 09:55:17 -04:00
committed by GitHub
parent 72f9a8fe78
commit 2ff51ff416
29 changed files with 231 additions and 190 deletions

View File

@@ -69,7 +69,7 @@ checkIsU32Numeric(std::string_view sv)
return ec == std::errc();
}
CustomValidator Uint256HexStringValidator =
CustomValidator CustomValidators::Uint256HexStringValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_string())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
@@ -81,7 +81,7 @@ CustomValidator Uint256HexStringValidator =
return MaybeError{};
}};
CustomValidator LedgerIndexValidator =
CustomValidator CustomValidators::LedgerIndexValidator =
CustomValidator{[](boost::json::value const& value, std::string_view /* key */) -> MaybeError {
auto err = Error{Status{RippledError::rpcINVALID_PARAMS, "ledgerIndexMalformed"}};
@@ -95,7 +95,7 @@ CustomValidator LedgerIndexValidator =
return MaybeError{};
}};
CustomValidator AccountValidator =
CustomValidator CustomValidators::AccountValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_string())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
@@ -108,7 +108,7 @@ CustomValidator AccountValidator =
return MaybeError{};
}};
CustomValidator AccountBase58Validator =
CustomValidator CustomValidators::AccountBase58Validator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_string())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
@@ -120,7 +120,7 @@ CustomValidator AccountBase58Validator =
return MaybeError{};
}};
CustomValidator AccountMarkerValidator =
CustomValidator CustomValidators::AccountMarkerValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_string())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
@@ -135,7 +135,7 @@ CustomValidator AccountMarkerValidator =
return MaybeError{};
}};
CustomValidator CurrencyValidator =
CustomValidator CustomValidators::CurrencyValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_string())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
@@ -151,7 +151,7 @@ CustomValidator CurrencyValidator =
return MaybeError{};
}};
CustomValidator IssuerValidator =
CustomValidator CustomValidators::IssuerValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_string())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
@@ -171,7 +171,7 @@ CustomValidator IssuerValidator =
return MaybeError{};
}};
CustomValidator SubscribeStreamValidator =
CustomValidator CustomValidators::SubscribeStreamValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_array())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotArray"}};
@@ -197,7 +197,7 @@ CustomValidator SubscribeStreamValidator =
return MaybeError{};
}};
CustomValidator SubscribeAccountsValidator =
CustomValidator CustomValidators::SubscribeAccountsValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_array())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotArray"}};
@@ -218,7 +218,7 @@ CustomValidator SubscribeAccountsValidator =
return MaybeError{};
}};
CustomValidator CurrencyIssueValidator =
CustomValidator CustomValidators::CurrencyIssueValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (not value.is_object())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotObject"}};

View File

@@ -428,70 +428,75 @@ public:
checkIsU32Numeric(std::string_view sv);
/**
* @brief Provides a commonly used validator for ledger index.
*
* LedgerIndex must be a string or an int. If the specified LedgerIndex is a string, its value must be either
* "validated" or a valid integer value represented as a string.
* @brief A group of custom validation functions
*/
extern CustomValidator LedgerIndexValidator;
struct CustomValidators final {
/**
* @brief Provides a commonly used validator for ledger index.
*
* LedgerIndex must be a string or an int. If the specified LedgerIndex is a string, its value must be either
* "validated" or a valid integer value represented as a string.
*/
static CustomValidator LedgerIndexValidator;
/**
* @brief Provides a commonly used validator for accounts.
*
* Account must be a string and the converted public key is valid.
*/
extern CustomValidator AccountValidator;
/**
* @brief Provides a commonly used validator for accounts.
*
* Account must be a string and the converted public key is valid.
*/
static CustomValidator AccountValidator;
/**
* @brief Provides a commonly used validator for accounts.
*
* Account must be a string and can convert to base58.
*/
extern CustomValidator AccountBase58Validator;
/**
* @brief Provides a commonly used validator for accounts.
*
* Account must be a string and can convert to base58.
*/
static CustomValidator AccountBase58Validator;
/**
* @brief Provides a commonly used validator for markers.
*
* A marker is composed of a comma-separated index and a start hint.
* The former will be read as hex, and the latter can be cast to uint64.
*/
extern CustomValidator AccountMarkerValidator;
/**
* @brief Provides a commonly used validator for markers.
*
* A marker is composed of a comma-separated index and a start hint.
* The former will be read as hex, and the latter can be cast to uint64.
*/
static CustomValidator AccountMarkerValidator;
/**
* @brief Provides a commonly used validator for uint256 hex string.
*
* It must be a string and also a decodable hex.
* Transaction index, ledger hash all use this validator.
*/
extern CustomValidator Uint256HexStringValidator;
/**
* @brief Provides a commonly used validator for uint256 hex string.
*
* It must be a string and also a decodable hex.
* Transaction index, ledger hash all use this validator.
*/
static CustomValidator Uint256HexStringValidator;
/**
* @brief Provides a commonly used validator for currency, including standard currency code and token code.
*/
extern CustomValidator CurrencyValidator;
/**
* @brief Provides a commonly used validator for currency, including standard currency code and token code.
*/
static CustomValidator CurrencyValidator;
/**
* @brief Provides a commonly used validator for issuer type.
*
* It must be a hex string or base58 string.
*/
extern CustomValidator IssuerValidator;
/**
* @brief Provides a commonly used validator for issuer type.
*
* It must be a hex string or base58 string.
*/
static CustomValidator IssuerValidator;
/**
* @brief Provides a validator for validating streams used in subscribe/unsubscribe.
*/
extern CustomValidator SubscribeStreamValidator;
/**
* @brief Provides a validator for validating streams used in subscribe/unsubscribe.
*/
static CustomValidator SubscribeStreamValidator;
/**
* @brief Provides a validator for validating accounts used in subscribe/unsubscribe.
*/
extern CustomValidator SubscribeAccountsValidator;
/**
* @brief Provides a validator for validating accounts used in subscribe/unsubscribe.
*/
static CustomValidator SubscribeAccountsValidator;
/**
* @brief Validates an asset (ripple::Issue).
*
* Used by amm_info.
*/
extern CustomValidator CurrencyIssueValidator;
/**
* @brief Validates an asset (ripple::Issue).
*
* Used by amm_info.
*/
static CustomValidator CurrencyIssueValidator;
};
} // namespace rpc::validation

View File

@@ -231,15 +231,17 @@ AMMInfoHandler::spec([[maybe_unused]] uint32_t apiVersion)
}};
static auto const rpcSpec = RpcSpec{
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(asset),
meta::WithCustomError{
validation::Type<std::string, boost::json::object>{}, Status(RippledError::rpcISSUE_MALFORMED)
},
meta::IfType<std::string>{stringIssueValidator},
meta::IfType<boost::json::object>{
meta::WithCustomError{validation::CurrencyIssueValidator, Status(RippledError::rpcISSUE_MALFORMED)},
meta::WithCustomError{
validation::CustomValidators::CurrencyIssueValidator, Status(RippledError::rpcISSUE_MALFORMED)
},
}},
{JS(asset2),
meta::WithCustomError{
@@ -247,10 +249,14 @@ AMMInfoHandler::spec([[maybe_unused]] uint32_t apiVersion)
},
meta::IfType<std::string>{stringIssueValidator},
meta::IfType<boost::json::object>{
meta::WithCustomError{validation::CurrencyIssueValidator, Status(RippledError::rpcISSUE_MALFORMED)},
meta::WithCustomError{
validation::CustomValidators::CurrencyIssueValidator, Status(RippledError::rpcISSUE_MALFORMED)
},
}},
{JS(amm_account), meta::WithCustomError{validation::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
{JS(account), meta::WithCustomError{validation::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
{JS(amm_account),
meta::WithCustomError{validation::CustomValidators::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
{JS(account),
meta::WithCustomError{validation::CustomValidators::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
};
return rpcSpec;

View File

@@ -123,15 +123,15 @@ public:
spec([[maybe_unused]] uint32_t apiVersion)
{
static auto const rpcSpec = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator},
{JS(destination_account), validation::Type<std::string>{}, validation::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(destination_account), validation::Type<std::string>{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(limit),
validation::Type<uint32_t>{},
validation::Min(1u),
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(marker), validation::AccountMarkerValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(marker), validation::CustomValidators::AccountMarkerValidator},
};
return rpcSpec;

View File

@@ -92,9 +92,9 @@ public:
spec([[maybe_unused]] uint32_t apiVersion)
{
static auto const rpcSpec = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{"account_index", check::Deprecated{}},
{JS(strict), check::Deprecated{}}
};

View File

@@ -130,11 +130,11 @@ public:
spec([[maybe_unused]] uint32_t apiVersion)
{
static auto const rpcSpecV1 = RpcSpec{
{JS(account), validation::AccountValidator},
{JS(ident), validation::AccountValidator},
{JS(account), validation::CustomValidators::AccountValidator},
{JS(ident), validation::CustomValidators::AccountValidator},
{JS(ident), check::Deprecated{}},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(ledger), check::Deprecated{}},
{JS(strict), check::Deprecated{}}
};

View File

@@ -127,16 +127,21 @@ public:
static auto const rpcSpec = RpcSpec{
{JS(account),
validation::Required{},
meta::WithCustomError{validation::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
{JS(peer), meta::WithCustomError{validation::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
meta::WithCustomError{
validation::CustomValidators::AccountValidator, Status(RippledError::rpcACT_MALFORMED)
}},
{JS(peer),
meta::WithCustomError{
validation::CustomValidators::AccountValidator, Status(RippledError::rpcACT_MALFORMED)
}},
{JS(ignore_default), validation::Type<bool>{}},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(limit),
validation::Type<uint32_t>{},
validation::Min(1u),
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(marker), validation::AccountMarkerValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(marker), validation::CustomValidators::AccountMarkerValidator},
{JS(ledger), check::Deprecated{}},
{"peer_index", check::Deprecated{}},
};

View File

@@ -97,10 +97,10 @@ public:
spec([[maybe_unused]] uint32_t apiVersion)
{
static auto const rpcSpec = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(marker), validation::Uint256HexStringValidator},
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(marker), validation::CustomValidators::Uint256HexStringValidator},
{JS(limit),
validation::Type<uint32_t>{},
validation::Min(1u),

View File

@@ -113,9 +113,9 @@ public:
{
auto const& ledgerTypeStrs = util::getLedgerEntryTypeStrs();
static auto const rpcSpec = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(limit),
validation::Type<uint32_t>{},
validation::Min(1u),
@@ -123,7 +123,7 @@ public:
{JS(type),
validation::Type<std::string>{},
validation::OneOf<std::string>(ledgerTypeStrs.cbegin(), ledgerTypeStrs.cend())},
{JS(marker), validation::AccountMarkerValidator},
{JS(marker), validation::CustomValidators::AccountMarkerValidator},
{JS(deletion_blockers_only), validation::Type<bool>{}},
};

View File

@@ -112,10 +112,10 @@ public:
spec([[maybe_unused]] uint32_t apiVersion)
{
static auto const rpcSpec = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(marker), validation::AccountMarkerValidator},
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(marker), validation::CustomValidators::AccountMarkerValidator},
{JS(limit),
validation::Type<uint32_t>{},
validation::Min(1u),

View File

@@ -125,9 +125,9 @@ public:
{
auto const& typesKeysInLowercase = util::getTxTypesInLowercase();
static auto const rpcSpecForV1 = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(ledger_index_min), validation::Type<int32_t>{}},
{JS(ledger_index_max), validation::Type<int32_t>{}},
{JS(limit),

View File

@@ -89,8 +89,8 @@ public:
spec([[maybe_unused]] uint32_t apiVersion)
{
static auto const rpcSpec = RpcSpec{
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
};
return rpcSpec;

View File

@@ -112,9 +112,13 @@ public:
meta::Section{
{JS(currency),
validation::Required{},
meta::WithCustomError{validation::CurrencyValidator, Status(RippledError::rpcDST_AMT_MALFORMED)}},
meta::WithCustomError{
validation::CustomValidators::CurrencyValidator, Status(RippledError::rpcDST_AMT_MALFORMED)
}},
{JS(issuer),
meta::WithCustomError{validation::IssuerValidator, Status(RippledError::rpcDST_ISR_MALFORMED)}}
meta::WithCustomError{
validation::CustomValidators::IssuerValidator, Status(RippledError::rpcDST_ISR_MALFORMED)
}}
}},
{JS(taker_pays),
validation::Required{},
@@ -122,21 +126,26 @@ public:
meta::Section{
{JS(currency),
validation::Required{},
meta::WithCustomError{validation::CurrencyValidator, Status(RippledError::rpcSRC_CUR_MALFORMED)}},
meta::WithCustomError{
validation::CustomValidators::CurrencyValidator, Status(RippledError::rpcSRC_CUR_MALFORMED)
}},
{JS(issuer),
meta::WithCustomError{validation::IssuerValidator, Status(RippledError::rpcSRC_ISR_MALFORMED)}}
meta::WithCustomError{
validation::CustomValidators::IssuerValidator, Status(RippledError::rpcSRC_ISR_MALFORMED)
}}
}},
// return INVALID_PARAMS if account format is wrong for "taker"
{JS(taker),
meta::WithCustomError{
validation::AccountValidator, Status(RippledError::rpcINVALID_PARAMS, "Invalid field 'taker'.")
validation::CustomValidators::AccountValidator,
Status(RippledError::rpcINVALID_PARAMS, "Invalid field 'taker'.")
}},
{JS(limit),
validation::Type<uint32_t>{},
validation::Min(1u),
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
};
return rpcSpec;

View File

@@ -95,10 +95,10 @@ public:
spec([[maybe_unused]] uint32_t apiVersion)
{
static auto const rpcSpec = RpcSpec{
{JS(source_account), validation::Required{}, validation::AccountValidator},
{JS(destination_account), validation::Required{}, validation::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(source_account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(destination_account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
};
return rpcSpec;

View File

@@ -138,9 +138,9 @@ public:
}};
static auto const rpcSpec = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(hotwallet), hotWalletValidator}
};

View File

@@ -152,7 +152,8 @@ public:
if (!maybeError)
return maybeError;
maybeError = validation::AccountBase58Validator.verify(oracle.as_object(), JS(account));
maybeError =
validation::CustomValidators::AccountBase58Validator.verify(oracle.as_object(), JS(account));
if (!maybeError)
return Error{Status{RippledError::rpcINVALID_PARAMS}};
};
@@ -161,17 +162,21 @@ public:
}};
static auto const rpcSpec = RpcSpec{
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
// validate quoteAsset and base_asset in accordance to the currency code found in XRPL doc:
// https://xrpl.org/docs/references/protocol/data-types/currency-formats#currency-codes
// usually Clio returns rpcMALFORMED_CURRENCY , return InvalidParam here just to mimic rippled
{JS(base_asset),
validation::Required{},
meta::WithCustomError{validation::CurrencyValidator, Status(RippledError::rpcINVALID_PARAMS)}},
meta::WithCustomError{
validation::CustomValidators::CurrencyValidator, Status(RippledError::rpcINVALID_PARAMS)
}},
{JS(quote_asset),
validation::Required{},
meta::WithCustomError{validation::CurrencyValidator, Status(RippledError::rpcINVALID_PARAMS)}},
meta::WithCustomError{
validation::CustomValidators::CurrencyValidator, Status(RippledError::rpcINVALID_PARAMS)
}},
{JS(oracles), validation::Required{}, oraclesValidator},
// note: Unlike `rippled`, Clio only supports UInt as input, no string, no `null`, etc.
{JS(time_threshold), validation::Type<std::uint32_t>{}},

View File

@@ -111,8 +111,8 @@ public:
{JS(accounts), check::Deprecated{}},
{JS(owner_funds), validation::Type<bool>{}},
{JS(queue), validation::Type<bool>{}, validation::NotSupported{true}},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(transactions), validation::Type<bool>{}},
{JS(expand), validation::Type<bool>{}},
{JS(binary), validation::Type<bool>{}},

View File

@@ -118,12 +118,12 @@ public:
static auto const rpcSpec = RpcSpec{
{JS(binary), validation::Type<bool>{}},
{"out_of_order", validation::Type<bool>{}},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(limit), validation::Type<uint32_t>{}, validation::Min(1u)},
{JS(marker),
validation::Type<uint32_t, std::string>{},
meta::IfType<std::string>{validation::Uint256HexStringValidator}},
meta::IfType<std::string>{validation::CustomValidators::Uint256HexStringValidator}},
{JS(type),
meta::WithCustomError{
validation::Type<std::string>{}, Status{ripple::rpcINVALID_PARAMS, "Invalid field 'type', not string."}

View File

@@ -146,8 +146,9 @@ public:
return MaybeError{};
}};
static auto const malformedRequestHexStringValidator =
meta::WithCustomError{validation::Uint256HexStringValidator, Status(ClioError::rpcMALFORMED_REQUEST)};
static auto const malformedRequestHexStringValidator = meta::WithCustomError{
validation::CustomValidators::Uint256HexStringValidator, Status(ClioError::rpcMALFORMED_REQUEST)
};
static auto const malformedRequestIntValidator =
meta::WithCustomError{validation::Type<uint32_t>{}, Status(ClioError::rpcMALFORMED_REQUEST)};
@@ -156,27 +157,27 @@ public:
meta::IfType<boost::json::object>{meta::Section{
{ripple::sfLockingChainDoor.getJsonName().c_str(),
validation::Required{},
validation::AccountBase58Validator},
validation::CustomValidators::AccountBase58Validator},
{ripple::sfIssuingChainDoor.getJsonName().c_str(),
validation::Required{},
validation::AccountBase58Validator},
validation::CustomValidators::AccountBase58Validator},
{ripple::sfLockingChainIssue.getJsonName().c_str(),
validation::Required{},
validation::CurrencyIssueValidator},
validation::CustomValidators::CurrencyIssueValidator},
{ripple::sfIssuingChainIssue.getJsonName().c_str(),
validation::Required{},
validation::CurrencyIssueValidator},
validation::CustomValidators::CurrencyIssueValidator},
}},
Status(ClioError::rpcMALFORMED_REQUEST)
};
static auto const rpcSpec = RpcSpec{
{JS(binary), validation::Type<bool>{}},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(index), malformedRequestHexStringValidator},
{JS(account_root), validation::AccountBase58Validator},
{JS(did), validation::AccountBase58Validator},
{JS(account_root), validation::CustomValidators::AccountBase58Validator},
{JS(did), validation::CustomValidators::AccountBase58Validator},
{JS(check), malformedRequestHexStringValidator},
{JS(deposit_preauth),
validation::Type<std::string, boost::json::object>{},
@@ -185,16 +186,18 @@ public:
meta::Section{
{JS(owner),
validation::Required{},
meta::WithCustomError{validation::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)}},
{JS(authorized), validation::Required{}, validation::AccountBase58Validator},
meta::WithCustomError{
validation::CustomValidators::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)
}},
{JS(authorized), validation::Required{}, validation::CustomValidators::AccountBase58Validator},
},
}},
{JS(directory),
validation::Type<std::string, boost::json::object>{},
meta::IfType<std::string>{malformedRequestHexStringValidator},
meta::IfType<boost::json::object>{meta::Section{
{JS(owner), validation::AccountBase58Validator},
{JS(dir_root), validation::Uint256HexStringValidator},
{JS(owner), validation::CustomValidators::AccountBase58Validator},
{JS(dir_root), validation::CustomValidators::Uint256HexStringValidator},
{JS(sub_index), malformedRequestIntValidator}
}}},
{JS(escrow),
@@ -204,7 +207,9 @@ public:
meta::Section{
{JS(owner),
validation::Required{},
meta::WithCustomError{validation::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)}},
meta::WithCustomError{
validation::CustomValidators::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)
}},
{JS(seq), validation::Required{}, malformedRequestIntValidator},
},
}},
@@ -213,7 +218,7 @@ public:
meta::IfType<std::string>{malformedRequestHexStringValidator},
meta::IfType<boost::json::object>{
meta::Section{
{JS(account), validation::Required{}, validation::AccountBase58Validator},
{JS(account), validation::Required{}, validation::CustomValidators::AccountBase58Validator},
{JS(seq), validation::Required{}, malformedRequestIntValidator},
},
}},
@@ -222,14 +227,14 @@ public:
validation::Type<boost::json::object>{},
meta::Section{
{JS(accounts), validation::Required{}, rippleStateAccountsCheck},
{JS(currency), validation::Required{}, validation::CurrencyValidator},
{JS(currency), validation::Required{}, validation::CustomValidators::CurrencyValidator},
}},
{JS(ticket),
validation::Type<std::string, boost::json::object>{},
meta::IfType<std::string>{malformedRequestHexStringValidator},
meta::IfType<boost::json::object>{
meta::Section{
{JS(account), validation::Required{}, validation::AccountBase58Validator},
{JS(account), validation::Required{}, validation::CustomValidators::AccountBase58Validator},
{JS(ticket_seq), validation::Required{}, malformedRequestIntValidator},
},
}},
@@ -244,20 +249,22 @@ public:
meta::WithCustomError{
validation::Type<boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)
},
validation::CurrencyIssueValidator},
validation::CustomValidators::CurrencyIssueValidator},
{JS(asset2),
meta::WithCustomError{validation::Required{}, Status(ClioError::rpcMALFORMED_REQUEST)},
meta::WithCustomError{
validation::Type<boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)
},
validation::CurrencyIssueValidator},
validation::CustomValidators::CurrencyIssueValidator},
},
}},
{JS(bridge),
meta::WithCustomError{validation::Type<boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)},
bridgeJsonValidator},
{JS(bridge_account),
meta::WithCustomError{validation::AccountBase58Validator, Status(ClioError::rpcMALFORMED_REQUEST)}},
meta::WithCustomError{
validation::CustomValidators::AccountBase58Validator, Status(ClioError::rpcMALFORMED_REQUEST)
}},
{JS(xchain_owned_claim_id),
meta::WithCustomError{
validation::Type<std::string, boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)
@@ -292,7 +299,9 @@ public:
meta::IfType<boost::json::object>{meta::Section{
{JS(account),
meta::WithCustomError{validation::Required{}, Status(ClioError::rpcMALFORMED_REQUEST)},
meta::WithCustomError{validation::AccountBase58Validator, Status(ClioError::rpcMALFORMED_ADDRESS)}},
meta::WithCustomError{
validation::CustomValidators::AccountBase58Validator, Status(ClioError::rpcMALFORMED_ADDRESS)
}},
// note: Unlike `rippled`, Clio only supports UInt as input, no string, no `null`, etc.:
{JS(oracle_document_id),
meta::WithCustomError{validation::Required{}, Status(ClioError::rpcMALFORMED_REQUEST)},

View File

@@ -119,9 +119,9 @@ public:
spec([[maybe_unused]] uint32_t apiVersion)
{
static auto const rpcSpec = RpcSpec{
{JS(nft_id), validation::Required{}, validation::Uint256HexStringValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(nft_id), validation::Required{}, validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(ledger_index_min), validation::Type<int32_t>{}},
{JS(ledger_index_max), validation::Type<int32_t>{}},
{JS(binary), validation::Type<bool>{}},

View File

@@ -95,9 +95,9 @@ public:
spec([[maybe_unused]] uint32_t apiVersion)
{
static auto const rpcSpec = RpcSpec{
{JS(nft_id), validation::Required{}, validation::Uint256HexStringValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(nft_id), validation::Required{}, validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
};
return rpcSpec;

View File

@@ -99,14 +99,14 @@ public:
spec([[maybe_unused]] uint32_t apiVersion)
{
static auto const rpcSpec = RpcSpec{
{JS(nft_id), validation::Required{}, validation::Uint256HexStringValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(nft_id), validation::Required{}, validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(limit),
validation::Type<uint32_t>{},
validation::Min(1u),
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
{JS(marker), validation::Uint256HexStringValidator},
{JS(marker), validation::CustomValidators::Uint256HexStringValidator},
};
return rpcSpec;

View File

@@ -95,15 +95,15 @@ public:
spec([[maybe_unused]] uint32_t apiVersion)
{
static auto const rpcSpec = RpcSpec{
{JS(issuer), validation::Required{}, validation::AccountValidator},
{JS(issuer), validation::Required{}, validation::CustomValidators::AccountValidator},
{"nft_taxon", validation::Type<uint32_t>{}},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(limit),
validation::Type<uint32_t>{},
validation::Min(1u),
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
{JS(marker), validation::Uint256HexStringValidator},
{JS(marker), validation::CustomValidators::Uint256HexStringValidator},
};
return rpcSpec;

View File

@@ -105,14 +105,14 @@ public:
spec([[maybe_unused]] uint32_t apiVersion)
{
static auto const rpcSpecV1 = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator},
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(role),
validation::Required{},
meta::WithCustomError{
validation::OneOf{"gateway", "user"}, Status{RippledError::rpcINVALID_PARAMS, "role field is invalid"}
}},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(limit),
validation::Type<uint32_t>(),
validation::Min(1u),

View File

@@ -79,7 +79,7 @@ SubscribeHandler::spec([[maybe_unused]] uint32_t apiVersion)
if (book.as_object().contains("taker")) {
if (auto err = meta::WithCustomError(
validation::AccountValidator,
validation::CustomValidators::AccountValidator,
Status{RippledError::rpcBAD_ISSUER, "Issuer account malformed."}
)
.verify(book.as_object(), "taker");
@@ -96,9 +96,9 @@ SubscribeHandler::spec([[maybe_unused]] uint32_t apiVersion)
}};
static auto const rpcSpec = RpcSpec{
{JS(streams), validation::SubscribeStreamValidator},
{JS(accounts), validation::SubscribeAccountsValidator},
{JS(accounts_proposed), validation::SubscribeAccountsValidator},
{JS(streams), validation::CustomValidators::SubscribeStreamValidator},
{JS(accounts), validation::CustomValidators::SubscribeAccountsValidator},
{JS(accounts_proposed), validation::CustomValidators::SubscribeAccountsValidator},
{JS(books), booksValidator},
{"user", check::Deprecated{}},
{JS(password), check::Deprecated{}},

View File

@@ -95,9 +95,9 @@ public:
static auto const rpcSpec = RpcSpec{
{JS(tx_hash),
meta::WithCustomError{validation::Required{}, Status(ClioError::rpcFIELD_NOT_FOUND_TRANSACTION)},
validation::Uint256HexStringValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
};
return rpcSpec;

View File

@@ -117,7 +117,7 @@ public:
spec(uint32_t apiVersion)
{
static RpcSpec const rpcSpecForV1 = {
{JS(transaction), validation::Uint256HexStringValidator},
{JS(transaction), validation::CustomValidators::Uint256HexStringValidator},
{JS(min_ledger), validation::Type<uint32_t>{}},
{JS(max_ledger), validation::Type<uint32_t>{}},
{JS(ctid), validation::Type<std::string>{}},

View File

@@ -77,9 +77,9 @@ UnsubscribeHandler::spec([[maybe_unused]] uint32_t apiVersion)
}};
static auto const rpcSpec = RpcSpec{
{JS(streams), validation::SubscribeStreamValidator},
{JS(accounts), validation::SubscribeAccountsValidator},
{JS(accounts_proposed), validation::SubscribeAccountsValidator},
{JS(streams), validation::CustomValidators::SubscribeStreamValidator},
{JS(accounts), validation::CustomValidators::SubscribeAccountsValidator},
{JS(accounts_proposed), validation::CustomValidators::SubscribeAccountsValidator},
{JS(books), booksValidator},
{JS(url), check::Deprecated{}},
{JS(rt_accounts), check::Deprecated{}},

View File

@@ -294,7 +294,7 @@ TEST_F(RPCBaseTest, IfTypeValidator)
Section{{"limit", Required{}, Type<uint32_t>{}, Between<uint32_t>{0, 100}}},
Section{{"limit2", Required{}, Type<uint32_t>{}, Between<uint32_t>{0, 100}}}
},
IfType<std::string>{Uint256HexStringValidator}},
IfType<std::string>{CustomValidators::Uint256HexStringValidator}},
{"mix2",
Section{{"limit", Required{}, Type<uint32_t>{}, Between<uint32_t>{0, 100}}},
Type<std::string, json::object>{}},
@@ -329,8 +329,10 @@ TEST_F(RPCBaseTest, IfTypeValidator)
TEST_F(RPCBaseTest, WithCustomError)
{
auto const spec = RpcSpec{
{"transaction", WithCustomError{Uint256HexStringValidator, rpc::Status{ripple::rpcBAD_FEATURE, "MyCustomError"}}
},
{"transaction",
WithCustomError{
CustomValidators::Uint256HexStringValidator, rpc::Status{ripple::rpcBAD_FEATURE, "MyCustomError"}
}},
{"other", WithCustomError{Type<std::string>{}, rpc::Status{ripple::rpcALREADY_MULTISIG, "MyCustomError2"}}}
};
@@ -390,7 +392,7 @@ TEST_F(RPCBaseTest, NotSupported)
TEST_F(RPCBaseTest, LedgerIndexValidator)
{
auto spec = RpcSpec{
{"ledgerIndex", LedgerIndexValidator},
{"ledgerIndex", CustomValidators::LedgerIndexValidator},
};
auto passingInput = json::parse(R"({ "ledgerIndex": "validated" })");
ASSERT_TRUE(spec.process(passingInput));
@@ -415,7 +417,7 @@ TEST_F(RPCBaseTest, LedgerIndexValidator)
TEST_F(RPCBaseTest, AccountValidator)
{
auto spec = RpcSpec{
{"account", AccountValidator},
{"account", CustomValidators::AccountValidator},
};
auto failingInput = json::parse(R"({ "account": 256 })");
ASSERT_FALSE(spec.process(failingInput));
@@ -437,7 +439,7 @@ TEST_F(RPCBaseTest, AccountValidator)
TEST_F(RPCBaseTest, AccountMarkerValidator)
{
auto spec = RpcSpec{
{"marker", AccountMarkerValidator},
{"marker", CustomValidators::AccountMarkerValidator},
};
auto failingInput = json::parse(R"({ "marker": 256 })");
ASSERT_FALSE(spec.process(failingInput));
@@ -454,7 +456,7 @@ TEST_F(RPCBaseTest, AccountMarkerValidator)
TEST_F(RPCBaseTest, Uint256HexStringValidator)
{
auto const spec = RpcSpec{{"transaction", Uint256HexStringValidator}};
auto const spec = RpcSpec{{"transaction", CustomValidators::Uint256HexStringValidator}};
auto passingInput =
json::parse(R"({ "transaction": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC"})");
ASSERT_TRUE(spec.process(passingInput));
@@ -472,7 +474,7 @@ TEST_F(RPCBaseTest, Uint256HexStringValidator)
TEST_F(RPCBaseTest, CurrencyValidator)
{
auto const spec = RpcSpec{{"currency", CurrencyValidator}};
auto const spec = RpcSpec{{"currency", CustomValidators::CurrencyValidator}};
auto passingInput = json::parse(R"({ "currency": "GBP"})");
ASSERT_TRUE(spec.process(passingInput));
@@ -500,7 +502,7 @@ TEST_F(RPCBaseTest, CurrencyValidator)
TEST_F(RPCBaseTest, IssuerValidator)
{
auto const spec = RpcSpec{{"issuer", IssuerValidator}};
auto const spec = RpcSpec{{"issuer", CustomValidators::IssuerValidator}};
auto passingInput = json::parse(R"({ "issuer": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn"})");
ASSERT_TRUE(spec.process(passingInput));
@@ -516,7 +518,7 @@ TEST_F(RPCBaseTest, IssuerValidator)
TEST_F(RPCBaseTest, SubscribeStreamValidator)
{
auto const spec = RpcSpec{{"streams", SubscribeStreamValidator}};
auto const spec = RpcSpec{{"streams", CustomValidators::SubscribeStreamValidator}};
auto passingInput = json::parse(
R"({
"streams":
@@ -548,7 +550,7 @@ TEST_F(RPCBaseTest, SubscribeStreamValidator)
TEST_F(RPCBaseTest, SubscribeAccountsValidator)
{
auto const spec = RpcSpec{{"accounts", SubscribeAccountsValidator}};
auto const spec = RpcSpec{{"accounts", CustomValidators::SubscribeAccountsValidator}};
auto passingInput =
json::parse(R"({ "accounts": ["rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn","rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun"]})");
ASSERT_TRUE(spec.process(passingInput));