post replacements: don't delete files still in use.

Bug: if a user replaces a post with another image, then replaces the
post back to the original image, then the deletion job for the original
image will still run. The will delete the original file, but that file
is now in use again and should not be deleted.
This commit is contained in:
evazion
2017-06-13 01:56:58 -05:00
parent 12dc2a4c9b
commit 27aa9fe82a
2 changed files with 27 additions and 0 deletions

View File

@@ -6,6 +6,7 @@ class Post < ActiveRecord::Base
class DisapprovalError < Exception ; end
class RevertError < Exception ; end
class SearchError < Exception ; end
class DeletionError < Exception ; end
before_validation :initialize_uploader, :on => :create
before_validation :merge_old_changes
@@ -65,6 +66,12 @@ class Post < ActiveRecord::Base
module ClassMethods
def delete_files(post_id, file_path, large_file_path, preview_file_path)
post = Post.find(post_id)
if post.file_path == file_path || post.large_file_path == large_file_path || post.preview_file_path == preview_file_path
raise DeletionError.new("Files still in use; skipping deletion.")
end
# the large file and the preview don't necessarily exist. if so errors will be ignored.
FileUtils.rm_f(file_path)
FileUtils.rm_f(large_file_path)

View File

@@ -170,5 +170,25 @@ class PostReplacementTest < ActiveSupport::TestCase
assert_equal([{"file"=>"000000.jpg", "delay"=>125}, {"file"=>"000001.jpg", "delay"=>125}], @post.pixiv_ugoira_frame_data.data)
end
end
context "a post that is replaced to another file then replaced back to the original file" do
should "not delete the original files" do
@post.replace!(replacement_url: "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62247350")
@post.replace!(replacement_url: "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62247364")
@post.replace!(replacement_url: "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62247350")
assert(File.exists?(@post.file_path))
assert(File.exists?(@post.preview_file_path))
assert(File.exists?(@post.large_file_path))
Timecop.travel(Time.now + PostReplacement::DELETION_GRACE_PERIOD + 1.day) do
Delayed::Worker.new.work_off
end
assert(File.exists?(@post.file_path))
assert(File.exists?(@post.preview_file_path))
assert(File.exists?(@post.large_file_path))
end
end
end
end