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 1EB911F8C6; Tue, 14 Sep 2021 19:35:28 +0000 (UTC) From: Eric Wong To: Konstantin Ryabitsev Cc: meta@public-inbox.org Subject: [PATCH] uri_imap: handle '/' as an IMAP hierarchy separator Date: Tue, 14 Sep 2021 19:35:28 +0000 Message-Id: <20210914193528.29676-1-e@80x24.org> In-Reply-To: <20210914175025.eq7s2shkc323itaf@meerkat.local> References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: On Tue, 14 Sep 2021 13:50:25 -0400, Konstantin Ryabitsev wrote: > Hello: > > I found an interesting problem using lei with imaps:// folders. I'm trying > things out with migadu, and the folder paths use '/' separators, so a full > IMAPS folder path for a folder "lore/mentions" is > imaps://imap.migadu.com/lore/mentions. However, if I configure lei-q to use > that remote path, everything actually ends up in the folder > imap.migadu.com/lore (not the "mentions" subfolder). Oops, I think the patch below should fix it. Btw, if you encounter more IMAP problems, I've found adding "-c imap.debug -c imap.compress=0" to the command-line useful (Mail::IMAPClient dumps the raw compressed traffic, so I need to disable compression). -----------8<----------- Subject: [PATCH] uri_imap: handle '/' as an IMAP hierarchy separator Untested at the moment(*), but we were inadvertantly truncating mailbox names with '/' due to our work-in-progress handling of "/;UID=$NUM" parameter. (*) strangely, my dovecot instance doesn't allow '/' by default, so the change to xt/net_writer-imap.t is untested. Reported-by: Konstantin Ryabitsev Link: https://public-inbox.org/meta/20210914175025.eq7s2shkc323itaf@meerkat.local/ --- lib/PublicInbox/URIimap.pm | 2 +- t/uri_imap.t | 2 ++ xt/net_writer-imap.t | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/PublicInbox/URIimap.pm b/lib/PublicInbox/URIimap.pm index a309fde0..6907e32a 100644 --- a/lib/PublicInbox/URIimap.pm +++ b/lib/PublicInbox/URIimap.pm @@ -63,7 +63,7 @@ sub path { my ($self) = @_; my (undef, undef, $path) = uri_split($$self); $path =~ s!\A/+!!; - $path =~ s![/;].*\z!!; # [;UIDVALIDITY=nz-number]/;UID=nz-number + $path =~ s!/?;.*\z!!; # [;UIDVALIDITY=nz-number]/;UID=nz-number $path eq '' ? undef : $path; } diff --git a/t/uri_imap.t b/t/uri_imap.t index 14f0f346..b9e4583d 100644 --- a/t/uri_imap.t +++ b/t/uri_imap.t @@ -130,5 +130,7 @@ $uri = PublicInbox::URIimap->new('imap://[::1]:36281/'); my $cred = bless { username => $uri->user, password => $uri->password }; 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"); done_testing; diff --git a/xt/net_writer-imap.t b/xt/net_writer-imap.t index 0a4cea68..f1228090 100644 --- a/xt/net_writer-imap.t +++ b/xt/net_writer-imap.t @@ -19,7 +19,8 @@ require_mods('Mail::IMAPClient'); require_ok 'PublicInbox::NetWriter'; my $host = (split(/\./, hostname))[0]; my ($base) = ($0 =~ m!\b([^/]+)\.[^\.]+\z!); -my $folder = "INBOX.$base-$host-".strftime('%Y%m%d%H%M%S', gmtime(time)). +my $SEP = $ENV{IMAP_SEPARATOR} || '.'; +my $folder = "INBOX$SEP$base-$host-".strftime('%Y%m%d%H%M%S', gmtime(time)). "-$$-".sprintf('%x', int(rand(0xffffffff))); my $nwr = PublicInbox::NetWriter->new; chop($imap_url) if substr($imap_url, -1) eq '/';