Blame
Date:
Tue Aug 30 11:40:44 2022 UTC
Message:
urlencode the mail/thread id reminded by semarie@, thanks!
001
2022-08-24
op
#!/usr/bin/env perl
002
2022-08-29
op
#
003
2022-08-29
op
# mexp was written by Omar Polo <op@openbsd.org> and is placed in the
004
2022-08-29
op
# public domain. The author hereby disclaims copyright to this source
005
2022-08-29
op
# code.
006
2022-08-24
op
007
2022-08-24
op
use open ":std", ":encoding(UTF-8)";
008
2022-08-24
op
use utf8;
009
2022-08-24
op
use strict;
010
2022-08-24
op
use warnings;
011
2022-08-24
op
use v5.32;
012
2022-08-27
op
use File::Temp qw(tempfile);
013
2022-08-24
op
014
2022-08-25
op
use OpenBSD::Pledge;
015
2022-08-25
op
use OpenBSD::Unveil;
016
2022-08-25
op
017
2022-08-25
op
use lib ".";
018
2022-08-30
op
use GotMArc qw(parse san urlencode initpage endpage thread_header);
019
2022-08-25
op
020
2022-08-24
op
my $outdir = $ENV{'OUTDIR'};
021
2022-08-24
op
die 'Set $OUTDIR' unless defined $outdir;
022
2022-08-24
op
023
2022-08-25
op
unveil("/usr/local/bin/mshow", "rx") or die "unveil mshow: $!";
024
2022-08-25
op
unveil($outdir, "rwc") or die "unveil $outdir: $!";
025
2022-08-30
op
026
2022-08-30
op
# can't use tmppath because File::Temp checks whether /tmp exists.
027
2022-08-27
op
unveil("/tmp", "rwc") or die "unveil /tmp: $!";
028
2022-08-27
op
unveil(".", "r") or die "unveil .: $!";
029
2022-08-25
op
030
2022-08-30
op
# fattr for File::Temp
031
2022-08-27
op
pledge("stdio rpath wpath cpath proc exec fattr") or die "pledge: $!";
032
2022-08-27
op
033
2022-08-24
op
my $tid;
034
2022-08-24
op
while (<>) {
035
2022-08-26
op
my ($level, $fname, $mid, $date, $from, $subj) = parse;
036
2022-08-24
op
037
2022-08-24
op
$tid = $mid if $level == 0;
038
2022-08-25
op
die "unknown tid" unless defined $tid;
039
2022-08-24
op
040
2022-08-25
op
my $dest = "$outdir/mail/$mid.html";
041
2022-08-25
op
next if -f $dest;
042
2022-08-25
op
043
2022-08-24
op
open(my $fh, '>', "$dest") or die "can't open $dest: $!";
044
2022-08-24
op
045
2022-08-25
op
initpage $fh, $subj;
046
2022-08-24
op
047
2022-08-27
op
my ($pfh, $parts) = tempfile "/tmp/gotmark.parts.XXXXXXXXXX";
048
2022-08-24
op
049
2022-08-27
op
$ENV{'PARTS_PATH'} = $parts;
050
2022-08-27
op
$ENV{'MESSAGE_ID'} = $mid;
051
2022-08-24
op
open(my $mshow, "-|", "mshow", "-nNA", "text/plain", $fname)
052
2022-08-24
op
or die "can't exec mshow: $!";
053
2022-08-24
op
054
2022-08-24
op
open(my $text, '>', "$outdir/text/$mid.txt")
055
2022-08-24
op
or die "can't open $outdir/text/$mid.txt: $!";
056
2022-08-24
op
057
2022-08-27
op
my @hdrs;
058
2022-08-24
op
while (<$mshow>) {
059
2022-08-24
op
last if /^$/;
060
2022-08-24
op
061
2022-08-24
op
# drop the (1 day ago) string
062
2022-08-27
op
s/ \(.*\)// if /^Date:/;
063
2022-08-27
op
print $text $_;
064
2022-08-27
op
push @hdrs, san($_);
065
2022-08-24
op
}
066
2022-08-27
op
say $text "";
067
2022-08-24
op
068
2022-08-27
op
thread_header $fh, $tid, $mid, \@hdrs;
069
2022-08-27
op
070
2022-08-24
op
print $fh "<pre>";
071
2022-08-25
op
while (<$mshow>) {
072
2022-08-25
op
print $text $_;
073
2022-08-25
op
print $fh san($_);
074
2022-08-25
op
}
075
2022-08-24
op
print $fh "</pre>";
076
2022-08-24
op
077
2022-08-24
op
# generate the listing for the exported parts
078
2022-08-24
op
my $part_seen = 0;
079
2022-08-27
op
while (<$pfh>) {
080
2022-08-24
op
if (!$part_seen) {
081
2022-08-24
op
$part_seen = 1;
082
2022-08-24
op
say $fh "<ul class='parts'>";
083
2022-08-24
op
}
084
2022-08-24
op
print $fh $_;
085
2022-08-24
op
}
086
2022-08-24
op
say $fh "</ul>" if $part_seen;
087
2022-08-24
op
088
2022-08-30
op
my $encmid = urlencode $mid;
089
2022-08-30
op
my $enctid = urlencode $tid;
090
2022-08-30
op
091
2022-08-27
op
print $fh "<nav>";
092
2022-08-30
op
print $fh "<a href='/text/$encmid.txt'>Raw body</a>";
093
2022-08-30
op
print $fh "<a href='/thread/$enctid.html#$encmid'>Thread</a>";
094
2022-08-27
op
print $fh "</nav>\n";
095
2022-08-27
op
096
2022-08-25
op
endpage $fh;
097
2022-08-24
op
098
2022-08-24
op
close($text);
099
2022-08-24
op
close($mshow);
100
2022-08-27
op
close($pfh);
101
2022-08-24
op
close($fh);
102
2022-08-24
op
103
2022-08-27
op
unlink $parts;
104
2022-08-27
op
}
Omar Polo