]> Sergey Matveev's repositories - public-inbox.git/commitdiff
use rel2abs_collapsed when loading Inbox objects
authorEric Wong <e@80x24.org>
Mon, 21 Dec 2020 07:51:20 +0000 (07:51 +0000)
committerEric Wong <e@80x24.org>
Mon, 21 Dec 2020 21:51:57 +0000 (21:51 +0000)
We need to canonicalize paths for inboxes which do not have
a newsgroup defined, otherwise ->eidx_key matches can fail
in unexpected ways.

lib/PublicInbox/Admin.pm
lib/PublicInbox/Config.pm
lib/PublicInbox/ExtSearchIdx.pm
script/public-inbox-convert
script/public-inbox-init

index ea82133aa8adef38c994e528bf38649d4924bcf1..c972fb680a80da9b6ce5e9b0cf75c12a73fcf170 100644 (file)
@@ -10,7 +10,7 @@ our @EXPORT_OK = qw(setup_signals);
 use PublicInbox::Config;
 use PublicInbox::Inbox;
 use PublicInbox::Spawn qw(popen_rd);
-use File::Spec ();
+*rel2abs_collapsed = \&PublicInbox::Config::rel2abs_collapsed;
 
 sub setup_signals {
        my ($cb, $arg) = @_; # optional
@@ -27,15 +27,6 @@ sub setup_signals {
        };
 }
 
-# abs_path resolves symlinks, so we want to avoid it if rel2abs
-# is sufficient and doesn't leave "/.." or "/../"
-sub rel2abs_collapsed ($) {
-       my $p = File::Spec->rel2abs($_[0]);
-       return $p if substr($p, -3, 3) ne '/..' && index($p, '/../') < 0; # likely
-       require Cwd;
-       Cwd::abs_path($p);
-}
-
 sub resolve_inboxdir {
        my ($cd, $ver) = @_;
        my $try = $cd // '.';
index 2f5c83cd86c9f9322cca5a14120c6906c7cd73ea..577337dc8a024d375be2db4f72cffb0365be2ffb 100644 (file)
@@ -368,6 +368,16 @@ sub git_bool {
        }
 }
 
+# abs_path resolves symlinks, so we want to avoid it if rel2abs
+# is sufficient and doesn't leave "/.." or "/../"
+sub rel2abs_collapsed {
+       require File::Spec;
+       my $p = File::Spec->rel2abs($_[-1]);
+       return $p if substr($p, -3, 3) ne '/..' && index($p, '/../') < 0;
+       require Cwd;
+       Cwd::abs_path($p);
+}
+
 sub _fill {
        my ($self, $pfx) = @_;
        my $ibx = {};
@@ -391,9 +401,9 @@ EOF
        }
 
        # "mainrepo" is backwards compatibility:
-       $ibx->{inboxdir} //= $self->{"$pfx.mainrepo"} // return;
-       if ($ibx->{inboxdir} =~ /\n/s) {
-               warn "E: `$ibx->{inboxdir}' must not contain `\\n'\n";
+       my $dir = $ibx->{inboxdir} //= $self->{"$pfx.mainrepo"} // return;
+       if (index($dir, "\n") >= 0) {
+               warn "E: `$dir' must not contain `\\n'\n";
                return;
        }
        foreach my $k (qw(obfuscate)) {
@@ -436,7 +446,7 @@ EOF
                        $self->{-by_list_id}->{lc($list_id)} = $ibx;
                }
        }
-       if (my $ngname = $ibx->{newsgroup}) {
+       if (defined(my $ngname = $ibx->{newsgroup})) {
                if (ref($ngname)) {
                        delete $ibx->{newsgroup};
                        warn 'multiple newsgroups not supported: '.
@@ -445,7 +455,8 @@ EOF
                # wildmat-exact and RFC 3501 (IMAP) ATOM-CHAR.
                # Leave out a few chars likely to cause problems or conflicts:
                # '|', '<', '>', ';', '#', '$', '&',
-               } elsif ($ngname =~ m![^A-Za-z0-9/_\.\-\~\@\+\=:]!) {
+               } elsif ($ngname =~ m![^A-Za-z0-9/_\.\-\~\@\+\=:]! ||
+                               $ngname eq '') {
                        delete $ibx->{newsgroup};
                        warn "newsgroup name invalid: `$ngname'\n";
                } else {
@@ -454,6 +465,13 @@ EOF
                        $self->{-by_newsgroup}->{$ngname} = $ibx;
                }
        }
+       unless (defined $ibx->{newsgroup}) { # for ->eidx_key
+               my $abs = rel2abs_collapsed($dir);
+               if ($abs ne $dir) {
+                       warn "W: `$dir' canonicalized to `$abs'\n";
+                       $ibx->{inboxdir} = $abs;
+               }
+       }
        $self->{-by_name}->{$name} = $ibx;
        if ($ibx->{obfuscate}) {
                $ibx->{-no_obfuscate} = $self->{-no_obfuscate};
index b82d05462671500f97c4a04701804004bed1370c..c4b429df0cf8b5c8e71642d9e2d677837574d15e 100644 (file)
@@ -72,11 +72,6 @@ sub attach_inbox {
                warn "W: skipping $key (no UIDVALIDITY)\n";
                return;
        }
-       my $ibxdir = File::Spec->canonpath($ibx->{inboxdir});
-       if ($ibxdir ne $ibx->{inboxdir}) {
-               warn "W: `$ibx->{inboxdir}' canonicalized to `$ibxdir'\n";
-               $ibx->{inboxdir} = $ibxdir;
-       }
        $self->{ibx_map}->{$key} //= do {
                push @{$self->{ibx_list}}, $ibx;
                $ibx;
index fbd527a6a1bc187df3c3ebf511ff672a2378aed4..800c364cea4999352494249ce71691ccf023cc3b 100755 (executable)
@@ -75,7 +75,7 @@ if ($opt->{'index'}) {
 }
 local %ENV = (%$env, %ENV) if $env;
 my $new = { %$old };
-$new->{inboxdir} = PublicInbox::Admin::rel2abs_collapsed($new_dir);
+$new->{inboxdir} = $cfg->rel2abs_collapsed($new_dir);
 $new->{version} = 2;
 $new = PublicInbox::InboxWritable->new($new, { nproc => $opt->{jobs} });
 $new->{-no_fsync} = 1 if !$opt->{fsync};
index eb605a51221b2411e9a49e2154506f32ad9c54fc..afaa4c12978cadaee45d8284430c85c7a7ef7720 100755 (executable)
@@ -138,7 +138,7 @@ close($fh) or die "failed to close $pi_config_tmp: $!\n";
 my $pfx = "publicinbox.$name";
 my @x = (qw/git config/, "--file=$pi_config_tmp");
 
-PublicInbox::Admin::rel2abs_collapsed($inboxdir);
+PublicInbox::Config::rel2abs_collapsed($inboxdir);
 die "`\\n' not allowed in `$inboxdir'\n" if index($inboxdir, "\n") >= 0;
 
 if (-f "$inboxdir/inbox.lock") {