diff --git a/app/models/zip_file/reader.rb b/app/models/zip_file/reader.rb index 2dc563f96..12ddd6fae 100644 --- a/app/models/zip_file/reader.rb +++ b/app/models/zip_file/reader.rb @@ -2,7 +2,7 @@ class ZipFile::Reader def initialize(io) @io = io @reader = ZipKit::FileReader.read_zip_structure(io: io) - rescue ZipKit::FileReader::InvalidStructure => e + rescue ZipKit::FileReader::ReadError, ZipKit::FileReader::MissingEOCD, ZipKit::FileReader::UnsupportedFeature => e raise ZipFile::InvalidFileError, e.message end diff --git a/test/models/account/import_test.rb b/test/models/account/import_test.rb index a377f69c2..a33cc32c2 100644 --- a/test/models/account/import_test.rb +++ b/test/models/account/import_test.rb @@ -96,6 +96,27 @@ class Account::ImportTest < ActiveSupport::TestCase tempfile&.unlink end + test "check sets failure_reason to invalid_export for non-ZIP file" do + target_account = Account.create!(name: "Import Test") + import = Account::Import.create!(identity: identities(:david), account: target_account) + + tempfile = Tempfile.new([ "not_a_zip", ".zip" ]) + tempfile.write("this is not a zip file at all") + tempfile.rewind + + Current.set(account: target_account) do + import.file.attach(io: tempfile, filename: "export.zip", content_type: "application/zip") + end + + assert_raises(ZipFile::InvalidFileError) { import.check } + + assert import.failed? + assert_equal "invalid_export", import.failure_reason + ensure + tempfile&.close + tempfile&.unlink + end + test "check sets failure_reason to conflict when records already exist" do source_account = accounts("37s") exporter = users(:david) diff --git a/test/models/zip_file_test.rb b/test/models/zip_file_test.rb index 42db30f9e..3484f9f92 100644 --- a/test/models/zip_file_test.rb +++ b/test/models/zip_file_test.rb @@ -119,6 +119,17 @@ class ZipFileTest < ActiveSupport::TestCase end end + test "reader raises InvalidFileError for non-zip file" do + tempfile = Tempfile.new([ "not_a_zip", ".zip" ]) + tempfile.write("this is not a zip file at all") + tempfile.rewind + + assert_raises(ZipFile::InvalidFileError) { ZipFile::Reader.new(tempfile) } + ensure + tempfile&.close + tempfile&.unlink + end + private def create_test_zip(files) tempfile = Tempfile.new([ "test", ".zip" ])