From b1d1db93342fda3828eabc91b458a1065d5c4a77 Mon Sep 17 00:00:00 2001 From: nick evans Date: Sun, 19 Jan 2025 10:15:14 -0500 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Parse=20`uid-set`=20as=20`?= =?UTF-8?q?sequence-set`=20without=20`*`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In addition to letting us delete some code, this is also a step towards replacing `UIDPlusData` with new (incompatible) data structures that store UID sets directly, rather than converted into arrays of integers. --- lib/net/imap/response_parser.rb | 20 ++++++++++---------- test/net/imap/test_imap_response_parser.rb | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/lib/net/imap/response_parser.rb b/lib/net/imap/response_parser.rb index 29ee38b8..03f135ec 100644 --- a/lib/net/imap/response_parser.rb +++ b/lib/net/imap/response_parser.rb @@ -2005,7 +2005,7 @@ def charset__list def resp_code_apnd__data validity = number; SP! dst_uids = uid_set # uniqueid ⊂ uid-set - UIDPlusData.new(validity, nil, dst_uids) + UIDPlus(validity, nil, dst_uids) end # already matched: "COPYUID" @@ -2015,6 +2015,12 @@ def resp_code_copy__data validity = number; SP! src_uids = uid_set; SP! dst_uids = uid_set + UIDPlus(validity, src_uids, dst_uids) + end + + def UIDPlus(validity, src_uids, dst_uids) + src_uids &&= src_uids.each_ordered_number.to_a + dst_uids = dst_uids.each_ordered_number.to_a UIDPlusData.new(validity, src_uids, dst_uids) end @@ -2141,15 +2147,9 @@ def nparens__objectid; NIL? ? nil : parens__objectid end # uniqueid = nz-number # ; Strictly ascending def uid_set - token = match(T_NUMBER, T_ATOM) - case token.symbol - when T_NUMBER then [Integer(token.value)] - when T_ATOM - token.value.split(",").flat_map {|range| - range = range.split(":").map {|uniqueid| Integer(uniqueid) } - range.size == 1 ? range : Range.new(range.min, range.max).to_a - } - end + set = sequence_set + parse_error("uid-set cannot contain '*'") if set.include_star? + set end def nil_atom diff --git a/test/net/imap/test_imap_response_parser.rb b/test/net/imap/test_imap_response_parser.rb index 9bcced4d..b24c63ff 100644 --- a/test/net/imap/test_imap_response_parser.rb +++ b/test/net/imap/test_imap_response_parser.rb @@ -202,6 +202,15 @@ def test_fetch_binary_and_binary_size Net::IMAP.debug = debug end + test "APPENDUID with '*'" do + parser = Net::IMAP::ResponseParser.new + assert_raise_with_message Net::IMAP::ResponseParseError, /uid-set cannot contain '\*'/ do + parser.parse( + "A004 OK [appendUID 1 1:*] Done\r\n" + ) + end + end + test "COPYUID with backwards ranges" do parser = Net::IMAP::ResponseParser.new response = parser.parse( @@ -223,4 +232,13 @@ def test_fetch_binary_and_binary_size ) end + test "COPYUID with '*'" do + parser = Net::IMAP::ResponseParser.new + assert_raise_with_message Net::IMAP::ResponseParseError, /uid-set cannot contain '\*'/ do + parser.parse( + "A004 OK [copyUID 1 1:* 1:*] Done\r\n" + ) + end + end + end