From c51cab322be0f255d8d51cea6c91a210fb35fb09 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 30 Nov 2023 11:40:56 +0000 Subject: config: reject newlines consistently in dir names Explicitly drop support for "\n" in git coderepo pathnames as we do other stuff. Gcf2 (our libgit2 helper) was always broken with "\n" in pathnames, and I'm not sure if cgit config files work with them, either. Dealing with newline characters requires extra complexity that I'm not willing to deal with when managing alternates files. --- lib/PublicInbox/Config.pm | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) (limited to 'lib/PublicInbox/Config.pm') diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 779e3140..6bebf790 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -361,12 +361,19 @@ sub parse_cgitrc { cgit_repo_merge($self, $repo->{dir}, $repo) if $repo; } +sub valid_dir ($$) { + my $dir = get_1($_[0], $_[1]) // return; + index($dir, "\n") < 0 ? $dir : do { + warn "E: `$_[1]=$dir' must not contain `\\n'\n"; + undef; + } +} + # parse a code repo, only git is supported at the moment sub fill_coderepo { my ($self, $nick) = @_; my $pfx = "coderepo.$nick"; - my $dir = $self->{"$pfx.dir"} // return undef; # aka "GIT_DIR" - my $git = PublicInbox::Git->new($dir); + my $git = PublicInbox::Git->new(valid_dir($self, "$pfx.dir") // return); if (defined(my $cgits = $self->{"$pfx.cgiturl"})) { $git->{cgit_url} = $cgits = _array($cgits); $self->{"$pfx.cgiturl"} = $cgits; @@ -450,18 +457,15 @@ sub _fill_ibx { my $v = $self->{"$pfx.$k"}; $ibx->{$k} = $v if defined $v; } - for my $k (qw(filter inboxdir newsgroup replyto httpbackendmax feedmax + for my $k (qw(filter newsgroup replyto httpbackendmax feedmax indexlevel indexsequentialshard boost)) { my $v = get_1($self, "$pfx.$k") // next; $ibx->{$k} = $v; } # "mainrepo" is backwards compatibility: - my $dir = $ibx->{inboxdir} //= $self->{"$pfx.mainrepo"} // return; - if (index($dir, "\n") >= 0) { - warn "E: `$dir' must not contain `\\n'\n"; - return; - } + my $dir = $ibx->{inboxdir} = valid_dir($self, "$pfx.inboxdir") // + valid_dir($self, "$pfx.mainrepo") // return; for my $k (qw(obfuscate)) { my $v = $self->{"$pfx.$k"} // next; if (defined(my $bval = git_bool($v))) { @@ -548,12 +552,8 @@ sub _fill_ei ($$) { my ($self, $name) = @_; eval { require PublicInbox::ExtSearch } or return; my $pfx = "extindex.$name"; - my $d = $self->{"$pfx.topdir"} // return; + my $d = valid_dir($self, "$pfx.topdir") // return; -d $d or return; - if (index($d, "\n") >= 0) { - warn "E: `$d' must not contain `\\n'\n"; - return; - } my $es = PublicInbox::ExtSearch->new($d); for my $k (qw(indexlevel indexsequentialshard)) { my $v = get_1($self, "$pfx.$k") // next; @@ -573,12 +573,8 @@ sub _fill_csrch ($$) { return if $name ne '' && !valid_foo_name($name, 'cindex'); eval { require PublicInbox::CodeSearch } or return; my $pfx = "cindex.$name"; - my $d = $self->{"$pfx.topdir"} // return; + my $d = valid_dir($self, "$pfx.topdir") // return; -d $d or return; - if (index($d, "\n") >= 0) { - warn "E: `$d' must not contain `\\n'\n"; - return; - } my $csrch = PublicInbox::CodeSearch->new($d, $self); for my $k (qw(localprefix)) { my $v = $self->{"$pfx.$k"} // next; -- cgit v1.2.3-24-ge0c7