From ea931f09219b93cab1f5d2c86cd8befcd177a6e1 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 14 Apr 2020 11:36:00 +0930 Subject: [PATCH] plugins: simplify htlc_accepted hook payload-setting API. As discussed with Christian, prepending the length to the payload returned is awkward, but it's the only way to set a legacy payload. As this will be soon deprecated, simplify the external API. Signed-off-by: Rusty Russell --- doc/PLUGINS.md | 6 ++++-- plugins/keysend.c | 8 ++------ tests/plugins/replace_payload.py | 9 +++++++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/doc/PLUGINS.md b/doc/PLUGINS.md index 05905ac3fbcd..3d36ca1af356 100644 --- a/doc/PLUGINS.md +++ b/doc/PLUGINS.md @@ -804,8 +804,10 @@ if we're the recipient, or attempt to forward it otherwise. Notice that the usual checks such as sufficient fees and CLTV deltas are still enforced. It can also replace the `onion.payload` by specifying a `payload` in -the response. This will be re-parsed; it's useful for removing onion -fields which a plugin doesn't want lightningd to consider. +the response. Note that this is always a TLV-style payload, so unlike +`onion.payload` there is no length prefix (and it must be at least 4 +hex digits long). This will be re-parsed; it's useful for removing +onion fields which a plugin doesn't want lightningd to consider. ```json diff --git a/plugins/keysend.c b/plugins/keysend.c index c047526abf31..4506d0742024 100644 --- a/plugins/keysend.c +++ b/plugins/keysend.c @@ -18,17 +18,13 @@ static struct command_result * htlc_accepted_continue(struct command *cmd, struct tlv_tlv_payload *payload) { struct json_stream *response; - u8 *binpayload, *rawpayload; response = jsonrpc_stream_success(cmd); json_add_string(response, "result", "continue"); if (payload) { - binpayload = tal_arr(cmd, u8, 0); + u8 *binpayload = tal_arr(cmd, u8, 0); towire_tlvstream_raw(&binpayload, payload->fields); - rawpayload = tal_arr(cmd, u8, 0); - towire_bigsize(&rawpayload, tal_bytelen(binpayload)); - towire(&rawpayload, binpayload, tal_bytelen(binpayload)); - json_add_string(response, "payload", tal_hex(cmd, rawpayload)); + json_add_string(response, "payload", tal_hex(cmd, binpayload)); } return command_finished(cmd, response); } diff --git a/tests/plugins/replace_payload.py b/tests/plugins/replace_payload.py index 0c55c2c418f1..122899653286 100755 --- a/tests/plugins/replace_payload.py +++ b/tests/plugins/replace_payload.py @@ -13,11 +13,16 @@ def on_htlc_accepted(htlc, onion, plugin, **kwargs): # eg. '2902017b04016d0821fff5b6bd5018c8731aa0496c3698ef49f132ef9a3000c94436f4957e79a2f8827b' # (but values change depending on pay's randomness!) + print("payload was:{}".format(onion['payload'])) + assert onion['payload'][0:2] == '29' + if plugin.replace_payload == 'corrupt_secret': + # Note: we don't include length prefix in returned payload, since it doesn't + # support the pre-TLV legacy form. if onion['payload'][18] == '0': - newpayload = onion['payload'][:18] + '1' + onion['payload'][19:] + newpayload = onion['payload'][2:18] + '1' + onion['payload'][19:] else: - newpayload = onion['payload'][:18] + '0' + onion['payload'][19:] + newpayload = onion['payload'][2:18] + '0' + onion['payload'][19:] else: newpayload = plugin.replace_payload print("payload was:{}".format(onion['payload']))