aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/models/incoming_message.rb4
-rw-r--r--spec/fixtures/psni.pdfbin0 -> 48057 bytes
-rw-r--r--spec/models/incoming_message_spec.rb7
-rw-r--r--vendor/ruby-msg/lib/mapi/msg.rb6
4 files changed, 12 insertions, 5 deletions
diff --git a/app/models/incoming_message.rb b/app/models/incoming_message.rb
index 949846e69..38d743d18 100644
--- a/app/models/incoming_message.rb
+++ b/app/models/incoming_message.rb
@@ -538,7 +538,7 @@ class IncomingMessage < ActiveRecord::Base
uncompressed_text = child.read()
end
# if we managed to uncompress the PDF...
- if !uncompressed_text.nil?
+ if !uncompressed_text.nil? && !uncompressed_text.empty?
# then censor stuff (making a copy so can compare again in a bit)
censored_uncompressed_text = uncompressed_text.dup
self._binary_mask_stuff_internal!(censored_uncompressed_text)
@@ -551,7 +551,7 @@ class IncomingMessage < ActiveRecord::Base
child.close_write()
recompressed_text = child.read()
end
- if !recompressed_text.nil?
+ if !recompressed_text.nil? && !recompressed_text.empty?
text[0..-1] = recompressed_text # [0..-1] makes it change the 'text' string in place
end
end
diff --git a/spec/fixtures/psni.pdf b/spec/fixtures/psni.pdf
new file mode 100644
index 000000000..daca3f4ec
--- /dev/null
+++ b/spec/fixtures/psni.pdf
Binary files differ
diff --git a/spec/models/incoming_message_spec.rb b/spec/models/incoming_message_spec.rb
index 411aa1d96..f41dff06d 100644
--- a/spec/models/incoming_message_spec.rb
+++ b/spec/models/incoming_message_spec.rb
@@ -174,6 +174,13 @@ describe IncomingMessage, " when censoring data" do
masked_text.should match(/xxx@xxx.xxx.xx/)
end
+ it "should not produce zero length output if pdftk silently fails" do
+ orig_pdf = load_file_fixture('psni.pdf')
+ pdf = orig_pdf.dup
+ @im.binary_mask_stuff!(pdf, "application/pdf")
+ pdf.should_not == ""
+ end
+
it "should apply censor rules to HTML files" do
data = @test_data.dup
@im.html_mask_stuff!(data)
diff --git a/vendor/ruby-msg/lib/mapi/msg.rb b/vendor/ruby-msg/lib/mapi/msg.rb
index c7cfb5515..fc30a9170 100644
--- a/vendor/ruby-msg/lib/mapi/msg.rb
+++ b/vendor/ruby-msg/lib/mapi/msg.rb
@@ -173,7 +173,7 @@ module Mapi
# parse guids
# this is the guids for named properities (other than builtin ones)
# i think PS_PUBLIC_STRINGS, and PS_MAPI are builtin.
- guids = [PS_PUBLIC_STRINGS] + guids_obj.read.scan(/.{16}/m).map do |str|
+ guids = [PS_PUBLIC_STRINGS] + guids_obj.read.scan(/.{16}/mn).map do |str|
Ole::Types.load_guid str
end
@@ -187,7 +187,7 @@ module Mapi
# parse actual props.
# not sure about any of this stuff really.
# should flip a few bits in the real msg, to get a better understanding of how this works.
- props = props_obj.read.scan(/.{8}/m).map do |str|
+ props = props_obj.read.scan(/.{8}/mn).map do |str|
flags, offset = str[4..-1].unpack 'v2'
# the property will be serialised as this pseudo property, mapping it to this named property
pseudo_prop = 0x8000 + offset
@@ -253,7 +253,7 @@ module Mapi
unless (pad == 0 || pad == 8) and data[0...pad] == "\000" * pad
Log.warn "padding was not as expected #{pad} (#{data.length}) -> #{data[0...pad].inspect}"
end
- data[pad..-1].scan(/.{16}/m).each do |data|
+ data[pad..-1].scan(/.{16}/mn).each do |data|
property, encoding = ('%08x' % data.unpack('V')).scan /.{4}/
key = property.hex
# doesn't make any sense to me. probably because its a serialization of some internal