mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-03-02 18:35:00 +01:00
feat: make peer_connected hook chainable
Changelog-Changed: peer_connected hook is now chainable
This commit is contained in:
parent
54675546ab
commit
91bdb6d2d9
1 changed files with 57 additions and 32 deletions
|
@ -443,6 +443,7 @@ struct peer_connected_hook_payload {
|
||||||
struct wireaddr_internal addr;
|
struct wireaddr_internal addr;
|
||||||
struct peer *peer;
|
struct peer *peer;
|
||||||
struct per_peer_state *pps;
|
struct per_peer_state *pps;
|
||||||
|
u8 *error;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void json_add_htlcs(struct lightningd *ld,
|
static void json_add_htlcs(struct lightningd *ld,
|
||||||
|
@ -946,10 +947,7 @@ peer_connected_serialize(struct peer_connected_hook_payload *payload,
|
||||||
json_object_end(stream); /* .peer */
|
json_object_end(stream); /* .peer */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void peer_connected_hook_final(struct peer_connected_hook_payload *payload STEALS)
|
||||||
peer_connected_hook_cb(struct peer_connected_hook_payload *payload STEALS,
|
|
||||||
const char *buffer,
|
|
||||||
const jsmntok_t *toks)
|
|
||||||
{
|
{
|
||||||
struct lightningd *ld = payload->ld;
|
struct lightningd *ld = payload->ld;
|
||||||
struct channel *channel = payload->channel;
|
struct channel *channel = payload->channel;
|
||||||
|
@ -962,30 +960,10 @@ peer_connected_hook_cb(struct peer_connected_hook_payload *payload STEALS,
|
||||||
* subd). */
|
* subd). */
|
||||||
tal_steal(tmpctx, payload);
|
tal_steal(tmpctx, payload);
|
||||||
|
|
||||||
/* If we had a hook, interpret result. */
|
/* Check for specific errors of a hook */
|
||||||
if (buffer) {
|
if (payload->error) {
|
||||||
const jsmntok_t *resulttok;
|
error = payload->error;
|
||||||
|
goto send_error;
|
||||||
resulttok = json_get_member(buffer, toks, "result");
|
|
||||||
if (!resulttok) {
|
|
||||||
fatal("Plugin returned an invalid response to the connected "
|
|
||||||
"hook: %s", buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
} else if (!json_tok_streq(buffer, resulttok, "continue"))
|
|
||||||
fatal("Plugin returned an invalid response to the connected "
|
|
||||||
"hook: %s", buffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (channel) {
|
if (channel) {
|
||||||
|
@ -1087,10 +1065,56 @@ send_error:
|
||||||
peer_start_openingd(peer, payload->pps, error);
|
peer_start_openingd(peer, payload->pps, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
REGISTER_SINGLE_PLUGIN_HOOK(peer_connected,
|
static bool
|
||||||
peer_connected_hook_cb,
|
peer_connected_hook_deserialize(struct peer_connected_hook_payload *payload,
|
||||||
peer_connected_serialize,
|
const char *buffer,
|
||||||
struct peer_connected_hook_payload *);
|
const jsmntok_t *toks)
|
||||||
|
{
|
||||||
|
struct lightningd *ld = payload->ld;
|
||||||
|
|
||||||
|
/* already rejected by prior plugin hook in the chain */
|
||||||
|
if (payload->error != NULL)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!toks || !buffer)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* If we had a hook, interpret result. */
|
||||||
|
const jsmntok_t *t_res = json_get_member(buffer, toks, "result");
|
||||||
|
const jsmntok_t *t_err = json_get_member(buffer, toks, "error_message");
|
||||||
|
|
||||||
|
/* fail */
|
||||||
|
if (!t_res)
|
||||||
|
fatal("Plugin returned an invalid response to the "
|
||||||
|
"peer_connected hook: %s", buffer);
|
||||||
|
|
||||||
|
/* reject */
|
||||||
|
if (json_tok_streq(buffer, t_res, "disconnect")) {
|
||||||
|
payload->error = (u8*)"";
|
||||||
|
if (t_err) {
|
||||||
|
payload->error = towire_errorfmt(tmpctx, NULL, "%.*s",
|
||||||
|
t_err->end - t_err->start,
|
||||||
|
buffer + t_err->start);
|
||||||
|
}
|
||||||
|
log_debug(ld->log, "peer_connected hook rejects and says '%s'",
|
||||||
|
payload->error);
|
||||||
|
/* At this point we suppress other plugins in the chain and
|
||||||
|
* directly move to final */
|
||||||
|
peer_connected_hook_final(payload);
|
||||||
|
return false;
|
||||||
|
} else if (!json_tok_streq(buffer, t_res, "continue"))
|
||||||
|
fatal("Plugin returned an invalid response to the "
|
||||||
|
"peer_connected hook: %s", buffer);
|
||||||
|
|
||||||
|
/* call next hook */
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER_PLUGIN_HOOK(peer_connected,
|
||||||
|
peer_connected_hook_deserialize,
|
||||||
|
peer_connected_hook_final,
|
||||||
|
peer_connected_serialize,
|
||||||
|
struct peer_connected_hook_payload *);
|
||||||
|
|
||||||
/* Connectd tells us a peer has connected: it never hands us duplicates, since
|
/* Connectd tells us a peer has connected: it never hands us duplicates, since
|
||||||
* it holds them until we say peer_died. */
|
* it holds them until we say peer_died. */
|
||||||
|
@ -1104,6 +1128,7 @@ void peer_connected(struct lightningd *ld, const u8 *msg,
|
||||||
|
|
||||||
hook_payload = tal(NULL, struct peer_connected_hook_payload);
|
hook_payload = tal(NULL, struct peer_connected_hook_payload);
|
||||||
hook_payload->ld = ld;
|
hook_payload->ld = ld;
|
||||||
|
hook_payload->error = NULL;
|
||||||
if (!fromwire_connectd_peer_connected(hook_payload, msg,
|
if (!fromwire_connectd_peer_connected(hook_payload, msg,
|
||||||
&id, &hook_payload->addr,
|
&id, &hook_payload->addr,
|
||||||
&hook_payload->pps,
|
&hook_payload->pps,
|
||||||
|
|
Loading…
Add table
Reference in a new issue