]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #6598: Increased time precision and random number range in
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 19 May 2015 07:09:27 +0000 (10:09 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Tue, 19 May 2015 07:09:27 +0000 (10:09 +0300)
email.utils.make_msgid() to strengthen the uniqueness of the message ID.

Lib/email/test/test_email.py
Lib/email/utils.py
Misc/NEWS

index c11e84b7513859660f48571ca8198a02e66e4905..513b3e5eb7d01617c98137ca7cb1a1ea4bdabd28 100644 (file)
@@ -12,6 +12,10 @@ import warnings
 import textwrap
 from cStringIO import StringIO
 from random import choice
+try:
+    from threading import Thread
+except ImportError:
+    from dummy_threading import Thread
 
 import email
 
@@ -33,7 +37,7 @@ from email import Iterators
 from email import base64MIME
 from email import quopriMIME
 
-from test.test_support import findfile, run_unittest
+from test.test_support import findfile, run_unittest, start_threads
 from email.test import __file__ as landmark
 
 
@@ -2412,6 +2416,25 @@ Foo
         addrs = Utils.getaddresses(['User ((nested comment)) <foo@bar.com>'])
         eq(addrs[0][1], 'foo@bar.com')
 
+    def test_make_msgid_collisions(self):
+        # Test make_msgid uniqueness, even with multiple threads
+        class MsgidsThread(Thread):
+            def run(self):
+                # generate msgids for 3 seconds
+                self.msgids = []
+                append = self.msgids.append
+                make_msgid = Utils.make_msgid
+                clock = time.clock
+                tfin = clock() + 3.0
+                while clock() < tfin:
+                    append(make_msgid())
+
+        threads = [MsgidsThread() for i in range(5)]
+        with start_threads(threads):
+            pass
+        all_ids = sum([t.msgids for t in threads], [])
+        self.assertEqual(len(set(all_ids)), len(all_ids))
+
     def test_utils_quote_unquote(self):
         eq = self.assertEqual
         msg = Message()
index c976021e0e0584c6ee56d5aa32b0034c531349c5..ac13f49d599df9b63c7ca5a205eea5491b14d7cb 100644 (file)
@@ -177,21 +177,20 @@ def formatdate(timeval=None, localtime=False, usegmt=False):
 def make_msgid(idstring=None):
     """Returns a string suitable for RFC 2822 compliant Message-ID, e.g:
 
-    <20020201195627.33539.96671@nightshade.la.mastaler.com>
+    <142480216486.20800.16526388040877946887@nightshade.la.mastaler.com>
 
     Optional idstring if given is a string used to strengthen the
     uniqueness of the message id.
     """
-    timeval = time.time()
-    utcdate = time.strftime('%Y%m%d%H%M%S', time.gmtime(timeval))
+    timeval = int(time.time()*100)
     pid = os.getpid()
-    randint = random.randrange(100000)
+    randint = random.getrandbits(64)
     if idstring is None:
         idstring = ''
     else:
         idstring = '.' + idstring
     idhost = socket.getfqdn()
-    msgid = '<%s.%s.%s%s@%s>' % (utcdate, pid, randint, idstring, idhost)
+    msgid = '<%d.%d.%d%s@%s>' % (timeval, pid, randint, idstring, idhost)
     return msgid
 
 
index a666032ded4d76976b535cbf608884ef0fc3fdff..4567a44b9f362d04b03322f19475eaa033fce817 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,6 +15,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #6598: Increased time precision and random number range in
+  email.utils.make_msgid() to strengthen the uniqueness of the message ID.
+
 - Issue #24091: Fixed various crashes in corner cases in cElementTree.
 
 - Issue #15267: HTTPConnection.request() now is compatibile with old-style