[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