From: Eric Wong Date: Sun, 23 Aug 2015 19:41:28 +0000 (+0000) Subject: hopefully fix broken permissions for search X-Git-Tag: v1.0.0~992 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2b1e7946abd1d589fc69b758c68497458bbf0ecf;p=thirdparty%2Fpublic-inbox.git hopefully fix broken permissions for search We must preserve the umask for the entirety of the indexing operation, as Xapian transactions replace entire files atomically instead of writing them in place. --- diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm index 5664c3850..2c2f81939 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -21,19 +21,18 @@ sub new { my $dir = $class->xdir($git_dir); require Search::Xapian::WritableDatabase; my $flag = Search::Xapian::DB_OPEN; - if ($writable == 1) { - require File::Path; - File::Path::mkpath($dir); - $flag = Search::Xapian::DB_CREATE_OR_OPEN; - } my $self = bless { git_dir => $git_dir }, $class; - my $umask = _umask_for($self->_git_config_perm); - my $old_umask = umask $umask; - my $db = eval { Search::Xapian::WritableDatabase->new($dir, $flag) }; - my $err = $@; - umask $old_umask; - die $err if $err; - $self->{xdb} = $db; + my $perm = $self->_git_config_perm; + my $umask = _umask_for($perm); + $self->{umask} = $umask; + $self->{xdb} = $self->with_umask(sub { + if ($writable == 1) { + require File::Path; + File::Path::mkpath($dir); + $flag = Search::Xapian::DB_CREATE_OR_OPEN; + } + Search::Xapian::WritableDatabase->new($dir, $flag); + }); $self; } @@ -288,8 +287,13 @@ sub do_cat_mail { $@ ? undef : $mime; } -# indexes all unindexed messages sub index_sync { + my ($self, $head) = @_; + $self->with_umask(sub { $self->_index_sync($head) }); +} + +# indexes all unindexed messages +sub _index_sync { my ($self, $head) = @_; require PublicInbox::GitCatFile; my $db = $self->{xdb}; @@ -423,4 +427,14 @@ sub _umask_for { (~$rv & 0777); } +sub with_umask { + my ($self, $cb) = @_; + my $old = umask $self->{umask}; + my $rv = eval { $cb->() }; + my $err = $@; + umask $old; + die $err if $@; + $rv; +} + 1; diff --git a/public-inbox-mda b/public-inbox-mda index 8e98d6ebe..c4822b618 100755 --- a/public-inbox-mda +++ b/public-inbox-mda @@ -88,7 +88,7 @@ sub do_spamc { sub search_index_sync { my ($git_dir) = @_; eval { - require PublicInbox::Search; + require PublicInbox::SearchIdx; PublicInbox::SearchIdx->new($git_dir, 2)->index_sync; }; }