jsonrpc: don't ignore invalid params to listaddresses

This commit is contained in:
Antoine Poinsot 2023-11-11 14:17:55 +01:00
parent d5338201d2
commit 0812a12166
No known key found for this signature in database
GPG Key ID: E13FC145CD3F4304
2 changed files with 36 additions and 13 deletions

View File

@ -136,21 +136,28 @@ fn list_coins(control: &DaemonControl, params: Option<Params>) -> Result<serde_j
Ok(serde_json::json!(&res))
}
fn get_opt_u32<Q>(params: &Option<Params>, index: usize, name: &Q) -> Result<Option<u32>, Error>
where
String: std::borrow::Borrow<Q>,
Q: ?Sized + Ord + Eq + std::hash::Hash + std::fmt::Display,
{
Ok(
if let Some(i) = params.as_ref().and_then(|p| p.get(index, name)) {
Some(i.as_u64().and_then(|i| i.try_into().ok()).ok_or_else(|| {
Error::invalid_params(format!("Invalid value for '{}': {}", name, i))
})?)
} else {
None
},
)
}
fn list_addresses(
control: &DaemonControl,
params: Option<Params>,
) -> Result<serde_json::Value, Error> {
let start_index: Option<u32> = params
.as_ref()
.and_then(|p| p.get(0, "start_index"))
.and_then(|i| i.as_u64())
.and_then(|i| i.try_into().ok());
let count: Option<u32> = params
.as_ref()
.and_then(|p| p.get(1, "count"))
.and_then(|c| c.as_u64())
.and_then(|i| i.try_into().ok());
let start_index = get_opt_u32(&params, 0, "start_index")?;
let count = get_opt_u32(&params, 1, "count")?;
let res = &control.list_addresses(start_index, count)?;
Ok(serde_json::json!(&res))

View File

@ -47,13 +47,29 @@ def test_listaddresses(lianad):
assert addr[-1]["index"] == 6
list3 = lianad.rpc.listaddresses() # start_index = 0, receive_index = 0
_ = lianad.rpc.getnewaddress() # start_index = 0, receive_index = 1
_ = lianad.rpc.getnewaddress() # start_index = 0, receive_index = 2
_ = lianad.rpc.getnewaddress() # start_index = 0, receive_index = 1
_ = lianad.rpc.getnewaddress() # start_index = 0, receive_index = 2
list4 = lianad.rpc.listaddresses()
assert len(list4["addresses"]) == len(list3["addresses"]) + 2 == 2
list5 = lianad.rpc.listaddresses(0)
assert list4 == list5
# Will explicitly error on invalid start_index.
with pytest.raises(
RpcError,
match=re.escape(
"Invalid params: Invalid value for \\'start_index\\': \"blabla\""
),
):
lianad.rpc.listaddresses("blabla", None)
# Will explicitly error on invalid count.
with pytest.raises(
RpcError,
match=re.escape("Invalid params: Invalid value for \\'count\\': \"blb\""),
):
lianad.rpc.listaddresses(0, "blb")
def test_listcoins(lianad, bitcoind):
# Initially empty