From f128c48485d23beed332d9ee8767cb33408ee5b3 Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 14 Nov 2022 16:13:22 -0600 Subject: [PATCH] archives: add code for detecting .rar and .7z files. --- app/logical/file_type_detector.rb | 25 +++++++++++++++++++ test/files/archive/ugoira.7z | Bin 0 -> 5016 bytes test/files/archive/ugoira.rar | Bin 0 -> 6043 bytes test/files/archive/ugoira.tar.7z | Bin 0 -> 5084 bytes test/files/archive/ugoira.zip | Bin 0 -> 6663 bytes test/unit/danbooru_archive_test.rb | 38 ++++++++++++++++++++++++++--- 6 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 test/files/archive/ugoira.7z create mode 100644 test/files/archive/ugoira.rar create mode 100644 test/files/archive/ugoira.tar.7z create mode 100644 test/files/archive/ugoira.zip diff --git a/app/logical/file_type_detector.rb b/app/logical/file_type_detector.rb index 797ace84d..9c4cb2245 100644 --- a/app/logical/file_type_detector.rb +++ b/app/logical/file_type_detector.rb @@ -55,8 +55,33 @@ class FileTypeDetector # https://aomediacodec.github.io/av1-avif/#brands-overview when /\A....ftyp(?:avif|avis)/ :avif + + # https://www.loc.gov/preservation/digital/formats/fdd/fdd000354.shtml#sign + # https://en.wikipedia.org/wiki/ZIP_(file_format) + # XXX Does not detect self-extracting archives when /\APK\x03\x04/ :zip + + # https://docs.fileformat.com/compression/7z/#file-signature + # https://py7zr.readthedocs.io/en/latest/archive_format.html#signature + # https://www.loc.gov/preservation/digital/formats/fdd/fdd000539.shtml#sign + # https://en.wikipedia.org/wiki/7z + # XXX Does not detect self-extracting archives + when /\A7z\xbc\xaf\x27\x1c/n + :"7z" + + # Rar 1.5 to 4.0 + # https://www.rarlab.com/technote.htm#rarsign + # https://www.loc.gov/preservation/digital/formats/fdd/fdd000450.shtml#sign + # https://en.wikipedia.org/wiki/RAR_(file_format) + # XXX Does not detect self-extracting archives + when /\ARar!\x1a\x07\x00/n + :rar + + # Rar 5.0+ + when /\ARar!\x1a\x07\x01\x00/n + :rar + else :bin end diff --git a/test/files/archive/ugoira.7z b/test/files/archive/ugoira.7z new file mode 100644 index 0000000000000000000000000000000000000000..60214e21788f8c6a1f02f26597a6c86409bfeac4 GIT binary patch literal 5016 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 mCS7IZY-nI$=VoMJRAy#mWQ}DIU|`^BgB>r*a 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 literal 0 HcmV?d00001 diff --git a/test/files/archive/ugoira.zip b/test/files/archive/ugoira.zip new file mode 100644 index 0000000000000000000000000000000000000000..463bed1c80444b39af01e33d6bf82878495ae99d GIT binary patch literal 6663 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