]> granicus.if.org Git - python/commitdiff
#5346: Preserve permissions of mbox, MMDF and Babyl mailbox files on flush()
authorPetri Lehtinen <petri@digip.org>
Fri, 29 Jun 2012 12:09:12 +0000 (15:09 +0300)
committerPetri Lehtinen <petri@digip.org>
Fri, 29 Jun 2012 12:09:16 +0000 (15:09 +0300)
Lib/mailbox.py
Lib/test/test_mailbox.py
Misc/NEWS

index fc154fa12aac998908d7ccd9311bb9761541b7b7..61683674ff7ab95e3d9febae9f6dfbddb165a6be 100644 (file)
@@ -665,6 +665,9 @@ class _singlefileMailbox(Mailbox):
         _sync_close(new_file)
         # self._file is about to get replaced, so no need to sync.
         self._file.close()
+        # Make sure the new file's mode is the same as the old file's
+        mode = os.stat(self._path).st_mode
+        os.chmod(new_file.name, mode)
         try:
             os.rename(new_file.name, self._path)
         except OSError, e:
index a8c692b98177bd256f480204b39bb15c24e9b20e..d479bf85f1ca9795430bdd33815fafd8510c3677 100644 (file)
@@ -848,6 +848,23 @@ class _TestSingleFile(TestMailbox):
         self._box = self._factory(self._path)
         self.assertEqual(len(self._box), 1)
 
+    def test_permissions_after_flush(self):
+        # See issue #5346
+
+        # Make the mailbox world writable. It's unlikely that the new
+        # mailbox file would have these permissions after flush(),
+        # because umask usually prevents it.
+        mode = os.stat(self._path).st_mode | 0o666
+        os.chmod(self._path, mode)
+
+        self._box.add(self._template % 0)
+        i = self._box.add(self._template % 1)
+        # Need to remove one message to make flush() create a new file
+        self._box.remove(i)
+        self._box.flush()
+
+        self.assertEqual(os.stat(self._path).st_mode, mode)
+
 
 class _TestMboxMMDF(_TestSingleFile):
 
index 09ea7e3b9db1b424d45937d009666838b0d38a84..9839903dfd5c0612345b607b53e649aa3d520844 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -75,6 +75,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #5346: Preserve permissions of mbox, MMDF and Babyl mailbox
+  files on flush().
+
 - Issue #15219: Fix a reference leak when hashlib.new() is called with
   invalid parameters.