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")