X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FCGI%2FBugreport.pm;h=a6063944a07b5edd1048639d17c6c8d1abecb085;hb=e09c4d3c9adb00e42d9af5daf9b1d5dd04264e6b;hp=8ebbfe8341a64e72f1ef1ad9643d4c437c6f8706;hpb=8e8eb43880421931c57b44123a1684f247011934;p=debbugs.git diff --git a/Debbugs/CGI/Bugreport.pm b/Debbugs/CGI/Bugreport.pm index 8ebbfe8..a606394 100644 --- a/Debbugs/CGI/Bugreport.pm +++ b/Debbugs/CGI/Bugreport.pm @@ -27,16 +27,17 @@ None known. use warnings; use strict; +use utf8; use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT); -use base qw(Exporter); +use Exporter qw(import); use IO::Scalar; use Params::Validate qw(validate_with :types); use Digest::MD5 qw(md5_hex); use Debbugs::Mail qw(get_addresses :reply); -use Debbugs::MIME qw(decode_rfc1522 create_mime_message); +use Debbugs::MIME qw(decode_rfc1522 create_mime_message parse_to_mime_entity); use Debbugs::CGI qw(:url :html :util); -use Debbugs::Common qw(globify_scalar english_join); +use Debbugs::Common qw(globify_scalar english_join hash_slice); use Debbugs::UTF8; use Debbugs::Config qw(:config); use Debbugs::Log qw(:read); @@ -44,6 +45,7 @@ use POSIX qw(strftime); use Encode qw(decode_utf8 encode_utf8); use URI::Escape qw(uri_escape_utf8); use Scalar::Util qw(blessed); +use List::AllUtils qw(sum); use File::Temp; BEGIN{ @@ -126,7 +128,6 @@ sub display_entity { my $output = globify_scalar($param{output}); my $entity = $param{entity}; my $ref = $param{bug_num}; - my $top = $param{outer}; my $xmessage = $param{msg_num}; my $attachments = $param{attachments}; @@ -225,9 +226,7 @@ sub display_entity { output => $output, attachments => $attachments, terse => $param{terse}, - exists $param{msg}?(msg=>$param{msg}):(), - exists $param{att}?(att=>$param{att}):(), - exists $param{avatars}?(avatars=>$param{avatars}):(), + hash_slice(%param,qw(msg att avatars)), ); if ($raw_output) { return $raw_output; @@ -248,9 +247,7 @@ sub display_entity { output => $output, attachments => $attachments, terse => $param{terse}, - exists $param{msg}?(msg=>$param{msg}):(), - exists $param{att}?(att=>$param{att}):(), - exists $param{avatars}?(avatars=>$param{avatars}):(), + hash_slice(%param,qw(msg att avatars)), ); # print {$output} "\n"; } @@ -263,11 +260,24 @@ sub display_entity { my $body = $entity->bodyhandle->as_string; $body = convert_to_utf8($body,$charset//'utf8'); $body = html_escape($body); + my $css_class = "message"; # 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. + $css_class .= " flowed"; + } + + # if the message is composed entirely of lines which are separated by + # newlines, wrap it. [Allow the signature to have special formatting.] + if ($body =~ /^([^\n]+\n\n)*[^\n]*\n?(-- \n.+)*$/s or + # if the first 20 lines in the message which have any non-space + # characters are larger than 100 characters more often than they + # are not, then use CSS to try to impose sensible wrapping + sum(0,map {length ($_) > 100?1:-1} grep {/\S/} split /\n/,$body,20) > 0 + ) { + $css_class .= " wrapping"; } # Add links to URLs # We don't html escape here because we escape above; @@ -290,10 +300,10 @@ sub display_entity { ) { # Add links to CVE vulnerabilities (closes #568464) $body =~ s{(^|\s|[\(\[])(CVE-\d{4}-\d{4,})(\s|[,.-\[\]\)]|$)} - {$1$2$3}gxm; + {$1$2$3}gxm; } if (not exists $param{att}) { - print {$output} qq(
$body
\n); + print {$output} qq(
$body
\n); } } return 0; @@ -321,17 +331,7 @@ sub handle_email_message{ my $entity; my $tempdir; if (not blessed $record) { - my $parser = MIME::Parser->new(); - # this will be cleaned up once it goes out of scope - $tempdir = File::Temp->newdir(); - $parser->output_under($tempdir->dirname()); - if ($record->{inner_file}) { - $entity = $parser->parse($record->{fh}) or - die "Unable to parse entity"; - } else { - $entity = $parser->parse_data($record->{text}) or - die "Unable to parse entity"; - } + $entity = parse_to_mime_entity($record); } else { $entity = $record; } @@ -344,10 +344,8 @@ sub handle_email_message{ output => $output_fh, attachments => \@attachments, terse => $param{terse}, - exists $param{msg}?(msg=>$param{msg}):(), - exists $param{att}?(att=>$param{att}):(), - exists $param{trim_headers}?(trim_headers=>$param{trim_headers}):(), - exists $param{avatars}?(avatars=>$param{avatars}):(), + hash_slice(%param,qw(msg att trim_headers avatars), + ), ); return $raw_output?$output:decode_utf8($output); } @@ -373,7 +371,7 @@ sub handle_record{ # $record->{text} is not in perl's internal encoding; convert it my $text = decode_rfc1522(decode_utf8(record_text($record))); my ($time) = $text =~ //; - my $class = $text =~ /^(?:Acknowledgement|Reply|Information|Report|Notification)/m ? 'infmessage':'msgreceived'; + my $class = $text =~ /^(?:Acknowledgement|Information|Report|Notification)/m ? 'infmessage':'msgreceived'; $output .= $text; # Link to forwarded http:// urls in the midst of the report # (even though these links already exist at the top) @@ -382,7 +380,7 @@ sub handle_record{ # Add links to the cloned bugs $output =~ s{(Bug )(\d+)( cloned as bugs? )(\d+)(?:\-(\d+)|)}{$1.bug_links(bug=>$2).$3.bug_links(bug=>(defined $5)?[$4..$5]:$4)}eo; # Add links to merged bugs - $output =~ s{(?<=Merged )([\d\s]+)(?=\.)}{join(' ',map {bug_links(bug=>$_)} (split /\s+/, $1))}eo; + $output =~ s{(?<=Merged )([\d\s]+)(?=[\.<])}{join(' ',map {bug_links(bug=>$_)} (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(bug=>$2):'').$3. @@ -391,7 +389,7 @@ sub handle_record{ (\d+(?:,\s+\d+)*(?:\,?\s+and\s+\d+)?)} {$1.(defined $3?$2.bug_links(bug=>$3):'').$4. english_join([map {bug_links(bug=>$_)} (split /\,?\s+(?:and\s+)?/, $5)])}xeo; - $output =~ s{([Aa]dded|[Rr]emoved)( indication that bug )(\d+)( blocks )([\d\s\,]+)} + $output =~ s{([Aa]dded|[Rr]emoved)( indication that bug )(\d+)( blocks ?)([\d\s\,]+)} {$1.$2.(bug_links(bug=>$3)).$4. english_join([map {bug_links(bug=>$_)} (split /\,?\s+(?:and\s+)?/, $5)])}eo; # Add links to reassigned packages @@ -402,19 +400,20 @@ sub handle_record{ if (defined $time) { $output .= ' ('.strftime('%a, %d %b %Y %T GMT',gmtime($time)).') '; } - $output .= ' $bug_number, options => {msg => ($msg_number+1)}, links_only => 1, ) - ) . '">Full text and full text, rfc822 format available.'; + ) . '">mbox, '. + qq{link).

}; - $output = qq(

\n\n) . $output . "
\n"; + $output = qq(

\n\n) . $output . "

\n"; } elsif (/recips/) { my ($msg_id) = record_regex($record,qr/^Message-Id:\s+<(.+)>/i); @@ -424,7 +423,8 @@ sub handle_record{ elsif (defined $msg_id) { $$seen_msg_ids{$msg_id} = 1; } - $output .= qq(

\n); + return () if defined $param{spam} and $param{spam}->is_spam($msg_id); + $output .= qq(


🔗\n); $output .= 'View this message in rfc822 format

'; $output .= handle_email_message($record, ref => $bug_number, @@ -443,6 +443,7 @@ sub handle_record{ elsif (defined $msg_id) { $$seen_msg_ids{$msg_id} = 1; } + return () if defined $param{spam} and $param{spam}->is_spam($msg_id); # Incomming Mail Message my ($received,$hostname) = record_regex($record,qr/Received: \(at (\S+)\) by (\S+)\;/o); $output .= qq|

Message #$msg_number received at |. @@ -459,6 +460,7 @@ sub handle_record{ # this will be cleaned up once it goes out of scope my $tempdir = File::Temp->newdir(); $parser->output_under($tempdir->dirname()); + $parser->filer->ignore_filename(1); my $entity; if ($record->{inner_file}) { $entity = $parser->parse($record->{fh}); @@ -499,9 +501,7 @@ sub __libravatar_url { __END__ - - - - - - +# Local Variables: +# cperl-indent-level: 4 +# indent-tabs-mode: nil +# End: