invoice: don't allow payments in expired invoices.

Fixes: #363
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2017-11-21 16:57:28 +10:30 committed by Christian Decker
parent e302d6193c
commit 35a6ab8151
2 changed files with 23 additions and 1 deletions

View File

@ -15,6 +15,7 @@ struct invoice_waiter {
struct command *cmd;
};
/* FIXME: remove this, just use database ops. */
struct invoices {
/* Payments for r values we know about. */
struct list_head invlist;
@ -27,8 +28,11 @@ struct invoice *find_unpaid(struct invoices *invs, const struct sha256 *rhash)
struct invoice *i;
list_for_each(&invs->invlist, i, list) {
if (structeq(rhash, &i->rhash) && i->state == UNPAID)
if (structeq(rhash, &i->rhash) && i->state == UNPAID) {
if (time_now().ts.tv_sec > i->expiry_time)
break;
return i;
}
}
return NULL;
}

View File

@ -314,6 +314,24 @@ class LightningDTests(BaseLightningDTests):
assert b11['expiry'] == 3600
assert b11['payee'] == l1.info['id']
def test_invoice_expiry(self):
l1,l2 = self.connect()
chanid = self.fund_channel(l1, l2, 10**6)
# Wait for route propagation.
bitcoind.rpc.generate(5)
l1.daemon.wait_for_logs(['Received channel_update for channel {}\(0\)'
.format(chanid),
'Received channel_update for channel {}\(1\)'
.format(chanid)])
inv = l2.rpc.invoice(123000, 'test_pay', 'description', 1)['bolt11']
time.sleep(2)
self.assertRaises(ValueError, l1.rpc.pay, inv)
assert l2.rpc.listinvoice('test_pay')[0]['complete'] == False
assert l2.rpc.listinvoice('test_pay')[0]['expiry_time'] < time.time()
def test_connect(self):
l1,l2 = self.connect()