From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 9B89C1F8C6; Tue, 14 Sep 2021 22:10:36 +0000 (UTC) Date: Tue, 14 Sep 2021 22:10:36 +0000 From: Eric Wong To: Konstantin Ryabitsev Cc: meta@public-inbox.org Subject: [PATCH] uri_imap: fix ->uidvalidity and ->uid w/ `/' separator Message-ID: <20210914221036.GA4907@dcvr> References: <20210914175025.eq7s2shkc323itaf@meerkat.local> <20210914193528.29676-1-e@80x24.org> <20210914195510.kozlchcwvgrng5uc@meerkat.local> <20210914210547.akdp4cqmwaheayp5@meerkat.local> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20210914210547.akdp4cqmwaheayp5@meerkat.local> List-Id: Konstantin Ryabitsev wrote: > 2021-09-14T20:59:12Z 20428 20428 die: BUG: imaps://imap.migadu.com/lore/b4;UIDVALIDITY=1621977334 has no UIDVALIDITY at /usr/local/share/perl/5.32.1/PublicInbox/LeiStore.pm line 313. > (from nowait set_sync_info) Same bug, different place :x --------8<------ Subject: [PATCH] uri_imap: fix ->uidvalidity and ->uid w/ `/' separator Again, we were failing to account for '/' use in mailbox names :x Reported-by: Konstantin Ryabitsev Link: https://public-inbox.org/meta/20210914210547.akdp4cqmwaheayp5@meerkat.local/ --- lib/PublicInbox/URIimap.pm | 7 ++++--- t/uri_imap.t | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/PublicInbox/URIimap.pm b/lib/PublicInbox/URIimap.pm index 6907e32a..81644914 100644 --- a/lib/PublicInbox/URIimap.pm +++ b/lib/PublicInbox/URIimap.pm @@ -86,7 +86,8 @@ sub uidvalidity { # read/write $$self = uri_join($scheme, $auth, $path, $query, $frag); } $path =~ s!\A/+!!; - $path =~ m!\A[^;/]+;UIDVALIDITY=([1-9][0-9]*)\b!i ? ($1 + 0) : undef; + $path =~ m!\A[^;]+;UIDVALIDITY=([1-9][0-9]*)\b!i ? + ($1 + 0) : undef; } sub uid { @@ -97,11 +98,11 @@ sub uid { $path =~ s!/;UID=[^;/]*\b!!i; } else { $path =~ s!/;UID=[^;/]*\b!/;UID=$val!i or - $path .= ";UID=$val"; + $path .= "/;UID=$val"; } $$self = uri_join($scheme, $auth, $path, $query); } - $path =~ m!\A/[^/;]+(?:;UIDVALIDITY=[^;/]+)?/;UID=([1-9][0-9]*)\b!i ? + $path =~ m!\A/[^;]+(?:;UIDVALIDITY=[^;/]+)?/;UID=([1-9][0-9]*)\b!i ? ($1 + 0) : undef; } diff --git a/t/uri_imap.t b/t/uri_imap.t index b9e4583d..7a97f875 100644 --- a/t/uri_imap.t +++ b/t/uri_imap.t @@ -132,5 +132,22 @@ is($cred->{username}, undef, 'user is undef in array context'); is($cred->{password}, undef, 'password is undef in array context'); $uri = PublicInbox::URIimap->new('imap://u@example.com/slash/separator'); is($uri->mailbox, 'slash/separator', "`/' separator accepted"); +is($uri->uidvalidity(6), 6, "UIDVALIDITY set with `/' separator"); +is($$uri, 'imap://u@example.com/slash/separator;UIDVALIDITY=6', + "URI correct after adding UIDVALIDITY w/ `/' separator"); + +$uri = PublicInbox::URIimap->new('imap://u@example.com/a/b;UIDVALIDITY=3'); +is($uri->uidvalidity, 3, "UIDVALIDITY w/ `/' separator"); +is($uri->mailbox, 'a/b', "mailbox w/ `/' separator + UIDVALIDITY"); +is($uri->uidvalidity(4), 4, "UIDVALIDITY set w/ `/' separator"); +is($$uri, 'imap://u@example.com/a/b;UIDVALIDITY=4', + "URI correct after replacing UIDVALIDITY w/ `/' separator"); +is($uri->uid(5), 5, "set /;UID= w/ `/' separator"); + +$uri = PublicInbox::URIimap->new('imap://u@example.com/a/b/;UID=9'); +is($uri->uid, 9, "UID read with `/' separator w/o UIDVALIDITY"); +is($uri->uid(8), 8, "UID set with `/' separator w/o UIDVALIDITY"); +is($$uri, 'imap://u@example.com/a/b/;UID=8', + "URI correct after replacing UID w/ `/' separator"); done_testing;