]> Sergey Matveev's repositories - public-inbox.git/commitdiff
view: try to display bogus charsets for text/plain
authorEric Wong <e@80x24.org>
Thu, 18 Aug 2016 00:54:25 +0000 (00:54 +0000)
committerEric Wong <e@80x24.org>
Thu, 18 Aug 2016 01:32:00 +0000 (01:32 +0000)
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 <tfnico@gmail.com>
lib/PublicInbox/View.pm

index 305722168a9ad2d132733db92cdc4bdc944e04f0..3f0e1226118702f3c62b94fbe06dd04b809dcfdd 100644 (file)
@@ -407,14 +407,17 @@ sub flush_quote {
        $$s .= qq(<span\nclass="q">) . $rv . '</span>'
 }
 
-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<a\nhref="$upfx$idx-$sfn">[-- Attachment #$idx: );
+       my $ret = qq($nl<a\nhref="$upfx$idx-$sfn">);
+       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 .= "</a>\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;