mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 13:25:43 +01:00
json-rpc: Don't let users send messages that are handled internally
We cannot let users use `sendcustommsg` to inject messages that are handled internally since it could result in our internal state tracking being borked.
This commit is contained in:
parent
3ad8438d91
commit
5325ff6352
@ -2385,6 +2385,7 @@ static struct command_result *json_sendcustommsg(struct command *cmd,
|
|||||||
struct peer *peer;
|
struct peer *peer;
|
||||||
struct subd *owner;
|
struct subd *owner;
|
||||||
u8 *msg;
|
u8 *msg;
|
||||||
|
int type;
|
||||||
|
|
||||||
if (!param(cmd, buffer, params,
|
if (!param(cmd, buffer, params,
|
||||||
p_req("node_id", param_node_id, &dest),
|
p_req("node_id", param_node_id, &dest),
|
||||||
@ -2392,6 +2393,17 @@ static struct command_result *json_sendcustommsg(struct command *cmd,
|
|||||||
NULL))
|
NULL))
|
||||||
return command_param_failed();
|
return command_param_failed();
|
||||||
|
|
||||||
|
type = fromwire_peektype(msg);
|
||||||
|
if (wire_type_is_defined(type)) {
|
||||||
|
return command_fail(
|
||||||
|
cmd, JSONRPC2_INVALID_REQUEST,
|
||||||
|
"Cannot send messages of type %d (%s). It is not possible "
|
||||||
|
"to send messages that have a type managed internally "
|
||||||
|
"since that might cause issues with the internal state "
|
||||||
|
"tracking.",
|
||||||
|
type, wire_type_name(type));
|
||||||
|
}
|
||||||
|
|
||||||
peer = peer_by_id(cmd->ld, dest);
|
peer = peer_by_id(cmd->ld, dest);
|
||||||
if (!peer) {
|
if (!peer) {
|
||||||
return command_fail(cmd, JSONRPC2_INVALID_REQUEST,
|
return command_fail(cmd, JSONRPC2_INVALID_REQUEST,
|
||||||
|
@ -26,6 +26,15 @@ enum ${enum_set['name']} {
|
|||||||
## The 'name' functions for the enums
|
## The 'name' functions for the enums
|
||||||
% for enum_set in enum_sets:
|
% for enum_set in enum_sets:
|
||||||
const char *${enum_set['name']}_name(int e);
|
const char *${enum_set['name']}_name(int e);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether a given message type is defined as a message.
|
||||||
|
*
|
||||||
|
* Returns true if the message type is part of the message definitions we have
|
||||||
|
* generated parsers for, false if it is a custom message that cannot be
|
||||||
|
* handled internally.
|
||||||
|
*/
|
||||||
|
bool ${enum_set['name']}_is_defined(u16 type);
|
||||||
% endfor
|
% endfor
|
||||||
|
|
||||||
## Structs for subtypes + tlv messages
|
## Structs for subtypes + tlv messages
|
||||||
|
@ -31,6 +31,18 @@ const char *${enum_set['name']}_name(int e)
|
|||||||
snprintf(invalidbuf, sizeof(invalidbuf), "INVALID %i", e);
|
snprintf(invalidbuf, sizeof(invalidbuf), "INVALID %i", e);
|
||||||
return invalidbuf;
|
return invalidbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ${enum_set['name']}_is_defined(u16 type)
|
||||||
|
{
|
||||||
|
switch ((enum ${enum_set['name']})type) {
|
||||||
|
% for msg in enum_set['set']:
|
||||||
|
case ${msg.enum_name()}:;
|
||||||
|
% endfor
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
% endfor
|
% endfor
|
||||||
## START PARTIALS
|
## START PARTIALS
|
||||||
## Subtype and TLV-msg towire_
|
## Subtype and TLV-msg towire_
|
||||||
|
Loading…
Reference in New Issue
Block a user