From d6cdf8c25a1fd454ba272465aeb02dd100d5b4e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Pi=C4=8Dman?= Date: Tue, 2 Jul 2019 10:18:41 +0200 Subject: [PATCH] Multiple zip files are filling the tmp folder #1017 --- app/controllers/dmsf_controller.rb | 11 +---------- lib/redmine_dmsf/dmsf_zip.rb | 6 +++--- test/functional/dmsf_controller_test.rb | 13 +++++-------- 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index 275c99ac..65455797 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -366,16 +366,7 @@ class DmsfController < ApplicationController raise DmsfAccessError unless User.current.allowed_to?(:email_documents, @project) zip = Zip.new zip_entries(zip, selected_folders, selected_files) - - zipped_content = DmsfHelper.temp_dir.join(DmsfHelper.temp_filename('dmsf_email_sent_documents.zip')) - - File.open(zipped_content, 'wb') do |f| - File.open(zip.finish, 'rb') do |zip_file| - while (buffer = zip_file.read(8192)) - f.write(buffer) - end - end - end + zipped_content = zip.finish max_filesize = Setting.plugin_redmine_dmsf['dmsf_max_email_filesize'].to_f if max_filesize > 0 && File.size(zipped_content) > max_filesize * 1048576 diff --git a/lib/redmine_dmsf/dmsf_zip.rb b/lib/redmine_dmsf/dmsf_zip.rb index 19812f1f..03fa3b7a 100644 --- a/lib/redmine_dmsf/dmsf_zip.rb +++ b/lib/redmine_dmsf/dmsf_zip.rb @@ -29,15 +29,15 @@ module RedmineDmsf attr_reader :files def initialize - @zip_path = DmsfHelper.temp_dir.join(DmsfHelper.temp_filename('dmsf_zip.zip')) - @zip_file = ::Zip::OutputStream.new(@zip_path) + @temp_file = Tempfile.new(%w(dmsf_zip_ .zip), DmsfHelper.temp_dir) + @zip_file = ::Zip::OutputStream.open(@temp_file) @files = [] @folders = [] end def finish @zip_file.close - @zip_path + @temp_file.path end def close diff --git a/test/functional/dmsf_controller_test.rb b/test/functional/dmsf_controller_test.rb index 4147d080..cd3f65db 100644 --- a/test/functional/dmsf_controller_test.rb +++ b/test/functional/dmsf_controller_test.rb @@ -286,19 +286,16 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase def test_entries_email @role.add_permission! :view_dmsf_files - zip_file_path = DmsfHelper.temp_dir.join(DmsfHelper.temp_filename('dmsf_email_sent_documents.zip')) - FileUtils.touch(zip_file_path) - assert File.exist?(zip_file_path) - get :entries_email, :params => {:id => @project, :email => + zip_file = Tempfile.new('test', DmsfHelper::temp_dir) + get :entries_email, params: { id: @project, email: { - :to => 'to@test.com', :from => 'from@test.com', :subject => 'subject', :body => 'body', :expired_at => '2015-01-01', - :folders => [], :files => [@file1.id], :zipped_content => zip_file_path + to: 'to@test.com', from: 'from@test.com', subject: 'subject', body: 'body', expired_at: '2015-01-01', + folders: [], files: [@file1.id], zipped_content: zip_file.path } } assert_redirected_to dmsf_folder_path(id: @project) - assert !File.exist?(zip_file_path) ensure - FileUtils.rm_rf(zip_file_path) + zip_file.unlink end def test_add_email_forbidden