]> git.donarmstrong.com Git - debbugs.git/blobdiff - cgi/bugreport.cgi
move the function from bugreport.cgi out to a separate module
[debbugs.git] / cgi / bugreport.cgi
index 856a35be4e8c27c785a9ab0c55da7b433e9fa648..dcb6482345f984479a7e20499232cb6e0d60c239 100755 (executable)
@@ -2,6 +2,7 @@
 
 use warnings;
 use strict;
+
 use POSIX qw(strftime tzset);
 use MIME::Parser;
 use MIME::Decoder;
@@ -14,6 +15,7 @@ use Debbugs::Config qw(:globals :text);
 use Debbugs::Log qw(read_log_records);
 use Debbugs::MIME qw(convert_to_utf8 decode_rfc1522 create_mime_message);
 use Debbugs::CGI qw(:url :html :util);
+use Debbugs::CGI::Bugreport qw(:all);
 use Debbugs::Common qw(buglog getmaintainers);
 use Debbugs::Packages qw(getpkgsrc);
 use Debbugs::Status qw(splitpackages get_bug_status isstrongseverity);
@@ -81,117 +83,124 @@ if (defined $ENV{REQUEST_METHOD} and $ENV{REQUEST_METHOD} eq 'HEAD' and not defi
     exit 0;
 }
 
-sub display_entity ($$$$\$\@);
-sub display_entity ($$$$\$\@) {
-    my $entity = shift;
-    my $ref = shift;
-    my $top = shift;
-    my $xmessage = shift;
-    my $this = shift;
-    my $attachments = shift;
-
-    my $head = $entity->head;
-    my $disposition = $head->mime_attr('content-disposition');
-    $disposition = 'inline' if not defined $disposition or $disposition eq '';
-    my $type = $entity->effective_type;
-    my $filename = $entity->head->recommended_filename;
-    $filename = '' unless defined $filename;
-    $filename = decode_rfc1522($filename);
-
-    if ($top and not $terse) {
-        my $header = $entity->head;
-        $$this .= "<pre class=\"headers\">\n";
-        if ($trim_headers) {
-             my @headers;
-             foreach (qw(From To Cc Subject Date)) {
-                  my $head_field = $head->get($_);
-                  next unless defined $head_field and $head_field ne '';
-                  push @headers, qq(<b>$_:</b> ) . html_escape(decode_rfc1522($head_field));
-             }
-             $$this .= join(qq(), @headers) unless $terse;
-        } else {
-             $$this .= html_escape(decode_rfc1522($entity->head->stringify));
-        }
-        $$this .= "</pre>\n";
-    }
 
-    unless (($top and $type =~ m[^text(?:/plain)?(?:;|$)]) or
-           ($type =~ m[^multipart/])) {
-       push @$attachments, $entity;
-       my @dlargs = ($ref, msg=>$xmessage, att=>$#$attachments);
-       push @dlargs, (filename=>$filename) if $filename ne '';
-       my $printname = $filename;
-       $printname = 'Message part ' . ($#$attachments + 1) if $filename eq '';
-       $$this .= '<pre class="mime">[<a href="' . bug_url(@dlargs) . qq{">$printname</a> } .
-                 "($type, $disposition)]</pre>\n";
-
-       if ($msg and defined($att) and $att == $#$attachments) {
-           my $head = $entity->head;
-           chomp(my $type = $entity->effective_type);
-           my $body = $entity->stringify_body;
-           print "Content-Type: $type";
-           my ($charset) = $head->get('Content-Type:') =~ m/charset\s*=\s*\"?([\w-]+)\"?/i;
-           print qq(; charset="$charset") if defined $charset;
-           print "\n";
-           if ($filename ne '') {
-               my $qf = $filename;
-               $qf =~ s/"/\\"/g;
-               $qf =~ s[.*/][];
-               print qq{Content-Disposition: inline; filename="$qf"\n};
-           }
-           print "\n";
-           my $decoder = new MIME::Decoder($head->mime_encoding);
-           $decoder->decode(new IO::Scalar(\$body), \*STDOUT);
-           exit(0);
-       }
-    }
+my $buglogfh;
+if ($buglog =~ m/\.gz$/) {
+    my $oldpath = $ENV{'PATH'};
+    $ENV{'PATH'} = '/bin:/usr/bin';
+    $buglogfh = new IO::File "zcat $buglog |" or &quitcgi("open log for $ref: $!");
+    $ENV{'PATH'} = $oldpath;
+} else {
+    $buglogfh = new IO::File "<$buglog" or &quitcgi("open log for $ref: $!");
+}
 
-    return if not $top and $disposition eq 'attachment' and not defined($att);
-    return unless ($type =~ m[^text/?] and
-                  $type !~ m[^text/(?:html|enriched)(?:;|$)]) or
-                 $type =~ m[^application/pgp(?:;|$)] or
-                 $entity->parts;
-
-    if ($entity->is_multipart) {
-       my @parts = $entity->parts;
-       foreach my $part (@parts) {
-           display_entity($part, $ref, 0, $xmessage,
-                          $$this, @$attachments);
-           $$this .= "\n";
-       }
-    } elsif ($entity->parts) {
-       # We must be dealing with a nested message.
-       $$this .= "<blockquote>\n";
-       my @parts = $entity->parts;
-       foreach my $part (@parts) {
-           display_entity($part, $ref, 1, $xmessage,
-                          $$this, @$attachments);
-           $$this .= "\n";
-       }
-       $$this .= "</blockquote>\n";
-    } else {
-        if (not $terse) {
-             my $content_type = $entity->head->get('Content-Type:') || "text/html";
-             my ($charset) = $content_type =~ m/charset\s*=\s*\"?([\w-]+)\"?/i;
-             my $body = $entity->bodyhandle->as_string;
-             $body = convert_to_utf8($body,$charset) if defined $charset;
-             $body = html_escape($body);
-             # Attempt to deal with format=flowed
-             if ($content_type =~ m/format\s*=\s*\"?flowed\"?/i) {
-                  $body =~ s{^\ }{}mgo;
-                  # we ignore the other things that you can do with
-                  # flowed e-mails cause they don't really matter.
-             }
-             # Add links to URLs
-             $body =~ s,((ftp|http|https)://[\S~-]+?/?)((\&gt\;)?[)]?[']?[:.\,]?(\s|$)),<a href=\"$1\">$1</a>$3,go;
-             # Add links to bug closures
-             $body =~ s[(closes:\s*(?:bug)?\#?\s?\d+(?:,?\s*(?:bug)?\#?\s?\d+)*)
-                       ][my $temp = $1; $temp =~ s{(\d+)}{qq(<a href=").bug_url($1).qq(">$1</a>)}ge; $temp;]gxie;
-             $$this .= qq(<pre class="message">$body</pre>\n);
-        }
-    }
+
+my @records;
+eval{
+     @records = read_log_records($buglogfh);
+};
+if ($@) {
+     quitcgi("Bad bug log for $gBug $ref. Unable to read records: $@");
+}
+undef $buglogfh;
+
+
+my $log='';
+my $msg_num = 0;
+my $skip_next = 0;
+if (looks_like_number($msg) and ($msg-1) <= $#records) {
+     @records = ($records[$msg-1]);
+     $msg_num = $msg - 1;
+}
+my @log;
+if ( $mbox ) {
+     my $date = strftime "%a %b %d %T %Y", localtime;
+     if (@records > 1) {
+         print qq(Content-Disposition: attachment; filename="bug_${ref}.mbox"\n);
+         print "Content-Type: text/plain\n\n";
+     }
+     else {
+         $msg_num++;
+         print qq(Content-Disposition: attachment; filename="bug_${ref}_message_${msg_num}.mbox"\n);
+         print "Content-Type: message/rfc822\n\n";
+     }
+     if ($mbox_status_message and @records > 1) {
+         my $status_message='';
+         my @status_fields = (retitle   => 'subject',
+                              package   => 'package',
+                              submitter => 'originator',
+                              severity  => 'severity',
+                              tag       => 'tags',
+                              owner     => 'owner',
+                              blocks    => 'blocks',
+                              forward   => 'forward',
+                             );
+         my ($key,$value);
+         while (($key,$value) = splice(@status_fields,0,2)) {
+              if (defined $status{$value} and length $status{$value}) {
+                   $status_message .= qq($key $ref $status{$value}\n);
+              }
+         }
+         print STDOUT qq(From unknown $date\n),
+              create_mime_message([From       => "$gBug#$ref <$ref\@$gEmailDomain>",
+                                   To         => "$gBug#$ref <$ref\@$gEmailDomain>",
+                                   Subject    => "Status: $status{subject}",
+                                   "Reply-To" => "$gBug#$ref <$ref\@$gEmailDomain>",
+                                  ],
+                                  <<END,);
+$status_message
+thanks
+
+
+END
+     }
+     my $message_number=0;
+     my %seen_message_ids;
+     for my $record (@records) {
+         next if $record->{type} !~ /^(?:recips|incoming-recv)$/;
+         my $wanted_type = $mbox_maint?'recips':'incoming-recv';
+         # we want to include control messages anyway
+         my $record_wanted_anyway = 0;
+         my ($msg_id) = $record->{text} =~ /^Message-Id:\s+<(.+)>/im;
+         next if exists $seen_message_ids{$msg_id};
+         next if $msg_id =~/handler\..+\.ack(?:info|done)?\@/;
+         $record_wanted_anyway = 1 if $record->{text} =~ /^Received: \(at control\)/;
+         next if not $boring and not $record->{type} eq $wanted_type and not $record_wanted_anyway and @records > 1;
+         $seen_message_ids{$msg_id} = 1;
+         my @lines = split( "\n", $record->{text}, -1 );
+         if ( $lines[ 1 ] =~ m/^From / ) {
+              my $tmp = $lines[ 0 ];
+              $lines[ 0 ] = $lines[ 1 ];
+              $lines[ 1 ] = $tmp;
+         }
+         if ( !( $lines[ 0 ] =~ m/^From / ) ) {
+              unshift @lines, "From unknown $date";
+         }
+         map { s/^(>*From )/>$1/ } @lines[ 1 .. $#lines ];
+         print join( "\n", @lines ) . "\n";
+     }
+     exit 0;
+}
+
+else {
+     my %seen_msg_ids;
+     for my $record (@records) {
+         $msg_num++;
+         if ($skip_next) {
+              $skip_next = 0;
+              next;
+         }
+         $skip_next = 1 if $record->{type} eq 'html' and not $boring;
+         push @log, handle_record($record,$ref,$msg_num,\%seen_msg_ids);
+     }
 }
 
+@log = reverse @log if $reverse;
+$log = join("\n",@log);
+
+
+# All of the below should be turned into a template
+
 my %maintainer = %{getmaintainers()};
 my %pkgsrc = %{getpkgsrc()};
 
@@ -207,18 +216,12 @@ $tail_html =~ s/SUBSTITUTE_DTIME/$dtime/;
 
 my %status = %{get_bug_status(bug=>$ref)};
 unless (%status) {
-    print <<EOF;
-Content-Type: text/html; charset=utf-8
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head><title>$short - $gProject $gBug report logs</title></head>
-<body>
-<h1>$gProject $gBug report logs - $short</h1>
-<p>There is no record of $gBug $short.
-Try the <a href="http://$gWebDomain/">search page</a> instead.</p>
-$tail_html</body></html>
-EOF
+    print "Content-Type: text/html; charset=utf-8\n\n";
+    print fill_in_template(template=>'cgi/no_such_bug',
+                          variables => {modify_time => $dtime,
+                                        bug_num     => $ref,
+                                       },
+                         )
     exit 0;
 }
 
@@ -237,17 +240,17 @@ if  ($status{severity} eq 'normal') {
 
 if (@{$status{found_versions}} or @{$status{fixed_versions}}) {
      $indexentry.= q(<div style="float:right"><a href=").
-         version_url($status{package},
-                     $status{found_versions},
-                     $status{fixed_versions},
-                    ).
+         html_escape(version_url(package => $status{package},
+                                 found => $status{found_versions},
+                                 fixed => $status{fixed_versions},
+                                )).
          q("><img alt="version graph" src=").
-         version_url($status{package},
-                     $status{found_versions},
-                     $status{fixed_versions},
-                     2,
-                     2,
-                    ).qq{"></a></div>};
+              html_escape(version_url(package => $status{package},
+                                      found => $status{found_versions},
+                                      fixed => $status{fixed_versions},
+                                      width => 2,
+                                      height => 2,
+                                     )).qq{"></a></div>};
 }
 
 
@@ -263,7 +266,7 @@ foreach my $pkg (@tpacks) {
                                             : "Maintainers for $pkg are\n" },
                            $tmaint);
     $indexentry .= ";\nSource for $pkg is\n".
-            '<a href="'.pkg_url(src=>$tsrc)."\">$tsrc</a>" if ($tsrc ne "(unknown)");
+            '<a href="'.html_escape(pkg_url(src=>$tsrc))."\">$tsrc</a>" if ($tsrc ne "(unknown)");
     $indexentry .= ".\n";
 }
 
@@ -291,7 +294,7 @@ if (@merged) {
        my $descmerged = 'Merged with ';
        my $mseparator = '';
        for my $m (@merged) {
-               $descmerged .= $mseparator."<a href=\"" . bug_url($m) . "\">#$m</a>";
+               $descmerged .= $mseparator."<a href=\"" . html_escape(bug_url($m)) . "\">#$m</a>";
                $mseparator= ",\n";
        }
        push @descstates, $descmerged;
@@ -315,10 +318,10 @@ if (@{$status{fixed_versions}}) {
 
 if (@{$status{found_versions}} or @{$status{fixed_versions}}) {
      push @descstates, '<a href="'.
-         version_url($status{package},
-                     $status{found_versions},
-                     $status{fixed_versions},
-                    ).qq{">Version Graph</a>};
+         html_escape(version_url($status{package},
+                                 $status{found_versions},
+                                 $status{fixed_versions},
+                                )).qq{">Version Graph</a>};
 }
 
 if (length($status{done})) {
@@ -326,8 +329,8 @@ if (length($status{done})) {
 }
 
 if (length($status{forwarded})) {
-    my $forward_link = $status{forwarded};
-    $forward_link =~ s,((ftp|http|https)://[\S~-]+?/?)((\&gt\;)?[)]?[']?[:.\,]?(\s|$)),<a href=\"$1\">$1</a>$3,go;
+    my $forward_link = html_escape($status{forwarded});
+    $forward_link =~ s,((ftp|http|https)://[\S~-]+?/?)((\&gt\;)?[)]?[']?[:.\,]?(\s|$)),<a href="$1">$1</a>$3,go;
     push @descstates, "<strong>Forwarded</strong> to $forward_link";
 }
 
@@ -337,7 +340,7 @@ if (@blockedby && $status{"pending"} ne 'fixed' && ! length($status{done})) {
     for my $b (@blockedby) {
         my %s = %{get_bug_status($b)};
         next if $s{"pending"} eq 'fixed' || length $s{done};
-        push @descstates, "Fix blocked by <a href=\"" . bug_url($b) . "\">#$b</a>: ".html_escape($s{subject});
+        push @descstates, "Fix blocked by <a href=\"" . html_escape(bug_url($b)) . "\">#$b</a>: ".html_escape($s{subject});
     }
 }
 
@@ -346,7 +349,7 @@ if (@blocks && $status{"pending"} ne 'fixed' && ! length($status{done})) {
     for my $b (@blocks) {
         my %s = %{get_bug_status($b)};
         next if $s{"pending"} eq 'fixed' || length $s{done};
-        push @descstates, "Blocking fix for <a href=\"" . bug_url($b) . "\">#$b</a>: ".html_escape($s{subject});
+        push @descstates, "Blocking fix for <a href=\"" . html_escape(bug_url($b)) . "\">#$b</a>: ".html_escape($s{subject});
     }
 }
 
@@ -359,234 +362,15 @@ $indexentry .= "</h3>\n";
 
 my $descriptivehead = $indexentry;
 
-my $buglogfh;
-if ($buglog =~ m/\.gz$/) {
-    my $oldpath = $ENV{'PATH'};
-    $ENV{'PATH'} = '/bin:/usr/bin';
-    $buglogfh = new IO::File "zcat $buglog |" or &quitcgi("open log for $ref: $!");
-    $ENV{'PATH'} = $oldpath;
-} else {
-    $buglogfh = new IO::File "<$buglog" or &quitcgi("open log for $ref: $!");
-}
-
-
-my @records;
-eval{
-     @records = read_log_records($buglogfh);
-};
-if ($@) {
-     quitcgi("Bad bug log for $gBug $ref. Unable to read records: $@");
-}
-undef $buglogfh;
-
-=head2 handle_email_message
-
-     handle_email_message($record->{text},
-                         ref        => $bug_number,
-                         msg_number => $msg_number,
-                        );
-
-Returns a decoded e-mail message and displays entities/attachments as
-appropriate.
-
-
-=cut
-
-sub handle_email_message{
-     my ($email,%options) = @_;
-
-     my $output = '';
-     my $parser = new MIME::Parser;
-     # Because we are using memory, not tempfiles, there's no need to
-     # clean up here like in Debbugs::MIME
-     $parser->tmp_to_core(1);
-     $parser->output_to_core(1);
-     my $entity = $parser->parse_data( $email);
-     my @attachments = ();
-     display_entity($entity, $options{ref}, 1, $options{msg_number}, $output, @attachments);
-     return $output;
-
-}
-
-=head2 handle_record
-
-     push @log, handle_record($record,$ref,$msg_num);
-
-Deals with a record in a bug log as returned by
-L<Debbugs::Log::read_log_records>; returns the log information that
-should be output to the browser.
-
-=cut
-
-sub handle_record{
-     my ($record,$bug_number,$msg_number,$seen_msg_ids) = @_;
-
-     my $output = '';
-     local $_ = $record->{type};
-     if (/html/) {
-         my ($time) = $record->{text} =~ /<!--\s+time:(\d+)\s+-->/;
-         my $class = $record->{text} =~ /^<strong>(?:Acknowledgement|Reply|Information|Report|Notification)/ ? 'infmessage':'msgreceived';
-         $output .= decode_rfc1522($record->{text});
-         # Link to forwarded http:// urls in the midst of the report
-         # (even though these links already exist at the top)
-         $output =~ s,((?:ftp|http|https)://[\S~-]+?/?)([\)\'\:\.\,]?(?:\s|\.<|$)),<a href=\"$1\">$1</a>$2,go;
-         # Add links to the cloned bugs
-         $output =~ s{(Bug )(\d+)( cloned as bugs? )(\d+)(?:\-(\d+)|)}{$1.bug_links($2).$3.bug_links($4,$5)}eo;
-         # Add links to merged bugs
-         $output =~ s{(?<=Merged )([\d\s]+)(?=\.)}{join(' ',map {bug_links($_)} (split /\s+/, $1))}eo;
-         # Add links to blocked bugs
-         $output =~ s{(?<=Blocking bugs)(?:( of )(\d+))?( (?:added|set to|removed):\s+)([\d\s\,]+)}
-                     {(defined $2?$1.bug_links($2):'').$3.
-                           join(' ',map {bug_links($_)} (split /\,?\s+/, $4))}eo;
-         # Add links to reassigned packages
-         $output =~ s{(Bug reassigned from package \`)([^']+)((?:'|\&\#39;) to \`)([^']+)((?:'|\&\#39;))}
-         {$1.q(<a href=").pkg_url(pkg=>$2).qq(">$2</a>).$3.q(<a href=").pkg_url(pkg=>$4).qq(">$4</a>).$5}eo;
-         if (defined $time) {
-              $output .= ' ('.strftime('%a, %d %b %Y %T GMT',gmtime($time)).') ';
-         }
-         $output .= '<a href="' . bug_url($ref, msg => ($msg_number+1)) . '">Full text</a> and <a href="' .
-              bug_url($ref, msg => ($msg_number+1), mbox => 'yes') . '">rfc822 format</a> available.';
-
-         $output = qq(<div class="$class"><hr>\n<a name="$msg_number"></a>\n) . $output . "</div>\n";
-     }
-     elsif (/recips/) {
-         my ($msg_id) = $record->{text} =~ /^Message-Id:\s+<(.+)>/im;
-         if (defined $msg_id and exists $$seen_msg_ids{$msg_id}) {
-              return ();
-         }
-         elsif (defined $msg_id) {
-              $$seen_msg_ids{$msg_id} = 1;
-         }
-         $output .= qq(<hr><p class="msgreceived"><a name="$msg_number"></a>\n);
-         $output .= 'View this message in <a href="' . bug_url($ref, msg=>$msg_number, mbox=>'yes') . '">rfc822 format</a></p>';
-         $output .= handle_email_message($record->{text},
-                                   ref        => $bug_number,
-                                   msg_number => $msg_number,
-                                  );
-     }
-     elsif (/autocheck/) {
-         # Do nothing
-     }
-     elsif (/incoming-recv/) {
-         my ($msg_id) = $record->{text} =~ /^Message-Id:\s+<(.+)>/im;
-         if (defined $msg_id and exists $$seen_msg_ids{$msg_id}) {
-              return ();
-         }
-         elsif (defined $msg_id) {
-              $$seen_msg_ids{$msg_id} = 1;
-         }
-         # Incomming Mail Message
-         my ($received,$hostname) = $record->{text} =~ m/Received: \(at (\S+)\) by (\S+)\;/;
-         $output .= qq|<hr><p class="msgreceived"><a name="$msg_number"></a><a name="msg$msg_number"></a><a href="#$msg_number">Message</a> received at |.
-              html_escape("$received\@$hostname") .
-                   q| (<a href="| . bug_url($ref, msg=>$msg_number) . '">full text</a>'.
-                        q|, <a href="| . bug_url($ref, msg=>$msg_number,mbox=>'yes') .'">mbox</a>)'.":</p>\n";
-         $output .= handle_email_message($record->{text},
-                                   ref        => $bug_number,
-                                   msg_number => $msg_number,
-                                  );
-     }
-     else {
-         die "Unknown record type $_";
-     }
-     return $output;
-}
-
-my $log='';
-my $msg_num = 0;
-my $skip_next = 0;
-if (looks_like_number($msg) and ($msg-1) <= $#records) {
-     @records = ($records[$msg-1]);
-     $msg_num = $msg - 1;
-}
-my @log;
-if ( $mbox ) {
-     my $date = strftime "%a %b %d %T %Y", localtime;
-     if (@records > 1) {
-         print qq(Content-Disposition: attachment; filename="bug_${ref}.mbox"\n);
-         print "Content-Type: text/plain\n\n";
-     }
-     else {
-         $msg_num++;
-         print qq(Content-Disposition: attachment; filename="bug_${ref}_message_${msg_num}.mbox"\n);
-         print "Content-Type: message/rfc822\n\n";
-     }
-     if ($mbox_status_message and @records > 1) {
-         my $status_message='';
-         my @status_fields = (retitle   => 'subject',
-                              package   => 'package',
-                              submitter => 'originator',
-                              severity  => 'severity',
-                              tag       => 'tags',
-                              owner     => 'owner',
-                              blocks    => 'blocks',
-                              forward   => 'forward',
-                             );
-         my ($key,$value);
-         while (($key,$value) = splice(@status_fields,0,2)) {
-              if (defined $status{$value} and length $status{$value}) {
-                   $status_message .= qq($key $ref $status{$value}\n);
-              }
-         }
-         print STDOUT qq(From unknown $date\n),
-              create_mime_message([From       => "$gBug#$ref <$ref\@$gEmailDomain>",
-                                   To         => "$gBug#$ref <$ref\@$gEmailDomain>",
-                                   Subject    => "Status: $status{subject}",
-                                   "Reply-To" => "$gBug#$ref <$ref\@$gEmailDomain>",
-                                  ],
-                                  <<END,);
-$status_message
-thanks
-
-
-END
-     }
-     my $message_number=0;
-     my %seen_message_ids;
-     for my $record (@records) {
-         next if $record->{type} !~ /^(?:recips|incoming-recv)$/;
-         my $wanted_type = $mbox_maint?'recips':'incoming-recv';
-         # we want to include control messages anyway
-         my $record_wanted_anyway = 0;
-         my ($msg_id) = $record->{text} =~ /^Message-Id:\s+<(.+)>/im;
-         next if exists $seen_message_ids{$msg_id};
-         next if $msg_id =~/handler\..+\.ack(?:info|done)?\@/;
-         $record_wanted_anyway = 1 if $record->{text} =~ /^Received: \(at control\)/;
-         next if not $boring and not $record->{type} eq $wanted_type and not $record_wanted_anyway and @records > 1;
-         $seen_message_ids{$msg_id} = 1;
-         my @lines = split( "\n", $record->{text}, -1 );
-         if ( $lines[ 1 ] =~ m/^From / ) {
-              my $tmp = $lines[ 0 ];
-              $lines[ 0 ] = $lines[ 1 ];
-              $lines[ 1 ] = $tmp;
-         }
-         if ( !( $lines[ 0 ] =~ m/^From / ) ) {
-              unshift @lines, "From unknown $date";
-         }
-         map { s/^(>*From )/>$1/ } @lines[ 1 .. $#lines ];
-         print join( "\n", @lines ) . "\n";
-     }
-     exit 0;
-}
+print "Content-Type: text/html; charset=utf-8\n";
 
-else {
-     my %seen_msg_ids;
-     for my $record (@records) {
-         $msg_num++;
-         if ($skip_next) {
-              $skip_next = 0;
-              next;
-         }
-         $skip_next = 1 if $record->{type} eq 'html' and not $boring;
-         push @log, handle_record($record,$ref,$msg_num,\%seen_msg_ids);
-     }
+my @stat = stat $buglog;
+if (@stat) {
+     my $mtime = strftime '%a, %d %b %Y %T GMT', gmtime($stat[9]);
+     print "Last-Modified: $mtime\n";
 }
 
-@log = reverse @log if $reverse;
-$log = join("\n",@log);
-
-
-print "Content-Type: text/html; charset=utf-8\n\n";
+print "\n";
 
 my $title = html_escape($status{subject});
 
@@ -608,7 +392,6 @@ function toggle_infmessages()
                 if (allDivs[i].className == "infmessage")
                 {
                         allDivs[i].style.display=(allDivs[i].style.display == 'none' | allDivs[i].style.display == '') ? 'block' : 'none';
-                        break;
                 }
         }
 }