Index: third_party/twisted_8_1/twisted/mail/protocols.py |
diff --git a/third_party/twisted_8_1/twisted/mail/protocols.py b/third_party/twisted_8_1/twisted/mail/protocols.py |
deleted file mode 100644 |
index dc449af52799ee90f1d6c5156b91b5992e806757..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/mail/protocols.py |
+++ /dev/null |
@@ -1,225 +0,0 @@ |
-# -*- test-case-name: twisted.mail.test.test_mail -*- |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
-"""Protocol support for twisted.mail.""" |
- |
-# twisted imports |
-from twisted.mail import pop3 |
-from twisted.mail import smtp |
-from twisted.internet import protocol |
-from twisted.internet import defer |
-from twisted.copyright import longversion |
-from twisted.python import log |
- |
-from twisted import cred |
-import twisted.cred.error |
-import twisted.cred.credentials |
- |
-from twisted.mail import relay |
- |
-from zope.interface import implements |
- |
- |
-class DomainDeliveryBase: |
- """A server that uses twisted.mail service's domains.""" |
- |
- implements(smtp.IMessageDelivery) |
- |
- service = None |
- protocolName = None |
- |
- def __init__(self, service, user, host=smtp.DNSNAME): |
- self.service = service |
- self.user = user |
- self.host = host |
- |
- def receivedHeader(self, helo, origin, recipients): |
- authStr = heloStr = "" |
- if self.user: |
- authStr = " auth=%s" % (self.user.encode('xtext'),) |
- if helo[0]: |
- heloStr = " helo=%s" % (helo[0],) |
- from_ = "from %s ([%s]%s%s)" % (helo[0], helo[1], heloStr, authStr) |
- by = "by %s with %s (%s)" % ( |
- self.host, self.protocolName, longversion |
- ) |
- for_ = "for <%s>; %s" % (' '.join(map(str, recipients)), smtp.rfc822date()) |
- return "Received: %s\n\t%s\n\t%s" % (from_, by, for_) |
- |
- def validateTo(self, user): |
- # XXX - Yick. This needs cleaning up. |
- if self.user and self.service.queue: |
- d = self.service.domains.get(user.dest.domain, None) |
- if d is None: |
- d = relay.DomainQueuer(self.service, True) |
- else: |
- d = self.service.domains[user.dest.domain] |
- return defer.maybeDeferred(d.exists, user) |
- |
- def validateFrom(self, helo, origin): |
- if not helo: |
- raise smtp.SMTPBadSender(origin, 503, "Who are you? Say HELO first.") |
- if origin.local != '' and origin.domain == '': |
- raise smtp.SMTPBadSender(origin, 501, "Sender address must contain domain.") |
- return origin |
- |
- def startMessage(self, users): |
- ret = [] |
- for user in users: |
- ret.append(self.service.domains[user.dest.domain].startMessage(user)) |
- return ret |
- |
- |
-class SMTPDomainDelivery(DomainDeliveryBase): |
- protocolName = 'smtp' |
- |
-class ESMTPDomainDelivery(DomainDeliveryBase): |
- protocolName = 'esmtp' |
- |
-class DomainSMTP(SMTPDomainDelivery, smtp.SMTP): |
- service = user = None |
- |
- def __init__(self, *args, **kw): |
- import warnings |
- warnings.warn( |
- "DomainSMTP is deprecated. Use IMessageDelivery objects instead.", |
- DeprecationWarning, stacklevel=2, |
- ) |
- smtp.SMTP.__init__(self, *args, **kw) |
- if self.delivery is None: |
- self.delivery = self |
- |
-class DomainESMTP(ESMTPDomainDelivery, smtp.ESMTP): |
- service = user = None |
- |
- def __init__(self, *args, **kw): |
- import warnings |
- warnings.warn( |
- "DomainESMTP is deprecated. Use IMessageDelivery objects instead.", |
- DeprecationWarning, stacklevel=2, |
- ) |
- smtp.ESMTP.__init__(self, *args, **kw) |
- if self.delivery is None: |
- self.delivery = self |
- |
-class SMTPFactory(smtp.SMTPFactory): |
- """A protocol factory for SMTP.""" |
- |
- protocol = smtp.SMTP |
- portal = None |
- |
- def __init__(self, service, portal = None): |
- smtp.SMTPFactory.__init__(self) |
- self.service = service |
- self.portal = portal |
- |
- def buildProtocol(self, addr): |
- log.msg('Connection from %s' % (addr,)) |
- p = smtp.SMTPFactory.buildProtocol(self, addr) |
- p.service = self.service |
- p.portal = self.portal |
- return p |
- |
-class ESMTPFactory(SMTPFactory): |
- protocol = smtp.ESMTP |
- context = None |
- |
- def __init__(self, *args): |
- SMTPFactory.__init__(self, *args) |
- self.challengers = { |
- 'CRAM-MD5': cred.credentials.CramMD5Credentials |
- } |
- |
- def buildProtocol(self, addr): |
- p = SMTPFactory.buildProtocol(self, addr) |
- p.challengers = self.challengers |
- p.ctx = self.context |
- return p |
- |
-class VirtualPOP3(pop3.POP3): |
- """Virtual hosting POP3.""" |
- |
- service = None |
- |
- domainSpecifier = '@' # Gaagh! I hate POP3. No standardized way |
- # to indicate user@host. '@' doesn't work |
- # with NS, e.g. |
- |
- def authenticateUserAPOP(self, user, digest): |
- # Override the default lookup scheme to allow virtual domains |
- user, domain = self.lookupDomain(user) |
- try: |
- portal = self.service.lookupPortal(domain) |
- except KeyError: |
- return defer.fail(cred.error.UnauthorizedLogin()) |
- else: |
- return portal.login( |
- pop3.APOPCredentials(self.magic, user, digest), |
- None, |
- pop3.IMailbox |
- ) |
- |
- def authenticateUserPASS(self, user, password): |
- user, domain = self.lookupDomain(user) |
- try: |
- portal = self.service.lookupPortal(domain) |
- except KeyError: |
- return defer.fail(cred.error.UnauthorizedLogin()) |
- else: |
- return portal.login( |
- cred.credentials.UsernamePassword(user, password), |
- None, |
- pop3.IMailbox |
- ) |
- |
- def lookupDomain(self, user): |
- try: |
- user, domain = user.split(self.domainSpecifier, 1) |
- except ValueError: |
- domain = '' |
- if domain not in self.service.domains: |
- raise pop3.POP3Error("no such domain %s" % domain) |
- return user, domain |
- |
- |
-class POP3Factory(protocol.ServerFactory): |
- """POP3 protocol factory.""" |
- |
- protocol = VirtualPOP3 |
- service = None |
- |
- def __init__(self, service): |
- self.service = service |
- |
- def buildProtocol(self, addr): |
- p = protocol.ServerFactory.buildProtocol(self, addr) |
- p.service = self.service |
- return p |
- |
-# |
-# It is useful to know, perhaps, that the required file for this to work can |
-# be created thusly: |
-# |
-# openssl req -x509 -newkey rsa:2048 -keyout file.key -out file.crt \ |
-# -days 365 -nodes |
-# |
-# And then cat file.key and file.crt together. The number of days and bits |
-# can be changed, of course. |
-# |
-class SSLContextFactory: |
- """An SSL Context Factory |
- |
- This loads a certificate and private key from a specified file. |
- """ |
- def __init__(self, filename): |
- self.filename = filename |
- |
- def getContext(self): |
- """Create an SSL context.""" |
- from OpenSSL import SSL |
- ctx = SSL.Context(SSL.SSLv23_METHOD) |
- ctx.use_certificate_file(self.filename) |
- ctx.use_privatekey_file(self.filename) |
- return ctx |