summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authormarc <[email protected]>2015-07-03 16:44:45 +0200
committermarc <[email protected]>2015-07-03 16:44:45 +0200
commitc7c7937dcde9a94f2e5ee0549451b34e410803e0 (patch)
treed06ccd49055e1474891a6b3d3d190e457e7e2304
parent1bec39cebaef6a98481f52587ecc0483b4defc08 (diff)
downloadcaxlsx-c7c7937dcde9a94f2e5ee0549451b34e410803e0.tar.gz
caxlsx-c7c7937dcde9a94f2e5ee0549451b34e410803e0.zip
Validates whether an image is acceptable through mime type
image/jpeg, image/png & image/gif are considered the allowed mime types for an image. mimemagic gem is added as dependency in order to do the checking. Added tests to check against three supported mime types. A fake jpg fixture (created with 'touch' command) has been added to test that extension is no longer used.
-rw-r--r--axlsx.gemspec1
-rw-r--r--examples/image1_fake.jpg0
-rw-r--r--lib/axlsx.rb1
-rw-r--r--lib/axlsx/drawing/pic.rb6
-rw-r--r--test/drawing/tc_pic.rb14
5 files changed, 14 insertions, 8 deletions
diff --git a/axlsx.gemspec b/axlsx.gemspec
index 9fc19285..8e3cd9ca 100644
--- a/axlsx.gemspec
+++ b/axlsx.gemspec
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
s.add_runtime_dependency 'nokogiri', '>= 1.4.1'
s.add_runtime_dependency 'rubyzip', '~> 1.1.7'
s.add_runtime_dependency "htmlentities", "~> 4.3.1"
+ s.add_runtime_dependency "mimemagic", "~> 0.3"
s.add_development_dependency 'yard'
s.add_development_dependency 'kramdown'
diff --git a/examples/image1_fake.jpg b/examples/image1_fake.jpg
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/examples/image1_fake.jpg
diff --git a/lib/axlsx.rb b/lib/axlsx.rb
index c6f01b19..14456024 100644
--- a/lib/axlsx.rb
+++ b/lib/axlsx.rb
@@ -1,6 +1,7 @@
# encoding: UTF-8
require 'htmlentities'
require 'axlsx/version.rb'
+require 'mimemagic'
require 'axlsx/util/simple_typed_list.rb'
require 'axlsx/util/constants.rb'
diff --git a/lib/axlsx/drawing/pic.rb b/lib/axlsx/drawing/pic.rb
index 571e9047..b090c661 100644
--- a/lib/axlsx/drawing/pic.rb
+++ b/lib/axlsx/drawing/pic.rb
@@ -25,8 +25,8 @@ module Axlsx
@picture_locking = PictureLocking.new(options)
end
- # allowed file extenstions
- ALLOWED_EXTENSIONS = ['gif', 'jpeg', 'png', 'jpg']
+ # allowed mime types
+ ALLOWED_MIME_TYPES = %w(image/jpeg image/png image/gif)
# The name to use for this picture
# @return [String]
@@ -67,7 +67,7 @@ module Axlsx
def image_src=(v)
Axlsx::validate_string(v)
- RestrictionValidator.validate 'Pic.image_src', ALLOWED_EXTENSIONS, File.extname(v.downcase).delete('.')
+ RestrictionValidator.validate 'Pic.image_src', ALLOWED_MIME_TYPES, MimeMagic.by_magic(File.open(v)).to_s
raise ArgumentError, "File does not exist" unless File.exist?(v)
@image_src = v
end
diff --git a/test/drawing/tc_pic.rb b/test/drawing/tc_pic.rb
index 3cea49c0..066d9962 100644
--- a/test/drawing/tc_pic.rb
+++ b/test/drawing/tc_pic.rb
@@ -5,7 +5,10 @@ class TestPic < Test::Unit::TestCase
def setup
@p = Axlsx::Package.new
ws = @p.workbook.add_worksheet
- @test_img = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
+ @test_img = @test_img_jpg = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
+ @test_img_png = File.dirname(__FILE__) + "/../../examples/image1.png"
+ @test_img_gif = File.dirname(__FILE__) + "/../../examples/image1.gif"
+ @test_img_fake = File.dirname(__FILE__) + "/../../examples/image1_fake.jpg"
@test_img_up = File.dirname(__FILE__) + "/../../examples/IMAGE1UP.JPEG"
@image = ws.add_image :image_src => @test_img, :hyperlink => 'https://github.com/randym', :tooltip => "What's up doc?"
end
@@ -70,11 +73,12 @@ class TestPic < Test::Unit::TestCase
end
def test_image_src
- assert_raise(ArgumentError) { @image.image_src = 49 }
- assert_raise(ArgumentError) { @image.image_src = 'Unknown' }
assert_raise(ArgumentError) { @image.image_src = __FILE__ }
- assert_nothing_raised { @image.image_src = @test_img }
- assert_equal(@image.image_src, @test_img)
+ assert_raise(ArgumentError) { @image.image_src = @test_img_fake }
+ assert_nothing_raised { @image.image_src = @test_img_gif }
+ assert_nothing_raised { @image.image_src = @test_img_png }
+ assert_nothing_raised { @image.image_src = @test_img_jpg }
+ assert_equal(@image.image_src, @test_img_jpg)
end
def test_image_src_downcase