at master 14 kB view raw
1From d10324eac4429ff3d7d38ad24a19210699229e07 Mon Sep 17 00:00:00 2001 2From: Alfred Wingate <parona@protonmail.com> 3Date: Wed, 11 Dec 2024 06:34:36 +0200 4Subject: [PATCH 1/4] Use application/gzip as the preferred mimetype for gzip 5 6Signed-off-by: Alfred Wingate <parona@protonmail.com> 7--- 8 patoolib/__init__.py | 1 - 9 patoolib/mime.py | 16 +++++++++++++--- 10 tests/test_mime.py | 4 ++-- 11 3 files changed, 15 insertions(+), 6 deletions(-) 12 13diff --git a/patoolib/__init__.py b/patoolib/__init__.py 14index d665a28a..2247b615 100644 15--- a/patoolib/__init__.py 16+++ b/patoolib/__init__.py 17@@ -127,7 +127,6 @@ 18 'application/x-cpio': 'cpio', 19 'application/x-debian-package': 'deb', 20 'application/x-dms': 'dms', 21- 'application/x-gzip': 'gzip', 22 'application/x-iso9660-image': 'iso', 23 'application/x-lz4': 'lz4', 24 'application/x-lzop': 'lzop', 25diff --git a/patoolib/mime.py b/patoolib/mime.py 26index 12405ada..c9d8894b 100644 27--- a/patoolib/mime.py 28+++ b/patoolib/mime.py 29@@ -135,9 +135,11 @@ def guess_mime(filename: str) -> tuple[str | None, str | None]: 30 Mime2Encoding: dict[str, str] = dict( 31 [(_val, _key) for _key, _val in Encoding2Mime.items()] 32 ) 33-# libmagic before version 5.14 identified .gz files as application/x-gzip 34-Mime2Encoding['application/x-gzip'] = 'gzip' 35 36+LegacyMimeType: dict[str, str] = { 37+ # libmagic before version 5.14 identified .gz files as application/x-gzip 38+ 'application/x-gzip': "application/gzip", 39+} 40 41 def guess_mime_mimedb(filename: str) -> tuple[str | None, str | None]: 42 """Guess MIME type from given filename. 43@@ -192,6 +194,10 @@ def guess_mime_file(filename: str) -> tuple[str | None, str | None]: 44 except (OSError, subprocess.CalledProcessError) as err: 45 log_warning(f"error executing {cmd}: {err}") 46 mime2 = None 47+ 48+ if mime2 in LegacyMimeType: 49+ mime2 = LegacyMimeType[mime2] 50+ 51 # Some file(1) implementations return an empty or unknown mime type 52 # when the uncompressor program is not installed, other 53 # implementation return the original file type. 54@@ -227,6 +233,10 @@ def guess_mime_file_mime( 55 except OSError as err: 56 # ignore errors, as file(1) is only a fallback 57 log_warning(f"error executing {cmd}: {err}") 58+ 59+ if mime in LegacyMimeType: 60+ mime = LegacyMimeType[mime] 61+ 62 if mime not in ArchiveMimetypes: 63 mime, encoding = None, None 64 return mime, encoding 65@@ -253,7 +263,7 @@ def get_file_mime_encoding(parts: Sequence[str]) -> str | None: 66 "cpio archive": "application/x-cpio", 67 "ASCII cpio archive": "application/x-cpio", 68 "Debian binary package": "application/x-debian-package", 69- "gzip compressed data": "application/x-gzip", 70+ "gzip compressed data": "application/gzip", 71 "LZMA compressed data": "application/x-lzma", 72 "LRZIP compressed data": "application/x-lrzip", 73 "lzop compressed data": "application/x-lzop", 74diff --git a/tests/test_mime.py b/tests/test_mime.py 75index 40e73edf..3f292dfc 100644 76--- a/tests/test_mime.py 77+++ b/tests/test_mime.py 78@@ -81,8 +81,8 @@ def test_mime_file(self): 79 self.mime_test_file("t.cpio.foo", "application/x-cpio") 80 self.mime_test_file("t.deb", "application/x-debian-package") 81 self.mime_test_file("t.deb.foo", "application/x-debian-package") 82- self.mime_test_file("t.txt.gz", ("application/gzip", "application/x-gzip")) 83- self.mime_test_file("t.txt.gz.foo", ("application/gzip", "application/x-gzip")) 84+ self.mime_test_file("t.txt.gz", "application/gzip") 85+ self.mime_test_file("t.txt.gz.foo", "application/gzip") 86 self.mime_test_file("t.jar", "application/zip") 87 self.mime_test_file("t.jar.foo", "application/zip") 88 self.mime_test_file("t.txt.lzma", "application/x-lzma") 89 90From e7501d1c7805696ff5b2ecc779f7a56ab2425c3f Mon Sep 17 00:00:00 2001 91From: Alfred Wingate <parona@protonmail.com> 92Date: Wed, 11 Dec 2024 06:37:54 +0200 93Subject: [PATCH 2/4] Change rar mime type to application/vnd.rar 94 95https://github.com/file/file/commit/d46a1f3dbbf58eb510c1779b8bdcc59d5ee24ab9 96https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1068700 97 98Signed-off-by: Alfred Wingate <parona@protonmail.com> 99--- 100 patoolib/__init__.py | 2 +- 101 patoolib/mime.py | 9 ++++++--- 102 tests/test_mime.py | 16 ++++++++-------- 103 3 files changed, 15 insertions(+), 12 deletions(-) 104 105diff --git a/patoolib/__init__.py b/patoolib/__init__.py 106index 2247b615..8b13181c 100644 107--- a/patoolib/__init__.py 108+++ b/patoolib/__init__.py 109@@ -136,7 +136,6 @@ 110 'application/x-lrzip': 'lrzip', 111 'application/x-lzh': 'lzh', 112 'application/x-ms-wim': 'wim', 113- 'application/x-rar': 'rar', 114 'application/x-redhat-package-manager': 'rpm', 115 'application/x-rpm': 'rpm', 116 'application/x-rzip': 'rzip', 117@@ -147,6 +146,7 @@ 118 'application/x-xz': 'xz', 119 'application/x-zip-compressed': 'zip', 120 'application/x-zoo': 'zoo', 121+ 'application/vnd.rar': 'rar', 122 'application/zip': 'zip', 123 'application/zpaq': 'zpaq', 124 "application/zstd": "zstd", 125diff --git a/patoolib/mime.py b/patoolib/mime.py 126index c9d8894b..8de9b180 100644 127--- a/patoolib/mime.py 128+++ b/patoolib/mime.py 129@@ -54,8 +54,8 @@ def add_mimedb_data(mimedb: mimetypes.MimeTypes) -> None: 130 add_mimetype(mimedb, 'application/x-lzma', '.lzma') 131 add_mimetype(mimedb, 'application/x-xz', '.xz') 132 add_mimetype(mimedb, 'application/java-archive', '.jar') 133- add_mimetype(mimedb, 'application/x-rar', '.rar') 134- add_mimetype(mimedb, 'application/x-rar', '.cbr') 135+ add_mimetype(mimedb, 'application/vnd.rar', '.rar') 136+ add_mimetype(mimedb, 'application/vnd.rar', '.cbr') 137 add_mimetype(mimedb, 'application/x-7z-compressed', '.7z') 138 add_mimetype(mimedb, 'application/x-7z-compressed', '.cb7') 139 add_mimetype(mimedb, 'application/x-cab', '.cab') 140@@ -139,8 +139,11 @@ def guess_mime(filename: str) -> tuple[str | None, str | None]: 141 LegacyMimeType: dict[str, str] = { 142 # libmagic before version 5.14 identified .gz files as application/x-gzip 143 'application/x-gzip': "application/gzip", 144+ # libmagic before version 5.46 identified .rar files as application/x-rar 145+ 'application/x-rar': "application/vnd.rar", 146 } 147 148+ 149 def guess_mime_mimedb(filename: str) -> tuple[str | None, str | None]: 150 """Guess MIME type from given filename. 151 @return: tuple (mime, encoding) 152@@ -268,7 +271,7 @@ def get_file_mime_encoding(parts: Sequence[str]) -> str | None: 153 "LRZIP compressed data": "application/x-lrzip", 154 "lzop compressed data": "application/x-lzop", 155 "Microsoft Cabinet archive data": "application/vnd.ms-cab-compressed", 156- "RAR archive data": "application/x-rar", 157+ "RAR archive data": "application/vnd.rar", 158 "RPM ": "application/x-redhat-package-manager", 159 "POSIX tar archive": "application/x-tar", 160 "xz compressed data": "application/x-xz", 161diff --git a/tests/test_mime.py b/tests/test_mime.py 162index 3f292dfc..8f3ecb8c 100644 163--- a/tests/test_mime.py 164+++ b/tests/test_mime.py 165@@ -91,10 +91,10 @@ def test_mime_file(self): 166 self.mime_test_file("t.txt.lz.foo", "application/x-lzip") 167 self.mime_test_file("t.txt.lzo", "application/x-lzop") 168 self.mime_test_file("t.txt.lzo.foo", "application/x-lzop") 169- self.mime_test_file("t.rar", "application/x-rar") 170- self.mime_test_file("t.rar.foo", "application/x-rar") 171- self.mime_test_file("t.cbr", "application/x-rar") 172- self.mime_test_file("t.cbr.foo", "application/x-rar") 173+ self.mime_test_file("t.rar", "application/vnd.rar") 174+ self.mime_test_file("t.rar.foo", "application/vnd.rar") 175+ self.mime_test_file("t.cbr", "application/vnd.rar") 176+ self.mime_test_file("t.cbr.foo", "application/vnd.rar") 177 self.mime_test_file("t.rpm", "application/x-rpm") 178 self.mime_test_file("t.rpm.foo", "application/x-rpm") 179 self.mime_test_file("t.tar", "application/x-tar") 180@@ -197,8 +197,8 @@ def test_nested_gzip(self): 181 """Test mime detection of archives with double compression""" 182 # We won't extract this with rar, as it doesn't support archives wrapped in gzip 183 # compression, but we will recognize the archive as a gzip-wrapped rar-file 184- self.mime_test_file("t.rar.gz", "application/x-rar", "gzip") 185- self.mime_test_file("t.rar.gz.foo", "application/x-rar", "gzip") 186+ self.mime_test_file("t.rar.gz", "application/vnd.rar", "gzip") 187+ self.mime_test_file("t.rar.gz.foo", "application/vnd.rar", "gzip") 188 189 @needs_program('file') 190 @needs_program('gzip') 191@@ -237,7 +237,7 @@ def test_mime_mimedb(self): 192 self.mime_test_mimedb("t .bz2", "application/x-bzip2") 193 self.mime_test_mimedb("t .bz3", "application/x-bzip3") 194 self.mime_test_mimedb("t.cab", "application/x-cab") 195- self.mime_test_mimedb("t.cbr", ("application/rar", "application/x-rar")) 196+ self.mime_test_mimedb("t.cbr", ("application/rar", "application/vnd.rar")) 197 self.mime_test_mimedb("t.cpio", "application/x-cpio") 198 self.mime_test_mimedb("t.deb", "application/x-debian-package") 199 self.mime_test_mimedb("t.gz", "application/gzip") 200@@ -247,7 +247,7 @@ def test_mime_mimedb(self): 201 self.mime_test_mimedb("t.txt.lz", "application/x-lzip") 202 self.mime_test_mimedb("t.txt.lz4", "application/x-lz4") 203 self.mime_test_mimedb("t.lzo", "application/x-lzop") 204- self.mime_test_mimedb("t.rar", ("application/rar", "application/x-rar")) 205+ self.mime_test_mimedb("t.rar", ("application/rar", "application/vnd.rar")) 206 self.mime_test_mimedb( 207 "t.rpm", ("application/x-redhat-package-manager", "application/x-rpm") 208 ) 209 210From 85fafd16ec01a7eb793e04011617bb47211d446a Mon Sep 17 00:00:00 2001 211From: Alfred Wingate <parona@protonmail.com> 212Date: Wed, 11 Dec 2024 06:40:41 +0200 213Subject: [PATCH 3/4] Remove references to application/rar 214 215application/vnd.rar is the IANA assigned mime type for rar. libmagic has 216never refered to application/rar either, so there is no use for backwards 217compatibility. 218 219https://www.iana.org/assignments/media-types/application/vnd.rar 220 221Signed-off-by: Alfred Wingate <parona@protonmail.com> 222--- 223 patoolib/__init__.py | 1 - 224 tests/test_mime.py | 4 ++-- 225 2 files changed, 2 insertions(+), 3 deletions(-) 226 227diff --git a/patoolib/__init__.py b/patoolib/__init__.py 228index 8b13181c..51f8b4eb 100644 229--- a/patoolib/__init__.py 230+++ b/patoolib/__init__.py 231@@ -110,7 +110,6 @@ 232 'application/jar': 'zip', # reported on older systems such as ubuntu 14.04 233 'application/java-archive': 'zip', 234 'application/vnd.android.package-archive': 'zip', 235- 'application/rar': 'rar', 236 'application/vnd.ms-cab-compressed': 'cab', 237 'application/x-7z-compressed': '7z', 238 'application/x-ace': 'ace', 239diff --git a/tests/test_mime.py b/tests/test_mime.py 240index 8f3ecb8c..287d8208 100644 241--- a/tests/test_mime.py 242+++ b/tests/test_mime.py 243@@ -237,7 +237,7 @@ def test_mime_mimedb(self): 244 self.mime_test_mimedb("t .bz2", "application/x-bzip2") 245 self.mime_test_mimedb("t .bz3", "application/x-bzip3") 246 self.mime_test_mimedb("t.cab", "application/x-cab") 247- self.mime_test_mimedb("t.cbr", ("application/rar", "application/vnd.rar")) 248+ self.mime_test_mimedb("t.cbr", "application/vnd.rar") 249 self.mime_test_mimedb("t.cpio", "application/x-cpio") 250 self.mime_test_mimedb("t.deb", "application/x-debian-package") 251 self.mime_test_mimedb("t.gz", "application/gzip") 252@@ -247,7 +247,7 @@ def test_mime_mimedb(self): 253 self.mime_test_mimedb("t.txt.lz", "application/x-lzip") 254 self.mime_test_mimedb("t.txt.lz4", "application/x-lz4") 255 self.mime_test_mimedb("t.lzo", "application/x-lzop") 256- self.mime_test_mimedb("t.rar", ("application/rar", "application/vnd.rar")) 257+ self.mime_test_mimedb("t.rar", "application/vnd.rar") 258 self.mime_test_mimedb( 259 "t.rpm", ("application/x-redhat-package-manager", "application/x-rpm") 260 ) 261 262From bab80a04a72941b3c53e5fce1f96f5a2fc531280 Mon Sep 17 00:00:00 2001 263From: Alfred Wingate <parona@protonmail.com> 264Date: Wed, 11 Dec 2024 07:04:19 +0200 265Subject: [PATCH 4/4] Remove references to application/x-redhat-package-manager 266 267libmagic has never referred to x-redhat-package-manager and has had 268x-rpm since 3.30. Red Hat themselves use x-rpm in their mailcap. 269 270https://pagure.io/mailcap/blob/master/f/mime.types 271 272Signed-off-by: Alfred Wingate <parona@protonmail.com> 273--- 274 patoolib/__init__.py | 1 - 275 patoolib/mime.py | 2 +- 276 tests/test_mime.py | 4 +--- 277 3 files changed, 2 insertions(+), 5 deletions(-) 278 279diff --git a/patoolib/__init__.py b/patoolib/__init__.py 280index 51f8b4eb..9d8bc849 100644 281--- a/patoolib/__init__.py 282+++ b/patoolib/__init__.py 283@@ -135,7 +135,6 @@ 284 'application/x-lrzip': 'lrzip', 285 'application/x-lzh': 'lzh', 286 'application/x-ms-wim': 'wim', 287- 'application/x-redhat-package-manager': 'rpm', 288 'application/x-rpm': 'rpm', 289 'application/x-rzip': 'rzip', 290 'application/x-shar': 'shar', 291diff --git a/patoolib/mime.py b/patoolib/mime.py 292index 8de9b180..ffad9cd0 100644 293--- a/patoolib/mime.py 294+++ b/patoolib/mime.py 295@@ -272,7 +272,7 @@ def get_file_mime_encoding(parts: Sequence[str]) -> str | None: 296 "lzop compressed data": "application/x-lzop", 297 "Microsoft Cabinet archive data": "application/vnd.ms-cab-compressed", 298 "RAR archive data": "application/vnd.rar", 299- "RPM ": "application/x-redhat-package-manager", 300+ "RPM ": "application/x-rpm", 301 "POSIX tar archive": "application/x-tar", 302 "xz compressed data": "application/x-xz", 303 "Zip archive data": "application/zip", 304diff --git a/tests/test_mime.py b/tests/test_mime.py 305index 287d8208..a337f87a 100644 306--- a/tests/test_mime.py 307+++ b/tests/test_mime.py 308@@ -248,9 +248,7 @@ def test_mime_mimedb(self): 309 self.mime_test_mimedb("t.txt.lz4", "application/x-lz4") 310 self.mime_test_mimedb("t.lzo", "application/x-lzop") 311 self.mime_test_mimedb("t.rar", "application/vnd.rar") 312- self.mime_test_mimedb( 313- "t.rpm", ("application/x-redhat-package-manager", "application/x-rpm") 314- ) 315+ self.mime_test_mimedb("t.rpm", "application/x-rpm") 316 self.mime_test_mimedb("t.tar", "application/x-tar") 317 self.mime_test_mimedb("t.cbt", "application/x-tar") 318 self.mime_test_mimedb("t.tar.bz2", "application/x-tar", "bzip2")