-{
- my $part1 = Email::MIME->create(
- attributes => {
- content_type => 'text/plain',
- disposition => 'attachment',
- charset => 'US-ASCII',
- encoding => 'quoted-printable',
- filename => 'attached_fart.txt',
- },
- body_str => 'inside the attachment',
- );
- my $part2 = Email::MIME->create(
- attributes => {
- content_type => 'text/plain',
- disposition => 'attachment',
- charset => 'US-ASCII',
- encoding => 'quoted-printable',
- filename => 'part_deux.txt',
- },
- body_str => 'inside another',
- );
- my $amsg = Email::MIME->create(
- header_str => [
- Subject => 'see attachment',
- 'Message-ID' => '<file@attached>',
- From => 'John Smith <js@example.com>',
- To => 'list@example.com',
- ],
- parts => [ $part1, $part2 ],
- );
- ok($rw->add_message($amsg), 'added attachment');
+$ibx->with_umask(sub {
+ my $amsg = eml_load 't/search-amsg.eml';
+ my $oid = ('0'x40);
+ my $smsg = bless { blob => $oid }, 'PublicInbox::Smsg';
+ ok($rw->add_message($amsg, $smsg), 'added attachment');
+ $rw_commit->();
+ my $n = $query->('n:attached_fart.txt');
+ is(scalar @$n, 1, 'got result for n:');
+ my $res = $query->('part_deux.txt');
+ is(scalar @$res, 1, 'got result without n:');
+ is($n->[0]->{mid}, $res->[0]->{mid},
+ 'same result with and without') if scalar(@$res);
+ my $txt = $query->('"inside another"');
+ is(scalar @$txt, 1, 'found inside another');
+ is($txt->[0]->{mid}, $res->[0]->{mid},
+ 'search inside text attachments works') if scalar(@$txt);
+
+ my $art;
+ if (scalar(@$n) >= 1) {
+ my $mid = $n->[0]->{mid};
+ my ($id, $prev);
+ $art = $ibx->over->next_by_mid($mid, \$id, \$prev);
+ ok($art, 'article exists in OVER DB');
+ }
+ $rw->_msgmap_init;
+ $rw->unindex_eml($oid, $amsg);
+ $rw->commit_txn_lazy;
+ SKIP: {
+ skip('$art not defined', 1) unless defined $art;
+ is($ibx->over->get_art($art->{num}), undef,
+ 'gone from OVER DB');
+ };
+});
+
+my $all_mask = 07777;
+my $dir_mask = 02770;
+
+# FreeBSD and apparently OpenBSD does not allow non-root users to set S_ISGID,
+# so git doesn't set it, either (see DIR_HAS_BSD_GROUP_SEMANTICS in git.git)
+if ($^O =~ /(?:free|open)bsd/i) {
+ $all_mask = 0777;
+ $dir_mask = 0770;
+}
+
+foreach my $f ("$git_dir/public-inbox/msgmap.sqlite3",
+ "$git_dir/public-inbox",
+ glob("$git_dir/public-inbox/xapian*/"),
+ glob("$git_dir/public-inbox/xapian*/*")) {
+ my @st = stat($f);
+ my ($bn) = (split(m!/!, $f))[-1];
+ oct_is($st[2] & $all_mask, -f _ ? 0660 : $dir_mask,
+ "sharedRepository respected for $bn");
+}
+
+$ibx->with_umask(sub {