[tor-commits] [bridgedb/develop] Refactor b.e.server.MailFactory.

isis at torproject.org isis at torproject.org
Fri Jun 6 20:40:38 UTC 2014


commit 3ae9de3621fb2cc158482dcf0c3d5a4d37073a86
Author: Isis Lovecruft <isis at torproject.org>
Date:   Mon Jun 2 21:05:29 2014 +0000

    Refactor b.e.server.MailFactory.
    
     * CHANGE b.e.server.MailFactory into two separate classes,
       b.e.server.SMTPIncomingDeliveryFactory and
       b.e.server.SMTPIncomingServerFactory. This will enable us to be able
       to keep state for multiple emails coming in over a single connection,
       if necessary.
     * CHANGE b.e.server.addServer to use the new classes.
---
 lib/bridgedb/email/server.py |   81 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 67 insertions(+), 14 deletions(-)

diff --git a/lib/bridgedb/email/server.py b/lib/bridgedb/email/server.py
index e575eab..6bc7300 100644
--- a/lib/bridgedb/email/server.py
+++ b/lib/bridgedb/email/server.py
@@ -333,23 +333,75 @@ class SMTPIncomingDelivery(smtp.SMTP):
         return lambda: SMTPMessage(self.context, self.fromCanonicalSMTP)
 
 
-class MailFactory(smtp.SMTPFactory):
-    """Plugs into Twisted Mail; creates a new MailDelivery whenever we get
-       a connection on the SMTP port."""
+class SMTPIncomingDeliveryFactory(object):
+    """Factory for :class:`SMTPIncomingDelivery`s.
+
+    This class is used to distinguish between different messages delivered
+    over the same connection. This can be used to optimize delivery of a
+    single message to multiple recipients, something which cannot be done by
+    :api:`IMessageDelivery <twisted.mail.smtp.IMessageDelivery>` implementors
+    due to their lack of information.
+
+    :ivar context: A :class:`MailServerContext` for storing configuration settings.
+    :ivar delivery: A :class:`SMTPIncomingDelivery` to deliver incoming
+        SMTP messages to.
+    """
+    implements(smtp.IMessageDeliveryFactory)
+
+    context = None
+    delivery = SMTPIncomingDelivery
 
-    def __init__(self, context=None, **kw):
-        smtp.SMTPFactory.__init__(self, **kw)
-        self.delivery = MailDelivery()
-        if context:
-            self.setBridgeDBContext(context)
+    def __init__(self):
+        logging.debug("%s created." % self.__class__.__name__)
 
-    def setBridgeDBContext(self, context):
-        self.context = context
-        self.delivery.setBridgeDBContext(context)
+    @classmethod
+    def setContext(cls, context):
+        """Set our :ivar:`context` and the context for our :ivar:`delivery`."""
+        cls.context = context
+        cls.delivery.setContext(cls.context)
+
+    def getMessageDelivery(self):
+        """Get a new :class:`SMTPIncomingDelivery` instance."""
+        return self.delivery()
+
+
+class SMTPIncomingServerFactory(smtp.SMTPFactory):
+    """Plugs into :api:`twisted.mail.smtp.SMTPFactory`; creates a new
+    :class:`SMTPMessageDelivery`, which handles response email automation,
+    whenever we get a incoming connection on the SMTP port.
+
+    .. warning:: My :ivar:`context` isn't an OpenSSL context, as is used for
+        the :api:`twisted.mail.smtp.ESMTPSender`
+
+    :ivar context: A :class:`MailServerContext` for storing configuration settings.
+    :ivar deliveryFactory: A :class:`SMTPIncomingDeliveryFactory` for
+        producing :class:`SMTPIncomingDelivery`s.
+    :ivar domain: :api:`Our FQDN <twisted.mail.smtp.DNSNAME>`.
+    :ivar int timeout: The number of seconds to wait, after the last chunk of
+        data was received, before raising a
+        :api:`SMTPTimeoutError <twisted.mail.smtp.SMTPTimeoutError>` for an
+        incoming connection.
+    :ivar protocol: :api:`SMTP <twisted.mail.smtp.SMTP>`
+    """
+
+    context = None
+    deliveryFactory = SMTPIncomingDeliveryFactory
+
+    def __init__(self, **kwargs):
+        smtp.SMTPFactory.__init__(self, **kwargs)
+        self.deliveryFactory = self.deliveryFactory()
+
+    @classmethod
+    def setContext(cls, context):
+        """Set :ivar:`context` and :ivar:`deliveryFactory`.context."""
+        cls.context = context
+        cls.deliveryFactory.setContext(cls.context)
 
     def buildProtocol(self, addr):
         p = smtp.SMTPFactory.buildProtocol(self, addr)
-        p.delivery = self.delivery
+        self.deliveryFactory.transport = p.transport # XXX is this set yet?
+        p.factory = self
+        p.deliveryFactory = self.deliveryFactory
         return p
 
 
@@ -364,8 +416,9 @@ def addServer(config, distributor, schedule):
     :type schedule: :class:`bridgedb.schedule.ScheduledInterval`
     :param schedule: The schedule. XXX: Is this even used?
     """
-    context = MailContext(config, distributor, schedule)
-    factory = MailFactory(context)
+    context = MailServerContext(config, distributor, schedule)
+    factory = SMTPIncomingServerFactory()
+    factory.setContext(context)
 
     addr = config.EMAIL_BIND_IP or ""
     port = config.EMAIL_PORT





More information about the tor-commits mailing list