- Send "utf-8" as the charset for the page to match what we actually

output.

- Properly decode MIME parts from their source charset (in the case of
  a single-part message, we haven't got the relevant headers thanks to
  GNATS. Sigh.)

- Don't strip the trailing newline on MIME parts, as this breaks encoded
  Quoted-Printable newlines (if there happened to be one at the end).
This commit is contained in:
Shaun Amott 2011-07-23 02:42:59 +00:00
parent d73bc5af84
commit bfac757e9e
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/www/; revision=37460
2 changed files with 28 additions and 7 deletions

View file

@ -24,7 +24,7 @@
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE. # SUCH DAMAGE.
# #
# $FreeBSD$ # $FreeBSD: www/en/cgi/GnatsPR/Section/MIME.pm,v 1.1 2011/07/20 22:23:23 shaun Exp $
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
package GnatsPR::Section::MIME; package GnatsPR::Section::MIME;
@ -136,10 +136,10 @@ sub Parse
{ {
my $self = shift; my $self = shift;
# XXX: decode other charsets? my $charset;
$self->{body} =~ s/^[\n\s]+//; $self->{body} =~ s/^[\n\s]+//;
$self->{body} =~ s/[\n\s]+$//; $self->{body} =~ s/[\n\s]+$/\n/;
$self->ParseHeader(); $self->ParseHeader();
@ -157,14 +157,32 @@ sub Parse
return; return;
} }
if ($self->header('content-type:charset')) {
my $cs = $self->header('content-type:charset');
if ($cs =~ /utf.*8/i) {
$cs = 'utf-8';
} else {
$cs = Encode::resolve_alias($cs);
}
if ($cs and $cs ne 'ascii') {
$charset = $cs;
}
}
# Look for Quoted-Printable (explicit or using a silly heuristic) # Look for Quoted-Printable (explicit or using a silly heuristic)
if (lc $self->header('content-transfer-encoding') eq 'quoted-printable' if (lc $self->header('content-transfer-encoding') eq 'quoted-printable'
or $self->{body} =~ /=[0-9A-Fa-f]{2}=[0-9A-Fa-f]{2}/) { or $self->{body} =~ /=[0-9A-Fa-f]{2}=[0-9A-Fa-f]{2}/) {
$self->{body} = decode('utf8', decode_qp($self->{body})); $self->{body} = decode_qp($self->{body});
$self->{body} = decode($charset, $self->{body})
if ($charset);
# Base64 -- probably better not to decode # Base64 -- probably better not to decode
} elsif (lc $self->header('content-transfer-encoding') eq 'base64') { } elsif (lc $self->header('content-transfer-encoding') eq 'base64') {
$self->{decoded_body} = decode('utf8', decode_base64($self->{body})); $self->{decoded_body} = decode_base64($self->{body});
$self->{decoded_body} = decode($charset, $self->{decoded_body})
if ($charset);
$self->{encoded} = 1; $self->{encoded} = 1;
} }
@ -189,7 +207,7 @@ sub Parse
} }
if ($self->{body} =~ /^begin \d\d\d (.*)/ && !$self->{encoded}) { if ($self->{body} =~ /^begin \d\d\d (.*)/ && !$self->{encoded}) {
$self->{decoded_body} = decode('utf8', uudecode($self->{body})); $self->{decoded_body} = uudecode($self->{body});
$self->{encoded} = 1; $self->{encoded} = 1;
} }
} }

View file

@ -26,7 +26,7 @@
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE. # SUCH DAMAGE.
# #
# $FreeBSD: www/en/cgi/query-pr.cgi,v 1.78 2011/07/21 14:31:41 shaun Exp $ # $FreeBSD: www/en/cgi/query-pr.cgi,v 1.79 2011/07/22 23:38:58 shaun Exp $
# #
# Useful PRs for testing: # Useful PRs for testing:
# #
@ -93,6 +93,9 @@ if (!$iscgi && !exists $ENV{'REQUEST_METHOD'}) {
$main::hsty_base ||= ''; $main::hsty_base ||= '';
$main::t_style ||= ''; $main::t_style ||= '';
$main::hsty_charset ||= '';
$main::hsty_charset = 'utf-8';
$main::t_style = $main::t_style =
qq{<link href="$stylesheet" rel="stylesheet" type="text/css" /> qq{<link href="$stylesheet" rel="stylesheet" type="text/css" />