From 21c18bbbe76bc6e7796d020cf1fe4b3b86657707 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 3 Nov 2022 12:47:21 +0000 Subject: [PATCH] util.parse_URI: honour docstring and only raise InvalidBitcoinURI follow-up ac1d53f0677dbd9a39efc325f94849607e73a6db --- electrum/tests/test_util.py | 9 +++++---- electrum/util.py | 7 +++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/electrum/tests/test_util.py b/electrum/tests/test_util.py index 239062bf7..60659d237 100644 --- a/electrum/tests/test_util.py +++ b/electrum/tests/test_util.py @@ -142,13 +142,13 @@ class TestUtil(ElectrumTestCase): {'r': 'http://domain.tld/page?h=2a8628fc2fbe'}) def test_parse_URI_invalid_address(self): - self.assertRaises(BaseException, parse_URI, 'bitcoin:invalidaddress') + self.assertRaises(InvalidBitcoinURI, parse_URI, 'bitcoin:invalidaddress') def test_parse_URI_invalid(self): - self.assertRaises(BaseException, parse_URI, 'notbitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma') + self.assertRaises(InvalidBitcoinURI, parse_URI, 'notbitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma') def test_parse_URI_parameter_pollution(self): - self.assertRaises(Exception, parse_URI, 'bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?amount=0.0003&label=test&amount=30.0') + self.assertRaises(InvalidBitcoinURI, parse_URI, 'bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?amount=0.0003&label=test&amount=30.0') @as_testnet def test_parse_URI_lightning_consistency(self): @@ -176,7 +176,8 @@ class TestUtil(ElectrumTestCase): self.assertRaises(InvalidBitcoinURI, parse_URI, 'bitcoin:tb1qvu0c9xme0ul3gzx4nzqdgxsu25acuk9wvsj2j2?amount=0.0007&message=test266&lightning=lntb700u1p3kqy26pp5l7rj7w0u5sdsj24umzdlhdhkk8a597sn865rhap4h4jenjefdk7ssp5d9zjr96ezp89gsyenfse5f4jn9ls29p0awvp0zxlt6tpzn2m3j5qdqvw3jhxapjxcmqcqzynxq8zals8sq9q7sqqqqqqqqqqqqqqqqqqqqqqqqq9qsqfppqu5ua3szskclyd48wlfdwfd32j65phxy9vu8dmmk3u20u0e0yqw484xzn4hc3cux6kk2wenhw7zy0mseu9ntpk9l4fws2d46svzszrc6mqy535740ks9j22w67fw0x4dt8w2hhzspcqakql') # bip21 uri that includes "lightning" key. top-level amount mismatches LN amount self.assertRaises(InvalidBitcoinURI, parse_URI, 'bitcoin:tb1qu5ua3szskclyd48wlfdwfd32j65phxy9yf7ytl?amount=0.0008&message=test266&lightning=lntb700u1p3kqy26pp5l7rj7w0u5sdsj24umzdlhdhkk8a597sn865rhap4h4jenjefdk7ssp5d9zjr96ezp89gsyenfse5f4jn9ls29p0awvp0zxlt6tpzn2m3j5qdqvw3jhxapjxcmqcqzynxq8zals8sq9q7sqqqqqqqqqqqqqqqqqqqqqqqqq9qsqfppqu5ua3szskclyd48wlfdwfd32j65phxy9vu8dmmk3u20u0e0yqw484xzn4hc3cux6kk2wenhw7zy0mseu9ntpk9l4fws2d46svzszrc6mqy535740ks9j22w67fw0x4dt8w2hhzspcqakql') - + # bip21 uri that includes "lightning" key with garbage unparseable value + self.assertRaises(InvalidBitcoinURI, parse_URI, 'bitcoin:tb1qu5ua3szskclyd48wlfdwfd32j65phxy9yf7ytl?amount=0.0008&message=test266&lightning=lntb700u1p3kqy26pp5l7rj7w0u5sdsj24umzdlhdasdasdasdasd') def test_is_hash256_str(self): self.assertTrue(is_hash256_str('09a4c03e3bdf83bbe3955f907ee52da4fc12f4813d459bc75228b64ad08617c7')) diff --git a/electrum/util.py b/electrum/util.py index f10a075b5..984bb7e1f 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -969,7 +969,7 @@ def parse_URI(uri: str, on_pr: Callable = None, *, loop=None) -> dict: """Raises InvalidBitcoinURI on malformed URI.""" from . import bitcoin from .bitcoin import COIN, TOTAL_COIN_SUPPLY_LIMIT_IN_BTC - from .lnaddr import lndecode + from .lnaddr import lndecode, LnDecodeException if not isinstance(uri, str): raise InvalidBitcoinURI(f"expected string, not {repr(uri)}") @@ -1033,7 +1033,10 @@ def parse_URI(uri: str, on_pr: Callable = None, *, loop=None) -> dict: except Exception as e: raise InvalidBitcoinURI(f"failed to parse 'sig' field: {repr(e)}") from e if 'lightning' in out: - lnaddr = lndecode(out['lightning']) + try: + lnaddr = lndecode(out['lightning']) + except LnDecodeException as e: + raise InvalidBitcoinURI(f"Failed to decode 'lightning' field: {e!r}") from e amount_sat = out.get('amount') if amount_sat: # allow small leeway due to msat precision