Commit bd8f6b7d

mo khan <mo@mokhan.ca>
2014-06-07 03:31:47
add specs for sanitizing a filename.
1 parent d481e4b
Changed files (3)
app
models
services
infrastructure
spec
services
infrastructure
app/models/photo.rb
@@ -2,10 +2,6 @@ class Photo < ActiveRecord::Base
   belongs_to :creation, counter_cache: true, touch: true
   #mount_uploader :image, PhotoUploader
 
-  #def thumb_url
-    #image.thumb.url
-  #end
-
   def watermark
     return '' if creation.nil?
     creation.watermark
@@ -16,8 +12,8 @@ class Photo < ActiveRecord::Base
   end
 
   def upload(file, blob_storage)
-    self.original_filename = File.basename(file)
     image = Image.new(file)
+    self.original_filename = image.filename
     versions.each do |version|
       version.adjust(image)
       blob_storage.upload(create_key(version.prefix), image.path)
app/services/infrastructure/image.rb
@@ -5,6 +5,10 @@ class Image
     @path = path
   end
 
+  def filename
+    @filename ||= sanitize(@path)
+  end
+
   def resize_to_fit(width, height)
     manipulate! do |img|
       img.resize "#{width}x#{height}"
@@ -55,4 +59,17 @@ class Image
     message = I18n.translate(:"errors.messages.mini_magick_processing_error", :e => e, :default => default)
     raise CarrierWave::ProcessingError, message
   end
+
+  def sanitize(name)
+    name = name.gsub("\\", "/")
+    name = File.basename(name)
+    name = name.gsub(sanitize_regexp,"_")
+    name = "_#{name}" if name =~ /\A\.+\z/
+    name = "unnamed" if name.size == 0
+    return name.mb_chars.to_s
+  end
+
+  def sanitize_regexp
+    /[^a-zA-Z0-9\.\-\+_]/
+  end
 end
spec/services/infrastructure/image_spec.rb
@@ -0,0 +1,13 @@
+require "spec_helper"
+
+describe Image do
+  describe "#filename" do
+    it "returns the filename" do
+      expect(Image.new("/Users/mo/blah.png").filename).to eql("blah.png")
+    end
+
+    it "sanitizes the filename" do
+      expect(Image.new("/Users/mo/blah huh.png").filename).to eql("blah_huh.png")
+    end
+  end
+end