X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FCGI%2FBugreport.pm;h=67ed7ba9c6ba04a1b2a6703168f3982e98b5d552;hb=9907f86ebd19706ce79b2b0cf2f54e8ae4112427;hp=29602c58c39f1088bc17208e49ab28c1561ac152;hpb=23d26116c0fcfeeaf60a7ab724f18fe86554d746;p=debbugs.git diff --git a/Debbugs/CGI/Bugreport.pm b/Debbugs/CGI/Bugreport.pm index 29602c5..67ed7ba 100644 --- a/Debbugs/CGI/Bugreport.pm +++ b/Debbugs/CGI/Bugreport.pm @@ -40,7 +40,8 @@ use Debbugs::Common qw(globify_scalar english_join); use Debbugs::UTF8; use Debbugs::Config qw(:config); use POSIX qw(strftime); -use Encode qw(decode_utf8); +use Encode qw(decode_utf8 encode_utf8); +use URI::Escape qw(uri_escape); BEGIN{ ($VERSION) = q$Revision: 494 $ =~ /^Revision:\s+([^\s+])/; @@ -113,10 +114,13 @@ sub display_entity { trim_headers => {type => BOOLEAN, default => 1, }, + avatars => {type => BOOLEAN, + default => 1, + }, } ); - $param{output} = globify_scalar($param{output}); + my $output = globify_scalar($param{output}); my $entity = $param{entity}; my $ref = $param{bug_num}; my $top = $param{outer}; @@ -135,25 +139,26 @@ sub display_entity { not $param{terse} and not exists $param{att}) { my $header = $entity->head; - print {$param{output}} "
\n"; + print {$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 ''; - if ($_ eq 'From') { + chomp $head_field; + if ($_ eq 'From' and $param{avatars}) { my $libravatar_url = __libravatar_url(decode_rfc1522($head_field)); if (defined $libravatar_url and length $libravatar_url) { - push @headers,q(); + push @headers,q(\n); } } - push @headers, qq(

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

"; + push @headers, qq(
$_: ) . html_escape(decode_rfc1522($head_field))."
\n"; } - print {$param{output}} join(qq(), @headers); + print {$output} join(qq(), @headers); } else { - print {$param{output}} "
".html_escape(decode_rfc1522($entity->head->stringify))."
\n"; + print {$output} "
".html_escape(decode_rfc1522($entity->head->stringify))."
\n"; } - print {$param{output}} "
\n"; + print {$output} "
\n"; } if (not (($param{outer} and $type =~ m{^text(?:/plain)?(?:;|$)}) @@ -168,32 +173,31 @@ sub display_entity { 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"; + binmode($output,':raw'); + print {$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 {$output} qq(; charset="$charset") if defined $charset; + print {$output} "\n"; if ($filename ne '') { my $qf = $filename; $qf =~ s/"/\\"/g; $qf =~ s[.*/][]; - print {$param{output}} qq{Content-Disposition: inline; filename="$qf"\n}; + print {$output} qq{Content-Disposition: inline; filename="$qf"\n}; } - print {$param{output}} "\n"; + print {$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; + $decoder->decode(IO::Scalar->new(\$body), $output); + # we don't reset the layers here, because it makes no + # sense to add anything to the output handle after this + # point. + return(1); } elsif (not exists $param{att}) { my @dlargs = (msg=>$xmessage, att=>$#$attachments); push @dlargs, (filename=>$filename) if $filename ne ''; my $printname = $filename; $printname = 'Message part ' . ($#$attachments + 1) if $filename eq ''; - print {$param{output}} '
[[ $part,
+                               bug_num => $ref,
+                               outer => 0,
+                               msg_num => $xmessage,
+                               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}):(),
+                              );
+            if ($raw_output) {
+                return $raw_output;
+            }
+	    # print {$output} "\n";
 	}
     } elsif ($entity->parts) {
 	# We must be dealing with a nested message.
 	 if (not exists $param{att}) {
-	      print {$param{output}} "
\n"; + print {$output} "
\n"; } my @parts = $entity->parts; foreach my $part (@parts) { @@ -234,16 +243,17 @@ sub display_entity { bug_num => $ref, outer => 1, msg_num => $xmessage, - output => $param{output}, + 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}):(), ); - # print {$param{output}} "\n"; + # print {$output} "\n"; } if (not exists $param{att}) { - print {$param{output}} "
\n"; + print {$output} "
\n"; } } elsif (not $param{terse}) { my $content_type = $entity->head->get('Content-Type:') || "text/html"; @@ -277,9 +287,10 @@ sub display_entity { {$1
$2$3}gxm; } if (not exists $param{att}) { - print {$param{output}} qq(
$body
\n); + print {$output} qq(
$body
\n); } } + return 0; } @@ -299,9 +310,8 @@ appropriate. sub handle_email_message{ my ($email,%param) = @_; - # output needs to have the is_utf8 flag on to avoid double - # encoding - my $output = decode_utf8(''); + my $output; + my $output_fh = globify_scalar(\$output); my $parser = MIME::Parser->new(); # Because we are using memory, not tempfiles, there's no need to # clean up here like in Debbugs::MIME @@ -309,19 +319,20 @@ sub handle_email_message{ $parser->output_to_core(1); my $entity = $parser->parse_data( $email); my @attachments = (); - display_entity(entity => $entity, - bug_num => $param{ref}, - outer => 1, - msg_num => $param{msg_num}, - output => \$output, - 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}):(), - ); - return $output; - + my $raw_output = + display_entity(entity => $entity, + bug_num => $param{ref}, + outer => 1, + msg_num => $param{msg_num}, + 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}):(), + ); + return $raw_output?$output:decode_utf8($output); } =head2 handle_record @@ -335,7 +346,7 @@ should be output to the browser. =cut sub handle_record{ - my ($record,$bug_number,$msg_number,$seen_msg_ids) = @_; + my ($record,$bug_number,$msg_number,$seen_msg_ids,%param) = @_; # output needs to have the is_utf8 flag on to avoid double # encoding @@ -398,6 +409,7 @@ sub handle_record{ $output .= handle_email_message($record->{text}, ref => $bug_number, msg_num => $msg_number, + %param, ); } elsif (/autocheck/) { @@ -425,6 +437,7 @@ sub handle_record{ $output .= handle_email_message($record->{text}, ref => $bug_number, msg_num => $msg_number, + %param, ); } else { @@ -440,7 +453,7 @@ sub __libravatar_url { return undef; } ($email) = get_addresses($email); - return $config{libravatar_uri}.md5_hex(lc($email)).($config{libravatar_uri_options}//''); + return $config{libravatar_uri}.uri_escape($email.($config{libravatar_uri_options}//'')); }