X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FCGI%2FBugreport.pm;h=59d88b07f5dedbdcb112574881a2085f084405be;hb=3087ff28c2299057a5e00ee49f025cf736b4b30f;hp=a01c2de4ff568a318aa18a62a2555581923f7077;hpb=c7ef08d9721d38f6e6c19aa9dfcd1a6a2492d8d0;p=debbugs.git diff --git a/Debbugs/CGI/Bugreport.pm b/Debbugs/CGI/Bugreport.pm index a01c2de..59d88b0 100644 --- a/Debbugs/CGI/Bugreport.pm +++ b/Debbugs/CGI/Bugreport.pm @@ -32,10 +32,14 @@ use base qw(Exporter); use IO::Scalar; use Params::Validate qw(validate_with :types); +use Digest::MD5 qw(md5_hex); +use Debbugs::Mail qw(get_addresses); use Debbugs::MIME qw(convert_to_utf8 decode_rfc1522 create_mime_message); use Debbugs::CGI qw(:url :html :util); -use Debbugs::Common qw(globify_scalar); +use Debbugs::Common qw(globify_scalar english_join); +use Debbugs::Config qw(:config); use POSIX qw(strftime); +use Encode qw(decode_utf8); BEGIN{ ($VERSION) = q$Revision: 494 $ =~ /^Revision:\s+([^\s+])/; @@ -130,19 +134,25 @@ sub display_entity { not $param{terse} and not exists $param{att}) { my $header = $entity->head; - print {$param{output}} "
\n";
+	 print {$param{output}} "
\n"; if ($param{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($_: ) . html_escape(decode_rfc1522($head_field)); + if ($_ eq 'From') { + my $libravatar_url = __libravatar_url(decode_rfc1522($head_field)); + if (defined $libravatar_url and length $libravatar_url) { + push @headers,q(); + } + } + push @headers, qq(

$_: ) . html_escape(decode_rfc1522($head_field))."

"; } print {$param{output}} join(qq(), @headers); } else { - print {$param{output}} html_escape(decode_rfc1522($entity->head->stringify)); + print {$param{output}} "
".html_escape(decode_rfc1522($entity->head->stringify))."
\n"; } - print {$param{output}} "
\n"; + print {$param{output}} "\n"; } if (not (($param{outer} and $type =~ m{^text(?:/plain)?(?:;|$)}) @@ -155,10 +165,14 @@ sub display_entity { my $head = $entity->head; chomp(my $type = $entity->effective_type); my $body = $entity->stringify_body; + # this attachment has its own content type, so we must not + # try to convert it to UTF-8 or do anything funky. + my @layers = PerlIO::get_layers($param{output}); + binmode($param{output},':raw'); print {$param{output}} "Content-Type: $type"; my ($charset) = $head->get('Content-Type:') =~ m/charset\s*=\s*\"?([\w-]+)\"?/i; print {$param{output}} qq(; charset="$charset") if defined $charset; - print {$param{output}}"\n"; + print {$param{output}} "\n"; if ($filename ne '') { my $qf = $filename; $qf =~ s/"/\\"/g; @@ -168,6 +182,9 @@ sub display_entity { print {$param{output}} "\n"; my $decoder = MIME::Decoder->new($head->mime_encoding); $decoder->decode(IO::Scalar->new(\$body), $param{output}); + if (grep {/utf8/} @layers) { + binmode($param{output},':utf8'); + } return; } elsif (not exists $param{att}) { @@ -231,7 +248,7 @@ sub display_entity { 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 = convert_to_utf8($body,$charset//'utf8'); $body = html_escape($body); # Attempt to deal with format=flowed if ($content_type =~ m/format\s*=\s*\"?flowed\"?/i) { @@ -251,7 +268,13 @@ sub display_entity { $temp =~ s{(\d+)} {bug_links(bug=>$1)}ge; $temp;]gxie; - + if (defined $config{cve_tracker} and + length $config{cve_tracker} + ) { + # Add links to CVE vulnerabilities (closes #568464) + $body =~ s{(^|\s)(CVE-\d{4}-\d{4,})(\s|[,.-\[\]]|$)} + {$1$2$3}gxm; + } if (not exists $param{att}) { print {$param{output}} qq(
$body
\n); } @@ -275,7 +298,9 @@ appropriate. sub handle_email_message{ my ($email,%param) = @_; - my $output = ''; + # output needs to have the is_utf8 flag on to avoid double + # encoding + my $output = decode_utf8(''); my $parser = MIME::Parser->new(); # Because we are using memory, not tempfiles, there's no need to # clean up here like in Debbugs::MIME @@ -292,6 +317,7 @@ sub handle_email_message{ terse => $param{terse}, exists $param{msg}?(msg=>$param{msg}):(), exists $param{att}?(att=>$param{att}):(), + exists $param{trim_headers}?(trim_headers=>$param{trim_headers}):(), ); return $output; @@ -310,15 +336,19 @@ should be output to the browser. sub handle_record{ my ($record,$bug_number,$msg_number,$seen_msg_ids) = @_; - my $output = ''; + # output needs to have the is_utf8 flag on to avoid double + # encoding + my $output = decode_utf8(''); local $_ = $record->{type}; if (/html/) { - my ($time) = $record->{text} =~ //; - my $class = $record->{text} =~ /^(?:Acknowledgement|Reply|Information|Report|Notification)/ ? 'infmessage':'msgreceived'; - $output .= decode_rfc1522($record->{text}); + # $record->{text} is not in perl's internal encoding; convert it + my $text = decode_utf8(decode_rfc1522($record->{text})); + my ($time) = $text =~ //; + my $class = $text =~ /^(?:Acknowledgement|Reply|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) - $output =~ s,((?:ftp|http|https)://[\S~-]+?/?)([\)\'\:\.\,]?(?:\s|\.<|$)),$1$2,go; + $output =~ s,((?:ftp|http|https)://[\S~-]+?/?)((?:[\)\'\:\.\,]|\&\#39;)?(?:\s|\.<|$)),$1$2,go; # 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 @@ -326,10 +356,17 @@ sub handle_record{ # 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. - join(' ',map {bug_links(bug=>$_)} (split /\,?\s+/, $4))}eo; + english_join([map {bug_links(bug=>$_)} (split /\,?\s+/, $4)])}eo; + $output =~ s{((?:[Aa]dded|[Rr]emoved)\ blocking\ bug(?:\(s\))?)(?:(\ of\ )(\d+))?(:?\s+) + (\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\,]+)} + {$1.$2.(bug_links(bug=>$3)).$4. + english_join([map {bug_links(bug=>$_)} (split /\,?\s+(?:and\s+)?/, $5)])}eo; # Add links to reassigned packages $output =~ s{(Bug reassigned from package \`)([^']+?)((?:'|\&\#39;) to \`)([^']+?)((?:'|\&\#39;))} - {$1.q($2).$3.q($4).$5}eo; + {$1.q($2).$3.q($4).$5}eo; if (defined $time) { $output .= ' ('.strftime('%a, %d %b %Y %T GMT',gmtime($time)).') '; } @@ -396,6 +433,15 @@ sub handle_record{ } +sub __libravatar_url { + my ($email) = @_; + if (not defined $config{libravatar_uri} or not length $config{libravatar_uri}) { + return undef; + } + ($email) = get_addresses($email); + return $config{libravatar_uri}.md5_hex(lc($email)).($config{libravatar_uri_options}//''); +} + 1;