diff --git a/tests/test_pay.py b/tests/test_pay.py index f517165cc..d4e41fab6 100644 --- a/tests/test_pay.py +++ b/tests/test_pay.py @@ -3,6 +3,7 @@ from fixtures import * # noqa: F401,F403 from fixtures import TEST_NETWORK from flaky import flaky # noqa: F401 from pyln.client import RpcError, Millisatoshi +from pyln.proto.onion import TlvPayload from utils import ( DEVELOPER, wait_for, only_one, sync_blockheight, SLOW_MACHINE, TIMEOUT, VALGRIND @@ -2803,3 +2804,35 @@ caused a crash in 0.8.0, so we then disallowed it. inv = only_one(l2.rpc.listinvoices('inv')['invoices']) assert inv['status'] == 'paid' assert inv['amount_received_msat'] == Millisatoshi(1001) + + +@pytest.mark.xfail(strict=True) +def test_reject_invalid_payload(node_factory): + """Send an onion payload with an unknown even type. + + Recipient l2 should reject it the incoming HTLC with an invalid onion + payload error. + + """ + + l1, l2 = node_factory.line_graph(2) + amt = 10**3 + route = l1.rpc.getroute(l2.info['id'], amt, 10)['route'] + inv = l2.rpc.invoice(amt, "lbl", "desc") + + first_hop = route[0] + + # A TLV payload with an unknown even type: + payload = TlvPayload() + payload.add_field(0xB000, b'Hi there') + hops = [{"pubkey": l2.info['id'], "payload": payload.to_hex()}] + onion = l1.rpc.createonion(hops=hops, assocdata=inv['payment_hash']) + l1.rpc.sendonion(onion=onion['onion'], + first_hop=first_hop, + payment_hash=inv['payment_hash'], + shared_secrets=onion['shared_secrets']) + + l2.daemon.wait_for_log(r'Failing HTLC because of an invalid payload') + + with pytest.raises(RpcError, match=r'WIRE_INVALID_ONION_PAYLOAD'): + l1.rpc.waitsendpay(inv['payment_hash'])