diff options
Diffstat (limited to 'Lib/smtpd.py')
| -rwxr-xr-x | Lib/smtpd.py | 21 | 
1 files changed, 11 insertions, 10 deletions
diff --git a/Lib/smtpd.py b/Lib/smtpd.py index 778d6d6280..457cef64e0 100755 --- a/Lib/smtpd.py +++ b/Lib/smtpd.py @@ -121,8 +121,9 @@ class SMTPChannel(asynchat.async_chat):          })      max_command_size_limit = max(command_size_limits.values()) -    def __init__(self, server, conn, addr, data_size_limit=DATA_SIZE_DEFAULT): -        asynchat.async_chat.__init__(self, conn) +    def __init__(self, server, conn, addr, data_size_limit=DATA_SIZE_DEFAULT, +                 map=None): +        asynchat.async_chat.__init__(self, conn, map=map)          self.smtp_server = server          self.conn = conn          self.addr = addr @@ -137,7 +138,7 @@ class SMTPChannel(asynchat.async_chat):          self.num_bytes = 0          try:              self.peer = conn.getpeername() -        except socket.error as err: +        except OSError as err:              # a race condition  may occur if the other end is closing              # before we can get the peername              self.close() @@ -576,11 +577,11 @@ class SMTPServer(asyncore.dispatcher):      channel_class = SMTPChannel      def __init__(self, localaddr, remoteaddr, -                 data_size_limit=DATA_SIZE_DEFAULT): +                 data_size_limit=DATA_SIZE_DEFAULT, map=None):          self._localaddr = localaddr          self._remoteaddr = remoteaddr          self.data_size_limit = data_size_limit -        asyncore.dispatcher.__init__(self) +        asyncore.dispatcher.__init__(self, map=map)          try:              self.create_socket(socket.AF_INET, socket.SOCK_STREAM)              # try to re-use a server port if possible @@ -597,7 +598,8 @@ class SMTPServer(asyncore.dispatcher):      def handle_accepted(self, conn, addr):          print('Incoming connection from %s' % repr(addr), file=DEBUGSTREAM) -        channel = self.channel_class(self, conn, addr, self.data_size_limit) +        channel = self.channel_class(self, conn, addr, self.data_size_limit, +                                     self._map)      # API for "doing something useful with the message"      def process_message(self, peer, mailfrom, rcpttos, data): @@ -668,7 +670,7 @@ class PureProxy(SMTPServer):          except smtplib.SMTPRecipientsRefused as e:              print('got SMTPRecipientsRefused', file=DEBUGSTREAM)              refused = e.recipients -        except (socket.error, smtplib.SMTPException) as e: +        except (OSError, smtplib.SMTPException) as e:              print('got', e.__class__, file=DEBUGSTREAM)              # All recipients were refused.  If the exception had an associated              # error code, use it.  Otherwise,fake it with a non-triggering @@ -844,14 +846,13 @@ if __name__ == '__main__':      if options.setuid:          try:              import pwd -        except ImportError: +        except ModuleNotFoundError:              print('Cannot import module "pwd"; try running with -n option.', file=sys.stderr)              sys.exit(1)          nobody = pwd.getpwnam('nobody')[2]          try:              os.setuid(nobody) -        except OSError as e: -            if e.errno != errno.EPERM: raise +        except PermissionError:              print('Cannot setuid "nobody"; try running with -n option.', file=sys.stderr)              sys.exit(1)      try:  | 
