diff --git a/common/jsonrpc_errors.h b/common/jsonrpc_errors.h index d52229582..ebf45c4eb 100644 --- a/common/jsonrpc_errors.h +++ b/common/jsonrpc_errors.h @@ -100,6 +100,9 @@ static const errcode_t DATASTORE_UPDATE_WRONG_GENERATION = 1204; static const errcode_t DATASTORE_UPDATE_HAS_CHILDREN = 1205; static const errcode_t DATASTORE_UPDATE_NO_CHILDREN = 1206; +/* Errors from signmessage command */ +static const errcode_t SIGNMESSAGE_PUBKEY_NOT_FOUND = 1301; + /* Errors from wait* commands */ static const errcode_t WAIT_TIMEOUT = 2000; diff --git a/doc/lightning-checkmessage.7.md b/doc/lightning-checkmessage.7.md index 010caba3d..3980f8c51 100644 --- a/doc/lightning-checkmessage.7.md +++ b/doc/lightning-checkmessage.7.md @@ -20,6 +20,10 @@ known node key (as per *listnodes*), and verification succeeds if it matches for any one of them. Note: this is implemented far more efficiently than trying each one, so performance is not a concern. +On failure, an error is returned and core lightning exit with the following error code: +- -32602: Parameter missed or malformed; +- 1301: *pubkey* not found in the graph. + RETURN VALUE ------------ diff --git a/lightningd/signmessage.c b/lightningd/signmessage.c index 1e0195a1d..81b584543 100644 --- a/lightningd/signmessage.c +++ b/lightningd/signmessage.c @@ -1,5 +1,6 @@ #include "config.h" #include +#include #include #include #include @@ -133,6 +134,12 @@ static void listnodes_done(const char *buffer, if (t) t = json_get_member(buffer, t, "nodes"); + if (!deprecated_apis && (!t || t->size == 0)) { + was_pending(command_fail(can->cmd, SIGNMESSAGE_PUBKEY_NOT_FOUND, + "pub key not found in the graph, expected pubkey is %s", + node_id_to_hexstr(tmpctx, &can->id))); + return; + } response = json_stream_success(can->cmd); json_add_node_id(response, "pubkey", &can->id); json_add_bool(response, "verified", t && t->size == 1); diff --git a/tests/test_misc.py b/tests/test_misc.py index b1946f1f8..059eacdce 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -1850,7 +1850,8 @@ def test_relative_config_dir(node_factory): def test_signmessage(node_factory): - l1, l2 = node_factory.line_graph(2, wait_for_announce=True) + l1, l2 = node_factory.line_graph(2, wait_for_announce=True, + opts={'allow-deprecated-apis': True}) corpus = [[None, "this is a test!", @@ -2712,3 +2713,18 @@ def test_torv2_in_db(node_factory): l1.stop() l1.db_manip("UPDATE peers SET address='3fyb44wdhnd2ghhl.onion:1234';") l1.start() + + +def test_checkmessage_pubkey_not_found(node_factory): + l1 = node_factory.get_node() + + msg = "testcase to check new rpc error" + pubkey = "03be3b0e9992153b1d5a6e1623670b6c3663f72ce6cf2e0dd39c0a373a7de5a3b7" + zbase = "d66bqz3qsku5fxtqsi37j11pci47ydxa95iusphutggz9ezaxt56neh77kxe5hyr41kwgkncgiu94p9ecxiexgpgsz8daoq4tw8kj8yx" + + with pytest.raises(RpcError, match="not found in the graph, expected pubkey is {}".format(pubkey)): + l1.rpc.checkmessage(msg, zbase) + + check_result = l1.rpc.checkmessage(msg, zbase, pubkey=pubkey) + assert check_result["pubkey"] == pubkey + assert check_result["verified"] is True \ No newline at end of file