[Zope-Checkins] SVN: Zope/branches/2.11/ Ensure that mailhosts sharing a queue do not double-deliver mails

Tres Seaver tseaver at palladion.com
Mon May 3 12:08:16 EDT 2010


Log message for revision 111898:
  Ensure that mailhosts sharing a queue do not double-deliver mails
  
  Arrange this by sharing the thread which processes emails for
  that directory.
  
  See:  https://bugs.launchpad.net/zope2/+bug/574286
  
  

Changed:
  U   Zope/branches/2.11/doc/CHANGES.txt
  U   Zope/branches/2.11/lib/python/Products/MailHost/MailHost.py
  U   Zope/branches/2.11/lib/python/Products/MailHost/tests/testMailHost.py

-=-
Modified: Zope/branches/2.11/doc/CHANGES.txt
===================================================================
--- Zope/branches/2.11/doc/CHANGES.txt	2010-05-03 15:00:45 UTC (rev 111897)
+++ Zope/branches/2.11/doc/CHANGES.txt	2010-05-03 16:08:15 UTC (rev 111898)
@@ -8,6 +8,10 @@
 
     Bugs Fixed
 
+      - Ensure that mailhosts which share a queue directory do not double-
+        deliver mails, by sharing the thread which processes emails for
+        that directory.  https://bugs.launchpad.net/zope2/+bug/574286
+
       - Process "evil" JSON cookies which contain double quotes in violation
         of RFC 2965 / 2616.  https://bugs.launchpad.net/zope2/+bug/563229
 

Modified: Zope/branches/2.11/lib/python/Products/MailHost/MailHost.py
===================================================================
--- Zope/branches/2.11/lib/python/Products/MailHost/MailHost.py	2010-05-03 15:00:45 UTC (rev 111897)
+++ Zope/branches/2.11/lib/python/Products/MailHost/MailHost.py	2010-05-03 16:08:15 UTC (rev 111898)
@@ -15,6 +15,7 @@
 $Id$
 """
 
+from os.path import realpath
 import mimetools
 import rfc822
 import time
@@ -202,32 +203,37 @@
                           force_tls=self.force_tls
                           )
 
+    security.declarePrivate('_getThreadKey')
+    def _getThreadKey(self):
+        """ Return the key used to find our processor thread.
+        """
+        return realpath(self.smtp_queue_directory)
+
     @synchronized(lock)
     def _stopQueueProcessorThread(self):
         """ Stop thread for processing the mail queue """
-
-        path = self.absolute_url(1)
-        if queue_threads.has_key(path):
-            thread = queue_threads[path]
+        key = self._getThreadKey()
+        if queue_threads.has_key(key):
+            thread = queue_threads[key]
             thread.stop()
             while thread.isAlive():
                 # wait until thread is really dead
                 time.sleep(0.3)
             del queue_threads[path]
-            LOG.info('Thread for %s stopped' % path)
+            LOG.info('Thread for %s stopped' % key)
 
     @synchronized(lock)
     def _startQueueProcessorThread(self):
-        """ Start thread for processing the mail queue """
-
-        path = self.absolute_url(1)
-        if not queue_threads.has_key(path):
+        """ Start thread for processing the mail queue
+        """
+        key = self._getThreadKey()
+        if not queue_threads.has_key(key):
             thread = QueueProcessorThread()
             thread.setMailer(self._makeMailer())
             thread.setQueuePath(self.smtp_queue_directory)
             thread.start()
-            queue_threads[path] = thread     
-            LOG.info('Thread for %s started' % path)
+            queue_threads[key] = thread     
+            LOG.info('Thread for %s started' % key)
 
     security.declareProtected(view, 'queueLength')
     def queueLength(self):
@@ -243,9 +249,9 @@
 
     security.declareProtected(view, 'queueThreadAlive')
     def queueThreadAlive(self):
-        """ return True/False is queue thread is working """
-
-        th = queue_threads.get(self.absolute_url(1))
+        """ return True/False is queue thread is working
+        """
+        th = queue_threads.get(self._getThreadKey())
         if th:
             return th.isAlive()
         return False

Modified: Zope/branches/2.11/lib/python/Products/MailHost/tests/testMailHost.py
===================================================================
--- Zope/branches/2.11/lib/python/Products/MailHost/tests/testMailHost.py	2010-05-03 15:00:45 UTC (rev 111897)
+++ Zope/branches/2.11/lib/python/Products/MailHost/tests/testMailHost.py	2010-05-03 16:08:15 UTC (rev 111898)
@@ -208,6 +208,14 @@
         self.assertEqual(mailhost.sent, outmsg)
         self.assertEqual(mailhost.immediate, True)
 
+    def test__getThreadKey_uses_fspath(self):
+        mh1 = self._makeOne('mh1')
+        mh1.smtp_queue_directory = '/abc'
+        mh1.absolute_url = lambda self: 'http://example.com/mh1'
+        mh2 = self._makeOne('mh2')
+        mh2.smtp_queue_directory = '/abc'
+        mh2.absolute_url = lambda self: 'http://example.com/mh2'
+        self.assertEqual(mh1._getThreadKey(), mh2._getThreadKey())
 
 def test_suite():
     suite = unittest.TestSuite()



More information about the Zope-Checkins mailing list