Index: Lib/zipfile.py =================================================================== --- Lib/zipfile.py (revision 65056) +++ Lib/zipfile.py (working copy) @@ -2,7 +2,7 @@ Read and write ZIP files. """ import struct, os, time, sys, shutil -import binascii, cStringIO +import binascii, cStringIO, stat try: import zlib # We may need its compression method @@ -1064,6 +1064,8 @@ zinfo = ZipInfo(filename=zinfo_or_arcname, date_time=time.localtime(time.time())[:6]) zinfo.compress_type = self.compression + # zinfo.external_attr = 0600 << 16 + zinfo.external_attr = (stat.S_IRUSR | stat.S_IWUSR) << 16 else: zinfo = zinfo_or_arcname Index: Lib/test/test_zipfile.py =================================================================== --- Lib/test/test_zipfile.py (revision 65056) +++ Lib/test/test_zipfile.py (working copy) @@ -372,6 +372,20 @@ # remove the test file subdirectories shutil.rmtree(os.path.join(os.getcwd(), 'ziptest2dir')) + def zip_test_writestr_permissions(self, f, compression): + # Make sure that writestr creates files with mode 0600, + # when it is passed a name rather than a ZipInfo instance. + + self.makeTestArchive(f, compression) + zipfp = zipfile.ZipFile(f, "r") + zinfo = zipfp.getinfo('strfile') + self.assertEqual(zinfo.external_attr, 0600 << 16) + + def test_writestr_permissions(self): + for f in (TESTFN2, TemporaryFile(), StringIO()): + self.zip_test_writestr_permissions(f, zipfile.ZIP_STORED) + + def tearDown(self): os.remove(TESTFN) os.remove(TESTFN2)