From 278b69dfbee048a61f8cf426962670cc4726dd97 Mon Sep 17 00:00:00 2001 From: lisa neigut Date: Wed, 11 Dec 2019 18:46:08 -0600 Subject: [PATCH] channel control: don't allow peer to cancel channel restrict fundchannel_cancel usage to only the opener side Changelog-Changed: Only the opener of a fundchannel can cancel the channel open with fundchannel_cancel --- lightningd/channel_control.c | 5 +++++ tests/test_connection.py | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index ddbedb70b..c88491603 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -726,6 +726,11 @@ struct command_result *cancel_channel_before_broadcast(struct command *cmd, buffer + cidtok->start); } + if (cancel_channel->funder == REMOTE) + return command_fail(cmd, LIGHTNINGD, + "Cannot cancel channel that was " + "initiated by peer"); + /* Check if we broadcast the transaction. (We store the transaction type into DB * before broadcast). */ enum wallet_tx_type type; diff --git a/tests/test_connection.py b/tests/test_connection.py index 849c28b59..80c269a70 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -1030,7 +1030,12 @@ def test_funding_external_wallet_corners(node_factory, bitcoind): # Be sure fundchannel_complete is successful assert l1.rpc.fundchannel_complete(l2.info['id'], prep['txid'], txout)['commitments_secured'] - # Canceld channel after fundchannel_complete + + # Peer shouldn't be able to cancel channel + with pytest.raises(RpcError, match=r'Cannot cancel channel that was initiated by peer'): + l2.rpc.fundchannel_cancel(l1.info['id']) + + # We can cancel channel after fundchannel_complete assert l1.rpc.fundchannel_cancel(l2.info['id'])['cancelled'] # l2 won't give up, since it considers error "soft".