Browse Source

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 <rusty@rustcorp.com.au>
register-keysend-plugin
Rusty Russell 5 years ago
parent
commit
bf053dcf7c
  1. 6
      doc/PLUGINS.md
  2. 8
      plugins/keysend.c
  3. 9
      tests/plugins/replace_payload.py

6
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. usual checks such as sufficient fees and CLTV deltas are still enforced.
It can also replace the `onion.payload` by specifying a `payload` in 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 the response. Note that this is always a TLV-style payload, so unlike
fields which a plugin doesn't want lightningd to consider. `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 ```json

8
plugins/keysend.c

@ -18,17 +18,13 @@ static struct command_result *
htlc_accepted_continue(struct command *cmd, struct tlv_tlv_payload *payload) htlc_accepted_continue(struct command *cmd, struct tlv_tlv_payload *payload)
{ {
struct json_stream *response; struct json_stream *response;
u8 *binpayload, *rawpayload;
response = jsonrpc_stream_success(cmd); response = jsonrpc_stream_success(cmd);
json_add_string(response, "result", "continue"); json_add_string(response, "result", "continue");
if (payload) { if (payload) {
binpayload = tal_arr(cmd, u8, 0); u8 *binpayload = tal_arr(cmd, u8, 0);
towire_tlvstream_raw(&binpayload, payload->fields); towire_tlvstream_raw(&binpayload, payload->fields);
rawpayload = tal_arr(cmd, u8, 0); json_add_string(response, "payload", tal_hex(cmd, binpayload));
towire_bigsize(&rawpayload, tal_bytelen(binpayload));
towire(&rawpayload, binpayload, tal_bytelen(binpayload));
json_add_string(response, "payload", tal_hex(cmd, rawpayload));
} }
return command_finished(cmd, response); return command_finished(cmd, response);
} }

9
tests/plugins/replace_payload.py

@ -13,11 +13,16 @@ plugin = Plugin()
def on_htlc_accepted(htlc, onion, plugin, **kwargs): def on_htlc_accepted(htlc, onion, plugin, **kwargs):
# eg. '2902017b04016d0821fff5b6bd5018c8731aa0496c3698ef49f132ef9a3000c94436f4957e79a2f8827b' # eg. '2902017b04016d0821fff5b6bd5018c8731aa0496c3698ef49f132ef9a3000c94436f4957e79a2f8827b'
# (but values change depending on pay's randomness!) # (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': 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': if onion['payload'][18] == '0':
newpayload = onion['payload'][:18] + '1' + onion['payload'][19:] newpayload = onion['payload'][2:18] + '1' + onion['payload'][19:]
else: else:
newpayload = onion['payload'][:18] + '0' + onion['payload'][19:] newpayload = onion['payload'][2:18] + '0' + onion['payload'][19:]
else: else:
newpayload = plugin.replace_payload newpayload = plugin.replace_payload
print("payload was:{}".format(onion['payload'])) print("payload was:{}".format(onion['payload']))

Loading…
Cancel
Save