Browse Source

connected_hook: allow hook to specify an error message.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
htlc_accepted_hook
Rusty Russell 6 years ago
committed by Christian Decker
parent
commit
7f7ad4f89f
  1. 1
      CHANGELOG.md
  2. 6
      doc/PLUGINS.md
  3. 9
      lightningd/peer_control.c
  4. 2
      tests/plugins/reject.py
  5. 5
      tests/test_plugin.py

1
CHANGELOG.md

@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Config: Adds parameter `min-capacity-sat` to reject tiny channels.
- JSON API: `listforwards` now includes the time an HTLC was received and when it was resolved. Both are expressed as UNIX timestamps to facilitate parsing (Issue [#2491](https://github.com/ElementsProject/lightning/issues/2491), PR [#2528](https://github.com/ElementsProject/lightning/pull/2528))
- JSON API: new plugin `invoice_payment` hook for intercepting invoices before they're paid.
- plugin: the `connected` hook can now send an `error_message` to the rejected peer.
### Changed

6
doc/PLUGINS.md

@ -268,6 +268,12 @@ gossiped list of known addresses. In particular this means that the port for
incoming connections is an ephemeral port, that may not be available for
reconnections.
The returned result must contain a `result` member which is either
the string `disconnect` or `continue`. If `disconnect` and
there's a member `error_message`, that member is sent to the peer
before disconnection.
#### `db_write`
This hook is called whenever a change is about to be committed to the database.

9
lightningd/peer_control.c

@ -706,6 +706,15 @@ peer_connected_hook_cb(struct peer_connected_hook_payload *payload,
}
if (json_tok_streq(buffer, resulttok, "disconnect")) {
const jsmntok_t *m = json_get_member(buffer, toks,
"error_message");
if (m) {
error = towire_errorfmt(tmpctx, NULL,
"%.*s",
m->end - m->start,
buffer + m->start);
goto send_error;
}
close(peer_fd);
tal_free(payload);
return;

2
tests/plugins/reject.py

@ -16,7 +16,7 @@ plugin = Plugin()
def on_connected(peer, plugin):
if peer['id'] in plugin.reject_ids:
print("{} is in reject list, disconnecting".format(peer['id']))
return {'result': 'disconnect'}
return {'result': 'disconnect', 'error_message': 'You are in reject list'}
print("{} is allowed".format(peer['id']))
return {'result': 'continue'}

5
tests/test_plugin.py

@ -164,6 +164,11 @@ def test_plugin_connected_hook(node_factory):
l3.connect(l1)
l1.daemon.wait_for_log(r"{} is in reject list".format(l3.info['id']))
# FIXME: this error occurs *after* connection, so we connect then drop.
l3.daemon.wait_for_log(r"lightning_openingd-{} chan #1: peer_in WIRE_ERROR"
.format(l1.info['id']))
l3.daemon.wait_for_log(r"You are in reject list")
peer = l1.rpc.listpeers(l3.info['id'])['peers']
assert(peer == [] or not peer[0]['connected'])

Loading…
Cancel
Save