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() _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org https://mail.zope.org/mailman/listinfo/zope-checkins