Blame


1 7d6d378a 2022-08-24 op #!/usr/bin/env perl
2 7d6d378a 2022-08-24 op
3 7d6d378a 2022-08-24 op use open ":std", ":encoding(UTF-8)";
4 7d6d378a 2022-08-24 op use utf8;
5 7d6d378a 2022-08-24 op use strict;
6 7d6d378a 2022-08-24 op use warnings;
7 7d6d378a 2022-08-24 op use v5.32;
8 66e1cf97 2022-08-27 op use File::Temp qw(tempfile);
9 7d6d378a 2022-08-24 op
10 054f3fd4 2022-08-25 op use OpenBSD::Pledge;
11 054f3fd4 2022-08-25 op use OpenBSD::Unveil;
12 054f3fd4 2022-08-25 op
13 04eab9af 2022-08-25 op use lib ".";
14 9d8482ab 2022-08-27 op use GotMArc qw(parse san initpage endpage thread_header);
15 04eab9af 2022-08-25 op
16 7d6d378a 2022-08-24 op my $outdir = $ENV{'OUTDIR'};
17 7d6d378a 2022-08-24 op die 'Set $OUTDIR' unless defined $outdir;
18 7d6d378a 2022-08-24 op
19 054f3fd4 2022-08-25 op unveil("/usr/local/bin/mshow", "rx") or die "unveil mshow: $!";
20 054f3fd4 2022-08-25 op unveil($outdir, "rwc") or die "unveil $outdir: $!";
21 66e1cf97 2022-08-27 op unveil("/tmp", "rwc") or die "unveil /tmp: $!";
22 66e1cf97 2022-08-27 op unveil(".", "r") or die "unveil .: $!";
23 054f3fd4 2022-08-25 op
24 66e1cf97 2022-08-27 op # fattr because of File::Temp somehow.
25 66e1cf97 2022-08-27 op pledge("stdio rpath wpath cpath proc exec fattr") or die "pledge: $!";
26 66e1cf97 2022-08-27 op
27 7d6d378a 2022-08-24 op my $tid;
28 7d6d378a 2022-08-24 op while (<>) {
29 de557185 2022-08-26 op my ($level, $fname, $mid, $date, $from, $subj) = parse;
30 7d6d378a 2022-08-24 op
31 7d6d378a 2022-08-24 op $tid = $mid if $level == 0;
32 f3e4455d 2022-08-25 op die "unknown tid" unless defined $tid;
33 7d6d378a 2022-08-24 op
34 c971fcee 2022-08-25 op my $dest = "$outdir/mail/$mid.html";
35 c971fcee 2022-08-25 op next if -f $dest;
36 c971fcee 2022-08-25 op
37 7d6d378a 2022-08-24 op open(my $fh, '>', "$dest") or die "can't open $dest: $!";
38 7d6d378a 2022-08-24 op
39 04eab9af 2022-08-25 op initpage $fh, $subj;
40 7d6d378a 2022-08-24 op
41 66e1cf97 2022-08-27 op my ($pfh, $parts) = tempfile "/tmp/gotmark.parts.XXXXXXXXXX";
42 f1ceade9 2022-08-24 op
43 66e1cf97 2022-08-27 op $ENV{'PARTS_PATH'} = $parts;
44 66e1cf97 2022-08-27 op $ENV{'MESSAGE_ID'} = $mid;
45 7d6d378a 2022-08-24 op open(my $mshow, "-|", "mshow", "-nNA", "text/plain", $fname)
46 7d6d378a 2022-08-24 op or die "can't exec mshow: $!";
47 7d6d378a 2022-08-24 op
48 84989e10 2022-08-24 op open(my $text, '>', "$outdir/text/$mid.txt")
49 84989e10 2022-08-24 op or die "can't open $outdir/text/$mid.txt: $!";
50 84989e10 2022-08-24 op
51 9d8482ab 2022-08-27 op my @hdrs;
52 7d6d378a 2022-08-24 op while (<$mshow>) {
53 7d6d378a 2022-08-24 op last if /^$/;
54 7d6d378a 2022-08-24 op
55 7d6d378a 2022-08-24 op # drop the (1 day ago) string
56 6e04f5f4 2022-08-27 op s/ \(.*\)// if /^Date:/;
57 6797be46 2022-08-27 op print $text $_;
58 9d8482ab 2022-08-27 op push @hdrs, san($_);
59 7d6d378a 2022-08-24 op }
60 6797be46 2022-08-27 op say $text "";
61 7d6d378a 2022-08-24 op
62 9d8482ab 2022-08-27 op thread_header $fh, $tid, $mid, \@hdrs;
63 9d8482ab 2022-08-27 op
64 7d6d378a 2022-08-24 op print $fh "<pre>";
65 5b01d758 2022-08-25 op while (<$mshow>) {
66 5b01d758 2022-08-25 op print $text $_;
67 5b01d758 2022-08-25 op print $fh san($_);
68 5b01d758 2022-08-25 op }
69 7d6d378a 2022-08-24 op print $fh "</pre>";
70 7d6d378a 2022-08-24 op
71 f1ceade9 2022-08-24 op # generate the listing for the exported parts
72 f1ceade9 2022-08-24 op my $part_seen = 0;
73 66e1cf97 2022-08-27 op while (<$pfh>) {
74 f1ceade9 2022-08-24 op if (!$part_seen) {
75 f1ceade9 2022-08-24 op $part_seen = 1;
76 f1ceade9 2022-08-24 op say $fh "<ul class='parts'>";
77 f1ceade9 2022-08-24 op }
78 f1ceade9 2022-08-24 op print $fh $_;
79 f1ceade9 2022-08-24 op }
80 f1ceade9 2022-08-24 op say $fh "</ul>" if $part_seen;
81 f1ceade9 2022-08-24 op
82 1fd8f454 2022-08-27 op print $fh "<nav>";
83 1fd8f454 2022-08-27 op print $fh "<a href='/text/$mid.txt'>Raw body</a>";
84 1fd8f454 2022-08-27 op print $fh "<a href='/thread/$tid.html#$mid'>Thread</a>";
85 1fd8f454 2022-08-27 op print $fh "</nav>\n";
86 1fd8f454 2022-08-27 op
87 04eab9af 2022-08-25 op endpage $fh;
88 7d6d378a 2022-08-24 op
89 84989e10 2022-08-24 op close($text);
90 7d6d378a 2022-08-24 op close($mshow);
91 66e1cf97 2022-08-27 op close($pfh);
92 7d6d378a 2022-08-24 op close($fh);
93 f1ceade9 2022-08-24 op
94 66e1cf97 2022-08-27 op unlink $parts;
95 66e1cf97 2022-08-27 op }