plugin: Wrap custom notifications in a dict with additional origin

This should allow us to differentiate the origin of the notification,
and further prevent plugins from spoofing native notifications.
This commit is contained in:
Christian Decker 2021-04-28 16:40:35 +02:00 committed by Rusty Russell
parent cfb1107244
commit 62e3358a5b
3 changed files with 6 additions and 16 deletions

View File

@ -453,19 +453,10 @@ static const char *plugin_notification_handle(struct plugin *plugin,
methname = json_strdup(tmpctx, plugin->buffer, methtok);
if (notifications_have_topic(plugin->plugins, methname)) {
n = tal(NULL, struct jsonrpc_notification);
n->method = tal_steal(n, methname);
n->stream = new_json_stream(n, NULL, NULL);
json_object_start(n->stream, NULL);
json_add_string(n->stream, "jsonrpc", "2.0");
json_add_string(n->stream, "method", methname);
json_add_tok(n->stream, "params", paramstok, plugin->buffer);
json_object_end(n->stream); /* closes '.' */
/* We guarantee to have \n\n at end of each response. */
json_stream_append(n->stream, "\n\n", strlen("\n\n"));
n = jsonrpc_notification_start(NULL, methname);
json_add_string(n->stream, "origin", plugin->shortname);
json_add_tok(n->stream, "payload", paramstok, plugin->buffer);
jsonrpc_notification_end(n);
plugins_notify(plugin->plugins, take(n));
return NULL;

View File

@ -6,8 +6,8 @@ plugin = Plugin()
@plugin.subscribe("custom")
def on_custom_notification(val, plugin, **kwargs):
plugin.log("Got a custom notification {}".format(val))
def on_custom_notification(origin, payload, **kwargs):
plugin.log("Got a custom notification {} from plugin {}".format(payload, origin))
@plugin.method("emit")

View File

@ -2404,7 +2404,6 @@ def test_self_disable(node_factory):
l1.rpc.plugin_start(p2, selfdisable=True)
@pytest.mark.xfail(strict=True)
def test_custom_notification_topics(node_factory):
plugin = os.path.join(
os.path.dirname(__file__), "plugins", "custom_notifications.py"