From a7ebb587e19ce1177a7ef067e2da74e4964ff19e Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sat, 27 Apr 2019 22:33:54 +0200 Subject: Handle weird permissions in tar archives --- tests/test_corrupted_files.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/test_corrupted_files.py b/tests/test_corrupted_files.py index 1331f1c..b7240fe 100644 --- a/tests/test_corrupted_files.py +++ b/tests/test_corrupted_files.py @@ -293,7 +293,7 @@ class TestCorruptedFiles(unittest.TestCase): os.remove('./tests/data/clean.epub') def test_tar(self): - with tarfile.TarFile('./tests/data/clean.tar', 'w') as zout: + with tarfile.TarFile.open('./tests/data/clean.tar', 'w') as zout: zout.add('./tests/data/dirty.flac') zout.add('./tests/data/dirty.docx') zout.add('./tests/data/dirty.jpg') @@ -302,6 +302,7 @@ class TestCorruptedFiles(unittest.TestCase): tarinfo.mtime = time.time() tarinfo.uid = 1337 tarinfo.gid = 1338 + tarinfo.size = os.stat('./tests/data/dirty.png').st_size with open('./tests/data/dirty.png', 'rb') as f: zout.addfile(tarinfo, f) p, mimetype = parser_factory.get_parser('./tests/data/clean.tar') @@ -316,3 +317,26 @@ class TestCorruptedFiles(unittest.TestCase): with self.assertRaises(ValueError): archive.TarParser('./tests/data/clean.tar') os.remove('./tests/data/clean.tar') + +class TestReadOnlyArchiveMembers(unittest.TestCase): + def test_onlymember_tar(self): + with tarfile.open('./tests/data/clean.tar', 'w') as zout: + zout.add('./tests/data/dirty.png') + tarinfo = tarfile.TarInfo('./tests/data/dirty.jpg') + tarinfo.mtime = time.time() + tarinfo.uid = 1337 + tarinfo.mode = 0o000 + tarinfo.size = os.stat('./tests/data/dirty.jpg').st_size + with open('./tests/data/dirty.jpg', 'rb') as f: + zout.addfile(tarinfo=tarinfo, fileobj=f) + p, mimetype = parser_factory.get_parser('./tests/data/clean.tar') + self.assertEqual(mimetype, 'application/x-tar') + meta = p.get_meta() + self.assertEqual(meta['./tests/data/dirty.jpg']['uid'], '1337') + self.assertTrue(p.remove_all()) + + p = archive.TarParser('./tests/data/clean.cleaned.tar') + self.assertEqual(p.get_meta(), {}) + os.remove('./tests/data/clean.tar') + os.remove('./tests/data/clean.cleaned.tar') + -- cgit v1.3