lib/PublicInbox/Admin.pm | 11 +---------- lib/PublicInbox/Config.pm | 28 +++++++++++++++++++++++----- lib/PublicInbox/ExtSearchIdx.pm | 5 ----- script/public-inbox-convert | 2 +- script/public-inbox-init | 2 +- diff --git a/lib/PublicInbox/Admin.pm b/lib/PublicInbox/Admin.pm index ea82133aa8adef38c994e528bf38649d4924bcf1..c972fb680a80da9b6ce5e9b0cf75c12a73fcf170 100644 --- a/lib/PublicInbox/Admin.pm +++ b/lib/PublicInbox/Admin.pm @@ -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 @@ -25,15 +25,6 @@ eval { $cb->($sig, $arg) } if $cb; $sig = 'SIG'.$sig; exit(128 + POSIX->$sig); }; -} - -# 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 { diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 2f5c83cd86c9f9322cca5a14120c6906c7cd73ea..577337dc8a024d375be2db4f72cffb0365be2ffb 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -368,6 +368,16 @@ undef; } } +# 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 @@ } } # "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 @@ foreach my $list_id (@$listids) { $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,13 +455,21 @@ # Newsgroup name needs to be compatible with RFC 3977 # 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 { # PublicInbox::NNTPD does stricter ->nntp_usable # checks, keep this lean for startup speed $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; diff --git a/lib/PublicInbox/ExtSearchIdx.pm b/lib/PublicInbox/ExtSearchIdx.pm index b82d05462671500f97c4a04701804004bed1370c..c4b429df0cf8b5c8e71642d9e2d677837574d15e 100644 --- a/lib/PublicInbox/ExtSearchIdx.pm +++ b/lib/PublicInbox/ExtSearchIdx.pm @@ -72,11 +72,6 @@ if (!defined($ibx->uidvalidity)) { 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; diff --git a/script/public-inbox-convert b/script/public-inbox-convert index fbd527a6a1bc187df3c3ebf511ff672a2378aed4..800c364cea4999352494249ce71691ccf023cc3b 100755 --- a/script/public-inbox-convert +++ b/script/public-inbox-convert @@ -75,7 +75,7 @@ $env = PublicInbox::Admin::index_prepare($opt, $cfg); } 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}; diff --git a/script/public-inbox-init b/script/public-inbox-init index eb605a51221b2411e9a49e2154506f32ad9c54fc..afaa4c12978cadaee45d8284430c85c7a7ef7720 100755 --- a/script/public-inbox-init +++ b/script/public-inbox-init @@ -138,7 +138,7 @@ 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") {