]> git.donarmstrong.com Git - debbugs.git/blobdiff - cgi/bugreport.cgi
Add Debbugs::BugWalker to abstract out bug-walking code in
[debbugs.git] / cgi / bugreport.cgi
index def15df910243cdd5ddd8fabb5f4a2e4a6b29533..3899a9defe715f2486770d1285cafe01fd17cb4b 100755 (executable)
@@ -1,8 +1,14 @@
-#!/usr/bin/perl -wT
+#!/usr/bin/perl
 
 use warnings;
 use strict;
 
+# Sanitize environent for taint
+BEGIN{
+    delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
+}
+
+
 use POSIX qw(strftime);
 use MIME::Parser;
 use MIME::Decoder;
@@ -19,6 +25,8 @@ use Debbugs::Common qw(buglog getmaintainers make_list bug_status);
 use Debbugs::Packages qw(getpkgsrc);
 use Debbugs::Status qw(splitpackages split_status_fields get_bug_status isstrongseverity);
 
+use Debbugs::User;
+
 use Scalar::Util qw(looks_like_number);
 
 use Debbugs::Text qw(:templates);
@@ -28,12 +36,14 @@ use List::Util qw(max);
 
 use CGI::Simple;
 my $q = new CGI::Simple;
+# STDOUT should be using the utf8 io layer
+binmode(STDOUT,':raw:encoding(UTF-8)');
 
 my %param = cgi_parameters(query => $q,
                           single => [qw(bug msg att boring terse),
                                      qw(reverse mbox mime trim),
                                      qw(mboxstat mboxmaint archive),
-                                     qw(repeatmerged)
+                                     qw(repeatmerged avatars),
                                     ],
                           default => {# msg       => '',
                                       boring    => 'no',
@@ -45,6 +55,7 @@ my %param = cgi_parameters(query => $q,
                                       mboxmaint => 'no',
                                       archive   => 'no',
                                       repeatmerged => 'yes',
+                                       avatars   => 'yes',
                                      },
                          );
 # This is craptacular.
@@ -60,6 +71,7 @@ my $terse = $param{'terse'} eq 'yes';
 my $reverse = $param{'reverse'} eq 'yes';
 my $mbox = $param{'mbox'} eq 'yes';
 my $mime = $param{'mime'} eq 'yes';
+my $avatars = $param{avatars} eq 'yes';
 
 my %bugusertags;
 my %ut;
@@ -161,6 +173,7 @@ if (defined($msg) and ($msg-1) <= $#records) {
 }
 my @log;
 if ( $mbox ) {
+     binmode(STDOUT,":raw");
      my $date = strftime "%a %b %d %T %Y", localtime;
      if (@records > 1) {
         print $q->header(-type => "text/plain",
@@ -213,11 +226,11 @@ END
          # 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)?\@/;
+         next if defined $msg_id and exists $seen_message_ids{$msg_id};
+         next if defined $msg_id and $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;
+         $seen_message_ids{$msg_id} = 1 if defined $msg_id;
          my @lines = split( "\n", $record->{text}, -1 );
          if ( $lines[ 1 ] =~ m/^From / ) {
               my $tmp = $lines[ 0 ];
@@ -235,6 +248,7 @@ END
 
 else {
      if (defined $att and defined $msg and @records) {
+        binmode(STDOUT,":raw");
          $msg_num++;
          print handle_email_message($records[0]->{text},
                                     ref => $ref,
@@ -253,7 +267,11 @@ else {
               next;
          }
          $skip_next = 1 if $record->{type} eq 'html' and not $boring;
-         push @log, handle_record($record,$ref,$msg_num,\%seen_msg_ids);
+         push @log, handle_record($record,$ref,$msg_num,
+                                   \%seen_msg_ids,
+                                   trim_headers => $trim_headers,
+                                   avatars => $avatars,
+                                  );
      }
 }