summaryrefslogtreecommitdiff
path: root/django/utils/archive.py
diff options
context:
space:
mode:
authorAnton Samarchyan <anton.samarchyan@savoirfairelinux.com>2016-12-01 11:05:08 -0500
committerTim Graham <timograham@gmail.com>2016-12-06 08:28:36 -0500
commitd0112cf9306834b17eb5476363cb6b3b9bfb650c (patch)
tree08433c083c4e5a60b6e60dc5adb58aadc046f7a4 /django/utils/archive.py
parentdd99e69fa8f89263d0396f23e0db9aa8fa667b01 (diff)
Fixed #26494 -- Made Archive.extract() preserve file permissions.
Diffstat (limited to 'django/utils/archive.py')
-rw-r--r--django/utils/archive.py5
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()