From 5a86dfa7c35aeb076271f2c3fcbaeba9fb221d66 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Fri, 23 Oct 2015 18:39:56 +0100 Subject: [PATCH 1/6] Set file encoding to ASCII-8BIT --- contrib/wmf.rb | 4 ++-- lib/mapi.rb | 2 +- lib/mapi/base.rb | 2 +- lib/mapi/convert.rb | 2 +- lib/mapi/convert/contact.rb | 2 +- lib/mapi/convert/note-mime.rb | 2 +- lib/mapi/convert/note-tmail.rb | 2 +- lib/mapi/mime.rb | 2 +- lib/mapi/msg.rb | 2 +- lib/mapi/orderedhash.rb | 2 +- lib/mapi/property_set.rb | 2 +- lib/mapi/pst.rb | 2 +- lib/mapi/rtf.rb | 2 +- lib/mapi/types.rb | 2 +- lib/mapi/version.rb | 2 +- test/test_convert_contact.rb | 2 +- test/test_convert_note.rb | 2 +- test/test_mime.rb | 2 +- test/test_msg.rb | 2 +- test/test_property_set.rb | 2 +- test/test_types.rb | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/contrib/wmf.rb b/contrib/wmf.rb index f662dc4..899c0da 100644 --- a/contrib/wmf.rb +++ b/contrib/wmf.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- # this file will be used later to enhance the msg conversion. @@ -52,7 +52,7 @@ def wmf_getdimensions wmf_data \b\f2\fs20{\object\objemb{\*\objclass PBrush}\objw1320\objh1274{\*\objdata 01050000 <- looks like standard header 02000000 <- not sure -07000000 <- this means length of following is 7. +07000000 <- this means length of following is 7. 50427275736800 <- Pbrush\000 in hex 00000000 <- ? 00000000 <- ? diff --git a/lib/mapi.rb b/lib/mapi.rb index 3dfd441..af9b364 100644 --- a/lib/mapi.rb +++ b/lib/mapi.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- require 'mapi/version' require 'mapi/base' require 'mapi/types' diff --git a/lib/mapi/base.rb b/lib/mapi/base.rb index 91cf190..73e1920 100644 --- a/lib/mapi/base.rb +++ b/lib/mapi/base.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- module Mapi # # Mapi::Item is the base class used for all mapi objects, and is purely a diff --git a/lib/mapi/convert.rb b/lib/mapi/convert.rb index cc7e18a..2e86e67 100644 --- a/lib/mapi/convert.rb +++ b/lib/mapi/convert.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- # we have two different "backends" for note conversion. we're sticking with # the current (home grown) mime one until the tmail version is suitably # polished. diff --git a/lib/mapi/convert/contact.rb b/lib/mapi/convert/contact.rb index 6b02e21..1a2297b 100644 --- a/lib/mapi/convert/contact.rb +++ b/lib/mapi/convert/contact.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- require 'rubygems' require 'vpim/vcard' diff --git a/lib/mapi/convert/note-mime.rb b/lib/mapi/convert/note-mime.rb index cd326d5..2156e8f 100644 --- a/lib/mapi/convert/note-mime.rb +++ b/lib/mapi/convert/note-mime.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- require 'base64' require 'mapi/mime' require 'time' diff --git a/lib/mapi/convert/note-tmail.rb b/lib/mapi/convert/note-tmail.rb index 1688f97..b2930a4 100644 --- a/lib/mapi/convert/note-tmail.rb +++ b/lib/mapi/convert/note-tmail.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- require 'rubygems' require 'tmail' diff --git a/lib/mapi/mime.rb b/lib/mapi/mime.rb index b278ff0..7240489 100644 --- a/lib/mapi/mime.rb +++ b/lib/mapi/mime.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- # # = Introduction # diff --git a/lib/mapi/msg.rb b/lib/mapi/msg.rb index 8d8b286..c805ea4 100644 --- a/lib/mapi/msg.rb +++ b/lib/mapi/msg.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- require 'ole/storage' require 'mapi' require 'mapi/rtf' diff --git a/lib/mapi/orderedhash.rb b/lib/mapi/orderedhash.rb index 34b9777..dc33741 100644 --- a/lib/mapi/orderedhash.rb +++ b/lib/mapi/orderedhash.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- # = OrderedHash # # == Version diff --git a/lib/mapi/property_set.rb b/lib/mapi/property_set.rb index 5e8abe9..1e6bf79 100644 --- a/lib/mapi/property_set.rb +++ b/lib/mapi/property_set.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- require 'yaml' require 'mapi/types' require 'mapi/rtf' diff --git a/lib/mapi/pst.rb b/lib/mapi/pst.rb index 57cd2e1..ce6bfda 100644 --- a/lib/mapi/pst.rb +++ b/lib/mapi/pst.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- # # = Introduction # diff --git a/lib/mapi/rtf.rb b/lib/mapi/rtf.rb index 8651a71..8a34467 100644 --- a/lib/mapi/rtf.rb +++ b/lib/mapi/rtf.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- require 'stringio' require 'strscan' diff --git a/lib/mapi/types.rb b/lib/mapi/types.rb index c802682..cbf6092 100644 --- a/lib/mapi/types.rb +++ b/lib/mapi/types.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- require 'rubygems' require 'ole/types' diff --git a/lib/mapi/version.rb b/lib/mapi/version.rb index 689b454..e2c4f06 100644 --- a/lib/mapi/version.rb +++ b/lib/mapi/version.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- module Mapi VERSION = '1.5.2' end diff --git a/test/test_convert_contact.rb b/test/test_convert_contact.rb index b37c529..1466572 100644 --- a/test/test_convert_contact.rb +++ b/test/test_convert_contact.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- require 'test/unit' $:.unshift File.dirname(__FILE__) + '/../lib' diff --git a/test/test_convert_note.rb b/test/test_convert_note.rb index 09c9981..8aabccb 100644 --- a/test/test_convert_note.rb +++ b/test/test_convert_note.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- require 'test/unit' $:.unshift File.dirname(__FILE__) + '/../lib' diff --git a/test/test_mime.rb b/test/test_mime.rb index 124d428..e597d88 100644 --- a/test/test_mime.rb +++ b/test/test_mime.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- #! /usr/bin/ruby -w $: << File.dirname(__FILE__) + '/../lib' diff --git a/test/test_msg.rb b/test/test_msg.rb index e5435bc..80e5beb 100644 --- a/test/test_msg.rb +++ b/test/test_msg.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- #! /usr/bin/ruby TEST_DIR = File.dirname __FILE__ diff --git a/test/test_property_set.rb b/test/test_property_set.rb index bd6b85b..a34451b 100644 --- a/test/test_property_set.rb +++ b/test/test_property_set.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- require 'test/unit' $:.unshift File.dirname(__FILE__) + '/../lib' diff --git a/test/test_types.rb b/test/test_types.rb index fc9c94f..4353fcf 100644 --- a/test/test_types.rb +++ b/test/test_types.rb @@ -1,4 +1,4 @@ -# -*- encoding : utf-8 -*- +# -*- encoding : ASCII-8BIT -*- require 'test/unit' $:.unshift File.dirname(__FILE__) + '/../lib' From f9f928ed76c024b4bc3a08bc1a59beb62df36663 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Fri, 23 Oct 2015 18:41:58 +0100 Subject: [PATCH 2/6] Remove previous fix - see comments at https://github.com/aquasync/ruby-msg/pull/5#issuecomment-50475467 --- lib/mapi/property_set.rb | 5 ---- test/test_msg.rb | 59 +++++++++++++++++++--------------------- 2 files changed, 28 insertions(+), 36 deletions(-) diff --git a/lib/mapi/property_set.rb b/lib/mapi/property_set.rb index 1e6bf79..d911b98 100644 --- a/lib/mapi/property_set.rb +++ b/lib/mapi/property_set.rb @@ -282,11 +282,6 @@ def body_html end end end - if @body_html && @body_html.respond_to?(:encoding) - @body_html.force_encoding("utf-8") - @body_html = @body_html.valid_encoding? ? @body_html : @body_html.encode("utf-16le", :invalid => :replace, :replace => "").encode("utf-8") - end - @body_html end end end diff --git a/test/test_msg.rb b/test/test_msg.rb index 80e5beb..ed52f0e 100644 --- a/test/test_msg.rb +++ b/test/test_msg.rb @@ -9,39 +9,36 @@ require 'mapi/convert' class TestMsg < Test::Unit::TestCase - def test_blammo - Mapi::Msg.open "#{TEST_DIR}/test_Blammo.msg" do |msg| - assert_equal '"TripleNickel" ', msg.from - assert_equal 'BlammoBlammo', msg.subject - assert_equal 0, msg.recipients.length - assert_equal 0, msg.attachments.length - # this is all properties - assert_equal 66, msg.properties.raw.length - # this is unique named properties - assert_equal 48, msg.properties.to_h.length - # test accessing the named property keys - same name but different namespace - assert_equal 'Yippee555', msg.props['Name4', Ole::Types::Clsid.parse('55555555-5555-5555-c000-000000000046')] - assert_equal 'Yippee666', msg.props['Name4', Ole::Types::Clsid.parse('66666666-6666-6666-c000-000000000046')] - end - end + def test_blammo + Mapi::Msg.open "#{TEST_DIR}/test_Blammo.msg" do |msg| + assert_equal '"TripleNickel" ', msg.from + assert_equal 'BlammoBlammo', msg.subject + assert_equal 0, msg.recipients.length + assert_equal 0, msg.attachments.length + # this is all properties + assert_equal 66, msg.properties.raw.length + # this is unique named properties + assert_equal 48, msg.properties.to_h.length + # test accessing the named property keys - same name but different namespace + assert_equal 'Yippee555', msg.props['Name4', Ole::Types::Clsid.parse('55555555-5555-5555-c000-000000000046')] + assert_equal 'Yippee666', msg.props['Name4', Ole::Types::Clsid.parse('66666666-6666-6666-c000-000000000046')] + end + end - def test_rtf_to_html_returns_valid_utf8 - msg = Mapi::Msg.open "#{TEST_DIR}/multipart-with-html.msg" do |msg| - assert_equal 1, msg.recipients.length - assert_equal 3, msg.attachments.length - html_part = msg.to_mime.parts[0].parts[1].to_s - if html_part.respond_to?(:encoding) - assert_equal 'UTF-8', html_part.encoding.to_s - assert html_part.valid_encoding? - end - end - end + def test_rendered_string_is_valid_encoding + msg = Mapi::Msg.open "#{TEST_DIR}/multipart-with-html.msg" do |msg| + string_version = msg.to_mime.to_s + if string_version.respond_to?(:valid_encoding?) + assert_equal true, string_version.valid_encoding? + end + end + end - def test_embedded_msg_renders_as_string - msg = Mapi::Msg.open "#{TEST_DIR}/embedded.msg" do |msg| - assert_match "message/rfc822", msg.to_mime.to_s - end - end + def test_embedded_msg_renders_as_string + msg = Mapi::Msg.open "#{TEST_DIR}/embedded.msg" do |msg| + assert_match "message/rfc822", msg.to_mime.to_s + end + end end From fac10c808fe73bfb1a38c1d63fa30a8cb0a92f82 Mon Sep 17 00:00:00 2001 From: Gareth Rees Date: Thu, 6 Oct 2016 16:34:16 +0100 Subject: [PATCH 3/6] Ruby 1.9+ compatible path in Rakefile Rake was failing because PKG_NAME was not defined. --- Rakefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index f09cb7d..f2e659f 100644 --- a/Rakefile +++ b/Rakefile @@ -4,7 +4,8 @@ require 'rake/testtask' require 'rbconfig' require 'fileutils' -spec = eval File.read('ruby-msg.gemspec') +gemspec_file = File.expand_path(File.dirname(__FILE__) + '/ruby-msg.gemspec') +spec = eval File.read(gemspec_file) task :default => [:test] From fae72e547299ab1f8b23239a79f5a1d353426b40 Mon Sep 17 00:00:00 2001 From: Gareth Rees Date: Thu, 6 Oct 2016 16:49:46 +0100 Subject: [PATCH 4/6] Rescue from error when converting Mime to String Rescue from Encoding::CompatibilityError when converting Mapi::Mime to a String. In some situations the parts can legitimately be different encodings, but cannot be concatenated given the encoding differences. In this situation, force the encoding to ASCII-8BIT rather than erroring. --- lib/mapi/mime.rb | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/mapi/mime.rb b/lib/mapi/mime.rb index 7240489..c8b007a 100644 --- a/lib/mapi/mime.rb +++ b/lib/mapi/mime.rb @@ -106,8 +106,17 @@ def to_s opts={} opts = {:boundary_counter => 0}.merge opts if multipart? boundary = Mime.make_boundary opts[:boundary_counter] += 1, self - @body = [preamble, parts.map { |part| "\r\n" + part.to_s(opts) + "\r\n" }, "--\r\n" + epilogue]. - flatten.join("\r\n--" + boundary) + begin + @body = [preamble, parts.map { |part| "\r\n" + part.to_s(opts) + "\r\n" }, "--\r\n" + epilogue]. + flatten.join("\r\n--" + boundary) + rescue Encoding::CompatibilityError => e + if ''.respond_to?(:force_encoding) + @body = [preamble, parts.map { |part| "\r\n" + part.to_s(opts).force_encoding('ASCII-8BIT') + "\r\n" }, "--\r\n" + epilogue]. + flatten.join("\r\n--" + boundary) + else + raise e + end + end content_type, attrs = Mime.split_header @headers['Content-Type'][0] attrs['boundary'] = boundary @headers['Content-Type'] = [([content_type] + attrs.map { |key, val| %{#{key}="#{val}"} }).join('; ')] From 2d09aaaf03f4248320b24c217a6bbea485c7264e Mon Sep 17 00:00:00 2001 From: Gareth Rees Date: Tue, 22 Sep 2020 17:00:54 +0100 Subject: [PATCH 5/6] Add spec for fae72e5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Copy spec added in 43c8797 that was used to test variations on the fix for falling back to ASCII encoding. We finally settled on fae72e5 as a fix, but didn’t introduce the spec for some reason. --- test/small-business-rates-relief.msg | Bin 0 -> 30720 bytes test/test_msg.rb | 9 +++++++++ 2 files changed, 9 insertions(+) create mode 100644 test/small-business-rates-relief.msg diff --git a/test/small-business-rates-relief.msg b/test/small-business-rates-relief.msg new file mode 100644 index 0000000000000000000000000000000000000000..1de113005dca6ff7fcd05b5e824aad9acf11b891 GIT binary patch literal 30720 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 literal 0 HcmV?d00001 diff --git a/test/test_msg.rb b/test/test_msg.rb index ed52f0e..c1741b6 100644 --- a/test/test_msg.rb +++ b/test/test_msg.rb @@ -35,6 +35,15 @@ def test_rendered_string_is_valid_encoding end end + def test_multipart_rendered_string_is_valid_encoding + msg = Mapi::Msg.open "#{TEST_DIR}/small-business-rates-relief.msg" do |msg| + string_version = msg.to_mime.to_s + if string_version.respond_to?(:valid_encoding?) + assert_equal true, string_version.valid_encoding? + end + end + end + def test_embedded_msg_renders_as_string msg = Mapi::Msg.open "#{TEST_DIR}/embedded.msg" do |msg| assert_match "message/rfc822", msg.to_mime.to_s From a9272b2060637a9d24db490bc85fa3ea520d05d0 Mon Sep 17 00:00:00 2001 From: Gareth Rees Date: Tue, 22 Sep 2020 17:16:33 +0100 Subject: [PATCH 6/6] Fix another incompatible character encoding error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In fae72e5 we introduced a fallback for incompatible character encodings, but that only covered the case where Mapi::Mime#is_multipart? returns true. This is a slight variation for the other branch of the conditional. The error is being raised where we have a `@body` in a different encoding to the default string encoding. In this case, just always force the string to be the same encoding as `@body` so we don’t get an error. This passes the spec for the particular file we’re seeing problems with, but I’m not at all sure this is the right thing to do. Maybe we should always treat anything in mapi as ASCII, and then force to UTF-8 for display? [1] Fixes https://github.com/mysociety/alaveteli/issues/5783 [1] https://github.com/aquasync/ruby-msg/issues/9#issuecomment-54589744 --- lib/mapi/mime.rb | 2 +- test/28101-outlook-attachment.msg | Bin 0 -> 45056 bytes test/test_msg.rb | 9 +++++++++ 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 test/28101-outlook-attachment.msg diff --git a/lib/mapi/mime.rb b/lib/mapi/mime.rb index c8b007a..2cdab98 100644 --- a/lib/mapi/mime.rb +++ b/lib/mapi/mime.rb @@ -126,7 +126,7 @@ def to_s opts={} @headers.each do |key, vals| vals.each { |val| str << "#{key}: #{val}\r\n" } end - str << "\r\n" + @body + str.force_encoding(@body.encoding) << "\r\n" + @body end def self.split_header header diff --git a/test/28101-outlook-attachment.msg b/test/28101-outlook-attachment.msg new file mode 100644 index 0000000000000000000000000000000000000000..6ec6aa9b66f18b73dfd8a104947f39775940be21 GIT binary patch literal 45056 zcmeHQ34B~fd7s^ttjmYwBg7#@EBTIftWHa|m1tL5$&zhZr!6aotXqn8MTaH1O(R1{ zQ=r5^l0pe2KsZ7v7zj5cPM|TXdrg~|Ct@_A??0dt%M29==be= zbAHEs^UeKq?rUj}zwLupJRw5dHNqh-Tuc%x0>W*0w`+f@5SQcK0l0AS;zb7Y9j`CC z7mx%R#R&c;gj0CMFrH&#hE-|oE)(%{b-u+S*Rhcc_wIT1w`?1cuDntuZWrxh6j(>_ z+k@wX7{GHJp(mt&9R3kdmM3zAYk~4z!frc&aOx?=zCeB{$bG}hJbBA zbQ|NDx%o38Fo9T@U-{_FFS@A3@Ae_%B6kBdpsiQfs)=i{>-ym|qJ02jil0<#3Y zUk&~>epCM0hPV1kiNo{xfCA#-rz|O+L_iWC8IS^430MVK4Ojz!2@q+3wSaYi^?(h4 z%K$F{cmO*9R{&lLxDxO(z*T^BfD@1b$OLQxYz9z=NZU5RcEHtuCcsWW7T_8{4j>mm zeaHjk0}23zfFeLKU>BeSPzu-$*aO%LC+vGvBje9E!9O?tSS`)X7EKa8~O zyXhj~FF-H49OI7<0`H9yyA^&9@aF;8!!PVO{^3}K;}cW<&mb+w5_FOIuQI~V@c?nt z$wDoD-j8^WGw34WSEE1c@gK)$9GjWq|3{?dSc@()e#+ij{*rOuk193t?|Tvb8efvg z_>J1Xjbl`fLrwXA5NSCkrHhQ8_HXI=e>d=&)xX*Je>KWudp70&T}W$E|3#AbrRV>h zz;Dw2iqP&&kFp*zY%H8_^&j=A8q|- z1OH|xe&E8(zXH~`6!@*}FZ(jCtC;eCH_}@7zr=4g{*0FYyMW)i|0RCP-;#g1u9O}H z|8GEA>;8xMxdvxx|D@ct3{bSCdp%NE+kfKc_|p=NuYmqh;Ko<#rkzxDOb#IFQZ-JL

*N# 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 literal 0 HcmV?d00001 diff --git a/test/test_msg.rb b/test/test_msg.rb index c1741b6..67bc7d5 100644 --- a/test/test_msg.rb +++ b/test/test_msg.rb @@ -44,6 +44,15 @@ def test_multipart_rendered_string_is_valid_encoding end end + def test_non_multipart_rendered_string_is_valid_encoding + msg = Mapi::Msg.open "#{TEST_DIR}/28101-outlook-attachment.msg" do |msg| + string_version = msg.to_mime.to_s + if string_version.respond_to?(:valid_encoding?) + assert_equal true, string_version.valid_encoding? + end + end + end + def test_embedded_msg_renders_as_string msg = Mapi::Msg.open "#{TEST_DIR}/embedded.msg" do |msg| assert_match "message/rfc822", msg.to_mime.to_s