From 4f15f7b34f592936c2c103c0c605b04139313380 Mon Sep 17 00:00:00 2001 From: Jens Kraemer Date: Thu, 2 Mar 2017 10:47:01 +0800 Subject: [PATCH 2/3] adds a rake task to convert the digests of existing attachments to SHA256 --- app/models/attachment.rb | 21 +++++++++++++++++++++ lib/tasks/redmine.rake | 5 +++++ test/unit/attachment_test.rb | 9 +++++++++ 3 files changed, 35 insertions(+) diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 3bfecfc..51b26b9 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -352,6 +352,27 @@ class Attachment < ActiveRecord::Base end end + # Updates attachments' digests to SHA256 + def self.update_digest_to_sha256 + Attachment.where("length(digest) < 64").find_in_batches do |group| + group.each do |attachment| + attachment.update_digest_to_sha256! + end + end + end + + def update_digest_to_sha256! + if readable? + sha = Digest::SHA256.new + File.open(diskfile, 'rb') do |f| + while buffer = f.read(8192) + sha.update(buffer) + end + end + update_column :digest, sha.hexdigest + end + end + # Returns true if the extension is allowed regarding allowed/denied # extensions defined in application settings, otherwise false def self.valid_extension?(extension) diff --git a/lib/tasks/redmine.rake b/lib/tasks/redmine.rake index 973e63e..bb7a9cd 100644 --- a/lib/tasks/redmine.rake +++ b/lib/tasks/redmine.rake @@ -26,6 +26,11 @@ namespace :redmine do task :move_to_subdirectories => :environment do Attachment.move_from_root_to_target_directory end + + desc 'Updates attachment digests to SHA256' + task :update_digest_to_sha256 => :environment do + Attachment.update_digest_to_sha256 + end end namespace :tokens do diff --git a/test/unit/attachment_test.rb b/test/unit/attachment_test.rb index a70009d..e1662f6 100644 --- a/test/unit/attachment_test.rb +++ b/test/unit/attachment_test.rb @@ -332,6 +332,14 @@ class AttachmentTest < ActiveSupport::TestCase assert_equal 'text/plain', attachment.content_type end + test 'should update digest to sha256' do + set_fixtures_attachments_directory + attachment = Attachment.find 4 + assert File.readable? attachment.diskfile + attachment.update_digest_to_sha256! + assert_equal 'c2db49ac68eaebb1703db09411dcd8186b395f4ae8482e449a5d5abff96c7fb2', attachment.digest + end + def test_update_attachments attachments = Attachment.where(:id => [2, 3]).to_a @@ -430,4 +438,5 @@ class AttachmentTest < ActiveSupport::TestCase else puts '(ImageMagick convert not available)' end + end -- 2.1.4