about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-08-18 00:54:25 +0000
committerEric Wong <e@80x24.org>2016-08-18 01:32:00 +0000
commit98bd8519675595f6697185a9bd5ee06669bd50be (patch)
tree01c87e06d6a0b062ec19ec485824f6d2e8259911
parent22e7f3ad672473f19ae5107602e57e9361b8b7f2 (diff)
downloadpublic-inbox-98bd8519675595f6697185a9bd5ee06669bd50be.tar.gz
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>
-rw-r--r--lib/PublicInbox/View.pm30
1 files 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(<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;