unofficial mirror of meta@public-inbox.org
 help / color / mirror / Atom feed
From: Eric Wong <e@80x24.org>
To: meta@public-inbox.org
Subject: [PATCH 2/3] lei_saved_search: canonicalized relative save paths
Date: Wed, 11 Aug 2021 11:26:17 +0000	[thread overview]
Message-ID: <20210811112618.24084-3-e@80x24.org> (raw)
In-Reply-To: <20210811112618.24084-1-e@80x24.org>

Storing relative paths with '..' in them can be expensive to
resolve when running 'lei up', so prefer storing canonicalized
absolute paths.  We only do this for paths with '..' in them,
though, since this can lose symlink info.
---
 lib/PublicInbox/LeiSavedSearch.pm | 9 ++++++++-
 t/lei-q-save.t                    | 9 +++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/lib/PublicInbox/LeiSavedSearch.pm b/lib/PublicInbox/LeiSavedSearch.pm
index cfbf68c3..2a0e9321 100644
--- a/lib/PublicInbox/LeiSavedSearch.pm
+++ b/lib/PublicInbox/LeiSavedSearch.pm
@@ -115,9 +115,16 @@ sub up { # updating existing saved search via "lei up"
 sub new { # new saved search "lei q --save"
 	my ($cls, $lei) = @_;
 	my $self = bless { ale => $lei->ale }, $cls;
+	require File::Path;
 	my $dst = $lei->{ovv}->{dst};
+
+	# canonicalize away relative paths into the config
+	if ($lei->{ovv}->{fmt} eq 'maildir' &&
+			$dst =~ m!(?:/*|\A)\.\.(?:/*|\z)! && !-d $dst) {
+		File::Path::make_path($dst);
+		$lei->{ovv}->{dst} = $dst = $lei->abs_path($dst);
+	}
 	my $dir = lss_dir_for($lei, \$dst);
-	require File::Path;
 	File::Path::make_path($dir); # raises on error
 	$self->{-cfg} = {};
 	my $f = $self->{'-f'} = "$dir/lei.saved-search";
diff --git a/t/lei-q-save.t b/t/lei-q-save.t
index b1ca4e92..eada2dd4 100644
--- a/t/lei-q-save.t
+++ b/t/lei-q-save.t
@@ -202,5 +202,14 @@ test_lei(sub {
 
 	lei_ok([qw(edit-search), $v2s], { VISUAL => 'cat', EDITOR => 'cat' });
 	like($lei_out, qr/^\[lei/sm, 'edit-search can cat');
+
+	lei_ok('-C', "$home/v2s",
+		qw(q -q --save -o ../s m:testmessage@example.com));
+	lei_ok qw(ls-search);
+	unlike $lei_out, qr{/\.\./s$}sm, 'relative path not in ls-search';
+	like $lei_out, qr{^\Q$home\E/s$}sm,
+		'absolute path appears in ls-search';
+	lei_ok qw(up ../s -C), "$home/v2s", \'relative lei up';
+	lei_ok qw(up), "$home/s", \'absolute lei up';
 });
 done_testing;

  parent reply	other threads:[~2021-08-11 11:26 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-11 11:26 [PATCH 0/3] lei pathname canonicalization fixes Eric Wong
2021-08-11 11:26 ` [PATCH 1/3] treewide: use *nix-specific dirname regexps Eric Wong
2021-08-11 11:26 ` Eric Wong [this message]
2021-08-11 11:26 ` [PATCH 3/3] lei: attempt to canonicalize away "/../" pathnames Eric Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://public-inbox.org/README

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210811112618.24084-3-e@80x24.org \
    --to=e@80x24.org \
    --cc=meta@public-inbox.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).