From 98bd8519675595f6697185a9bd5ee06669bd50be Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 18 Aug 2016 00:54:25 +0000 Subject: view: try to display bogus charsets for text/plain Alpine seems to set charset=X-UNKNOWN for valid UTF-8 text, which causes Email::MIME::body_str to fail as X-UNKNOWN is not a valid encoding. So, blindly display the body as plain-text but warn users about possibly mangled text. Reported-by: Thomas Ferris Nicolaisen --- lib/PublicInbox/View.pm | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 30572216..3f0e1226 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -407,14 +407,17 @@ sub flush_quote { $$s .= qq() . $rv . '' } -sub attach_link ($$$$) { - my ($upfx, $ct, $p, $fn) = @_; +sub attach_link ($$$$;$) { + my ($upfx, $ct, $p, $fn, $err) = @_; my ($part, $depth, @idx) = @$p; my $nl = $idx[-1] > 1 ? "\n" : ''; my $idx = join('.', @idx); my $size = bytes::length($part->body); $ct ||= 'text/plain'; - $ct =~ s/;.*//; # no attributes + + # hide attributes normally, unless we want to aid users in + # spotting MUA problems: + $ct =~ s/;.*// unless $err; $ct = ascii_html($ct); my $desc = $part->header('Content-Description'); $desc = $fn unless defined $desc; @@ -427,7 +430,12 @@ sub attach_link ($$$$) { } else { $sfn = 'a.bin'; } - my $ret = qq($nl[-- Attachment #$idx: ); + my $ret = qq($nl); + if ($err) { + $ret .= +"[-- Warning: decoded text below may be mangled --]\n"; + } + $ret .= "[-- Attachment #$idx: "; my $ts = "Type: $ct, Size: $size bytes"; $ret .= ($desc eq '') ? "$ts --]" : "$desc --]\n[-- $ts --]"; $ret .= "\n"; @@ -446,12 +454,20 @@ sub add_text_body { my $s = eval { $part->body_str }; # badly-encoded message? tell the world about it! - return attach_link($upfx, $ct, $p, $fn) if $@; + my $err = $@; + if ($err) { + if ($ct =~ m!\btext/plain\b!i) { + # attach_link will warn further down... + $s = $part->body; + } else { + return attach_link($upfx, $ct, $p, $fn); + } + } my @lines = split(/^/m, $s); $s = ''; - if (defined($fn) || $depth > 0) { - $s .= attach_link($upfx, $ct, $p, $fn); + if (defined($fn) || $depth > 0 || $err) { + $s .= attach_link($upfx, $ct, $p, $fn, $err); $s .= "\n"; } my @quot; -- cgit v1.2.3-24-ge0c7