diff options
| author | Anton Samarchyan <anton.samarchyan@savoirfairelinux.com> | 2016-12-01 11:05:08 -0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-12-06 08:28:36 -0500 |
| commit | d0112cf9306834b17eb5476363cb6b3b9bfb650c (patch) | |
| tree | 08433c083c4e5a60b6e60dc5adb58aadc046f7a4 /django/utils/archive.py | |
| parent | dd99e69fa8f89263d0396f23e0db9aa8fa667b01 (diff) | |
Fixed #26494 -- Made Archive.extract() preserve file permissions.
Diffstat (limited to 'django/utils/archive.py')
| -rw-r--r-- | django/utils/archive.py | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/django/utils/archive.py b/django/utils/archive.py index 13f8afa32f..f8c1a0f83b 100644 --- a/django/utils/archive.py +++ b/django/utils/archive.py @@ -164,6 +164,7 @@ class TarArchive(BaseArchive): os.makedirs(dirname) with open(filename, 'wb') as outfile: shutil.copyfileobj(extracted, outfile) + os.chmod(filename, member.mode) finally: if extracted: extracted.close() @@ -185,6 +186,7 @@ class ZipArchive(BaseArchive): leading = self.has_leading_dir(namelist) for name in namelist: data = self._archive.read(name) + info = self._archive.getinfo(name) if leading: name = self.split_leading_dir(name)[1] filename = os.path.join(to_path, name) @@ -198,6 +200,9 @@ class ZipArchive(BaseArchive): else: with open(filename, 'wb') as outfile: outfile.write(data) + # convert ZipInfo.external_attr to mode + mode = info.external_attr >> 16 + os.chmod(filename, mode) def close(self): self._archive.close() |
