) {
$linenum++;
if ($line =~ m/^.$/ and 1 <= ord($line) && ord($line) <= 7) {
# state transitions
my $newstate;
my $statenum = ord($line);
$newstate = 'autocheck' if ($statenum == 1);
$newstate = 'recips' if ($statenum == 2);
$newstate = 'kill-end' if ($statenum == 3);
$newstate = 'go' if ($statenum == 5);
$newstate = 'html' if ($statenum == 6);
$newstate = 'incoming-recv' if ($statenum == 7);
# disallowed transitions:
$_ = "$normstate $newstate";
unless (m/^(go|go-nox|html) kill-end$/
|| m/^(kill-init|kill-end) (incoming-recv|autocheck|recips|html)$/
|| m/^kill-body go$/)
{
&quit("$ref: Transition from $normstate to $newstate at $linenum disallowed");
}
if ($newstate eq 'go') {
$this .= "\n";
}
if ($newstate eq 'html') {
$this = '';
}
if ($newstate eq 'kill-end') {
my $show = 1;
$show = $boring
if ($suppressnext && $normstate ne 'html');
$show = ($xmessage == $msg) if ($msg);
push @mails, $mail if ( $mbox && $mail );
if ($show) {
my $downloadHtml = '';
if ($mail) {
my $parser = new MIME::Parser;
$parser->tmp_to_core(1);
$parser->output_to_core(1);
# $parser->output_under("/tmp");
my $entity = $parser->parse_data($mail);
# TODO: make local subdir, clean it outselves
# the following does NOT delete the msg dirs in /tmp
END { $entity->purge; $parser->filer->purge; }
my @attachments = ();
if ( $entity->is_multipart ) {
my @parts = $entity->parts_DFS;
# $this .= htmlsanit($entity->head->stringify);
my @keep = ();
foreach ( @parts ) {
my $head = $_->head;
# $head->mime_attr("content-transfer-encoding" => "8bit")
# if !$head->mime_attr("content-transfer-encoding");
my ($disposition,$type) = (
$head->mime_attr("content-disposition"),
lc $head->mime_attr("content-type")
);
#print STDERR "'$type' '$disposition'\n";
if ($disposition && ( $disposition eq "attachment" || $disposition eq "inline" ) && $_->head->recommended_filename ) {
push @attachments, $_;
my $file = $_->head->recommended_filename;
$downloadHtml .= "Download Attachment: $file\n";
if ($msg && $att eq $#attachments) {
my $head = $_->head;
my $type;
chomp($type = $head->mime_attr("content-type"));
my $body = $_->stringify_body;
print "Content-Type: $type; name=$file\n\n";
my $decoder = new MIME::Decoder($head->mime_encoding);
$decoder->decode(new IO::Scalar(\$body), \*STDOUT);
exit(0);
}
if ($type eq 'text/plain') {
# push @keep, $_;
}
# $this .= htmlsanit($_->head->stringify);
} else {
# $this .= htmlsanit($_->head->stringify);
# push @keep, $_;
}
# $this .= "\n" . htmlsanit($_->stringify_body);
}
# $entity->parts(\@keep) if (!$msg);
}
$this .= htmlsanit($entity->stringify);
}
$this = "$downloadHtml\n$this$downloadHtml" if $downloadHtml;
$downloadHtml = '';
$this = "\n$this
\n"
if $normstate eq 'go' || $normstate eq 'go-nox';
$this = "$thisheader$this" if $thisheader && !( $normstate eq 'html' );;
$thisheader = '';
if ($normstate eq 'html') {
$this .= " Full text available.";
}
if ($reverse) {
$log = "$this\n
$log";
} else {
$log .= "$this\n
\n";
}
}
$xmessage++ if ($normstate ne 'html');
$suppressnext = $normstate eq 'html';
}
$normstate = $newstate;
$mail = '';
next;
}
$_ = $line;
if ($normstate eq 'incoming-recv') {
my $pl= $_;
$pl =~ s/\n+$//;
m/^Received: \(at (\S+)\) by (\S+)\;/
|| &quit("bad line \`$pl' in state incoming-recv");
$thisheader = "Message received at ".htmlsanit("$1\@$2")
. ":
\n";
$this = '';
$normstate= 'go';
$mail .= $_;
} elsif ($normstate eq 'html') {
$this .= $_;
} elsif ($normstate eq 'go') {
if ($mail) {
$mail .= $_;
} else {
$this .= htmlsanit($_);
}
} elsif ($normstate eq 'go-nox') {
next if !s/^X//;
if ($mail) {
$mail .= $_;
} else {
$this .= htmlsanit($_);
}
} elsif ($normstate eq 'recips') {
if (m/^-t$/) {
$this = "Message sent:
\n";
} else {
s/\04/, /g; s/\n$//;
$this = "Message sent to ".htmlsanit($_).":
\n";
}
$normstate= 'kill-body';
} elsif ($normstate eq 'autocheck') {
next if !m/^X-Debian-Bugs(-\w+)?: This is an autoforward from (\S+)/;
$normstate= 'autowait';
$this = "Message received at $2:
\n";
} elsif ($normstate eq 'autowait') {
next if !m/^$/;
$normstate= 'go-nox';
$this .= "\n";
} else {
&quit("$ref state $normstate line \`$_'");
}
}
&quit("$ref state $normstate at end") unless $normstate eq 'kill-end';
close(L);
if ( $mbox ) {
print "Content-Type: text/plain\n\n";
foreach ( @mails ) {
my @lines = split( "\n", $_, -1 );
if ( $lines[ 1 ] =~ m/^From / ) {
my $tmp = $lines[ 0 ];
$lines[ 0 ] = $lines[ 1 ];
$lines[ 1 ] = $tmp;
$_ = join( "\n", @lines ) . "\n";
}
if ( !( $lines[ 0 ] =~ m/^From / ) ) {
$ENV{ PATH } = "/bin:/usr/bin:/usr/local/bin";
my $date = `date "+%a %b %d %T %Y"`;
chomp $date;
$_ = "From unknown $date\n" . $_;
}
}
print join("", @mails );
exit 0;
}
print "Content-Type: text/html\n\n";
print "\n";
print "\n" .
"$debbugs::gProject $debbugs::gBug report logs - $short\n" .
"\n" .
'' .
"\n";
print "" . "$debbugs::gProject $debbugs::gBug report logs - $short" .
"
" . htmlsanit($status{subject}) . "
\n";
print "$descriptivehead\n";
printf "
Download as mbox\n", mboxurl($ref);
print "
";
print "$log";
print $tail_html;
print "\n";
exit 0;