damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit 05b62c5860e8704e3ff1bdc92ce8f4c754a3182a
parent fae061cec0e17c5604d1e97cf3acb44f39cc5eba
Author: Daniel D’Aquino <daniel@daquino.me>
Date:   Wed, 13 Aug 2025 12:54:46 -0700

Fix edge case around bolt11 invoice parsing

Changelog-None
Closes: https://github.com/damus-io/damus/issues/3190
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>

Diffstat:
MdamusTests/InvoiceTests.swift | 8+++++---
Mnostrdb/src/bolt11/bech32.c | 2+-
2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/damusTests/InvoiceTests.swift b/damusTests/InvoiceTests.swift @@ -19,8 +19,6 @@ final class InvoiceTests: XCTestCase { // Put teardown code here. This method is called after the invocation of each test method in the class. } - /* - // gh-3144: It was decided on a standup meeting that we do not need invoices to render, few people use this feature. func testParseAnyAmountInvoice() throws { let invstr = "LNBC1P3MR5UJSP5G7SA48YD4JWTTPCHWMY4QYN4UWZQCJQ8NMWKD6QE3HCRVYTDLH9SPP57YM9TSA9NN4M4XU59XMJCXKR7YDV29DDP6LVQUT46ZW6CU3KE9GQDQ9V9H8JXQ8P3MYLZJCQPJRZJQF60PZDVNGGQWQDNERZSQN35L8CVQ3QG2Z5NSZYD0D3Q0JW2TL6VUZA7FYQQWKGQQYQQQQLGQQQQXJQQ9Q9QXPQYSGQ39EM4QJMQFKZGJXZVGL7QJMYNSWA8PGDTAGXXRG5Z92M7VLCGKQK2L2THDF8LM0AUKAURH7FVAWDLRNMVF38W4EYJDNVN9V4Z9CRS5CQCV465C" @@ -51,6 +49,8 @@ final class InvoiceTests: XCTestCase { }) } + /* + // gh-3144: It was decided on a standup meeting that we do not need invoices to render, few people use this feature. func testTextAfterInvoice() throws { let invstr = """ LNBC1P3MR5UJSP5G7SA48YD4JWTTPCHWMY4QYN4UWZQCJQ8NMWKD6QE3HCRVYTDLH9SPP57YM9TSA9NN4M4XU59XMJCXKR7YDV29DDP6LVQUT46ZW6CU3KE9GQDQ9V9H8JXQ8P3MYLZJCQPJRZJQF60PZDVNGGQWQDNERZSQN35L8CVQ3QG2Z5NSZYD0D3Q0JW2TL6VUZA7FYQQWKGQQYQQQQLGQQQQXJQQ9Q9QXPQYSGQ39EM4QJMQFKZGJXZVGL7QJMYNSWA8PGDTAGXXRG5Z92M7VLCGKQK2L2THDF8LM0AUKAURH7FVAWDLRNMVF38W4EYJDNVN9V4Z9CRS5CQCV465C hi there @@ -95,6 +95,7 @@ final class InvoiceTests: XCTestCase { XCTAssertEqual(textSuccess, true) }) } + */ func testParseInvoiceUpper() throws { let invstr = "LNBC100N1P357SL0SP5T9N56WDZTUN39LGDQLR30XQWKSG3K69Q4Q2RKR52APLUJW0ESN0QPP5MRQGLJK62Z20Q4NVGR6LZCYN6FHYLZCCWDVU4K77APG3ZMRKUJJQDPZW35XJUEQD9EJQCFQV3JHXCMJD9C8G6T0DCXQYJW5QCQPJRZJQT56H4GVP5YX36U2UZQA6QWCSK3E2DUUNFXPPZJ9VHYPC3WFE2WSWZ607UQQ3XQQQSQQQQQQQQQQQLQQYG9QYYSGQAGX5H20AEULJ3GDWX3KXS8U9F4MCAKDKWUAKASAMM9562FFYR9EN8YG20LG0YGNR9ZPWP68524KMDA0T5XP2WYTEX35PU8HAPYJAJXQPSQL29R" @@ -173,6 +174,8 @@ final class InvoiceTests: XCTestCase { }) } + /* + // gh-3144: It was decided on a standup meeting that we do not need invoices to render, few people use this feature. func testParseInvoice() throws { let invstr = " lnbc100n1p357sl0sp5t9n56wdztun39lgdqlr30xqwksg3k69q4q2rkr52aplujw0esn0qpp5mrqgljk62z20q4nvgr6lzcyn6fhylzccwdvu4k77apg3zmrkujjqdpzw35xjueqd9ejqcfqv3jhxcmjd9c8g6t0dcxqyjw5qcqpjrzjqt56h4gvp5yx36u2uzqa6qwcsk3e2duunfxppzj9vhypc3wfe2wswz607uqq3xqqqsqqqqqqqqqqqlqqyg9qyysgqagx5h20aeulj3gdwx3kxs8u9f4mcakdkwuakasamm9562ffyr9en8yg20lg0ygnr9zpwp68524kmda0t5xp2wytex35pu8hapyjajxqpsql29r" @@ -202,7 +205,6 @@ final class InvoiceTests: XCTestCase { XCTAssertEqual(success, true) }) } - */ } diff --git a/nostrdb/src/bolt11/bech32.c b/nostrdb/src/bolt11/bech32.c @@ -162,7 +162,7 @@ bech32_encoding bech32_decode(char* hrp, uint8_t *data, size_t *data_len, const if (len > max_input_len) { return BECH32_ENCODING_NONE; } - static const int MAX_PREFIX = 9; // 8 bytes for the text, 1 byte for the null terminator + static const int MAX_PREFIX = 10; // 9 bytes for the text, 1 byte for the null terminator return bech32_decode_len(hrp, data, data_len, input, len, MAX_PREFIX); }