From ac650c4aee915a93a6a4198cc59dc1188b300432 Mon Sep 17 00:00:00 2001 From: jxy_git Date: Mon, 20 Mar 2023 17:11:16 +0800 Subject: [PATCH] Update package to version 1.4.4 --- ...-Implement-Unthreaded-Controller-256.patch | 2019 ------------ 0002-Code-Hygiene-259.patch | 2735 ----------------- 0003-URGENT-Fix-RTD-docs-gen.patch | 24 - 0004-Make-Sphinx-RTD-deps-SSOT.patch | 120 - 1.4.2.tar.gz | Bin 139929 -> 0 bytes 284.patch | 46 - aiosmtpd-1.4.4.tar.gz | Bin 0 -> 151390 bytes python-aiosmtpd.spec | 20 +- 8 files changed, 8 insertions(+), 4956 deletions(-) delete mode 100644 0001-Implement-Unthreaded-Controller-256.patch delete mode 100644 0002-Code-Hygiene-259.patch delete mode 100644 0003-URGENT-Fix-RTD-docs-gen.patch delete mode 100644 0004-Make-Sphinx-RTD-deps-SSOT.patch delete mode 100644 1.4.2.tar.gz delete mode 100644 284.patch create mode 100644 aiosmtpd-1.4.4.tar.gz diff --git a/0001-Implement-Unthreaded-Controller-256.patch b/0001-Implement-Unthreaded-Controller-256.patch deleted file mode 100644 index 78d3628..0000000 --- a/0001-Implement-Unthreaded-Controller-256.patch +++ /dev/null @@ -1,2019 +0,0 @@ -From 747a7c467d45354d8d1ea72bc9d2fce15e186479 Mon Sep 17 00:00:00 2001 -From: Pandu E POLUAN -Date: Tue, 9 Mar 2021 00:25:48 +0700 -Subject: [PATCH 1/4] Implement Unthreaded Controller (#256) - -* Complete rewrite of aiosmtpd.controller -* Implement Unthreaded Controllers -* Implement tests of Unthreaded Controllers -* Improve other tests -* Improve coverage by replacing nocover's with conditional pragmas -* Suppress exception ignored during __del__ -* Blackification -* Update badges -* Tidy up table + link to Public PGP on GH -* Bump version to 1.5.0a1 and update NEWS.rst ---- - DESCRIPTION.rst | 45 ++- - README.rst | 24 +- - aiosmtpd/__init__.py | 2 +- - aiosmtpd/controller.py | 296 ++++++++++++---- - aiosmtpd/docs/NEWS.rst | 12 + - aiosmtpd/docs/controller.rst | 642 +++++++++++++++++++++++----------- - aiosmtpd/docs/smtp.rst | 10 +- - aiosmtpd/handlers.py | 11 +- - aiosmtpd/proxy_protocol.py | 2 +- - aiosmtpd/tests/conftest.py | 15 + - aiosmtpd/tests/test_main.py | 27 +- - aiosmtpd/tests/test_server.py | 248 ++++++++++--- - pyproject.toml | 6 +- - 13 files changed, 958 insertions(+), 382 deletions(-) - -diff --git a/DESCRIPTION.rst b/DESCRIPTION.rst -index 9ec007b..caa9e7a 100644 ---- a/DESCRIPTION.rst -+++ b/DESCRIPTION.rst -@@ -2,16 +2,22 @@ - aiosmtpd - asyncio based SMTP server - ###################################### - --| |github license| |_| |PyPI Version| |PyPI Python| --| |GA badge| |codecov| |_| |LGTM.com| |readthedocs| |_| --| |GH Release| |_| |PullRequests| |_| |LastCommit| -+| |github license| |_| |PyPI Version| |_| |PyPI Python| -+| |GA badge| |_| |codecov| |_| |LGTM.com| |_| |readthedocs| -+| |GH Release| |_| |GH PRs| |_| |GH LastCommit| - | - - .. |_| unicode:: 0xA0 - :trim: --.. |github license| image:: https://img.shields.io/github/license/aio-libs/aiosmtpd -+.. |github license| image:: https://img.shields.io/github/license/aio-libs/aiosmtpd?logo=Open+Source+Initiative&logoColor=0F0 - :target: https://github.com/aio-libs/aiosmtpd/blob/master/LICENSE - :alt: Project License on GitHub -+.. |PyPI Version| image:: https://img.shields.io/pypi/v/aiosmtpd?logo=pypi&logoColor=yellow -+ :target: https://pypi.org/project/aiosmtpd/ -+ :alt: PyPI Package -+.. |PyPI Python| image:: https://img.shields.io/pypi/pyversions/aiosmtpd?logo=python&logoColor=yellow -+ :target: https://pypi.org/project/aiosmtpd/ -+ :alt: Supported Python Versions - .. .. For |GA badge|, don't forget to check actual workflow name in unit-testing-and-coverage.yml - .. |GA badge| image:: https://github.com/aio-libs/aiosmtpd/workflows/aiosmtpd%20CI/badge.svg - :target: https://github.com/aio-libs/aiosmtpd/actions -@@ -25,21 +31,15 @@ - .. |readthedocs| image:: https://img.shields.io/readthedocs/aiosmtpd?logo=Read+the+Docs - :target: https://aiosmtpd.readthedocs.io/en/latest/?badge=latest - :alt: Documentation Status --.. |PyPI Version| image:: https://badge.fury.io/py/aiosmtpd.svg -- :target: https://badge.fury.io/py/aiosmtpd -- :alt: PyPI Package --.. |PyPI Python| image:: https://img.shields.io/pypi/pyversions/aiosmtpd.svg -- :target: https://pypi.org/project/aiosmtpd/ -- :alt: Supported Python Versions - .. .. Do NOT include the Discourse badge! - .. .. Below are badges just for PyPI - .. |GH Release| image:: https://img.shields.io/github/v/release/aio-libs/aiosmtpd?logo=github - :target: https://github.com/aio-libs/aiosmtpd/releases - :alt: GitHub latest release --.. |PullRequests| image:: https://img.shields.io/github/issues-pr/aio-libs/aiosmtpd?logo=GitHub -+.. |GH PRs| image:: https://img.shields.io/github/issues-pr/aio-libs/aiosmtpd?logo=GitHub - :target: https://github.com/aio-libs/aiosmtpd/pulls - :alt: GitHub pull requests --.. |LastCommit| image:: https://img.shields.io/github/last-commit/aio-libs/aiosmtpd?logo=GitHub -+.. |GH LastCommit| image:: https://img.shields.io/github/last-commit/aio-libs/aiosmtpd?logo=GitHub - :target: https://github.com/aio-libs/aiosmtpd/commits/master - :alt: GitHub last commit - -@@ -61,10 +61,19 @@ Starting version 1.3.1, - files provided through PyPI or `GitHub Releases`_ - will be signed using one of the following GPG Keys: - --+-------------------------+----------------+------------------------------+ --| GPG Key ID | Owner | Email | --+=========================+================+==============================+ --| ``5D60 CE28 9CD7 C258`` | Pandu E POLUAN | pepoluan at gmail period com | --+-------------------------+----------------+------------------------------+ -- - .. _`GitHub Releases`: https://github.com/aio-libs/aiosmtpd/releases -+ -+.. .. In the second column of the table, prefix each line with "| " -+ .. In the third column, refrain from putting in a direct link to keep the table tidy. -+ Rather, use the |...|_ construct and do the replacement+linking directive below the table -+ -++-------------------------+--------------------------------+-----------+ -+| GPG Key ID | Owner / Email | Key | -++=========================+================================+===========+ -+| ``5D60 CE28 9CD7 C258`` | | Pandu POLUAN / | |pep_gh|_ | -+| | | pepoluan at gmail period com | | -++-------------------------+--------------------------------+-----------+ -+ -+.. .. The |_| contruct is U+00A0 (non-breaking space), defined at the start of the file -+.. |pep_gh| replace:: On |_| GitHub -+.. _`pep_gh`: https://github.com/pepoluan.gpg -diff --git a/README.rst b/README.rst -index 35dcb88..2c1bab7 100644 ---- a/README.rst -+++ b/README.rst -@@ -2,14 +2,22 @@ - aiosmtpd - An asyncio based SMTP server - ========================================= - --| |github license| |PyPI| |PyPI Python| --| |GA badge| |codecov| |LGTM.com| |readthedocs| -+| |github license| |_| |PyPI Version| |_| |PyPI Python| -+| |GA badge| |_| |codecov| |_| |LGTM.com| |_| |readthedocs| - | - | |Discourse| - --.. |github license| image:: https://img.shields.io/github/license/aio-libs/aiosmtpd -+.. |_| unicode:: 0xA0 -+ :trim: -+.. |github license| image:: https://img.shields.io/github/license/aio-libs/aiosmtpd?logo=Open+Source+Initiative&logoColor=0F0 - :target: https://github.com/aio-libs/aiosmtpd/blob/master/LICENSE - :alt: Project License on GitHub -+.. |PyPI Version| image:: https://img.shields.io/pypi/v/aiosmtpd?logo=pypi&logoColor=yellow -+ :target: https://pypi.org/project/aiosmtpd/ -+ :alt: PyPI Package -+.. |PyPI Python| image:: https://img.shields.io/pypi/pyversions/aiosmtpd?logo=python&logoColor=yellow -+ :target: https://pypi.org/project/aiosmtpd/ -+ :alt: Supported Python Versions - .. .. For |GA badge|, don't forget to check actual workflow name in unit-testing-and-coverage.yml - .. |GA badge| image:: https://github.com/aio-libs/aiosmtpd/workflows/aiosmtpd%20CI/badge.svg - :target: https://github.com/aio-libs/aiosmtpd/actions -@@ -20,15 +28,9 @@ - .. |LGTM.com| image:: https://img.shields.io/lgtm/grade/python/github/aio-libs/aiosmtpd.svg?logo=lgtm&logoWidth=18 - :target: https://lgtm.com/projects/g/aio-libs/aiosmtpd/context:python - :alt: Semmle/LGTM.com quality --.. |readthedocs| image:: https://readthedocs.org/projects/aiosmtpd/badge/?version=latest -- :target: https://aiosmtpd.readthedocs.io/en/latest/?badge=latest -+.. |readthedocs| image:: https://img.shields.io/readthedocs/aiosmtpd?logo=Read+the+Docs&logoColor=white -+ :target: https://aiosmtpd.readthedocs.io/en/latest/ - :alt: Documentation Status --.. |PyPI| image:: https://badge.fury.io/py/aiosmtpd.svg -- :target: https://badge.fury.io/py/aiosmtpd -- :alt: PyPI Package --.. |PyPI Python| image:: https://img.shields.io/pypi/pyversions/aiosmtpd.svg -- :target: https://pypi.org/project/aiosmtpd/ -- :alt: Supported Python Versions - .. .. If you edit the above badges, don't forget to edit setup.cfg - .. .. The |Discourse| badge MUST NOT be included in setup.cfg - .. |Discourse| image:: https://img.shields.io/discourse/status?server=https%3A%2F%2Faio-libs.discourse.group%2F&style=social -diff --git a/aiosmtpd/__init__.py b/aiosmtpd/__init__.py -index 7d459d8..9c7b938 100644 ---- a/aiosmtpd/__init__.py -+++ b/aiosmtpd/__init__.py -@@ -1,4 +1,4 @@ - # Copyright 2014-2021 The aiosmtpd Developers - # SPDX-License-Identifier: Apache-2.0 - --__version__ = "1.4.2" -+__version__ = "1.5.0a1" -diff --git a/aiosmtpd/controller.py b/aiosmtpd/controller.py -index 2258c54..d3345b8 100644 ---- a/aiosmtpd/controller.py -+++ b/aiosmtpd/controller.py -@@ -5,6 +5,7 @@ import asyncio - import errno - import os - import ssl -+import sys - import threading - import time - from abc import ABCMeta, abstractmethod -@@ -19,6 +20,11 @@ try: - except ImportError: # pragma: on-not-win32 - AF_UNIX = None - from typing import Any, Coroutine, Dict, Optional, Union -+ -+if sys.version_info >= (3, 8): -+ from typing import Literal # pragma: py-lt-38 -+else: # pragma: py-ge-38 -+ from typing_extensions import Literal - from warnings import warn - - from public import public -@@ -38,13 +44,14 @@ class IP6_IS: - YES = {errno.EADDRINUSE} - - --def _has_ipv6(): -+def _has_ipv6() -> bool: - # Helper function to assist in mocking - return has_ipv6 - - - @public --def get_localhost() -> str: -+def get_localhost() -> Literal["::1", "127.0.0.1"]: -+ """Returns numeric address to localhost depending on IPv6 availability""" - # Ref: - # - https://github.com/urllib3/urllib3/pull/611#issuecomment-100954017 - # - https://github.com/python/cpython/blob/ : -@@ -91,24 +98,17 @@ class _FakeServer(asyncio.StreamReaderProtocol): - - - @public --class BaseThreadedController(metaclass=ABCMeta): -- """ -- `Documentation can be found here -- `_. -- """ -+class BaseController(metaclass=ABCMeta): -+ smtpd = None - server: Optional[AsyncServer] = None - server_coro: Optional[Coroutine] = None -- smtpd = None -- _factory_invoked: Optional[threading.Event] = None -- _thread: Optional[threading.Thread] = None -- _thread_exception: Optional[Exception] = None -+ _factory_invoked: threading.Event = None - - def __init__( - self, -- handler, -- loop=None, -+ handler: Any, -+ loop: asyncio.AbstractEventLoop = None, - *, -- ready_timeout: float, - ssl_context: Optional[ssl.SSLContext] = None, - # SMTP parameters - server_hostname: Optional[str] = None, -@@ -119,9 +119,6 @@ class BaseThreadedController(metaclass=ABCMeta): - self.loop = asyncio.new_event_loop() - else: - self.loop = loop -- self.ready_timeout = float( -- os.getenv("AIOSMTPD_CONTROLLER_TIMEOUT", ready_timeout) -- ) - self.ssl_context = ssl_context - self.SMTP_kwargs: Dict[str, Any] = {} - if "server_kwargs" in SMTP_parameters: -@@ -139,9 +136,11 @@ class BaseThreadedController(metaclass=ABCMeta): - # It actually conflicts with SMTP class's default, but the reasoning is - # discussed in the docs. - self.SMTP_kwargs.setdefault("enable_SMTPUTF8", True) -+ # -+ self._factory_invoked = threading.Event() - - def factory(self): -- """Allow subclasses to customize the handler/server creation.""" -+ """Subclasses can override this to customize the handler/server creation.""" - return SMTP(self.handler, **self.SMTP_kwargs) - - def _factory_invoker(self): -@@ -159,13 +158,72 @@ class BaseThreadedController(metaclass=ABCMeta): - - @abstractmethod - def _create_server(self) -> Coroutine: -- raise NotImplementedError # pragma: nocover -+ """ -+ Overridden by subclasses to actually perform the async binding to the -+ listener endpoint. When overridden, MUST refer the _factory_invoker() method. -+ """ -+ raise NotImplementedError -+ -+ def _cleanup(self): -+ """Reset internal variables to prevent contamination""" -+ self._thread_exception = None -+ self._factory_invoked.clear() -+ self.server_coro = None -+ self.server = None -+ self.smtpd = None -+ -+ def cancel_tasks(self, stop_loop: bool = True): -+ """ -+ Convenience method to stop the loop and cancel all tasks. -+ Use loop.call_soon_threadsafe() to invoke this. -+ """ -+ if stop_loop: # pragma: nobranch -+ self.loop.stop() -+ try: -+ _all_tasks = asyncio.all_tasks # pytype: disable=module-attr -+ except AttributeError: # pragma: py-gt-36 -+ _all_tasks = asyncio.Task.all_tasks -+ for task in _all_tasks(self.loop): -+ # This needs to be invoked in a thread-safe way -+ task.cancel() -+ -+ -+@public -+class BaseThreadedController(BaseController, metaclass=ABCMeta): -+ _thread: Optional[threading.Thread] = None -+ _thread_exception: Optional[Exception] = None -+ -+ def __init__( -+ self, -+ handler: Any, -+ loop: asyncio.AbstractEventLoop = None, -+ *, -+ ready_timeout: float = DEFAULT_READY_TIMEOUT, -+ ssl_context: Optional[ssl.SSLContext] = None, -+ # SMTP parameters -+ server_hostname: Optional[str] = None, -+ **SMTP_parameters, -+ ): -+ super().__init__( -+ handler, -+ loop, -+ ssl_context=ssl_context, -+ server_hostname=server_hostname, -+ **SMTP_parameters, -+ ) -+ self.ready_timeout = float( -+ os.getenv("AIOSMTPD_CONTROLLER_TIMEOUT", ready_timeout) -+ ) - - @abstractmethod - def _trigger_server(self): -- raise NotImplementedError # pragma: nocover -+ """ -+ Overridden by subclasses to trigger asyncio to actually initialize the SMTP -+ class (it's lazy initialization, done only on initial connection). -+ """ -+ raise NotImplementedError - -- def _run(self, ready_event): -+ def _run(self, ready_event: threading.Event): - asyncio.set_event_loop(self.loop) - try: - # Need to do two-step assignments here to ensure IDEs can properly -@@ -187,14 +245,19 @@ class BaseThreadedController(metaclass=ABCMeta): - return - self.loop.call_soon(ready_event.set) - self.loop.run_forever() -+ # We reach this point when loop is ended (by external code) -+ # Perform some stoppages to ensure endpoint no longer bound. - self.server.close() - self.loop.run_until_complete(self.server.wait_closed()) - self.loop.close() - self.server = None - - def start(self): -+ """ -+ Start a thread and run the asyncio event loop in that thread -+ """ - assert self._thread is None, "SMTP daemon already running" -- self._factory_invoked = threading.Event() -+ self._factory_invoked.clear() - - ready_event = threading.Event() - self._thread = threading.Thread(target=self._run, args=(ready_event,)) -@@ -240,43 +303,26 @@ class BaseThreadedController(metaclass=ABCMeta): - if self.smtpd is None: - raise RuntimeError("Unknown Error, failed to init SMTP server") - -- def _stop(self): -- self.loop.stop() -- try: -- _all_tasks = asyncio.all_tasks # pytype: disable=module-attr -- except AttributeError: # pragma: py-gt-36 -- _all_tasks = asyncio.Task.all_tasks -- for task in _all_tasks(self.loop): -- task.cancel() -- -- def stop(self, no_assert=False): -+ def stop(self, no_assert: bool = False): -+ """ -+ Stop the loop, the tasks in the loop, and terminate the thread as well. -+ """ - assert no_assert or self._thread is not None, "SMTP daemon not running" -- self.loop.call_soon_threadsafe(self._stop) -+ self.loop.call_soon_threadsafe(self.cancel_tasks) - if self._thread is not None: - self._thread.join() - self._thread = None -- self._thread_exception = None -- self._factory_invoked = None -- self.server_coro = None -- self.server = None -- self.smtpd = None -+ self._cleanup() - - - @public --class Controller(BaseThreadedController): -- """ -- `Documentation can be found here -- `_. -- """ -+class BaseUnthreadedController(BaseController, metaclass=ABCMeta): - def __init__( - self, -- handler, -- hostname: Optional[str] = None, -- port: int = 8025, -- loop=None, -+ handler: Any, -+ loop: asyncio.AbstractEventLoop = None, - *, -- ready_timeout: float = DEFAULT_READY_TIMEOUT, -- ssl_context: ssl.SSLContext = None, -+ ssl_context: Optional[ssl.SSLContext] = None, - # SMTP parameters - server_hostname: Optional[str] = None, - **SMTP_parameters, -@@ -284,15 +330,80 @@ class Controller(BaseThreadedController): - super().__init__( - handler, - loop, -- ready_timeout=ready_timeout, -+ ssl_context=ssl_context, - server_hostname=server_hostname, -- **SMTP_parameters -+ **SMTP_parameters, - ) -- self.hostname = get_localhost() if hostname is None else hostname -+ self.ended = threading.Event() -+ -+ def begin(self): -+ """ -+ Sets up the asyncio server task and inject it into the asyncio event loop. -+ Does NOT actually start the event loop itself. -+ """ -+ asyncio.set_event_loop(self.loop) -+ # Need to do two-step assignments here to ensure IDEs can properly -+ # detect the types of the vars. Cannot use `assert isinstance`, because -+ # Python 3.6 in asyncio debug mode has a bug wherein CoroWrapper is not -+ # an instance of Coroutine -+ self.server_coro = self._create_server() -+ srv: AsyncServer = self.loop.run_until_complete(self.server_coro) -+ self.server = srv -+ -+ async def finalize(self): -+ """ -+ Perform orderly closing of the server listener. -+ NOTE: This is an async method; await this from an async or use -+ loop.create_task() (if loop is still running), or -+ loop.run_until_complete() (if loop has stopped) -+ """ -+ self.ended.clear() -+ server = self.server -+ server.close() -+ await server.wait_closed() -+ self.server_coro.close() -+ self._cleanup() -+ self.ended.set() -+ -+ def end(self): -+ """ -+ Convenience method to asynchronously invoke finalize(). -+ Consider using loop.call_soon_threadsafe to invoke this method, especially -+ if your loop is running in a different thread. You can afterwards .wait() on -+ ended attribute (a threading.Event) to check for completion, if needed. -+ """ -+ self.ended.clear() -+ if self.loop.is_running(): -+ self.loop.create_task(self.finalize()) -+ else: -+ self.loop.run_until_complete(self.finalize()) -+ -+ -+@public -+class InetMixin(BaseController, metaclass=ABCMeta): -+ def __init__( -+ self, -+ handler: Any, -+ hostname: Optional[str] = None, -+ port: int = 8025, -+ loop: asyncio.AbstractEventLoop = None, -+ **kwargs, -+ ): -+ super().__init__( -+ handler, -+ loop, -+ **kwargs, -+ ) -+ self._localhost = get_localhost() -+ self.hostname = self._localhost if hostname is None else hostname - self.port = port -- self.ssl_context = ssl_context - - def _create_server(self) -> Coroutine: -+ """ -+ Creates a 'server task' that listens on an INET host:port. -+ Does NOT actually start the protocol object itself; -+ _factory_invoker() is only called upon fist connection attempt. -+ """ - return self.loop.create_server( - self._factory_invoker, - host=self.hostname, -@@ -308,42 +419,36 @@ class Controller(BaseThreadedController): - """ - # At this point, if self.hostname is Falsy, it most likely is "" (bind to all - # addresses). In such case, it should be safe to connect to localhost) -- hostname = self.hostname or get_localhost() -+ hostname = self.hostname or self._localhost - with ExitStack() as stk: - s = stk.enter_context(create_connection((hostname, self.port), 1.0)) - if self.ssl_context: - s = stk.enter_context(self.ssl_context.wrap_socket(s)) -- _ = s.recv(1024) -+ s.recv(1024) - - --class UnixSocketController(BaseThreadedController): # pragma: on-win32 on-cygwin -- """ -- `Documentation can be found here -- `_. -- """ -+@public -+class UnixSocketMixin(BaseController, metaclass=ABCMeta): # pragma: no-unixsock - def __init__( - self, -- handler, -- unix_socket: Optional[Union[str, Path]], -- loop=None, -- *, -- ready_timeout: float = DEFAULT_READY_TIMEOUT, -- ssl_context: ssl.SSLContext = None, -- # SMTP parameters -- server_hostname: str = None, -- **SMTP_parameters, -+ handler: Any, -+ unix_socket: Union[str, Path], -+ loop: asyncio.AbstractEventLoop = None, -+ **kwargs, - ): - super().__init__( - handler, - loop, -- ready_timeout=ready_timeout, -- ssl_context=ssl_context, -- server_hostname=server_hostname, -- **SMTP_parameters -+ **kwargs, - ) - self.unix_socket = str(unix_socket) - - def _create_server(self) -> Coroutine: -+ """ -+ Creates a 'server task' that listens on a Unix Socket file. -+ Does NOT actually start the protocol object itself; -+ _factory_invoker() is only called upon fist connection attempt. -+ """ - return self.loop.create_unix_server( - self._factory_invoker, - path=self.unix_socket, -@@ -351,9 +456,52 @@ class UnixSocketController(BaseThreadedController): # pragma: on-win32 on-cygwi - ) - - def _trigger_server(self): -+ """ -+ Opens a socket connection to the newly launched server, wrapping in an SSL -+ Context if necessary, and read some data from it to ensure that factory() -+ gets invoked. -+ """ - with ExitStack() as stk: - s: makesock = stk.enter_context(makesock(AF_UNIX, SOCK_STREAM)) - s.connect(self.unix_socket) - if self.ssl_context: - s = stk.enter_context(self.ssl_context.wrap_socket(s)) -- _ = s.recv(1024) -+ s.recv(1024) -+ -+ -+@public -+class Controller(InetMixin, BaseThreadedController): -+ """Provides a multithreaded controller that listens on an INET endpoint""" -+ -+ def _trigger_server(self): -+ # Prevent confusion on which _trigger_server() to invoke. -+ # Or so LGTM.com claimed -+ InetMixin._trigger_server(self) -+ -+ -+@public -+class UnixSocketController( # pragma: no-unixsock -+ UnixSocketMixin, BaseThreadedController -+): -+ """Provides a multithreaded controller that listens on a Unix Socket file""" -+ -+ def _trigger_server(self): # pragma: no-unixsock -+ # Prevent confusion on which _trigger_server() to invoke. -+ # Or so LGTM.com claimed -+ UnixSocketMixin._trigger_server(self) -+ -+ -+@public -+class UnthreadedController(InetMixin, BaseUnthreadedController): -+ """Provides an unthreaded controller that listens on an INET endpoint""" -+ -+ pass -+ -+ -+@public -+class UnixSocketUnthreadedController( # pragma: no-unixsock -+ UnixSocketMixin, BaseUnthreadedController -+): -+ """Provides an unthreaded controller that listens on a Unix Socket file""" -+ -+ pass -diff --git a/aiosmtpd/docs/NEWS.rst b/aiosmtpd/docs/NEWS.rst -index fb32de4..ce627a7 100644 ---- a/aiosmtpd/docs/NEWS.rst -+++ b/aiosmtpd/docs/NEWS.rst -@@ -3,6 +3,18 @@ - ################### - - -+1.5.0 (aiosmtpd-next-next) -+========================== -+ -+Added -+----- -+* Unthreaded Controllers (Closes #160) -+ -+Fixed/Improved -+-------------- -+* All Controllers now have more rationale design, as they are now composited from a Base + a Mixin -+ -+ - 1.4.2 (2021-03-08) - ===================== - -diff --git a/aiosmtpd/docs/controller.rst b/aiosmtpd/docs/controller.rst -index d3e08ed..e43720b 100644 ---- a/aiosmtpd/docs/controller.rst -+++ b/aiosmtpd/docs/controller.rst -@@ -5,15 +5,15 @@ - ==================== - - If you already have an `asyncio event loop`_, you can `create a server`_ using --the ``SMTP`` class as the *protocol factory*, and then run the loop forever. -+the :class:`~aiosmtpd.smtp.SMTP` class as the *protocol factory*, and then run the loop forever. - If you need to pass arguments to the ``SMTP`` constructor, use - :func:`functools.partial` or write your own wrapper function. You might also - want to add a signal handler so that the loop can be stopped, say when you hit - control-C. - --It's probably easier to use a *controller* which runs the SMTP server in a -+It's probably easier to use a *threaded controller* which runs the SMTP server in a - separate thread with a dedicated event loop. The controller provides useful --and reliable *start* and *stop* semantics so that the foreground thread -+and reliable ``start`` and ``stop`` semantics so that the foreground thread - doesn't block. Among other use cases, this makes it convenient to spin up an - SMTP server for unit tests. - -@@ -30,7 +30,7 @@ Using the controller - TCP-based Server - ---------------- - --The :class:`Controller` class creates a TCP-based server, -+The :class:`~aiosmtpd.controller.Controller` class creates a TCP-based server, - listening on an Internet endpoint (i.e., ``ip_address:port`` pair). - - Say you want to receive email for ``example.com`` and print incoming mail data -@@ -100,11 +100,11 @@ Connect to the server and send a message, which then gets printed by - End of message - - You'll notice that at the end of the ``DATA`` command, your handler's --``handle_DATA()`` method was called. The sender, recipients, and message -+:meth:`handle_DATA` method was called. The sender, recipients, and message - contents were taken from the envelope, and printed at the console. The - handler methods also returns a successful status message. - --The ``ExampleHandler`` class also implements a ``handle_RCPT()`` method. This -+The ``ExampleHandler`` class also implements a :meth:`handle_RCPT` method. This - gets called after the ``RCPT TO`` command is sanity checked. The method - ensures that all recipients are local to the ``@example.com`` domain, - returning an error status if not. It is the handler's responsibility to add -@@ -148,10 +148,11 @@ use to do some common tasks, and it's easy to write your own handler. For a - full overview of the methods that handler classes may implement, see the - section on :ref:`handler hooks `. - -+ - Unix Socket-based Server - ------------------------ - --The :class:`UnixSocketController` class creates a server listening to -+The :class:`~aiosmtpd.controller.UnixSocketController` class creates a server listening to - a Unix Socket (i.e., a special file that can act as a 'pipe' for interprocess - communication). - -@@ -168,8 +169,13 @@ with some differences: - >>> controller = UnixSocketController(Sink(), unix_socket="smtp_socket~") - >>> controller.start() - -+.. warning:: -+ -+ Do not exceed the Operating System limit for the length of the socket file path. -+ On Linux, the limit is 108 characters. On BSD OSes, it's 104 characters. -+ - **Rather than connecting to IP:port, you connect to the Socket file.** --Python's :class:`smtplib.SMTP` sadly cannot connect to a Unix Socket, -+Python's :class:`smtplib.SMTP` class sadly cannot connect to a Unix Socket, - so we need to handle it on our own here: - - .. doctest:: unix_socket -@@ -178,9 +184,8 @@ so we need to handle it on our own here: - >>> import socket - >>> sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - >>> sock.connect("smtp_socket~") -- >>> resp = sock.recv(1024) -- >>> resp[0:4] -- b'220 ' -+ >>> sock.recv(1024) -+ b'220 ...' - - Try sending something, don't forget to end with ``"\r\n"``: - -@@ -189,9 +194,8 @@ Try sending something, don't forget to end with ``"\r\n"``: - - >>> sock.send(b"HELO example.org\r\n") - 18 -- >>> resp = sock.recv(1024) -- >>> resp[0:4] -- b'250 ' -+ >>> sock.recv(1024) -+ b'250 ...' - - And close everything when done: - -@@ -200,13 +204,116 @@ And close everything when done: - - >>> sock.send(b"QUIT\r\n") - 6 -- >>> resp = sock.recv(1024) -- >>> resp[0:4] -- b'221 ' -+ >>> sock.recv(1024) -+ b'221 Bye...' - >>> sock.close() - >>> controller.stop() - - -+.. _unthreaded: -+ -+Unthreaded Controllers -+---------------------- -+ -+In addition to the **threaded** controllers described above, -+``aiosmtpd`` also provides the following **UNthreaded** controllers: -+ -+* :class:`UnthreadedController` -- the unthreaded version of :class:`Controller` -+* :class:`UnixSocketUnthreadedController` -- the unthreaded version of :class:`UnixSocketController` -+ -+These classes are considered *advanced* classes, -+because you'll have to manage the event loop yourself. -+ -+For example, to start an unthreaded controller, -+you'll have to do something similar to this: -+ -+.. doctest:: unthreaded -+ -+ >>> import asyncio -+ >>> loop = asyncio.get_event_loop() -+ >>> from aiosmtpd.controller import UnthreadedController -+ >>> from aiosmtpd.handlers import Sink -+ >>> controller = UnthreadedController(Sink(), loop=loop) -+ >>> controller.begin() -+ -+Note that unlike the threaded counterparts, -+the method used to start the controller is named ``begin()``. -+And unlike the method in the threaded version, -+``begin()`` does NOT start the asyncio event loop; -+you'll have to start it yourself. -+ -+For the purposes of trying this, -+let's create a thread and have it run the asyncio event loop; -+we'll also schedule an autostop so it won't hang: -+ -+.. doctest:: unthreaded -+ -+ >>> def runner(): -+ ... # Set the delay to something long enough so you have time -+ ... # to do some testing -+ ... loop.call_later(3.0, loop.stop) -+ ... loop.run_forever() -+ >>> import threading -+ >>> thread = threading.Thread(target=runner) -+ >>> thread.setDaemon(True) -+ >>> thread.start() -+ >>> import time -+ >>> time.sleep(0.1) # Allow the loop to begin -+ -+At this point in time, the server would be listening: -+ -+.. doctest:: unthreaded -+ -+ >>> from smtplib import SMTP as Client -+ >>> client = Client(controller.hostname, controller.port) -+ >>> client.helo("example.com") -+ (250, ...) -+ >>> client.quit() -+ (221, b'Bye') -+ -+The complex thing will be to end it; -+that is why we're marking these classes as "advanced". -+ -+For our example here, -+since we have created an "autostop loop", -+all we have to do is wait for the runner thread to end: -+ -+.. doctest:: unthreaded -+ -+ >>> thread.join() -+ >>> loop.is_running() -+ False -+ -+We still need to do some cleanup to fully release the bound port. -+Since the loop has ended, we can simply call the :meth:`end` method: -+ -+.. doctest:: unthreaded -+ -+ >>> controller.end() -+ -+If you want to end the controller *but* keep the loop running, -+you'll have to do it like this:: -+ -+ loop.call_soon_threadsafe(controller.end) -+ # If you want to ensure that controller has stopped, you can wait() here: -+ controller.ended.wait(10.0) # Optional -+ -+You must remember to cleanup the canceled tasks yourself. -+We have provided a convenience method, -+:meth:`~aiosmtpd.controller.BaseController.cancel_tasks`:: -+ -+ # Will also stop the loop! -+ loop.call_soon_threadsafe(controller.cancel_tasks) -+ -+(If you invoke ``cancel_tasks`` with the parameter ``stop_loop=False``, -+then loop will NOT be stopped. -+That is a much too-advanced topic and we will not discuss it further in this documentation.) -+ -+The Unix Socket variant, ``UnixSocketUnthreadedController``, works in the same way. -+The difference is only in how to access the server, i.e., through a Unix Socket instead of TCP/IP. -+We'll leave out the details for you to figure it out yourself. -+ -+ - .. _enablesmtputf8: - - Enabling SMTPUTF8 -@@ -253,265 +360,398 @@ Controller API - - .. py:module:: aiosmtpd.controller - --.. class:: IP6_IS - -- .. py:attribute:: NO -- :type: set -+.. py:data:: DEFAULT_READY_TIMEOUT -+ :type: float -+ :value: 5.0 -+ -+ -+.. py:function:: get_localhost() - -- Contains constants from :mod:`errno` that will be raised by `socket.bind()` -- if IPv6 is not available on the system. -+ :return: The numeric address of the loopback interface; ``"::1"`` if IPv6 is supported, -+ ``"127.0.0.1"`` if IPv6 is not supported. -+ :rtype: Literal["::1", "127.0.0.1"] -+ -+ -+.. class:: IP6_IS - -- .. important:: -+ .. py:attribute:: NO -+ :type: set[int] - -- If your system does not have IPv6 support but :func:`get_localhost` -- raises an error instead of returning ``"127.0.0.1"``, -- you can add the error number into this attribute. -+ Contains constants from :mod:`errno` that will be raised by :meth:`socket.socket.bind` -+ if IPv6 is NOT available on the system. - - .. py:attribute:: YES -- :type: set -+ :type: set[int] - -- Contains constants from :mod:`errno` that will be raised by `socket.bind()` -- if IPv6 is not available on the system. -+ Contains constants from :mod:`errno` that will be raised by :meth:`socket.socket.bind` -+ if IPv6 IS available on the system. - --.. py:function:: get_localhost -+ .. note:: - -- :return: The numeric address of the loopback interface; ``"::1"`` if IPv6 is supported, -- ``"127.0.0.1"`` if IPv6 is not supported. -- :rtype: str -+ You can customize the contents of these attributes by adding/removing from them, -+ in case the behavior does not align with your expectations *and* -+ you cannot wait for a patch to be merged. - --.. class:: BaseThreadedController(\ -- handler, \ -- loop=None, \ -- *, \ -- ready_timeout, \ -- ssl_context=None, \ -- server_hostname=None, server_kwargs=None, **SMTP_parameters) - -- :param handler: Handler object -- :param loop: The asyncio event loop in which the server will run. -- If not given, :func:`asyncio.new_event_loop` will be called to create the event loop. -- :param ready_timeout: How long to wait until server starts. -- The :envvar:`AIOSMTPD_CONTROLLER_TIMEOUT` takes precedence over this parameter. -- See :attr:`ready_timeout` for more information. -- :type ready_timeout: float -- :param ssl_context: SSL Context to wrap the socket in. -- Will be passed-through to :meth:`~asyncio.loop.create_server` method -- :type ssl_context: ssl.SSLContext -- :param server_hostname: Server's hostname, -- will be passed-through as ``hostname`` parameter of :class:`~aiosmtpd.smtp.SMTP` -- :type server_hostname: Optional[str] -- :param server_kwargs: (DEPRECATED) A dict that -- will be passed-through as keyword arguments of :class:`~aiosmtpd.smtp.SMTP`. -- Explicitly listed keyword arguments going into ``**SMTP_parameters`` -- will take precedence over this parameter -- :type server_kwargs: Dict[str, Any] -- :param SMTP_parameters: Optional keyword arguments that -- will be passed-through as keyword arguments of :class:`~aiosmtpd.smtp.SMTP` -+.. class:: BaseController(\ -+ handler, \ -+ loop=None, \ -+ *, \ -+ ssl_context=None, \ -+ server_hostname=None, \ -+ server_kwargs=None, \ -+ **SMTP_parameters, \ -+ ) - -- .. important:: -+ This **Abstract Base Class** defines parameters, attributes, and methods common between -+ all concrete controller classes. - -- Usually, setting the ``ssl_context`` parameter will switch the protocol to ``SMTPS`` mode, -- implying unconditional encryption of the connection, -- and preventing the use of the ``STARTTLS`` mechanism. -+ :param handler: Handler object -+ :param loop: The asyncio event loop in which the server will run. -+ If not given, :func:`asyncio.new_event_loop` will be called to create the event loop. -+ :type loop: asyncio.AbstractEventLoop -+ :param ssl_context: SSL Context to wrap the socket in. -+ Will be passed-through to :meth:`~asyncio.loop.create_server` method -+ :type ssl_context: ssl.SSLContext -+ :param server_hostname: Server's hostname, -+ will be passed-through as ``hostname`` parameter of :class:`~aiosmtpd.smtp.SMTP` -+ :type server_hostname: Optional[str] -+ :param server_kwargs: *(DEPRECATED)* A dict that will be passed-through as keyword -+ arguments of :class:`~aiosmtpd.smtp.SMTP`. -+ This is DEPRECATED; please use ``**SMTP_parameters`` instead. -+ :type server_kwargs: dict -+ :param SMTP_parameters: Optional keyword arguments that -+ will be passed-through as keyword arguments of :class:`~aiosmtpd.smtp.SMTP` - -- Actual behavior depends on the subclass's implementation. -+ | -+ | :part:`Attributes` - -- | -- | :part:`Attributes` -+ .. attribute:: handler -+ :noindex: - -- .. attribute:: handler -- :noindex: -+ The instance of the event *handler* passed to the constructor. - -- The instance of the event *handler* passed to the constructor. -+ .. attribute:: loop -+ :noindex: - -- .. attribute:: loop -- :noindex: -+ The event loop being used. - -- The event loop being used. -+ .. attribute:: server - -- .. attribute:: ready_timeout -- :type: float -+ This is the server instance returned by -+ :meth:`_create_server` after the server has started. - -- The timeout value used to wait for the server to start. -+ You can retrieve the :class:`~socket.socket` objects the server is listening on -+ from the ``server.sockets`` attribute. - -- This will either be the value of -- the :envvar:`AIOSMTPD_CONTROLLER_TIMEOUT` environment variable (converted to float), -- or the :attr:`ready_timeout` parameter. -+ .. py:attribute:: smtpd -+ :type: aiosmtpd.smtp.SMTP - -- Setting this to a high value will NOT slow down controller startup, -- because it's a timeout limit rather than a sleep delay. -- However, you may want to reduce the default value to something 'just enough' -- so you don't have to wait too long for an exception, if problem arises. -+ The server instance (of class SMTP) created by :meth:`factory` after -+ the controller is started. - -- If this timeout is breached, a :class:`TimeoutError` exception will be raised. -+ | -+ | :part:`Methods` - -- .. attribute:: server -+ .. method:: factory() -> aiosmtpd.smtp.SMTP - -- This is the server instance returned by -- :meth:`_create_server` after the server has started. -+ You can override this method to create custom instances of -+ the :class:`~aiosmtpd.smtp.SMTP` class being controlled. - -- .. py:attribute:: smtpd -- :type: aiosmtpd.smtp.SMTP -+ By default, this creates an ``SMTP`` instance, -+ passing in your handler and setting flags from the :attr:`**SMTP_Parameters` parameter. - -- The server instance (of class SMTP) created by :meth:`factory` after -- the controller is started. -+ Examples of why you would want to override this method include -+ creating an :ref:`LMTP ` server instance instead of the standard ``SMTP`` server. - -- | -- | :part:`Methods` -+ .. py:method:: cancel_tasks(stop_loop=True) - -- .. py:method:: _create_server() -> Coroutine -- :abstractmethod: -+ :param stop_loop: If ``True``, stops the loop before canceling tasks. -+ :type stop_loop: bool - -- This method will be called by :meth:`_run` during :meth:`start` procedure. -+ This is a convenience class that will stop the loop & -+ cancel all asyncio tasks for you. - -- It must return a ``Coroutine`` object which will be executed by the asyncio event loop. - -- .. py:method:: _trigger_server() -> None -- :abstractmethod: -+.. class:: Controller(\ -+ handler, \ -+ hostname=None, \ -+ port=8025, \ -+ loop=None, \ -+ *, \ -+ ready_timeout=DEFAULT_READY_TIMEOUT, \ -+ ssl_context=None, \ -+ server_hostname=None, \ -+ server_kwargs=None, \ -+ **SMTP_parameters) - -- The :meth:`asyncio.loop.create_server` method (or its parallel) -- invokes :meth:`factory` "lazily", -- so exceptions in :meth:`factory` can go undetected during :meth:`start`. -+ A concrete subclass of :class:`BaseController` that provides -+ a threaded, INET listener. - -- This method will create a connection to the started server and 'exchange' some traffic, -- thus triggering :meth:`factory` invocation, -- allowing the Controller to catch exceptions during initialization. -+ :param hostname: Will be given to the event loop's :meth:`~asyncio.loop.create_server` method -+ as the ``host`` parameter, with a slight processing (see below) -+ :type hostname: Optional[str] -+ :param port: Will be passed-through to :meth:`~asyncio.loop.create_server` method -+ :type port: int -+ :param ready_timeout: How long to wait until server starts. -+ The :envvar:`AIOSMTPD_CONTROLLER_TIMEOUT` takes precedence over this parameter. -+ See :attr:`ready_timeout` for more information. -+ :type ready_timeout: float - -- .. method:: start() -> None -+ Other parameters are defined in the :class:`BaseController` class. - -- :raises TimeoutError: if the server takes too long to get ready, -- exceeding the ``ready_timeout`` parameter. -- :raises RuntimeError: if an unrecognized & unhandled error happened, -- resulting in non-creation of a server object -- (:attr:`smtpd` remains ``None``) -+ The ``hostname`` parameter will be passed to the event loop's -+ :meth:`~asyncio.loop.create_server` method as the ``host`` parameter, -+ :boldital:`except` ``None`` (default) will be translated to ``::1``. - -- Start the server in the subthread. -- The subthread is always a :class:`daemon thread ` -- (i.e., we always set ``thread.daemon=True``). -+ * To bind `dual-stack`_ locally, use ``localhost``. -+ * To bind `dual-stack`_ on all interfaces, use ``""`` (empty string). - -- Exceptions can be raised -- if the server does not start within :attr:`ready_timeout` seconds, -- or if any other exception occurs in :meth:`factory` while creating the server. -+ .. important:: - -- .. important:: -+ The ``hostname`` parameter does NOT get passed through to the SMTP instance; -+ if you want to give the SMTP instance a custom hostname -+ (e.g., for use in HELO/EHLO greeting), -+ you must pass it through the :attr:`server_hostname` parameter. - -- If :meth:`start` raises an Exception, -- cleanup is not performed automatically, -- to support deep inspection post-exception (if you wish to do so.) -- Cleanup must still be performed manually by calling :meth:`stop` -+ Explicitly defined SMTP keyword arguments will override keyword arguments of the -+ same names defined in the (deprecated) ``server_kwargs`` argument. - -- For example:: -+ .. doctest:: controller_kwargs - -- # Assume SomeController is a concrete subclass of BaseThreadedController -- controller = SomeController(handler) -- try: -- controller.start() -- except ...: -- ... exception handling and/or inspection ... -- finally: -- controller.stop() -+ >>> from aiosmtpd.controller import Controller -+ >>> from aiosmtpd.handlers import Sink -+ >>> controller = Controller( -+ ... Sink(), timeout=200, server_kwargs=dict(timeout=400) -+ ... ) -+ >>> controller.SMTP_kwargs["timeout"] -+ 200 - -- .. method:: stop() -> None -+ Finally, setting the ``ssl_context`` parameter will switch the protocol to ``SMTPS`` mode, -+ implying unconditional encryption of the connection, -+ and preventing the use of the ``STARTTLS`` mechanism. - -- :raises AssertionError: if :meth:`stop` is called before :meth:`start` is called successfully -+ Actual behavior depends on the subclass's implementation. - -- Stop the server and the event loop, and cancel all tasks. -+ | -+ | :part:`Attributes` - -- .. method:: factory() -> aiosmtpd.smtp.SMTP -+ In addition to those provided by :class:`BaseController`, -+ this class provides the following: - -- You can override this method to create custom instances of the ``SMTP`` -- class being controlled. -+ .. attribute:: hostname: str -+ port: int - -- By default, this creates an ``SMTP`` instance, -- passing in your handler and setting flags from the :attr:`**SMTP_Parameters` parameter. -+ The values of the *hostname* and *port* arguments. - -- Examples of why you would want to override this method include -- creating an :ref:`LMTP ` server instance instead of the standard ``SMTP`` server. -+ .. attribute:: ready_timeout -+ :type: float - -+ The timeout value used to wait for the server to start. - -+ This will either be the value of -+ the :envvar:`AIOSMTPD_CONTROLLER_TIMEOUT` environment variable (converted to float), -+ or the :attr:`ready_timeout` parameter. - --.. class:: Controller(\ -- handler, \ -- hostname=None, port=8025, \ -- loop=None, \ -- *, \ -- ready_timeout=3.0, \ -- ssl_context=None, \ -- server_hostname=None, server_kwargs=None, **SMTP_parameters) -- -- :param hostname: Will be given to the event loop's :meth:`~asyncio.loop.create_server` method -- as the ``host`` parameter, with a slight processing (see below) -- :type hostname: Optional[str] -- :param port: Will be passed-through to :meth:`~asyncio.loop.create_server` method -- :type port: int -+ Setting this to a high value will NOT slow down controller startup, -+ because it's a timeout limit rather than a sleep delay. -+ However, you may want to reduce the default value to something 'just enough' -+ so you don't have to wait too long for an exception, if problem arises. - -- .. note:: -+ If this timeout is breached, a :class:`TimeoutError` exception will be raised. -+ -+ | -+ | :part:`Methods` - -- The ``hostname`` parameter will be passed to the event loop's -- :meth:`~asyncio.loop.create_server` method as the ``host`` parameter, -- :boldital:`except` ``None`` (default) will be translated to ``::1``. -+ In addition to those provided by :class:`BaseController`, -+ this class provides the following: - -- * To bind `dual-stack`_ locally, use ``localhost``. -+ .. method:: start() -> None - -- * To bind `dual-stack`_ on all interfaces, use ``""`` (empty string). -+ :raises TimeoutError: if the server takes too long to get ready, -+ exceeding the ``ready_timeout`` parameter. -+ :raises RuntimeError: if an unrecognized & unhandled error happened, -+ resulting in non-creation of a server object -+ (:attr:`smtpd` remains ``None``) - -- .. important:: -+ Start the server in the subthread. -+ The subthread is always a :class:`daemon thread ` -+ (i.e., we always set ``thread.daemon=True``). - -- The ``hostname`` parameter does NOT get passed through to the SMTP instance; -- if you want to give the SMTP instance a custom hostname -- (e.g., for use in HELO/EHLO greeting), -- you must pass it through the :attr:`server_hostname` parameter. -+ Exceptions can be raised -+ if the server does not start within :attr:`ready_timeout` seconds, -+ or if any other exception occurs in :meth:`~BaseController.factory` -+ while creating the server. - -- .. important:: -+ .. important:: - -- Explicitly defined SMTP keyword arguments will override keyword arguments of the -- same names defined in the (deprecated) ``server_kwargs`` argument. -+ If :meth:`start` raises an Exception, -+ cleanup is not performed automatically, -+ to support deep inspection post-exception (if you wish to do so.) -+ Cleanup must still be performed manually by calling :meth:`stop` - -- >>> from aiosmtpd.handlers import Sink -- >>> controller = Controller(Sink(), timeout=200, server_kwargs=dict(timeout=400)) -- >>> controller.SMTP_kwargs["timeout"] -- 200 -+ For example:: - -- One example is the ``enable_SMTPUTF8`` flag described in the -- :ref:`Enabling SMTPUTF8 section ` above. -+ # Assume SomeController is a concrete subclass of BaseThreadedController -+ controller = SomeController(handler) -+ try: -+ controller.start() -+ except ...: -+ ... exception handling and/or inspection ... -+ finally: -+ controller.stop() - -- | -- | :part:`Attributes` -+ .. method:: stop(no_assert=False) -> None - -- .. attribute:: hostname: str -- port: int -- :noindex: -+ :param no_assert: If ``True``, skip the assertion step so an ``AssertionError`` will -+ not be raised if thread had not been started successfully. -+ :type no_assert: bool - -- The values of the *hostname* and *port* arguments. -+ :raises AssertionError: if this method is called before -+ :meth:`start` is called successfully *AND* ``no_assert=False`` - -- Other parameters, attributes, and methods are identical to :class:`BaseThreadedController` -- and thus are not repeated nor explained here. -+ Stop the server and the event loop, and cancel all tasks -+ via :meth:`~BaseController.cancel_tasks`. - - - .. class:: UnixSocketController(\ -- handler, \ -- unix_socket, \ -- loop=None, \ -- *, \ -- ready_timeout=3.0, \ -- ssl_context=None, \ -- server_hostname=None,\ -- **SMTP_parameters) -+ handler, \ -+ unix_socket, \ -+ loop=None, \ -+ *, \ -+ ready_timeout=DEFAULT_READY_TIMEOUT, \ -+ ssl_context=None, \ -+ server_hostname=None, \ -+ **SMTP_parameters) -+ -+ A concrete subclass of :class:`BaseController` that provides -+ a threaded, Unix Socket listener. -+ -+ :param unix_socket: Socket file, -+ will be passed-through to :meth:`asyncio.loop.create_unix_server` -+ :type unix_socket: Union[str, pathlib.Path] -+ -+ For the other parameters, see the description under :class:`Controller` -+ -+ | -+ | :part:`Attributes` -+ -+ .. py:attribute:: unix_socket -+ :type: str -+ -+ The stringified version of the ``unix_socket`` parameter -+ -+ Other attributes (except ``hostname`` and ``port``) are identical to :class:`Controller` -+ and thus are not repeated nor explained here. -+ -+ | -+ | :part:`Methods` -+ -+ All methods are identical to :class:`Controller` -+ and thus are not repeated nor explained here. -+ -+ -+.. class:: UnthreadedController(\ -+ handler, \ -+ hostname=None, \ -+ port=8025, \ -+ loop=None, \ -+ *, \ -+ ssl_context=None, \ -+ server_hostname=None, \ -+ server_kwargs=None, \ -+ **SMTP_parameters) -+ -+ .. versionadded:: 1.5.0 -+ -+ A concrete subclass of :class:`BaseController` that provides -+ an UNthreaded, INET listener. -+ -+ Parameters are identical to the :class:`Controller` class. -+ -+ | -+ | :part:`Attributes` -+ -+ Attributes are identical to the :class:`Controller` class with one addition: -+ -+ .. py:attribute:: ended -+ :type: threading.Event -+ -+ An ``Event`` that can be ``.wait()``-ed when ending the controller. -+ Please see the :ref:`Unthreaded Controllers ` section for more info. -+ -+ | -+ | :part:`Methods` -+ -+ In addition to those provided by :class:`BaseController`, -+ this class provides the following: -+ -+ .. py:method:: begin -+ -+ Initializes the server task and insert it into the asyncio event loop. -+ -+ .. note:: -+ -+ The SMTP class itself will only be initialized upon first connection -+ to the server task. -+ -+ .. py:method:: finalize -+ :async: -+ -+ Perform orderly closing of the server listener. -+ If you need to close the server from a non-async function, -+ you can use the :meth:`~UnthreadedController.end` method instead. -+ -+ Upon completion of this method, the :attr:`ended` attribute will be ``set()``. -+ -+ .. py:method:: end -+ -+ This is a convenience method that will asynchronously invoke the -+ :meth:`finalize` method. -+ This method non-async, and thus is callable from non-async functions. -+ -+ .. note:: -+ -+ If the asyncio event loop has been stopped, -+ then it is safe to invoke this method directly. -+ Otherwise, it is recommended to invoke this method -+ using the :meth:`~asyncio.loop.call_soon_threadsafe` method. -+ -+ -+.. class:: UnixSocketUnthreadedController(\ -+ handler, \ -+ unix_socket, \ -+ loop=None, \ -+ *, \ -+ ssl_context=None, \ -+ server_hostname=None,\ -+ server_kwargs=None, \ -+ **SMTP_parameters) -+ -+ .. versionadded:: 1.5.0 -+ -+ A concrete subclass of :class:`BaseController` that provides -+ an UNthreaded, Unix Socket listener. -+ -+ Parameters are identical to the :class:`UnixSocketController` class. -+ -+ | -+ | :part:`Attributes` - -- :param unix_socket: Socket file, -- will be passed-through to :meth:`asyncio.loop.create_unix_server` -- :type unix_socket: Union[str, pathlib.Path] -+ Attributes are identical to the :class:`UnixSocketController` class, -+ with the following addition: - -- | -- | :part:`Attributes` -+ .. py:attribute:: ended -+ :type: threading.Event - -- .. py:attribute:: unix_socket -- :type: str -+ An ``Event`` that can be ``.wait()``-ed when ending the controller. -+ Please see the :ref:`Unthreaded Controllers ` section for more info. - -- The stringified version of the ``unix_socket`` parameter -+ | -+ | :part:`Methods` - -- Other parameters, attributes, and methods are identical to :class:`BaseThreadedController` -- and thus are not repeated nor explained here. -+ Methods are identical to the :class:`UnthreadedController` class. - - - .. _`asyncio event loop`: https://docs.python.org/3/library/asyncio-eventloop.html -diff --git a/aiosmtpd/docs/smtp.rst b/aiosmtpd/docs/smtp.rst -index f48b717..3305079 100644 ---- a/aiosmtpd/docs/smtp.rst -+++ b/aiosmtpd/docs/smtp.rst -@@ -99,7 +99,8 @@ Server hooks - The ``SMTP`` server class also implements some hooks which your subclass can - override to provide additional responses. - --``ehlo_hook()`` -+.. py:function:: ehlo_hook() -+ - This hook makes it possible for subclasses to return additional ``EHLO`` - responses. This method, called *asynchronously* and taking no arguments, - can do whatever it wants, including (most commonly) pushing new -@@ -107,12 +108,17 @@ override to provide additional responses. - before the standard ``250 HELP`` which ends the ``EHLO`` response from the - server. - --``rset_hook()`` -+ .. deprecated:: 1.2 -+ -+.. py:function:: rset_hook() -+ - This hook makes it possible to return additional ``RSET`` responses. This - method, called *asynchronously* and taking no arguments, is called just - before the standard ``250 OK`` which ends the ``RSET`` response from the - server. - -+ .. deprecated:: 1.2 -+ - - .. _smtp_api: - -diff --git a/aiosmtpd/handlers.py b/aiosmtpd/handlers.py -index b13dd12..ada1e91 100644 ---- a/aiosmtpd/handlers.py -+++ b/aiosmtpd/handlers.py -@@ -15,6 +15,7 @@ import mailbox - import re - import smtplib - import sys -+from abc import ABCMeta, abstractmethod - from email import message_from_bytes, message_from_string - - from public import public -@@ -148,7 +149,7 @@ class Sink: - - - @public --class Message: -+class Message(metaclass=ABCMeta): - def __init__(self, message_class=None): - self.message_class = message_class - -@@ -172,12 +173,13 @@ class Message: - message['X-RcptTo'] = COMMASPACE.join(envelope.rcpt_tos) - return message - -+ @abstractmethod - def handle_message(self, message): -- raise NotImplementedError # pragma: nocover -+ raise NotImplementedError - - - @public --class AsyncMessage(Message): -+class AsyncMessage(Message, metaclass=ABCMeta): - def __init__(self, message_class=None, *, loop=None): - super().__init__(message_class) - self.loop = loop or asyncio.get_event_loop() -@@ -187,8 +189,9 @@ class AsyncMessage(Message): - await self.handle_message(message) - return '250 OK' - -+ @abstractmethod - async def handle_message(self, message): -- raise NotImplementedError # pragma: nocover -+ raise NotImplementedError - - - @public -diff --git a/aiosmtpd/proxy_protocol.py b/aiosmtpd/proxy_protocol.py -index a171211..621098c 100644 ---- a/aiosmtpd/proxy_protocol.py -+++ b/aiosmtpd/proxy_protocol.py -@@ -99,7 +99,7 @@ class UnknownTypeTLV(KeyError): - - - @public --class AsyncReader(Protocol): # pragma: nocover -+class AsyncReader(Protocol): - async def read(self, num_bytes: Optional[int] = None) -> bytes: - ... - return b"" -diff --git a/aiosmtpd/tests/conftest.py b/aiosmtpd/tests/conftest.py -index 08fc0e8..d0a6cd3 100644 ---- a/aiosmtpd/tests/conftest.py -+++ b/aiosmtpd/tests/conftest.py -@@ -29,6 +29,7 @@ __all__ = [ - "controller_data", - "handler_data", - "Global", -+ "AUTOSTOP_DELAY", - "SERVER_CRT", - "SERVER_KEY", - ] -@@ -64,6 +65,9 @@ class Global: - cls.SrvAddr = HostPort(contr.hostname, contr.port) - - -+# If less than 1.0, might cause intermittent error if test system -+# is too busy/overloaded. -+AUTOSTOP_DELAY = 1.0 - SERVER_CRT = resource_filename("aiosmtpd.tests.certs", "server.crt") - SERVER_KEY = resource_filename("aiosmtpd.tests.certs", "server.key") - -@@ -204,6 +208,17 @@ def temp_event_loop() -> Generator[asyncio.AbstractEventLoop, None, None]: - asyncio.set_event_loop(default_loop) - - -+@pytest.fixture -+def autostop_loop(temp_event_loop) -> Generator[asyncio.AbstractEventLoop, None, None]: -+ # Create a new event loop, and arrange for that loop to end almost -+ # immediately. This will allow the calls to main() in these tests to -+ # also exit almost immediately. Otherwise, the foreground test -+ # process will hang. -+ temp_event_loop.call_later(AUTOSTOP_DELAY, temp_event_loop.stop) -+ # -+ yield temp_event_loop -+ -+ - @pytest.fixture - def plain_controller(get_handler, get_controller) -> Generator[Controller, None, None]: - """ -diff --git a/aiosmtpd/tests/test_main.py b/aiosmtpd/tests/test_main.py -index f9ac424..36992f3 100644 ---- a/aiosmtpd/tests/test_main.py -+++ b/aiosmtpd/tests/test_main.py -@@ -16,8 +16,9 @@ import pytest - from aiosmtpd import __version__ - from aiosmtpd.handlers import Debugging - from aiosmtpd.main import main, parseargs -+from aiosmtpd.testing.helpers import catchup_delay - from aiosmtpd.testing.statuscodes import SMTP_STATUS_CODES as S --from aiosmtpd.tests.conftest import SERVER_CRT, SERVER_KEY -+from aiosmtpd.tests.conftest import AUTOSTOP_DELAY, SERVER_CRT, SERVER_KEY - - try: - import pwd -@@ -27,10 +28,6 @@ except ImportError: - HAS_SETUID = hasattr(os, "setuid") - MAIL_LOG = logging.getLogger("mail.log") - --# If less than 1.0, might cause intermittent error if test system --# is too busy/overloaded. --AUTOSTOP_DELAY = 1.0 -- - - # region ##### Custom Handlers ######################################################## - -@@ -53,17 +50,6 @@ class NullHandler: - # region ##### Fixtures ############################################################### - - --@pytest.fixture --def autostop_loop(temp_event_loop) -> Generator[asyncio.AbstractEventLoop, None, None]: -- # Create a new event loop, and arrange for that loop to end almost -- # immediately. This will allow the calls to main() in these tests to -- # also exit almost immediately. Otherwise, the foreground test -- # process will hang. -- temp_event_loop.call_later(AUTOSTOP_DELAY, temp_event_loop.stop) -- # -- yield temp_event_loop -- -- - @pytest.fixture - def nobody_uid() -> Generator[int, None, None]: - if pwd is None: -@@ -97,10 +83,10 @@ def watch_for_tls(ready_flag, retq: MP.Queue): - req_tls = False - ready_flag.set() - start = time.monotonic() -- delay = AUTOSTOP_DELAY * 1.5 -+ delay = AUTOSTOP_DELAY * 4 - while (time.monotonic() - start) <= delay: - try: -- with SMTPClient("localhost", 8025) as client: -+ with SMTPClient("localhost", 8025, timeout=0.1) as client: - resp = client.docmd("HELP", "HELO") - if resp == S.S530_STARTTLS_FIRST: - req_tls = True -@@ -121,7 +107,7 @@ def watch_for_smtps(ready_flag, retq: MP.Queue): - delay = AUTOSTOP_DELAY * 1.5 - while (time.monotonic() - start) <= delay: - try: -- with SMTP_SSL("localhost", 8025) as client: -+ with SMTP_SSL("localhost", 8025, timeout=0.1) as client: - client.ehlo("exemple.org") - has_smtps = True - break -@@ -215,6 +201,7 @@ class TestMainByWatcher: - with watcher_process(watch_for_tls) as retq: - temp_event_loop.call_later(AUTOSTOP_DELAY, temp_event_loop.stop) - main_n("--tlscert", str(SERVER_CRT), "--tlskey", str(SERVER_KEY)) -+ catchup_delay() - has_starttls = retq.get() - assert has_starttls is True - require_tls = retq.get() -@@ -230,6 +217,7 @@ class TestMainByWatcher: - str(SERVER_KEY), - "--no-requiretls", - ) -+ catchup_delay() - has_starttls = retq.get() - assert has_starttls is True - require_tls = retq.get() -@@ -239,6 +227,7 @@ class TestMainByWatcher: - with watcher_process(watch_for_smtps) as retq: - temp_event_loop.call_later(AUTOSTOP_DELAY, temp_event_loop.stop) - main_n("--smtpscert", str(SERVER_CRT), "--smtpskey", str(SERVER_KEY)) -+ catchup_delay() - has_smtps = retq.get() - assert has_smtps is True - -diff --git a/aiosmtpd/tests/test_server.py b/aiosmtpd/tests/test_server.py -index 99c5630..41225dc 100644 ---- a/aiosmtpd/tests/test_server.py -+++ b/aiosmtpd/tests/test_server.py -@@ -3,16 +3,18 @@ - - """Test other aspects of the server implementation.""" - -+import asyncio - import errno - import platform - import socket --import ssl - import time - from contextlib import ExitStack - from functools import partial - from pathlib import Path -+from smtplib import SMTP as SMTPClient, SMTPServerDisconnected - from tempfile import mkdtemp --from typing import Generator -+from threading import Thread -+from typing import Generator, Optional - - import pytest - from pytest_mock import MockFixture -@@ -20,13 +22,17 @@ from pytest_mock import MockFixture - from aiosmtpd.controller import ( - Controller, - UnixSocketController, -+ UnthreadedController, -+ UnixSocketMixin, -+ UnixSocketUnthreadedController, - _FakeServer, - get_localhost, - ) - from aiosmtpd.handlers import Sink - from aiosmtpd.smtp import SMTP as Server -+from aiosmtpd.testing.helpers import catchup_delay - --from .conftest import Global -+from .conftest import Global, AUTOSTOP_DELAY - - - class SlowStartController(Controller): -@@ -91,6 +97,45 @@ def safe_socket_dir() -> Generator[Path, None, None]: - tmpdir.rmdir() - - -+def assert_smtp_socket(controller: UnixSocketMixin): -+ assert Path(controller.unix_socket).exists() -+ sockfile = controller.unix_socket -+ ssl_context = controller.ssl_context -+ with ExitStack() as stk: -+ sock: socket.socket = stk.enter_context( -+ socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) -+ ) -+ sock.settimeout(AUTOSTOP_DELAY) -+ sock.connect(str(sockfile)) -+ if ssl_context: -+ sock = stk.enter_context(ssl_context.wrap_socket(sock)) -+ catchup_delay() -+ try: -+ resp = sock.recv(1024) -+ except socket.timeout: -+ return False -+ if not resp: -+ return False -+ assert resp.startswith(b"220 ") -+ assert resp.endswith(b"\r\n") -+ sock.send(b"EHLO socket.test\r\n") -+ # We need to "build" resparr because, especially when socket is wrapped -+ # in SSL, the SMTP server takes it sweet time responding with the list -+ # of ESMTP features ... -+ resparr = bytearray() -+ while not resparr.endswith(b"250 HELP\r\n"): -+ catchup_delay() -+ resp = sock.recv(1024) -+ if not resp: -+ break -+ resparr += resp -+ assert resparr.endswith(b"250 HELP\r\n") -+ sock.send(b"QUIT\r\n") -+ catchup_delay() -+ resp = sock.recv(1024) -+ assert resp.startswith(b"221") -+ -+ - class TestServer: - """Tests for the aiosmtpd.smtp.SMTP class""" - -@@ -272,10 +317,7 @@ class TestController: - - # Apparently errno.E* constants adapts to the OS, so on Windows they will - # automatically use the analogous WSAE* constants -- @pytest.mark.parametrize( -- "err", -- [errno.EADDRNOTAVAIL, errno.EAFNOSUPPORT] -- ) -+ @pytest.mark.parametrize("err", [errno.EADDRNOTAVAIL, errno.EAFNOSUPPORT]) - def test_getlocalhost_6no(self, mocker, err): - mock_makesock: mocker.Mock = mocker.patch( - "aiosmtpd.controller.makesock", -@@ -320,70 +362,176 @@ class TestController: - @pytest.mark.skipif(in_cygwin(), reason="Cygwin AF_UNIX is problematic") - @pytest.mark.skipif(in_win32(), reason="Win32 does not yet fully implement AF_UNIX") - class TestUnixSocketController: -- sockfile: Path = None -- -- def _assert_good_server(self, ssl_context: ssl.SSLContext = None): -- # Note: all those time.sleep()s are necessary -- # Remember that we're running in "Threaded" mode, and there's the GIL... -- # The time.sleep()s lets go of the GIL allowing the asyncio loop to move -- # forward -- assert self.sockfile.exists() -- with ExitStack() as stk: -- sock: socket.socket = stk.enter_context( -- socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) -- ) -- sock.connect(str(self.sockfile)) -- if ssl_context: -- sock = stk.enter_context(ssl_context.wrap_socket(sock)) -- time.sleep(0.1) -- resp = sock.recv(1024) -- assert resp.startswith(b"220 ") -- assert resp.endswith(b"\r\n") -- sock.send(b"EHLO socket.test\r\n") -- # We need to "build" resparr because, especially when socket is wrapped -- # in SSL, the SMTP server takes it sweet time responding with the list -- # of ESMTP features ... -- resparr = bytearray() -- while not resparr.endswith(b"250 HELP\r\n"): -- time.sleep(0.1) -- resp = sock.recv(1024) -- if not resp: -- break -- resparr += resp -- assert resparr.endswith(b"250 HELP\r\n") -- sock.send(b"QUIT\r\n") -- time.sleep(0.1) -- resp = sock.recv(1024) -- assert resp.startswith(b"221") -- - def test_server_creation(self, safe_socket_dir): -- self.sockfile = safe_socket_dir / "smtp" -- cont = UnixSocketController(Sink(), unix_socket=self.sockfile) -+ sockfile = safe_socket_dir / "smtp" -+ cont = UnixSocketController(Sink(), unix_socket=sockfile) - try: - cont.start() -- self._assert_good_server() -+ assert_smtp_socket(cont) - finally: - cont.stop() - - def test_server_creation_ssl(self, safe_socket_dir, ssl_context_server): -- self.sockfile = safe_socket_dir / "smtp" -+ sockfile = safe_socket_dir / "smtp" - cont = UnixSocketController( -- Sink(), unix_socket=self.sockfile, ssl_context=ssl_context_server -+ Sink(), unix_socket=sockfile, ssl_context=ssl_context_server - ) - try: - cont.start() - # Allow additional time for SSL to kick in -- time.sleep(0.1) -- self._assert_good_server(ssl_context_server) -+ catchup_delay() -+ assert_smtp_socket(cont) - finally: - cont.stop() - - -+class TestUnthreaded: -+ @pytest.fixture -+ def runner(self): -+ thread: Optional[Thread] = None -+ -+ def _runner(loop: asyncio.AbstractEventLoop): -+ loop.run_forever() -+ -+ def starter(loop: asyncio.AbstractEventLoop): -+ nonlocal thread -+ thread = Thread(target=_runner, args=(loop,)) -+ thread.setDaemon(True) -+ thread.start() -+ catchup_delay() -+ -+ def joiner(timeout: float = None): -+ nonlocal thread -+ assert isinstance(thread, Thread) -+ thread.join(timeout=timeout) -+ -+ def is_alive(): -+ nonlocal thread -+ assert isinstance(thread, Thread) -+ return thread.is_alive() -+ -+ starter.join = joiner -+ starter.is_alive = is_alive -+ return starter -+ -+ @pytest.mark.skipif(in_cygwin(), reason="Cygwin AF_UNIX is problematic") -+ @pytest.mark.skipif(in_win32(), reason="Win32 does not yet fully implement AF_UNIX") -+ def test_unixsocket(self, safe_socket_dir, autostop_loop, runner): -+ sockfile = safe_socket_dir / "smtp" -+ cont = UnixSocketUnthreadedController( -+ Sink(), unix_socket=sockfile, loop=autostop_loop -+ ) -+ cont.begin() -+ # Make sure event loop is not running (will be started in thread) -+ assert autostop_loop.is_running() is False -+ runner(autostop_loop) -+ # Make sure event loop is up and running (started within thread) -+ assert autostop_loop.is_running() is True -+ # Check we can connect -+ assert_smtp_socket(cont) -+ # Wait until thread ends, which it will be when the loop autostops -+ runner.join(timeout=AUTOSTOP_DELAY) -+ assert runner.is_alive() is False -+ catchup_delay() -+ assert autostop_loop.is_running() is False -+ # At this point, the loop _has_ stopped, but the task is still listening -+ assert assert_smtp_socket(cont) is False -+ # Stop the task -+ cont.end() -+ catchup_delay() -+ # Now the listener has gone away -+ # noinspection PyTypeChecker -+ with pytest.raises((socket.timeout, ConnectionError)): -+ assert_smtp_socket(cont) -+ -+ @pytest.mark.filterwarnings( -+ "ignore::pytest.PytestUnraisableExceptionWarning" -+ ) -+ def test_inet_loopstop(self, autostop_loop, runner): -+ """ -+ Verify behavior when the loop is stopped before controller is stopped -+ """ -+ autostop_loop.set_debug(True) -+ cont = UnthreadedController(Sink(), loop=autostop_loop) -+ cont.begin() -+ # Make sure event loop is not running (will be started in thread) -+ assert autostop_loop.is_running() is False -+ runner(autostop_loop) -+ # Make sure event loop is up and running (started within thread) -+ assert autostop_loop.is_running() is True -+ # Check we can connect -+ with SMTPClient(cont.hostname, cont.port, timeout=AUTOSTOP_DELAY) as client: -+ code, _ = client.helo("example.org") -+ assert code == 250 -+ # Wait until thread ends, which it will be when the loop autostops -+ runner.join(timeout=AUTOSTOP_DELAY) -+ assert runner.is_alive() is False -+ catchup_delay() -+ assert autostop_loop.is_running() is False -+ # At this point, the loop _has_ stopped, but the task is still listening, -+ # so rather than socket.timeout, we'll get a refusal instead, thus causing -+ # SMTPServerDisconnected -+ with pytest.raises(SMTPServerDisconnected): -+ SMTPClient(cont.hostname, cont.port, timeout=0.1) -+ cont.end() -+ catchup_delay() -+ cont.ended.wait() -+ # Now the listener has gone away, and thus we will end up with socket.timeout -+ # or ConnectionError (depending on OS) -+ # noinspection PyTypeChecker -+ with pytest.raises((socket.timeout, ConnectionError)): -+ SMTPClient(cont.hostname, cont.port, timeout=0.1) -+ -+ @pytest.mark.filterwarnings( -+ "ignore::pytest.PytestUnraisableExceptionWarning" -+ ) -+ def test_inet_contstop(self, temp_event_loop, runner): -+ """ -+ Verify behavior when the controller is stopped before loop is stopped -+ """ -+ cont = UnthreadedController(Sink(), loop=temp_event_loop) -+ cont.begin() -+ # Make sure event loop is not running (will be started in thread) -+ assert temp_event_loop.is_running() is False -+ runner(temp_event_loop) -+ # Make sure event loop is up and running -+ assert temp_event_loop.is_running() is True -+ try: -+ # Check that we can connect -+ with SMTPClient(cont.hostname, cont.port, timeout=AUTOSTOP_DELAY) as client: -+ code, _ = client.helo("example.org") -+ assert code == 250 -+ client.quit() -+ catchup_delay() -+ temp_event_loop.call_soon_threadsafe(cont.end) -+ for _ in range(10): # 10 is arbitrary -+ catchup_delay() # effectively yield to other threads/event loop -+ if cont.ended.wait(1.0): -+ break -+ assert temp_event_loop.is_running() is True -+ # Because we've called .end() there, the server listener should've gone -+ # away, so we should end up with a socket.timeout or ConnectionError or -+ # SMTPServerDisconnected (depending on lotsa factors) -+ expect_errs = (socket.timeout, ConnectionError, SMTPServerDisconnected) -+ # noinspection PyTypeChecker -+ with pytest.raises(expect_errs): -+ SMTPClient(cont.hostname, cont.port, timeout=0.1) -+ finally: -+ # Wrap up, or else we'll hang -+ temp_event_loop.call_soon_threadsafe(cont.cancel_tasks) -+ catchup_delay() -+ runner.join() -+ assert runner.is_alive() is False -+ assert temp_event_loop.is_running() is False -+ assert temp_event_loop.is_closed() is False -+ -+ - class TestFactory: - def test_normal_situation(self): - cont = Controller(Sink()) - try: - cont.start() -+ catchup_delay() - assert cont.smtpd is not None - assert cont._thread_exception is None - finally: -diff --git a/pyproject.toml b/pyproject.toml -index b61bfa6..e067d36 100644 ---- a/pyproject.toml -+++ b/pyproject.toml -@@ -3,7 +3,6 @@ requires = ["setuptools", "wheel"] - build-backend = "setuptools.build_meta" - - [tool.pytest.ini_options] --# addopts = """--doctest-glob="*.rst" --strict-markers -rfEX""" - addopts = """--strict-markers -rfEX""" - markers = [ - "client_data", -@@ -37,6 +36,7 @@ source = [ - [tool.coverage.coverage_conditional_plugin.rules] - # Here we specify our pragma rules: - py-ge-38 = "sys_version_info >= (3, 8)" -+py-lt-38 = "sys_version_info < (3, 8)" - py-gt-36 = "sys_version_info > (3, 6)" - has-mypy = "is_installed('mypy')" - has-pwd = "is_installed('pwd')" -@@ -47,10 +47,14 @@ on-wsl = "'Microsoft' in platform_release" - # As of 2021-02-07, only WSL has a kernel with "Microsoft" in the version. - on-not-win32 = "sys_platform != 'win32'" - on-cygwin = "sys_platform == 'cygwin'" -+no-unixsock = "sys_platform in {'win32', 'cygwin'}" - - [tool.coverage.report] - exclude_lines = [ - "pragma: nocover", -+ "pragma: no cover", -+ "@abstract", -+ 'class \S+\(Protocol\):' - ] - fail_under = 100 - show_missing = true --- -2.32.0 - diff --git a/0002-Code-Hygiene-259.patch b/0002-Code-Hygiene-259.patch deleted file mode 100644 index 5fddb26..0000000 --- a/0002-Code-Hygiene-259.patch +++ /dev/null @@ -1,2735 +0,0 @@ -From 1a1c1bb15d4659f1076c7e14a064721761d81aa6 Mon Sep 17 00:00:00 2001 -From: Pandu E POLUAN -Date: Tue, 23 Mar 2021 13:31:32 +0700 -Subject: [PATCH 2/4] Code Hygiene (#259) - -* Activate LOTS of flake8 plugins to enforce code hygiene -* Tune Annotation Thresholds -* Add Annotation -* Add pytest-mock to the deps of "docs" -* Fix post-rebase flake8 complaints -* Update NEWS.rst -* Move flake8 plugins into a pseudo-section in tox.ini -* Create concrete class for MessageHandler -* Bump Version to 1.5.0a2 -* Experimentally enable tox-ing on 3.10 -* Use typing.ByteString instead of custom AnyBytes ---- - .../workflows/unit-testing-and-coverage.yml | 10 +- - aiosmtpd/__init__.py | 2 +- - aiosmtpd/controller.py | 10 +- - aiosmtpd/docs/NEWS.rst | 5 +- - aiosmtpd/docs/_exts/autoprogramm.py | 64 ++++--- - aiosmtpd/docs/conf.py | 9 +- - aiosmtpd/docs/proxyprotocol.rst | 6 +- - aiosmtpd/docs/smtp.rst | 2 +- - aiosmtpd/handlers.py | 158 +++++++++++------- - aiosmtpd/lmtp.py | 6 +- - aiosmtpd/main.py | 11 +- - aiosmtpd/proxy_protocol.py | 32 ++-- - aiosmtpd/qa/test_0packaging.py | 38 ++++- - aiosmtpd/qa/test_1testsuite.py | 6 +- - aiosmtpd/smtp.py | 124 ++++++++------ - aiosmtpd/testing/helpers.py | 10 +- - aiosmtpd/tests/conftest.py | 48 +++--- - aiosmtpd/tests/test_handlers.py | 90 +++++++--- - aiosmtpd/tests/test_main.py | 16 +- - aiosmtpd/tests/test_proxyprotocol.py | 67 +++++--- - aiosmtpd/tests/test_server.py | 26 +-- - aiosmtpd/tests/test_smtp.py | 89 +++++----- - aiosmtpd/tests/test_starttls.py | 17 +- - housekeep.py | 3 +- - setup.cfg | 52 +++++- - tox.ini | 57 ++++++- - 26 files changed, 627 insertions(+), 331 deletions(-) - -diff --git a/.github/workflows/unit-testing-and-coverage.yml b/.github/workflows/unit-testing-and-coverage.yml -index f7b0e32..ebc2248 100644 ---- a/.github/workflows/unit-testing-and-coverage.yml -+++ b/.github/workflows/unit-testing-and-coverage.yml -@@ -38,9 +38,17 @@ jobs: - python -m pip install --upgrade pip setuptools wheel - python setup.py develop - - name: "flake8 Style Checking" -+ shell: bash - # language=bash - run: | -- pip install colorama flake8 flake8-bugbear -+ # A bunch of flake8 plugins... -+ grab_f8_plugins=( -+ "from configparser import ConfigParser;" -+ "config = ConfigParser();" -+ "config.read('tox.ini');" -+ "print(config['flake8_plugins']['deps']);" -+ ) -+ pip install colorama flake8 $(python -c "${grab_f8_plugins[*]}") - python -m flake8 aiosmtpd setup.py housekeep.py release.py - - name: "Docs Checking" - # language=bash -diff --git a/aiosmtpd/__init__.py b/aiosmtpd/__init__.py -index 9c7b938..e96d0ee 100644 ---- a/aiosmtpd/__init__.py -+++ b/aiosmtpd/__init__.py -@@ -1,4 +1,4 @@ - # Copyright 2014-2021 The aiosmtpd Developers - # SPDX-License-Identifier: Apache-2.0 - --__version__ = "1.5.0a1" -+__version__ = "1.5.0a2" -diff --git a/aiosmtpd/controller.py b/aiosmtpd/controller.py -index d3345b8..79bdbd0 100644 ---- a/aiosmtpd/controller.py -+++ b/aiosmtpd/controller.py -@@ -85,7 +85,7 @@ class _FakeServer(asyncio.StreamReaderProtocol): - factory() failed to instantiate an SMTP instance. - """ - -- def __init__(self, loop): -+ def __init__(self, loop: asyncio.AbstractEventLoop): - # Imitate what SMTP does - super().__init__( - asyncio.StreamReader(loop=loop), -@@ -93,7 +93,9 @@ class _FakeServer(asyncio.StreamReaderProtocol): - loop=loop, - ) - -- def _client_connected_cb(self, reader, writer): -+ def _client_connected_cb( -+ self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter -+ ) -> None: - pass - - -@@ -143,7 +145,7 @@ class BaseController(metaclass=ABCMeta): - """Subclasses can override this to customize the handler/server creation.""" - return SMTP(self.handler, **self.SMTP_kwargs) - -- def _factory_invoker(self): -+ def _factory_invoker(self) -> Union[SMTP, _FakeServer]: - """Wraps factory() to catch exceptions during instantiation""" - try: - self.smtpd = self.factory() -@@ -223,7 +225,7 @@ class BaseThreadedController(BaseController, metaclass=ABCMeta): - """ - raise NotImplementedError - -- def _run(self, ready_event: threading.Event): -+ def _run(self, ready_event: threading.Event) -> None: - asyncio.set_event_loop(self.loop) - try: - # Need to do two-step assignments here to ensure IDEs can properly -diff --git a/aiosmtpd/docs/NEWS.rst b/aiosmtpd/docs/NEWS.rst -index ce627a7..eea911d 100644 ---- a/aiosmtpd/docs/NEWS.rst -+++ b/aiosmtpd/docs/NEWS.rst -@@ -3,8 +3,8 @@ - ################### - - --1.5.0 (aiosmtpd-next-next) --========================== -+1.5.0 (aiosmtpd-next) -+===================== - - Added - ----- -@@ -13,6 +13,7 @@ Added - Fixed/Improved - -------------- - * All Controllers now have more rationale design, as they are now composited from a Base + a Mixin -+* A whole bunch of annotations - - - 1.4.2 (2021-03-08) -diff --git a/aiosmtpd/docs/_exts/autoprogramm.py b/aiosmtpd/docs/_exts/autoprogramm.py -index 69088be..c23bd2f 100644 ---- a/aiosmtpd/docs/_exts/autoprogramm.py -+++ b/aiosmtpd/docs/_exts/autoprogramm.py -@@ -32,6 +32,7 @@ import argparse - import builtins - import collections - import os -+import sphinx - - from docutils import nodes - from docutils.parsers.rst import Directive -@@ -39,13 +40,13 @@ from docutils.parsers.rst.directives import unchanged - from docutils.statemachine import StringList - from functools import reduce - from sphinx.util.nodes import nested_parse_with_titles --from typing import List -+from typing import Any, Dict, List, Optional, Tuple - - - __all__ = ("AutoprogrammDirective", "import_object", "scan_programs", "setup") - - --def get_subparser_action(parser): -+def get_subparser_action(parser: argparse.ArgumentParser) -> argparse._SubParsersAction: - neg1_action = parser._actions[-1] - - if isinstance(neg1_action, argparse._SubParsersAction): -@@ -56,7 +57,13 @@ def get_subparser_action(parser): - return a - - --def scan_programs(parser, command=None, maxdepth=0, depth=0, groups=False): -+def scan_programs( -+ parser: argparse.ArgumentParser, -+ command: List[str] = None, -+ maxdepth: int = 0, -+ depth: int = 0, -+ groups: bool = False, -+): - if command is None: - command = [] - -@@ -79,6 +86,7 @@ def scan_programs(parser, command=None, maxdepth=0, depth=0, groups=False): - subp_action = get_subparser_action(parser) - - if subp_action: -+ # noinspection PyUnresolvedReferences - choices = subp_action.choices.items() - - if not ( -@@ -89,11 +97,10 @@ def scan_programs(parser, command=None, maxdepth=0, depth=0, groups=False): - - for cmd, sub in choices: - if isinstance(sub, argparse.ArgumentParser): -- for program in scan_programs(sub, command + [cmd], maxdepth, depth + 1): -- yield program -+ yield from scan_programs(sub, command + [cmd], maxdepth, depth + 1) - - --def scan_options(actions): -+def scan_options(actions: list): - for arg in actions: - if not (arg.option_strings or isinstance(arg, argparse._SubParsersAction)): - yield format_positional_argument(arg) -@@ -103,13 +110,13 @@ def scan_options(actions): - yield format_option(arg) - - --def format_positional_argument(arg): -+def format_positional_argument(arg: argparse.Action) -> Tuple[List[str], str]: - desc = (arg.help or "") % {"default": arg.default} - name = arg.metavar or arg.dest - return [name], desc - - --def format_option(arg): -+def format_option(arg: argparse.Action) -> Tuple[List[str], str]: - desc = (arg.help or "") % {"default": arg.default} - - if not isinstance(arg, (argparse._StoreAction, argparse._AppendAction)): -@@ -131,7 +138,7 @@ def format_option(arg): - return names, desc - - --def import_object(import_name): -+def import_object(import_name: str) -> Any: - module_name, expr = import_name.split(":", 1) - try: - mod = __import__(module_name) -@@ -151,7 +158,8 @@ def import_object(import_name): - with open(f[0]) as fobj: - codestring = fobj.read() - foo = imp.new_module("foo") -- exec(codestring, foo.__dict__) # nosec -+ # noinspection BuiltinExec -+ exec(codestring, foo.__dict__) # noqa: DUO105 # nosec - - sys.modules["foo"] = foo - mod = __import__("foo") -@@ -163,7 +171,7 @@ def import_object(import_name): - globals_ = builtins - if not isinstance(globals_, dict): - globals_ = globals_.__dict__ -- return eval(expr, globals_, mod.__dict__) # nosec -+ return eval(expr, globals_, mod.__dict__) # noqa: DUO104 # nosec - - - class AutoprogrammDirective(Directive): -@@ -204,13 +212,16 @@ class AutoprogrammDirective(Directive): - - if start_command: - -- def get_start_cmd_parser(p): -+ def get_start_cmd_parser( -+ p: argparse.ArgumentParser, -+ ) -> argparse.ArgumentParser: - looking_for = start_command.pop(0) - action = get_subparser_action(p) - - if not action: - raise ValueError("No actions for command " + looking_for) - -+ # noinspection PyUnresolvedReferences - subp = action.choices[looking_for] - - if start_command: -@@ -263,7 +274,7 @@ class AutoprogrammDirective(Directive): - options_adornment=options_adornment, - ) - -- def run(self): -+ def run(self) -> list: - node = nodes.section() - node.document = self.state.document - result = StringList() -@@ -274,17 +285,17 @@ class AutoprogrammDirective(Directive): - - - def render_rst( -- title, -- options, -- is_program, -- is_subgroup, -- description, -- usage, -- usage_strip, -- usage_codeblock, -- epilog, -- options_title, -- options_adornment, -+ title: str, -+ options: List[Tuple[List[str], str]], -+ is_program: bool, -+ is_subgroup: bool, -+ description: str, -+ usage: Optional[str], -+ usage_strip: bool, -+ usage_codeblock: bool, -+ epilog: str, -+ options_title: str, -+ options_adornment: str, - ): - if usage_strip: - to_strip = title.rsplit(" ", 1)[0] -@@ -310,8 +321,7 @@ def render_rst( - yield ("!" if is_subgroup else "?") * len(title) - yield "" - -- for line in (description or "").splitlines(): -- yield line -+ yield from (description or "").splitlines() - yield "" - - if usage is None: -@@ -340,7 +350,7 @@ def render_rst( - yield line or "" - - --def setup(app): -+def setup(app: sphinx.application.Sphinx) -> Dict[str, Any]: - app.add_directive("autoprogramm", AutoprogrammDirective) - return { - "version": "0.2a0", -diff --git a/aiosmtpd/docs/conf.py b/aiosmtpd/docs/conf.py -index 6ee2d05..d3273f1 100644 ---- a/aiosmtpd/docs/conf.py -+++ b/aiosmtpd/docs/conf.py -@@ -1,6 +1,7 @@ --# -*- coding: utf-8 -*- --# --# aiosmtpd documentation build configuration file, created by -+# Copyright 2014-2021 The aiosmtpd Developers -+# SPDX-License-Identifier: Apache-2.0 -+ -+# aiosmtpd documentation build configuration file, originally created by - # sphinx-quickstart on Fri Oct 16 12:18:52 2015. - # - # This file is execfile()d with the current directory set to its -@@ -331,5 +332,5 @@ texinfo_documents = [ - # endregion - - --def setup(app): -+def setup(app): # noqa: ANN001 - app.add_css_file("aiosmtpd.css") -diff --git a/aiosmtpd/docs/proxyprotocol.rst b/aiosmtpd/docs/proxyprotocol.rst -index 30e01b7..eac41b0 100644 ---- a/aiosmtpd/docs/proxyprotocol.rst -+++ b/aiosmtpd/docs/proxyprotocol.rst -@@ -203,7 +203,7 @@ Enums - Valid only for address family of :attr:`AF.INET` or :attr:`AF.INET6` - - .. py:attribute:: rest -- :type: Union[bytes, bytearray] -+ :type: ByteString - - The contents depend on the version of the PROXY header *and* (for version 2) - the address family. -@@ -374,7 +374,7 @@ Enums - .. py:classmethod:: from_raw(raw) -> Optional[ProxyTLV] - - :param raw: The raw bytes containing the TLV Vectors -- :type raw: Union[bytes, bytearray] -+ :type raw: ByteString - :return: A new instance of ProxyTLV, or ``None`` if parsing failed - - This triggers the parsing of raw bytes/bytearray into a ProxyTLV instance. -@@ -387,7 +387,7 @@ Enums - .. py:classmethod:: parse(chunk, partial_ok=True) -> Dict[str, Any] - - :param chunk: The bytes to parse into TLV Vectors -- :type chunk: Union[bytes, bytearray] -+ :type chunk: ByteString - :param partial_ok: If ``True``, return partially-parsed TLV Vectors as is. - If ``False``, (re)raise ``MalformedTLV`` - :type partial_ok: bool -diff --git a/aiosmtpd/docs/smtp.rst b/aiosmtpd/docs/smtp.rst -index 3305079..b647e32 100644 ---- a/aiosmtpd/docs/smtp.rst -+++ b/aiosmtpd/docs/smtp.rst -@@ -499,7 +499,7 @@ aiosmtpd.smtp - - :param challenge: The SMTP AUTH challenge to send to the client. - May be in plaintext, may be in base64. Do NOT prefix with "334 "! -- :type challenge: Union[str, bytes, bytearray] -+ :type challenge: AnyStr - :param encode_to_b64: If true, will perform base64-encoding before sending - the challenge to the client. - :type encode_to_b64: bool -diff --git a/aiosmtpd/handlers.py b/aiosmtpd/handlers.py -index ada1e91..b22821e 100644 ---- a/aiosmtpd/handlers.py -+++ b/aiosmtpd/handlers.py -@@ -10,91 +10,114 @@ your own handling of messages. Implement only the methods you care about. - """ - - import asyncio -+import io - import logging - import mailbox -+import os - import re - import smtplib - import sys - from abc import ABCMeta, abstractmethod --from email import message_from_bytes, message_from_string -+from argparse import ArgumentParser -+from email.message import Message as Em_Message -+from email.parser import BytesParser, Parser -+from typing import AnyStr, Dict, List, Tuple, Type, TypeVar - - from public import public - --EMPTYBYTES = b'' --COMMASPACE = ', ' --CRLF = b'\r\n' --NLCRE = re.compile(br'\r\n|\r|\n') --log = logging.getLogger('mail.debug') -+from aiosmtpd.smtp import SMTP as SMTPServer -+from aiosmtpd.smtp import Envelope as SMTPEnvelope -+from aiosmtpd.smtp import Session as SMTPSession - -+T = TypeVar("T") - --def _format_peer(peer): -+EMPTYBYTES = b"" -+COMMASPACE = ", " -+CRLF = b"\r\n" -+NLCRE = re.compile(br"\r\n|\r|\n") -+log = logging.getLogger("mail.debug") -+ -+ -+def _format_peer(peer: str) -> str: - # This is a separate function mostly so the test suite can craft a - # reproducible output. -- return 'X-Peer: {!r}'.format(peer) -+ return "X-Peer: {!r}".format(peer) -+ -+ -+def message_from_bytes(s, *args, **kws): -+ return BytesParser(*args, **kws).parsebytes(s) -+ -+ -+def message_from_string(s, *args, **kws): -+ return Parser(*args, **kws).parsestr(s) - - - @public - class Debugging: -- def __init__(self, stream=None): -+ def __init__(self, stream: io.TextIOBase = None): - self.stream = sys.stdout if stream is None else stream - - @classmethod -- def from_cli(cls, parser, *args): -+ def from_cli(cls: Type[T], parser: ArgumentParser, *args) -> T: - error = False - stream = None - if len(args) == 0: - pass - elif len(args) > 1: - error = True -- elif args[0] == 'stdout': -+ elif args[0] == "stdout": - stream = sys.stdout -- elif args[0] == 'stderr': -+ elif args[0] == "stderr": - stream = sys.stderr - else: - error = True - if error: -- parser.error('Debugging usage: [stdout|stderr]') -+ parser.error("Debugging usage: [stdout|stderr]") - return cls(stream) - -- def _print_message_content(self, peer, data): -+ def _print_message_content(self, peer: str, data: AnyStr) -> None: - in_headers = True - for line in data.splitlines(): - # Dump the RFC 2822 headers first. - if in_headers and not line: - print(_format_peer(peer), file=self.stream) - in_headers = False -- if isinstance(data, bytes): -+ if isinstance(line, bytes): - # Avoid spurious 'str on bytes instance' warning. -- line = line.decode('utf-8', 'replace') -+ line = line.decode("utf-8", "replace") - print(line, file=self.stream) - -- async def handle_DATA(self, server, session, envelope): -- print('---------- MESSAGE FOLLOWS ----------', file=self.stream) -+ async def handle_DATA( -+ self, server: SMTPServer, session: SMTPSession, envelope: SMTPEnvelope -+ ) -> str: -+ print("---------- MESSAGE FOLLOWS ----------", file=self.stream) - # Yes, actually test for truthiness since it's possible for either the - # keywords to be missing, or for their values to be empty lists. - add_separator = False - if envelope.mail_options: -- print('mail options:', envelope.mail_options, file=self.stream) -+ print("mail options:", envelope.mail_options, file=self.stream) - add_separator = True - # rcpt_options are not currently support by the SMTP class. - rcpt_options = envelope.rcpt_options -- if any(rcpt_options): # pragma: nocover -- print('rcpt options:', rcpt_options, file=self.stream) -+ if any(rcpt_options): # pragma: nocover -+ print("rcpt options:", rcpt_options, file=self.stream) - add_separator = True - if add_separator: - print(file=self.stream) - self._print_message_content(session.peer, envelope.content) -- print('------------ END MESSAGE ------------', file=self.stream) -- return '250 OK' -+ print("------------ END MESSAGE ------------", file=self.stream) -+ return "250 OK" - - - @public - class Proxy: -- def __init__(self, remote_hostname, remote_port): -+ def __init__(self, remote_hostname: str, remote_port: int): - self._hostname = remote_hostname - self._port = remote_port - -- async def handle_DATA(self, server, session, envelope): -+ async def handle_DATA( -+ self, server: SMTPServer, session: SMTPSession, envelope: SMTPEnvelope -+ ) -> str: - if isinstance(envelope.content, str): - content = envelope.original_content - else: -@@ -107,15 +130,17 @@ class Proxy: - if NLCRE.match(line): - ending = line - break -- peer = session.peer[0].encode('ascii') -- lines.insert(_i, b'X-Peer: %s%s' % (peer, ending)) -+ peer = session.peer[0].encode("ascii") -+ lines.insert(_i, b"X-Peer: " + peer + ending) - data = EMPTYBYTES.join(lines) - refused = self._deliver(envelope.mail_from, envelope.rcpt_tos, data) - # TBD: what to do with refused addresses? -- log.info('we got some refusals: %s', refused) -- return '250 OK' -+ log.info("we got some refusals: %s", refused) -+ return "250 OK" - -- def _deliver(self, mail_from, rcpt_tos, data): -+ def _deliver( -+ self, mail_from: AnyStr, rcpt_tos: List[AnyStr], data: AnyStr -+ ) -> Dict[str, Tuple[int, bytes]]: - refused = {} - try: - s = smtplib.SMTP() -@@ -125,15 +150,15 @@ class Proxy: - finally: - s.quit() - except smtplib.SMTPRecipientsRefused as e: -- log.info('got SMTPRecipientsRefused') -+ log.info("got SMTPRecipientsRefused") - refused = e.recipients - except (OSError, smtplib.SMTPException) as e: -- log.exception('got %s', e.__class__) -+ log.exception("got %s", e.__class__) - # All recipients were refused. If the exception had an associated - # error code, use it. Otherwise, fake it with a non-triggering - # exception code. -- errcode = getattr(e, 'smtp_code', -1) -- errmsg = getattr(e, 'smtp_error', 'ignore') -+ errcode = getattr(e, "smtp_code", -1) -+ errmsg = getattr(e, "smtp_error", "ignore") - for r in rcpt_tos: - refused[r] = (errcode, errmsg) - return refused -@@ -142,75 +167,88 @@ class Proxy: - @public - class Sink: - @classmethod -- def from_cli(cls, parser, *args): -+ def from_cli(cls: Type[T], parser: ArgumentParser, *args) -> T: - if len(args) > 0: -- parser.error('Sink handler does not accept arguments') -+ parser.error("Sink handler does not accept arguments") - return cls() - - - @public - class Message(metaclass=ABCMeta): -- def __init__(self, message_class=None): -+ def __init__(self, message_class: Type[Em_Message] = None): - self.message_class = message_class - -- async def handle_DATA(self, server, session, envelope): -- envelope = self.prepare_message(session, envelope) -- self.handle_message(envelope) -- return '250 OK' -+ async def handle_DATA( -+ self, server: SMTPServer, session: SMTPSession, envelope: SMTPEnvelope -+ ) -> str: -+ message = self.prepare_message(session, envelope) -+ self.handle_message(message) -+ return "250 OK" - -- def prepare_message(self, session, envelope): -+ def prepare_message( -+ self, session: SMTPSession, envelope: SMTPEnvelope -+ ) -> Em_Message: - # If the server was created with decode_data True, then data will be a - # str, otherwise it will be bytes. - data = envelope.content -- if isinstance(data, bytes): -+ message: Em_Message -+ if isinstance(data, (bytes, bytearray)): - message = message_from_bytes(data, self.message_class) -- else: -- assert isinstance(data, str), ( -- 'Expected str or bytes, got {}'.format(type(data))) -+ elif isinstance(data, str): - message = message_from_string(data, self.message_class) -- message['X-Peer'] = str(session.peer) -- message['X-MailFrom'] = envelope.mail_from -- message['X-RcptTo'] = COMMASPACE.join(envelope.rcpt_tos) -+ else: -+ raise TypeError(f"Expected str or bytes, got {type(data)}") -+ assert isinstance(message, Em_Message) -+ message["X-Peer"] = str(session.peer) -+ message["X-MailFrom"] = envelope.mail_from -+ message["X-RcptTo"] = COMMASPACE.join(envelope.rcpt_tos) - return message - - @abstractmethod -- def handle_message(self, message): -+ def handle_message(self, message: Em_Message) -> None: - raise NotImplementedError - - - @public - class AsyncMessage(Message, metaclass=ABCMeta): -- def __init__(self, message_class=None, *, loop=None): -+ def __init__( -+ self, -+ message_class: Type[Em_Message] = None, -+ *, -+ loop: asyncio.AbstractEventLoop = None, -+ ): - super().__init__(message_class) - self.loop = loop or asyncio.get_event_loop() - -- async def handle_DATA(self, server, session, envelope): -+ async def handle_DATA( -+ self, server: SMTPServer, session: SMTPSession, envelope: SMTPEnvelope -+ ) -> str: - message = self.prepare_message(session, envelope) - await self.handle_message(message) -- return '250 OK' -+ return "250 OK" - - @abstractmethod -- async def handle_message(self, message): -+ async def handle_message(self, message: Em_Message) -> None: - raise NotImplementedError - - - @public - class Mailbox(Message): -- def __init__(self, mail_dir, message_class=None): -+ def __init__(self, mail_dir: os.PathLike, message_class: Type[Em_Message] = None): - self.mailbox = mailbox.Maildir(mail_dir) - self.mail_dir = mail_dir - super().__init__(message_class) - -- def handle_message(self, message): -+ def handle_message(self, message: Em_Message) -> None: - self.mailbox.add(message) - -- def reset(self): -+ def reset(self) -> None: - self.mailbox.clear() - - @classmethod -- def from_cli(cls, parser, *args): -+ def from_cli(cls: Type[T], parser: ArgumentParser, *args) -> T: - if len(args) < 1: -- parser.error('The directory for the maildir is required') -+ parser.error("The directory for the maildir is required") - elif len(args) > 1: -- parser.error('Too many arguments for Mailbox handler') -+ parser.error("Too many arguments for Mailbox handler") - return cls(args[0]) -diff --git a/aiosmtpd/lmtp.py b/aiosmtpd/lmtp.py -index 3f13af7..de68808 100644 ---- a/aiosmtpd/lmtp.py -+++ b/aiosmtpd/lmtp.py -@@ -11,14 +11,14 @@ class LMTP(SMTP): - show_smtp_greeting: bool = False - - @syntax('LHLO hostname') -- async def smtp_LHLO(self, arg): -+ async def smtp_LHLO(self, arg: str) -> None: - """The LMTP greeting, used instead of HELO/EHLO.""" - await super().smtp_EHLO(arg) - -- async def smtp_HELO(self, arg): -+ async def smtp_HELO(self, arg: str) -> None: - """HELO is not a valid LMTP command.""" - await self.push('500 Error: command "HELO" not recognized') - -- async def smtp_EHLO(self, arg): -+ async def smtp_EHLO(self, arg: str) -> None: - """EHLO is not a valid LMTP command.""" - await self.push('500 Error: command "EHLO" not recognized') -diff --git a/aiosmtpd/main.py b/aiosmtpd/main.py -index e978c60..2366ae4 100644 ---- a/aiosmtpd/main.py -+++ b/aiosmtpd/main.py -@@ -7,11 +7,12 @@ import os - import signal - import ssl - import sys --from argparse import ArgumentParser -+from argparse import ArgumentParser, Namespace - from contextlib import suppress - from functools import partial - from importlib import import_module - from pathlib import Path -+from typing import Optional, Sequence, Tuple - - from public import public - -@@ -167,7 +168,7 @@ def _parser() -> ArgumentParser: - return parser - - --def parseargs(args=None): -+def parseargs(args: Optional[Sequence[str]] = None) -> Tuple[ArgumentParser, Namespace]: - parser = _parser() - parsed = parser.parse_args(args) - # Find the handler class. -@@ -214,7 +215,7 @@ def parseargs(args=None): - - - @public --def main(args=None): -+def main(args: Optional[Sequence[str]] = None) -> None: - parser, args = parseargs(args=args) - - if args.setuid: # pragma: on-win32 -@@ -285,10 +286,8 @@ def main(args=None): - loop.add_signal_handler(signal.SIGINT, loop.stop) - - log.debug("Starting asyncio loop") -- try: -+ with suppress(KeyboardInterrupt): - loop.run_forever() -- except KeyboardInterrupt: -- pass - server_loop.close() - log.debug("Completed asyncio loop") - loop.run_until_complete(server_loop.wait_closed()) -diff --git a/aiosmtpd/proxy_protocol.py b/aiosmtpd/proxy_protocol.py -index 621098c..27d202a 100644 ---- a/aiosmtpd/proxy_protocol.py -+++ b/aiosmtpd/proxy_protocol.py -@@ -1,6 +1,7 @@ - # Copyright 2014-2021 The aiosmtpd Developers - # SPDX-License-Identifier: Apache-2.0 - -+import contextlib - import logging - import re - import struct -@@ -8,7 +9,7 @@ from collections import deque - from enum import IntEnum - from functools import partial - from ipaddress import IPv4Address, IPv6Address, ip_address --from typing import Any, AnyStr, Dict, Optional, Tuple, Union -+from typing import Any, AnyStr, ByteString, Dict, Optional, Tuple, Union - - import attr - from public import public -@@ -73,9 +74,10 @@ V2_PARSE_ADDR_FAMPRO = { - """Family & Proto combinations that need address parsing""" - - --__all__ = [ -+__all__ = ["struct", "partial", "IPv4Address", "IPv6Address"] -+__all__.extend( - k for k in globals().keys() if k.startswith("V1_") or k.startswith("V2_") --] + ["struct", "partial", "IPv4Address", "IPv6Address"] -+) - - - _NOT_FOUND = object() -@@ -144,10 +146,10 @@ class ProxyTLV(dict): - super().__init__(*args, **kwargs) - self.tlv_loc = _tlv_loc - -- def __getattr__(self, item): -+ def __getattr__(self, item: str) -> Any: - return self.get(item) - -- def __eq__(self, other): -+ def __eq__(self, other: Dict[str, Any]) -> bool: - return super().__eq__(other) - - def same_attribs(self, _raises: bool = False, **kwargs) -> bool: -@@ -175,7 +177,7 @@ class ProxyTLV(dict): - @classmethod - def parse( - cls, -- data: Union[bytes, bytearray], -+ data: ByteString, - partial_ok: bool = True, - strict: bool = False, - ) -> Tuple[Dict[str, Any], Dict[str, int]]: -@@ -189,7 +191,7 @@ class ProxyTLV(dict): - rslt: Dict[str, Any] = {} - tlv_loc: Dict[str, int] = {} - -- def _pars(chunk: Union[bytes, bytearray], *, offset: int): -+ def _pars(chunk: ByteString, *, offset: int) -> None: - i = 0 - while i < len(chunk): - typ = chunk[i] -@@ -228,7 +230,7 @@ class ProxyTLV(dict): - - @classmethod - def from_raw( -- cls, raw: Union[bytes, bytearray], strict: bool = False -+ cls, raw: ByteString, strict: bool = False - ) -> Optional["ProxyTLV"]: - """ - Parses raw bytes for TLV Vectors, decode them and giving them human-readable -@@ -275,7 +277,7 @@ class ProxyData: - dst_addr: Optional[EndpointAddress] = _anoinit(default=None) - src_port: Optional[int] = _anoinit(default=None) - dst_port: Optional[int] = _anoinit(default=None) -- rest: Union[bytes, bytearray] = _anoinit(default=b"") -+ rest: ByteString = _anoinit(default=b"") - """ - Rest of PROXY Protocol data following UNKNOWN (v1) or UNSPEC (v2), or containing - undecoded TLV (v2). If the latter, you can use the ProxyTLV class to parse the -@@ -302,12 +304,10 @@ class ProxyData: - return not (self.error or self.version is None or self.protocol is None) - - @property -- def tlv(self): -+ def tlv(self) -> Optional[ProxyTLV]: - if self._tlv is None: -- try: -+ with contextlib.suppress(MalformedTLV): - self._tlv = ProxyTLV.from_raw(self.rest) -- except MalformedTLV: -- pass - return self._tlv - - def with_error(self, error_msg: str, log_prefix: bool = True) -> "ProxyData": -@@ -340,7 +340,7 @@ class ProxyData: - return False - return True - -- def __bool__(self): -+ def __bool__(self) -> bool: - return self.valid - - -@@ -353,7 +353,7 @@ RE_PORT_NOLEADZERO = re.compile(r"^[1-9]\d{0,4}|0$") - # Reference: https://github.com/haproxy/haproxy/blob/v2.3.0/doc/proxy-protocol.txt - - --async def _get_v1(reader: AsyncReader, initial=b"") -> ProxyData: -+async def _get_v1(reader: AsyncReader, initial: ByteString = b"") -> ProxyData: - proxy_data = ProxyData(version=1) - proxy_data.whole_raw = bytearray(initial) - -@@ -437,7 +437,7 @@ async def _get_v1(reader: AsyncReader, initial=b"") -> ProxyData: - return proxy_data - - --async def _get_v2(reader: AsyncReader, initial=b"") -> ProxyData: -+async def _get_v2(reader: AsyncReader, initial: ByteString = b"") -> ProxyData: - proxy_data = ProxyData(version=2) - whole_raw = bytearray() - -diff --git a/aiosmtpd/qa/test_0packaging.py b/aiosmtpd/qa/test_0packaging.py -index 2240762..9dbb115 100644 ---- a/aiosmtpd/qa/test_0packaging.py -+++ b/aiosmtpd/qa/test_0packaging.py -@@ -2,8 +2,10 @@ - # SPDX-License-Identifier: Apache-2.0 - - """Test meta / packaging""" -+ - import re - import subprocess -+from datetime import datetime - from itertools import tee - from pathlib import Path - -@@ -15,6 +17,7 @@ from packaging import version - from aiosmtpd import __version__ - - RE_DUNDERVER = re.compile(r"__version__\s*?=\s*?(['\"])(?P[^'\"]+)\1\s*$") -+RE_VERHEADING = re.compile(r"(?P[0-9.]+)\s*\((?P[^)]+)\)") - - - @pytest.fixture -@@ -23,14 +26,16 @@ def aiosmtpd_version() -> version.Version: - - - class TestVersion: -- def test_pep440(self, aiosmtpd_version): -+ def test_pep440(self, aiosmtpd_version: version.Version): - """Ensure version number compliance to PEP-440""" - assert isinstance( - aiosmtpd_version, version.Version - ), "Version number must comply with PEP-440" - - # noinspection PyUnboundLocalVariable -- def test_ge_master(self, aiosmtpd_version, capsys): -+ def test_ge_master( -+ self, aiosmtpd_version: version.Version, capsys: pytest.CaptureFixture -+ ): - """Ensure version is monotonically increasing""" - reference = "master:aiosmtpd/__init__.py" - cmd = f"git show {reference}".split() -@@ -50,10 +55,11 @@ class TestVersion: - assert aiosmtpd_version >= master_ver, "Version number cannot be < master's" - - --class TestDocs: -- def test_NEWS_version(self, aiosmtpd_version): -- news_rst = next(Path("..").rglob("*/NEWS.rst")) -- with open(news_rst, "rt") as fin: -+class TestNews: -+ news_rst = list(Path("..").rglob("*/NEWS.rst"))[0] -+ -+ def test_NEWS_version(self, aiosmtpd_version: version.Version): -+ with self.news_rst.open("rt") as fin: - # pairwise() from https://docs.python.org/3/library/itertools.html - a, b = tee(fin) - next(b, None) -@@ -73,3 +79,23 @@ class TestDocs: - f"NEWS.rst is not updated: " - f"{newsver.base_version} < {aiosmtpd_version.base_version}" - ) -+ -+ def test_release_date(self, aiosmtpd_version: version.Version): -+ if aiosmtpd_version.pre is not None: -+ pytest.skip("Not a release version") -+ with self.news_rst.open("rt") as fin: -+ for ln in fin: -+ ln = ln.strip() -+ m = RE_VERHEADING.match(ln) -+ if not m: -+ continue -+ ver = version.Version(m.group("ver")) -+ if ver != aiosmtpd_version: -+ continue -+ try: -+ datetime.strptime(m.group("date"), "%Y-%m-%d") -+ except ValueError: -+ pytest.fail("Release version not dated correctly") -+ break -+ else: -+ pytest.fail("Release version has no NEWS fragment") -diff --git a/aiosmtpd/qa/test_1testsuite.py b/aiosmtpd/qa/test_1testsuite.py -index e61a71d..db20c61 100644 ---- a/aiosmtpd/qa/test_1testsuite.py -+++ b/aiosmtpd/qa/test_1testsuite.py -@@ -19,7 +19,7 @@ RE_ESC = re.compile(rb"(?P\d)\.\d+\.\d+\s") - - # noinspection PyUnresolvedReferences - @pytest.fixture(scope="module", autouse=True) --def exit_on_fail(request): -+def exit_on_fail(request: pytest.FixtureRequest): - # Behavior of this will be undefined if tests are running in parallel. - # But since parallel running is not practically possible (the ports will conflict), - # then I don't think that will be a problem. -@@ -65,7 +65,9 @@ class TestStatusCodes: - f"{key}: First digit of Enhanced Status Code different from " - f"first digit of Standard Status Code" - ) -- total_correct += 1 -+ # Can't use enumerate(); total_correct does not increase in lockstep with -+ # the loop (there are several "continue"s above) -+ total_correct += 1 # noqa: SIM113 - assert total_correct > 0 - - def test_commands(self): -diff --git a/aiosmtpd/smtp.py b/aiosmtpd/smtp.py -index 04a3497..b985b64 100644 ---- a/aiosmtpd/smtp.py -+++ b/aiosmtpd/smtp.py -@@ -24,7 +24,9 @@ from typing import ( - List, - NamedTuple, - Optional, -+ Sequence, - Tuple, -+ TypeVar, - Union, - ) - from warnings import warn -@@ -39,7 +41,7 @@ from aiosmtpd.proxy_protocol import ProxyData, get_proxy - # region #### Custom Data Types ####################################################### - - class _Missing: -- def __repr__(self): -+ def __repr__(self) -> str: - return "MISSING" - - -@@ -59,6 +61,9 @@ AuthenticatorType = Callable[["SMTP", "Session", "Envelope", str, Any], "AuthRes - AuthMechanismType = Callable[["SMTP", List[str]], Awaitable[Any]] - _TriStateType = Union[None, _Missing, bytes] - -+RT = TypeVar("RT") # "ReturnType" -+DecoratorType = Callable[[Callable[..., RT]], Callable[..., RT]] -+ - - # endregion - -@@ -149,7 +154,7 @@ class LoginPassword(NamedTuple): - - @public - class Session: -- def __init__(self, loop): -+ def __init__(self, loop: asyncio.AbstractEventLoop): - self.peer = None - self.ssl = None - self.host_name = None -@@ -172,7 +177,7 @@ class Session: - self.authenticated = None - - @property -- def login_data(self): -+ def login_data(self) -> Any: - """Legacy login_data, usually containing the username""" - log.warning( - "Session.login_data is deprecated and will be removed in version 2.0" -@@ -180,7 +185,7 @@ class Session: - return self._login_data - - @login_data.setter -- def login_data(self, value): -+ def login_data(self, value: Any) -> None: - log.warning( - "Session.login_data is deprecated and will be removed in version 2.0" - ) -@@ -189,7 +194,7 @@ class Session: - - @public - class Envelope: -- def __init__(self): -+ def __init__(self) -> None: - self.mail_from = None - self.mail_options = [] - self.smtp_utf8 = False -@@ -202,12 +207,14 @@ class Envelope: - # This is here to enable debugging output when the -E option is given to the - # unit test suite. In that case, this function is mocked to set the debug - # level on the loop (as if PYTHONASYNCIODEBUG=1 were set). --def make_loop(): -+def make_loop() -> asyncio.AbstractEventLoop: - return asyncio.get_event_loop() - - - @public --def syntax(text, extended=None, when: Optional[str] = None): -+def syntax( -+ text: str, extended: str = None, when: Optional[str] = None -+) -> DecoratorType: - """ - A @decorator that provides helptext for (E)SMTP HELP. - Applies for smtp_* methods only! -@@ -217,7 +224,7 @@ def syntax(text, extended=None, when: Optional[str] = None): - :param when: The name of the attribute of SMTP class to check; if the value - of the attribute is false-y then HELP will not be available for the command - """ -- def decorator(f): -+ def decorator(f: Callable[..., RT]) -> Callable[..., RT]: - f.__smtp_syntax__ = text - f.__smtp_syntax_extended__ = extended - f.__smtp_syntax_when__ = when -@@ -226,7 +233,7 @@ def syntax(text, extended=None, when: Optional[str] = None): - - - @public --def auth_mechanism(actual_name: str): -+def auth_mechanism(actual_name: str) -> DecoratorType: - """ - A @decorator to explicitly specifies the name of the AUTH mechanism implemented by - the function/method this decorates -@@ -234,9 +241,10 @@ def auth_mechanism(actual_name: str): - :param actual_name: Name of AUTH mechanism. Must consists of [A-Z0-9_-] only. - Will be converted to uppercase - """ -- def decorator(f): -+ def decorator(f: Callable[..., RT]) -> Callable[..., RT]: - f.__auth_mechanism_name__ = actual_name - return f -+ - actual_name = actual_name.upper() - if not VALID_AUTHMECH.match(actual_name): - raise ValueError(f"Invalid AUTH mechanism name: {actual_name}") -@@ -249,7 +257,7 @@ def login_always_fail( - return False - - --def is_int(o): -+def is_int(o: Any) -> bool: - return isinstance(o, int) - - -@@ -267,7 +275,7 @@ def sanitize(text: bytes) -> bytes: - - - @public --def sanitized_log(func: Callable, msg: AnyStr, *args, **kwargs): -+def sanitized_log(func: Callable[..., None], msg: AnyStr, *args, **kwargs) -> None: - """ - Sanitize args before passing to a logging function. - """ -@@ -305,24 +313,24 @@ class SMTP(asyncio.StreamReaderProtocol): - - def __init__( - self, -- handler, -+ handler: Any, - *, -- data_size_limit=DATA_SIZE_DEFAULT, -- enable_SMTPUTF8=False, -- decode_data=False, -- hostname=None, -- ident=None, -+ data_size_limit: int = DATA_SIZE_DEFAULT, -+ enable_SMTPUTF8: bool = False, -+ decode_data: bool = False, -+ hostname: str = None, -+ ident: str = None, - tls_context: Optional[ssl.SSLContext] = None, -- require_starttls=False, -- timeout=300, -- auth_required=False, -- auth_require_tls=True, -+ require_starttls: bool = False, -+ timeout: float = 300, -+ auth_required: bool = False, -+ auth_require_tls: bool = True, - auth_exclude_mechanism: Optional[Iterable[str]] = None, - auth_callback: AuthCallbackType = None, - command_call_limit: Union[int, Dict[str, int], None] = None, - authenticator: AuthenticatorType = None, - proxy_protocol_timeout: Optional[Union[int, float]] = None, -- loop=None -+ loop: asyncio.AbstractEventLoop = None - ): - self.__ident__ = ident or __ident__ - self.loop = loop if loop else make_loop() -@@ -343,7 +351,7 @@ class SMTP(asyncio.StreamReaderProtocol): - self.tls_context = tls_context - if tls_context: - if (tls_context.verify_mode -- not in {ssl.CERT_NONE, ssl.CERT_OPTIONAL}): -+ not in {ssl.CERT_NONE, ssl.CERT_OPTIONAL}): # noqa: DUO122 - log.warning("tls_context.verify_mode not in {CERT_NONE, " - "CERT_OPTIONAL}; this might cause client " - "connection problems") -@@ -452,13 +460,13 @@ class SMTP(asyncio.StreamReaderProtocol): - else: - raise TypeError("command_call_limit must be int or Dict[str, int]") - -- def _create_session(self): -+ def _create_session(self) -> Session: - return Session(self.loop) - -- def _create_envelope(self): -+ def _create_envelope(self) -> Envelope: - return Envelope() - -- async def _call_handler_hook(self, command, *args): -+ async def _call_handler_hook(self, command: str, *args) -> Any: - hook = self._handle_hooks.get(command) - if hook is None: - return MISSING -@@ -466,7 +474,7 @@ class SMTP(asyncio.StreamReaderProtocol): - return status - - @property -- def max_command_size_limit(self): -+ def max_command_size_limit(self) -> int: - try: - return max(self.command_size_limits.values()) - except ValueError: -@@ -484,7 +492,7 @@ class SMTP(asyncio.StreamReaderProtocol): - if closed.done() and not closed.cancelled(): - closed.exception() - -- def connection_made(self, transport): -+ def connection_made(self, transport: asyncio.transports.Transport) -> None: - # Reset state due to rfc3207 part 4.2. - self._set_rset_state() - self.session = self._create_session() -@@ -513,7 +521,7 @@ class SMTP(asyncio.StreamReaderProtocol): - self._handler_coroutine = self.loop.create_task( - self._handle_client()) - -- def connection_lost(self, error): -+ def connection_lost(self, error: Optional[Exception]) -> None: - log.info('%r connection lost', self.session.peer) - self._timeout_handle.cancel() - # If STARTTLS was issued, then our transport is the SSL protocol -@@ -527,7 +535,7 @@ class SMTP(asyncio.StreamReaderProtocol): - self._handler_coroutine.cancel() - self.transport = None - -- def eof_received(self): -+ def eof_received(self) -> bool: - log.info('%r EOF received', self.session.peer) - self._handler_coroutine.cancel() - if self.session.ssl is not None: -@@ -537,7 +545,7 @@ class SMTP(asyncio.StreamReaderProtocol): - return False - return super().eof_received() - -- def _reset_timeout(self, duration=None): -+ def _reset_timeout(self, duration: float = None) -> None: - if self._timeout_handle is not None: - self._timeout_handle.cancel() - self._timeout_handle = self.loop.call_later( -@@ -552,7 +560,9 @@ class SMTP(asyncio.StreamReaderProtocol): - # up state. - self.transport.close() - -- def _client_connected_cb(self, reader, writer): -+ def _client_connected_cb( -+ self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter -+ ): - # This is redundant since we subclass StreamReaderProtocol, but I like - # the shorter names. - self._reader = reader -@@ -577,7 +587,7 @@ class SMTP(asyncio.StreamReaderProtocol): - log.debug("%r << %r", self.session.peer, response) - await self._writer.drain() - -- async def handle_exception(self, error): -+ async def handle_exception(self, error: Exception) -> str: - if hasattr(self.event_handler, 'handle_exception'): - status = await self.event_handler.handle_exception(error) - return status -@@ -678,9 +688,11 @@ class SMTP(asyncio.StreamReaderProtocol): - await self.push('500 Error: strict ASCII mode') - # Should we await self.handle_exception()? - continue -- max_sz = (self.command_size_limits[command] -- if self.session.extended_smtp -- else self.command_size_limit) -+ max_sz = ( -+ self.command_size_limits[command] -+ if self.session.extended_smtp -+ else self.command_size_limit -+ ) - if len(line) > max_sz: - await self.push('500 Command line too long') - continue -@@ -720,7 +732,8 @@ class SMTP(asyncio.StreamReaderProtocol): - self.transport.close() - continue - await self.push( -- '500 Error: command "%s" not recognized' % command) -+ f'500 Error: command "{command}" not recognized' -+ ) - continue - - # Received a valid command, reset the timer. -@@ -785,7 +798,7 @@ class SMTP(asyncio.StreamReaderProtocol): - - # SMTP and ESMTP commands - @syntax('HELO hostname') -- async def smtp_HELO(self, hostname): -+ async def smtp_HELO(self, hostname: str): - if not hostname: - await self.push('501 Syntax: HELO hostname') - return -@@ -798,7 +811,7 @@ class SMTP(asyncio.StreamReaderProtocol): - await self.push(status) - - @syntax('EHLO hostname') -- async def smtp_EHLO(self, hostname): -+ async def smtp_EHLO(self, hostname: str): - if not hostname: - await self.push('501 Syntax: EHLO hostname') - return -@@ -806,9 +819,9 @@ class SMTP(asyncio.StreamReaderProtocol): - response = [] - self._set_rset_state() - self.session.extended_smtp = True -- response.append('250-%s' % self.hostname) -+ response.append('250-' + self.hostname) - if self.data_size_limit: -- response.append('250-SIZE %s' % self.data_size_limit) -+ response.append(f'250-SIZE {self.data_size_limit}') - self.command_size_limits['MAIL'] += 26 - if not self._decode_data: - response.append('250-8BITMIME') -@@ -848,12 +861,12 @@ class SMTP(asyncio.StreamReaderProtocol): - await self.push(r) - - @syntax('NOOP [ignored]') -- async def smtp_NOOP(self, arg): -+ async def smtp_NOOP(self, arg: str): - status = await self._call_handler_hook('NOOP', arg) - await self.push('250 OK' if status is MISSING else status) - - @syntax('QUIT') -- async def smtp_QUIT(self, arg): -+ async def smtp_QUIT(self, arg: str): - if arg: - await self.push('501 Syntax: QUIT') - else: -@@ -863,7 +876,7 @@ class SMTP(asyncio.StreamReaderProtocol): - self.transport.close() - - @syntax('STARTTLS', when='tls_context') -- async def smtp_STARTTLS(self, arg): -+ async def smtp_STARTTLS(self, arg: str): - if arg: - await self.push('501 Syntax: STARTTLS') - return -@@ -1032,7 +1045,7 @@ class SMTP(asyncio.StreamReaderProtocol): - encode_to_b64=False, - ) - -- def _authenticate(self, mechanism, auth_data) -> AuthResult: -+ def _authenticate(self, mechanism: str, auth_data: Any) -> AuthResult: - if self._authenticator is not None: - # self.envelope is likely still empty, but we'll pass it anyways to - # make the invocation similar to the one in _call_handler_hook -@@ -1093,7 +1106,7 @@ class SMTP(asyncio.StreamReaderProtocol): - assert password is not None - return self._authenticate("PLAIN", LoginPassword(login, password)) - -- async def auth_LOGIN(self, _, args: List[str]): -+ async def auth_LOGIN(self, _, args: List[str]) -> AuthResult: - login: _TriStateType - if len(args) == 1: - # Client sent only "AUTH LOGIN" -@@ -1117,13 +1130,13 @@ class SMTP(asyncio.StreamReaderProtocol): - - return self._authenticate("LOGIN", LoginPassword(login, password)) - -- def _strip_command_keyword(self, keyword, arg): -+ def _strip_command_keyword(self, keyword: str, arg: str) -> Optional[str]: - keylen = len(keyword) - if arg[:keylen].upper() == keyword: - return arg[keylen:].strip() - return None - -- def _getaddr(self, arg) -> Tuple[Optional[str], Optional[str]]: -+ def _getaddr(self, arg: str) -> Tuple[Optional[str], Optional[str]]: - """ - Try to parse address given in SMTP command. - -@@ -1145,7 +1158,9 @@ class SMTP(asyncio.StreamReaderProtocol): - return None, None - return address, rest - -- def _getparams(self, params): -+ def _getparams( -+ self, params: Sequence[str] -+ ) -> Optional[Dict[str, Union[str, bool]]]: - # Return params as dictionary. Return None if not all parameters - # appear to be syntactically valid according to RFC 1869. - result = {} -@@ -1156,7 +1171,8 @@ class SMTP(asyncio.StreamReaderProtocol): - result[param] = value if eq else True - return result - -- def _syntax_available(self, method): -+ # noinspection PyUnresolvedReferences -+ def _syntax_available(self, method: Callable) -> bool: - if not hasattr(method, '__smtp_syntax__'): - return False - if method.__smtp_syntax_when__: -@@ -1193,7 +1209,7 @@ class SMTP(asyncio.StreamReaderProtocol): - if arg: - address, params = self._getaddr(arg) - if address is None: -- await self.push('502 Could not VRFY %s' % arg) -+ await self.push('502 Could not VRFY ' + arg) - else: - status = await self._call_handler_hook('VRFY', address) - await self.push( -@@ -1314,7 +1330,7 @@ class SMTP(asyncio.StreamReaderProtocol): - await self.push(status) - - @syntax('RSET') -- async def smtp_RSET(self, arg): -+ async def smtp_RSET(self, arg: str): - if arg: - await self.push('501 Syntax: RSET') - return -@@ -1458,5 +1474,5 @@ class SMTP(asyncio.StreamReaderProtocol): - await self.push('250 OK' if status is MISSING else status) - - # Commands that have not been implemented. -- async def smtp_EXPN(self, arg): -+ async def smtp_EXPN(self, arg: str): - await self.push('502 EXPN not implemented') -diff --git a/aiosmtpd/testing/helpers.py b/aiosmtpd/testing/helpers.py -index 7fa62a2..2328704 100644 ---- a/aiosmtpd/testing/helpers.py -+++ b/aiosmtpd/testing/helpers.py -@@ -12,7 +12,7 @@ import time - from smtplib import SMTP as SMTP_Client - from typing import List - --from aiosmtpd.smtp import Envelope -+from aiosmtpd.smtp import Envelope, Session, SMTP - - ASYNCIO_CATCHUP_DELAY = float(os.environ.get("ASYNCIO_CATCHUP_DELAY", 0.1)) - """ -@@ -52,12 +52,14 @@ class ReceivingHandler: - def __init__(self): - self.box = [] - -- async def handle_DATA(self, server, session, envelope): -+ async def handle_DATA( -+ self, server: SMTP, session: Session, envelope: Envelope -+ ) -> str: - self.box.append(envelope) - return "250 OK" - - --def catchup_delay(delay=ASYNCIO_CATCHUP_DELAY): -+def catchup_delay(delay: float = ASYNCIO_CATCHUP_DELAY): - """ - Sleep for awhile to give asyncio's event loop time to catch up. - """ -@@ -65,7 +67,7 @@ def catchup_delay(delay=ASYNCIO_CATCHUP_DELAY): - - - def send_recv( -- sock: socket.socket, data: bytes, end: bytes = b"\r\n", timeout=0.1 -+ sock: socket.socket, data: bytes, end: bytes = b"\r\n", timeout: float = 0.1 - ) -> bytes: - sock.send(data + end) - slist = [sock] -diff --git a/aiosmtpd/tests/conftest.py b/aiosmtpd/tests/conftest.py -index d0a6cd3..859d5ef 100644 ---- a/aiosmtpd/tests/conftest.py -+++ b/aiosmtpd/tests/conftest.py -@@ -8,10 +8,11 @@ import ssl - from contextlib import suppress - from functools import wraps - from smtplib import SMTP as SMTPClient --from typing import Generator, NamedTuple, Optional, Type -+from typing import Any, Callable, Generator, NamedTuple, Optional, Type, TypeVar - - import pytest - from pkg_resources import resource_filename -+from pytest_mock import MockFixture - - from aiosmtpd.controller import Controller - from aiosmtpd.handlers import Sink -@@ -50,6 +51,9 @@ class HostPort(NamedTuple): - port: int = 8025 - - -+RT = TypeVar("RT") # "ReturnType" -+ -+ - # endregion - - -@@ -79,15 +83,13 @@ SERVER_KEY = resource_filename("aiosmtpd.tests.certs", "server.key") - - # autouse=True and scope="session" automatically apply this fixture to ALL test cases - @pytest.fixture(autouse=True, scope="session") --def cache_fqdn(session_mocker): -+def cache_fqdn(session_mocker: MockFixture): - """ - This fixture "caches" the socket.getfqdn() call. VERY necessary to prevent - situations where quick repeated getfqdn() causes extreme slowdown. Probably due to - the DNS server thinking it was an attack or something. - """ - session_mocker.patch("socket.getfqdn", return_value=Global.FQDN) -- # -- yield - - - # endregion -@@ -97,7 +99,7 @@ def cache_fqdn(session_mocker): - - - @pytest.fixture --def get_controller(request): -+def get_controller(request: pytest.FixtureRequest) -> Callable[..., Controller]: - """ - Provides a function that will return an instance of a controller. - -@@ -122,7 +124,7 @@ def get_controller(request): - markerdata = {} - - def getter( -- handler, -+ handler: Any, - class_: Optional[Type[Controller]] = None, - **server_kwargs, - ) -> Controller: -@@ -154,7 +156,7 @@ def get_controller(request): - - - @pytest.fixture --def get_handler(request): -+def get_handler(request: pytest.FixtureRequest) -> Callable: - """ - Provides a function that will return an instance of - a :ref:`handler class `. -@@ -179,7 +181,7 @@ def get_handler(request): - else: - markerdata = {} - -- def getter(*args, **kwargs): -+ def getter(*args, **kwargs) -> Any: - if marker: - class_ = markerdata.pop("class_", default_class) - # *args overrides args_ in handler_data() -@@ -209,18 +211,22 @@ def temp_event_loop() -> Generator[asyncio.AbstractEventLoop, None, None]: - - - @pytest.fixture --def autostop_loop(temp_event_loop) -> Generator[asyncio.AbstractEventLoop, None, None]: -+def autostop_loop( -+ temp_event_loop: asyncio.AbstractEventLoop, -+) -> asyncio.AbstractEventLoop: - # Create a new event loop, and arrange for that loop to end almost - # immediately. This will allow the calls to main() in these tests to - # also exit almost immediately. Otherwise, the foreground test - # process will hang. - temp_event_loop.call_later(AUTOSTOP_DELAY, temp_event_loop.stop) - # -- yield temp_event_loop -+ return temp_event_loop - - - @pytest.fixture --def plain_controller(get_handler, get_controller) -> Generator[Controller, None, None]: -+def plain_controller( -+ get_handler: Callable, get_controller: Callable -+) -> Generator[Controller, None, None]: - """ - Returns a Controller that, by default, gets invoked with no optional args. - Hence the moniker "plain". -@@ -246,7 +252,7 @@ def plain_controller(get_handler, get_controller) -> Generator[Controller, None, - - @pytest.fixture - def nodecode_controller( -- get_handler, get_controller -+ get_handler: Callable, get_controller: Callable - ) -> Generator[Controller, None, None]: - """ - Same as :fixture:`plain_controller`, -@@ -268,7 +274,7 @@ def nodecode_controller( - - @pytest.fixture - def decoding_controller( -- get_handler, get_controller -+ get_handler: Callable, get_controller: Callable - ) -> Generator[Controller, None, None]: - handler = get_handler() - controller = get_controller(handler, decode_data=True) -@@ -285,7 +291,7 @@ def decoding_controller( - - - @pytest.fixture --def client(request) -> Generator[SMTPClient, None, None]: -+def client(request: pytest.FixtureRequest) -> Generator[SMTPClient, None, None]: - """ - Generic SMTP Client, - will connect to the ``host:port`` defined in ``Global.SrvAddr`` -@@ -302,7 +308,7 @@ def client(request) -> Generator[SMTPClient, None, None]: - - - @pytest.fixture --def ssl_context_server() -> Generator[ssl.SSLContext, None, None]: -+def ssl_context_server() -> ssl.SSLContext: - """ - Provides a server-side SSL Context - """ -@@ -310,11 +316,11 @@ def ssl_context_server() -> Generator[ssl.SSLContext, None, None]: - context.check_hostname = False - context.load_cert_chain(SERVER_CRT, SERVER_KEY) - # -- yield context -+ return context - - - @pytest.fixture --def ssl_context_client() -> Generator[ssl.SSLContext, None, None]: -+def ssl_context_client() -> ssl.SSLContext: - """ - Provides a client-side SSL Context - """ -@@ -322,14 +328,14 @@ def ssl_context_client() -> Generator[ssl.SSLContext, None, None]: - context.check_hostname = False - context.load_verify_locations(SERVER_CRT) - # -- yield context -+ return context - - - # Please keep the scope as "module"; setting it as "function" (the default) somehow - # causes the 'hidden' exception to be detected when the loop starts over in the next - # test case, defeating the silencing. - @pytest.fixture(scope="module") --def silence_event_loop_closed(): -+def silence_event_loop_closed() -> bool: - """ - Mostly used to suppress "unhandled exception" error due to - ``_ProactorBasePipeTransport`` raising an exception when doing ``__del__`` -@@ -341,9 +347,9 @@ def silence_event_loop_closed(): - return True - - # From: https://github.com/aio-libs/aiohttp/issues/4324#issuecomment-733884349 -- def silencer(func): -+ def silencer(func: Callable[..., RT]) -> Callable[..., RT]: - @wraps(func) -- def wrapper(self, *args, **kwargs): -+ def wrapper(self: Any, *args, **kwargs) -> RT: - try: - return func(self, *args, **kwargs) - except RuntimeError as e: -diff --git a/aiosmtpd/tests/test_handlers.py b/aiosmtpd/tests/test_handlers.py -index 51e06ce..35bd661 100644 ---- a/aiosmtpd/tests/test_handlers.py -+++ b/aiosmtpd/tests/test_handlers.py -@@ -3,6 +3,7 @@ - - import logging - import sys -+from email.message import Message as Em_Message - from io import StringIO - from mailbox import Maildir - from operator import itemgetter -@@ -10,14 +11,16 @@ from pathlib import Path - from smtplib import SMTPDataError, SMTPRecipientsRefused - from textwrap import dedent - from types import SimpleNamespace --from typing import AnyStr, Generator, Type, TypeVar, Union -+from typing import AnyStr, Callable, Generator, Type, TypeVar, Union - - import pytest - - from aiosmtpd.controller import Controller - from aiosmtpd.handlers import AsyncMessage, Debugging, Mailbox, Proxy, Sink -+from aiosmtpd.handlers import Message as AbstractMessageHandler - from aiosmtpd.smtp import SMTP as Server - from aiosmtpd.smtp import Session as ServerSession -+from aiosmtpd.smtp import Envelope - from aiosmtpd.testing.statuscodes import SMTP_STATUS_CODES as S - from aiosmtpd.testing.statuscodes import StatusCode - -@@ -54,7 +57,7 @@ class FakeParser: - - message: AnyStr = None - -- def error(self, message): -+ def error(self, message: AnyStr): - self.message = message - raise SystemExit - -@@ -63,16 +66,23 @@ class DataHandler: - content: AnyStr = None - original_content: bytes = None - -- async def handle_DATA(self, server, session, envelope): -+ async def handle_DATA( -+ self, server: Server, session: ServerSession, envelope: Envelope -+ ) -> str: - self.content = envelope.content - self.original_content = envelope.original_content - return S.S250_OK.to_str() - - -+class MessageHandler(AbstractMessageHandler): -+ def handle_message(self, message: Em_Message) -> None: -+ pass -+ -+ - class AsyncMessageHandler(AsyncMessage): -- handled_message = None -+ handled_message: Em_Message = None - -- async def handle_message(self, message): -+ async def handle_message(self, message: Em_Message) -> None: - self.handled_message = message - - -@@ -209,14 +219,13 @@ def debugging_controller(get_controller) -> Generator[Controller, None, None]: - - - @pytest.fixture --def temp_maildir(tmp_path: Path) -> Generator[Path, None, None]: -- maildir_path = tmp_path / "maildir" -- yield maildir_path -+def temp_maildir(tmp_path: Path) -> Path: -+ return tmp_path / "maildir" - - - @pytest.fixture - def mailbox_controller( -- temp_maildir, get_controller -+ temp_maildir, get_controller - ) -> Generator[Controller, None, None]: - handler = Mailbox(temp_maildir) - controller = get_controller(handler) -@@ -229,7 +238,7 @@ def mailbox_controller( - - - @pytest.fixture --def with_fake_parser(): -+def with_fake_parser() -> Callable: - """ - Gets a function that will instantiate a handler_class using the class's - from_cli() @classmethod, using FakeParser as the parser. -@@ -250,7 +259,7 @@ def with_fake_parser(): - handler = SimpleNamespace(fparser=parser, exception=type(e)) - return handler - -- yield handler_initer -+ return handler_initer - - - @pytest.fixture -@@ -435,6 +444,43 @@ class TestDebugging: - - - class TestMessage: -+ @pytest.mark.parametrize( -+ "content", -+ [ -+ b"", -+ bytearray(), -+ "", -+ ], -+ ids=["bytes", "bytearray", "str"] -+ ) -+ def test_prepare_message(self, temp_event_loop, content): -+ sess_ = ServerSession(temp_event_loop) -+ enve_ = Envelope() -+ handler = MessageHandler() -+ enve_.content = content -+ msg = handler.prepare_message(sess_, enve_) -+ assert isinstance(msg, Em_Message) -+ assert msg.keys() == ['X-Peer', 'X-MailFrom', 'X-RcptTo'] -+ assert msg.get_payload() == "" -+ -+ @pytest.mark.parametrize( -+ ("content", "expectre"), -+ [ -+ (None, r"Expected str or bytes, got "), -+ ([], r"Expected str or bytes, got "), -+ ({}, r"Expected str or bytes, got "), -+ ((), r"Expected str or bytes, got "), -+ ], -+ ids=("None", "List", "Dict", "Tuple") -+ ) -+ def test_prepare_message_err(self, temp_event_loop, content, expectre): -+ sess_ = ServerSession(temp_event_loop) -+ enve_ = Envelope() -+ handler = MessageHandler() -+ enve_.content = content -+ with pytest.raises(TypeError, match=expectre): -+ _ = handler.prepare_message(sess_, enve_) -+ - @handler_data(class_=DataHandler) - def test_message(self, plain_controller, client): - handler = plain_controller.handler -@@ -585,11 +631,8 @@ class TestMailbox: - # Check the messages in the mailbox. - mailbox = Maildir(temp_maildir) - messages = sorted(mailbox, key=itemgetter("message-id")) -- assert list(message["message-id"] for message in messages) == [ -- "", -- "", -- "", -- ] -+ expect = ["", "", ""] -+ assert [message["message-id"] for message in messages] == expect - - def test_mailbox_reset(self, temp_maildir, mailbox_controller, client): - client.sendmail( -@@ -766,7 +809,6 @@ class TestProxyMocked: - def patch_smtp_oserror(self, mocker): - mock = mocker.patch("aiosmtpd.handlers.smtplib.SMTP") - mock().sendmail.side_effect = OSError -- yield - - def test_oserror( - self, caplog, patch_smtp_oserror, proxy_decoding_controller, client -@@ -804,13 +846,13 @@ class TestHooks: - - def test_hook_EHLO_deprecated_warning(self): - with pytest.warns( -- DeprecationWarning, -- match=( -- # Is a regex; escape regex special chars if necessary -- r"Use the 5-argument handle_EHLO\(\) hook instead of the " -- r"4-argument handle_EHLO\(\) hook; support for the 4-argument " -- r"handle_EHLO\(\) hook will be removed in version 2.0" -- ) -+ DeprecationWarning, -+ match=( -+ # Is a regex; escape regex special chars if necessary -+ r"Use the 5-argument handle_EHLO\(\) hook instead of the " -+ r"4-argument handle_EHLO\(\) hook; support for the 4-argument " -+ r"handle_EHLO\(\) hook will be removed in version 2.0" -+ ), - ): - _ = Server(EHLOHandlerDeprecated()) - -diff --git a/aiosmtpd/tests/test_main.py b/aiosmtpd/tests/test_main.py -index 36992f3..e6b3868 100644 ---- a/aiosmtpd/tests/test_main.py -+++ b/aiosmtpd/tests/test_main.py -@@ -7,11 +7,13 @@ import multiprocessing as MP - import os - import time - from contextlib import contextmanager -+from multiprocessing.synchronize import Event as MP_Event - from smtplib import SMTP as SMTPClient - from smtplib import SMTP_SSL - from typing import Generator - - import pytest -+from pytest_mock import MockFixture - - from aiosmtpd import __version__ - from aiosmtpd.handlers import Debugging -@@ -33,7 +35,7 @@ MAIL_LOG = logging.getLogger("mail.log") - - - class FromCliHandler: -- def __init__(self, called): -+ def __init__(self, called: bool): - self.called = called - - @classmethod -@@ -63,14 +65,12 @@ def nobody_uid() -> Generator[int, None, None]: - - - @pytest.fixture --def setuid(mocker): -+def setuid(mocker: MockFixture): - if not HAS_SETUID: - pytest.skip("setuid is unavailable") - mocker.patch("aiosmtpd.main.pwd", None) - mocker.patch("os.setuid", side_effect=PermissionError) - mocker.patch("aiosmtpd.main.partial", side_effect=RuntimeError) -- # -- yield - - - # endregion -@@ -78,7 +78,7 @@ def setuid(mocker): - # region ##### Helper Funcs ########################################################### - - --def watch_for_tls(ready_flag, retq: MP.Queue): -+def watch_for_tls(ready_flag: MP_Event, retq: MP.Queue): - has_tls = False - req_tls = False - ready_flag.set() -@@ -100,7 +100,7 @@ def watch_for_tls(ready_flag, retq: MP.Queue): - retq.put(req_tls) - - --def watch_for_smtps(ready_flag, retq: MP.Queue): -+def watch_for_smtps(ready_flag: MP_Event, retq: MP.Queue): - has_smtps = False - ready_flag.set() - start = time.monotonic() -@@ -276,7 +276,7 @@ class TestParseArgs: - ) - - @pytest.mark.parametrize( -- "args, exp_host, exp_port", -+ ("args", "exp_host", "exp_port"), - [ - ((), "localhost", 8025), - (("-l", "foo:25"), "foo", 25), -@@ -333,7 +333,7 @@ class TestParseArgs: - assert args.requiretls is False - - @pytest.mark.parametrize( -- "certfile, keyfile, expect", -+ ("certfile", "keyfile", "expect"), - [ - ("x", "x", "Cert file x not found"), - (SERVER_CRT, "x", "Key file x not found"), -diff --git a/aiosmtpd/tests/test_proxyprotocol.py b/aiosmtpd/tests/test_proxyprotocol.py -index bf7f939..ad9dc9a 100644 ---- a/aiosmtpd/tests/test_proxyprotocol.py -+++ b/aiosmtpd/tests/test_proxyprotocol.py -@@ -10,12 +10,12 @@ import socket - import struct - import time - from base64 import b64decode --from contextlib import contextmanager -+from contextlib import contextmanager, suppress - from functools import partial - from ipaddress import IPv4Address, IPv6Address - from smtplib import SMTP as SMTPClient - from smtplib import SMTPServerDisconnected --from typing import Any, Dict, List, Optional -+from typing import Any, Callable, Dict, List, Optional - - import pytest - from pytest_mock import MockFixture -@@ -35,6 +35,7 @@ from aiosmtpd.proxy_protocol import ( - ) - from aiosmtpd.smtp import SMTP as SMTPServer - from aiosmtpd.smtp import Session as SMTPSession -+from aiosmtpd.smtp import Envelope as SMTPEnvelope - from aiosmtpd.tests.conftest import Global, controller_data, handler_data - - DEFAULT_AUTOCANCEL = 0.1 -@@ -94,13 +95,19 @@ HANDSHAKES = { - - - class ProxyPeekerHandler(Sink): -- def __init__(self, retval=True): -+ def __init__(self, retval: bool = True): - self.called = False - self.sessions: List[SMTPSession] = [] - self.proxy_datas: List[ProxyData] = [] - self.retval = retval - -- async def handle_PROXY(self, server, session, envelope, proxy_data): -+ async def handle_PROXY( -+ self, -+ server: SMTPServer, -+ session: SMTPSession, -+ envelope: SMTPEnvelope, -+ proxy_data: ProxyData, -+ ) -> bool: - self.called = True - self.sessions.append(session) - self.proxy_datas.append(proxy_data) -@@ -113,7 +120,9 @@ def does_not_raise(): - - - @pytest.fixture --def setup_proxy_protocol(mocker: MockFixture, temp_event_loop): -+def setup_proxy_protocol( -+ mocker: MockFixture, temp_event_loop: asyncio.AbstractEventLoop -+) -> Callable: - proxy_timeout = 1.0 - responses = [] - transport = mocker.Mock() -@@ -129,16 +138,14 @@ def setup_proxy_protocol(mocker: MockFixture, temp_event_loop): - - def runner(stop_after: float = DEFAULT_AUTOCANCEL): - loop.call_later(stop_after, protocol._handler_coroutine.cancel) -- try: -+ with suppress(asyncio.CancelledError): - loop.run_until_complete(protocol._handler_coroutine) -- except asyncio.CancelledError: -- pass - - test_obj.protocol = protocol - test_obj.runner = runner - test_obj.transport = transport - -- yield getter -+ return getter - - - class _TestProxyProtocolCommon: -@@ -303,7 +310,7 @@ class TestProxyTLV: - (None, "wrongname"), - ], - ) -- def test_backmap(self, typename, typeint): -+ def test_backmap(self, typename: str, typeint: int): - assert ProxyTLV.name_to_num(typename) == typeint - - def test_parse_partial(self): -@@ -384,14 +391,23 @@ class TestModule: - return emit - - @parametrize("handshake", HANDSHAKES.values(), ids=HANDSHAKES.keys()) -- def test_get(self, caplog, temp_event_loop, handshake): -+ def test_get( -+ self, -+ caplog: pytest.LogCaptureFixture, -+ temp_event_loop: asyncio.AbstractEventLoop, -+ handshake: bytes, -+ ): - caplog.set_level(logging.DEBUG) - mock_reader = self.MockAsyncReader(handshake) - reslt = temp_event_loop.run_until_complete(get_proxy(mock_reader)) - assert isinstance(reslt, ProxyData) - assert reslt.valid - -- def test_get_cut_v1(self, caplog, temp_event_loop): -+ def test_get_cut_v1( -+ self, -+ caplog: pytest.LogCaptureFixture, -+ temp_event_loop: asyncio.AbstractEventLoop, -+ ): - caplog.set_level(logging.DEBUG) - mock_reader = self.MockAsyncReader(GOOD_V1_HANDSHAKE[0:20]) - reslt = temp_event_loop.run_until_complete(get_proxy(mock_reader)) -@@ -401,7 +417,11 @@ class TestModule: - expect = ("mail.debug", 30, "PROXY error: PROXYv1 malformed") - assert expect in caplog.record_tuples - -- def test_get_cut_v2(self, caplog, temp_event_loop): -+ def test_get_cut_v2( -+ self, -+ caplog: pytest.LogCaptureFixture, -+ temp_event_loop: asyncio.AbstractEventLoop, -+ ): - caplog.set_level(logging.DEBUG) - mock_reader = self.MockAsyncReader(TEST_V2_DATA1_EXACT[0:20]) - reslt = temp_event_loop.run_until_complete(get_proxy(mock_reader)) -@@ -412,7 +432,11 @@ class TestModule: - expect = ("mail.debug", 30, expect_msg) - assert expect in caplog.record_tuples - -- def test_get_invalid_sig(self, caplog, temp_event_loop): -+ def test_get_invalid_sig( -+ self, -+ caplog: pytest.LogCaptureFixture, -+ temp_event_loop: asyncio.AbstractEventLoop, -+ ): - caplog.set_level(logging.DEBUG) - mock_reader = self.MockAsyncReader(b"PROXI TCP4 1.2.3.4 5.6.7.8 9 10\r\n") - reslt = temp_event_loop.run_until_complete(get_proxy(mock_reader)) -@@ -451,7 +475,7 @@ class TestGetV1(_TestProxyProtocolCommon): - assert self.transport.close.called - - @parametrize("patt", PUBLIC_V1_PATTERNS.values(), ids=PUBLIC_V1_PATTERNS.keys()) -- def test_valid_patterns(self, setup_proxy_protocol, patt: bytes): -+ def test_valid_patterns(self, setup_proxy_protocol: Callable, patt: bytes): - if not patt.endswith(b"\r\n"): - patt += b"\r\n" - setup_proxy_protocol(self) -@@ -1004,7 +1028,7 @@ class TestWithController: - # Try resending the handshake. Should also fail (because connection has - # been closed by the server. - # noinspection PyTypeChecker -- with pytest.raises(OSError) as exc_info: -+ with pytest.raises(OSError) as exc_info: # noqa: PT011 - sock.send(handshake) - resp = sock.recv(4096) - if resp == b"": -@@ -1041,7 +1065,7 @@ class TestWithController: - # Try resending the handshake. Should also fail (because connection has - # been closed by the server. - # noinspection PyTypeChecker -- with pytest.raises(OSError) as exc_info: -+ with pytest.raises(OSError) as exc_info: # noqa: PT011 - sock.send(handshake) - resp = sock.recv(4096) - if resp == b"": -@@ -1094,8 +1118,7 @@ class TestHandlerAcceptReject: - sock.sendall(handshake) - resp = sock.recv(4096) - assert oper(resp, b"") -- with expect: -- with SMTPClient() as client: -- client.sock = sock -- code, mesg = client.ehlo("example.org") -- assert code == 250 -+ with expect, SMTPClient() as client: -+ client.sock = sock -+ code, mesg = client.ehlo("example.org") -+ assert code == 250 -diff --git a/aiosmtpd/tests/test_server.py b/aiosmtpd/tests/test_server.py -index 41225dc..5e27070 100644 ---- a/aiosmtpd/tests/test_server.py -+++ b/aiosmtpd/tests/test_server.py -@@ -10,6 +10,7 @@ import socket - import time - from contextlib import ExitStack - from functools import partial -+from threading import Event - from pathlib import Path - from smtplib import SMTP as SMTPClient, SMTPServerDisconnected - from tempfile import mkdtemp -@@ -40,7 +41,7 @@ class SlowStartController(Controller): - kwargs.setdefault("ready_timeout", 0.5) - super().__init__(*args, **kwargs) - -- def _run(self, ready_event): -+ def _run(self, ready_event: Event): - time.sleep(self.ready_timeout * 1.5) - super()._run(ready_event) - -@@ -88,7 +89,7 @@ def safe_socket_dir() -> Generator[Path, None, None]: - # - yield tmpdir - # -- plist = [p for p in tmpdir.rglob("*")] -+ plist = list(tmpdir.rglob("*")) - for p in reversed(plist): - if p.is_dir(): - p.rmdir() -@@ -97,7 +98,7 @@ def safe_socket_dir() -> Generator[Path, None, None]: - tmpdir.rmdir() - - --def assert_smtp_socket(controller: UnixSocketMixin): -+def assert_smtp_socket(controller: UnixSocketMixin) -> bool: - assert Path(controller.unix_socket).exists() - sockfile = controller.unix_socket - ssl_context = controller.ssl_context -@@ -134,6 +135,7 @@ def assert_smtp_socket(controller: UnixSocketMixin): - catchup_delay() - resp = sock.recv(1024) - assert resp.startswith(b"221") -+ return True - - - class TestServer: -@@ -207,8 +209,9 @@ class TestController: - contr2 = Controller( - Sink(), hostname=Global.SrvAddr.host, port=Global.SrvAddr.port - ) -+ expectedre = r"error while attempting to bind on address" - try: -- with pytest.raises(socket.error): -+ with pytest.raises(socket.error, match=expectedre): - contr2.start() - finally: - contr2.stop() -@@ -526,6 +529,7 @@ class TestUnthreaded: - assert temp_event_loop.is_closed() is False - - -+@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") - class TestFactory: - def test_normal_situation(self): - cont = Controller(Sink()) -@@ -537,8 +541,7 @@ class TestFactory: - finally: - cont.stop() - -- @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") -- def test_unknown_args_direct(self, silence_event_loop_closed): -+ def test_unknown_args_direct(self, silence_event_loop_closed: bool): - unknown = "this_is_an_unknown_kwarg" - cont = Controller(Sink(), ready_timeout=0.3, **{unknown: True}) - expectedre = r"__init__.. got an unexpected keyword argument '" + unknown + r"'" -@@ -553,8 +556,7 @@ class TestFactory: - @pytest.mark.filterwarnings( - "ignore:server_kwargs will be removed:DeprecationWarning" - ) -- @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") -- def test_unknown_args_inkwargs(self, silence_event_loop_closed): -+ def test_unknown_args_inkwargs(self, silence_event_loop_closed: bool): - unknown = "this_is_an_unknown_kwarg" - cont = Controller(Sink(), ready_timeout=0.3, server_kwargs={unknown: True}) - expectedre = r"__init__.. got an unexpected keyword argument '" + unknown + r"'" -@@ -565,8 +567,7 @@ class TestFactory: - finally: - cont.stop() - -- @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") -- def test_factory_none(self, mocker: MockFixture, silence_event_loop_closed): -+ def test_factory_none(self, mocker: MockFixture, silence_event_loop_closed: bool): - # Hypothetical situation where factory() did not raise an Exception - # but returned None instead - mocker.patch("aiosmtpd.controller.SMTP", return_value=None) -@@ -579,8 +580,9 @@ class TestFactory: - finally: - cont.stop() - -- @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") -- def test_noexc_smtpd_missing(self, mocker, silence_event_loop_closed): -+ def test_noexc_smtpd_missing( -+ self, mocker: MockFixture, silence_event_loop_closed: bool -+ ): - # Hypothetical situation where factory() failed but no - # Exception was generated. - cont = Controller(Sink()) -diff --git a/aiosmtpd/tests/test_smtp.py b/aiosmtpd/tests/test_smtp.py -index 6fd8bfb..0fb3a15 100644 ---- a/aiosmtpd/tests/test_smtp.py -+++ b/aiosmtpd/tests/test_smtp.py -@@ -9,6 +9,7 @@ import logging - import socket - import time - import warnings -+from asyncio.transports import Transport - from base64 import b64encode - from contextlib import suppress - from smtplib import ( -@@ -19,7 +20,7 @@ from smtplib import ( - SMTPServerDisconnected, - ) - from textwrap import dedent --from typing import Any, AnyStr, Callable, Generator, List, Tuple -+from typing import cast, Any, AnyStr, Callable, Generator, List, Tuple - - import pytest - from pytest_mock import MockFixture -@@ -62,10 +63,7 @@ MAIL_LOG.setLevel(logging.DEBUG) - - - def auth_callback(mechanism, login, password) -> bool: -- if login and login.decode() == "goodlogin": -- return True -- else: -- return False -+ return login and login.decode() == "goodlogin" - - - def assert_nopassleak(passwd: str, record_tuples: List[Tuple[str, int, str]]): -@@ -87,7 +85,7 @@ class UndescribableError(Exception): - class ErrorSMTP(Server): - exception_type = ValueError - -- async def smtp_HELO(self, hostname): -+ async def smtp_HELO(self, hostname: str): - raise self.exception_type("test") - - -@@ -136,8 +134,13 @@ class PeekerHandler: - return AuthResult(success=True, auth_data=login_data) - - async def handle_MAIL( -- self, server, session: SMTPSession, envelope, address, mail_options -- ): -+ self, -+ server: Server, -+ session: SMTPSession, -+ envelope: SMTPEnvelope, -+ address: str, -+ mail_options: dict, -+ ) -> str: - self.sess = session - return S.S250_OK.to_str() - -@@ -157,7 +160,7 @@ class PeekerHandler: - async def auth_DONT(self, server, args): - return MISSING - -- async def auth_WITH_UNDERSCORE(self, server: Server, args): -+ async def auth_WITH_UNDERSCORE(self, server: Server, args) -> str: - """ - Be careful when using this AUTH mechanism; log_client_response is set to - True, and this will raise some severe warnings. -@@ -180,7 +183,9 @@ class StoreEnvelopeOnVRFYHandler: - - envelope = None - -- async def handle_VRFY(self, server, session, envelope, addr): -+ async def handle_VRFY( -+ self, server: Server, session: SMTPSession, envelope: SMTPEnvelope, addr: str -+ ) -> str: - self.envelope = envelope - return S.S250_OK.to_str() - -@@ -189,10 +194,10 @@ class ErroringHandler: - error = None - custom_response = False - -- async def handle_DATA(self, server, session, envelope): -+ async def handle_DATA(self, server, session, envelope) -> str: - return "499 Could not accept the message" - -- async def handle_exception(self, error): -+ async def handle_exception(self, error) -> str: - self.error = error - if not self.custom_response: - return "500 ErroringHandler handling error" -@@ -215,7 +220,7 @@ class ErroringHandlerConnectionLost: - class ErroringErrorHandler: - error = None - -- async def handle_exception(self, error): -+ async def handle_exception(self, error: Exception): - self.error = error - raise ValueError("ErroringErrorHandler test") - -@@ -223,13 +228,19 @@ class ErroringErrorHandler: - class UndescribableErrorHandler: - error = None - -- async def handle_exception(self, error): -+ async def handle_exception(self, error: Exception): - self.error = error - raise UndescribableError() - - - class SleepingHeloHandler: -- async def handle_HELO(self, server, session, envelope, hostname): -+ async def handle_HELO( -+ self, -+ server: Server, -+ session: SMTPSession, -+ envelope: SMTPEnvelope, -+ hostname: str, -+ ) -> str: - await asyncio.sleep(0.01) - session.host_name = hostname - return "250 {}".format(server.hostname) -@@ -267,8 +278,7 @@ class CustomIdentController(Controller): - ident: bytes = b"Identifying SMTP v2112" - - def factory(self): -- server = Server(self.handler, ident=self.ident.decode()) -- return server -+ return Server(self.handler, ident=self.ident.decode()) - - - # endregion -@@ -278,18 +288,19 @@ class CustomIdentController(Controller): - - - @pytest.fixture --def transport_resp(mocker: MockFixture): -+def transport_resp(mocker: MockFixture) -> Tuple[Transport, list]: - responses = [] - mocked = mocker.Mock() - mocked.write = responses.append - # -- yield mocked, responses -+ return cast(Transport, mocked), responses - - - @pytest.fixture - def get_protocol( -- temp_event_loop, transport_resp --) -> Generator[Callable[..., Server], None, None]: -+ temp_event_loop: asyncio.AbstractEventLoop, -+ transport_resp: Any, -+) -> Callable[..., Server]: - transport, _ = transport_resp - - def getter(*args, **kwargs) -> Server: -@@ -297,14 +308,16 @@ def get_protocol( - proto.connection_made(transport) - return proto - -- yield getter -+ return getter - - - # region #### Fixtures: Controllers ################################################## - - - @pytest.fixture --def auth_peeker_controller(get_controller) -> Generator[Controller, None, None]: -+def auth_peeker_controller( -+ get_controller: Callable[..., Controller] -+) -> Generator[Controller, None, None]: - handler = PeekerHandler() - controller = get_controller( - handler, -@@ -324,7 +337,7 @@ def auth_peeker_controller(get_controller) -> Generator[Controller, None, None]: - - @pytest.fixture - def authenticator_peeker_controller( -- get_controller, -+ get_controller: Callable[..., Controller] - ) -> Generator[Controller, None, None]: - handler = PeekerHandler() - controller = get_controller( -@@ -345,7 +358,8 @@ def authenticator_peeker_controller( - - @pytest.fixture - def decoding_authnotls_controller( -- get_handler, get_controller -+ get_handler: Callable, -+ get_controller: Callable[..., Controller] - ) -> Generator[Controller, None, None]: - handler = get_handler() - controller = get_controller( -@@ -368,7 +382,7 @@ def decoding_authnotls_controller( - - - @pytest.fixture --def error_controller(get_handler) -> Generator[ErrorController, None, None]: -+def error_controller(get_handler: Callable) -> Generator[ErrorController, None, None]: - handler = get_handler() - controller = ErrorController(handler) - controller.start() -@@ -417,10 +431,8 @@ class TestProtocol: - ] - ) - ) -- try: -+ with suppress(asyncio.CancelledError): - temp_event_loop.run_until_complete(protocol._handler_coroutine) -- except asyncio.CancelledError: -- pass - _, responses = transport_resp - assert responses[5] == S.S250_OK.to_bytes() + b"\r\n" - assert len(handler.box) == 1 -@@ -441,10 +453,8 @@ class TestProtocol: - ] - ) - ) -- try: -+ with suppress(asyncio.CancelledError): - temp_event_loop.run_until_complete(protocol._handler_coroutine) -- except asyncio.CancelledError: -- pass - _, responses = transport_resp - assert responses[5] == S.S250_OK.to_bytes() + b"\r\n" - assert len(handler.box) == 1 -@@ -986,19 +996,19 @@ class TestAuthMechanisms(_CommonMethods): - @pytest.fixture - def do_auth_plain1( - self, client -- ) -> Generator[Callable[[str], Tuple[int, bytes]], None, None]: -+ ) -> Callable[[str], Tuple[int, bytes]]: - self._ehlo(client) - - def do(param: str) -> Tuple[int, bytes]: - return client.docmd("AUTH PLAIN " + param) - - do.client = client -- yield do -+ return do - - @pytest.fixture - def do_auth_login3( - self, client -- ) -> Generator[Callable[[str], Tuple[int, bytes]], None, None]: -+ ) -> Callable[[str], Tuple[int, bytes]]: - self._ehlo(client) - resp = client.docmd("AUTH LOGIN") - assert resp == S.S334_AUTH_USERNAME -@@ -1007,7 +1017,7 @@ class TestAuthMechanisms(_CommonMethods): - return client.docmd(param) - - do.client = client -- yield do -+ return do - - def test_ehlo(self, client): - code, mesg = client.ehlo("example.com") -@@ -1119,11 +1129,11 @@ class TestAuthMechanisms(_CommonMethods): - assert_nopassleak(PW, caplog.record_tuples) - - @pytest.fixture -- def client_auth_plain2(self, client) -> Generator[SMTPClient, None, None]: -+ def client_auth_plain2(self, client) -> SMTPClient: - self._ehlo(client) - resp = client.docmd("AUTH PLAIN") - assert resp == S.S334_AUTH_EMPTYPROMPT -- yield client -+ return client - - def test_plain2_good_credentials( - self, caplog, auth_peeker_controller, client_auth_plain2 -@@ -1965,7 +1975,8 @@ class TestAuthArgs: - ], - ) - def test_authmechname_decorator_badname(self, name): -- with pytest.raises(ValueError): -+ expectre = r"Invalid AUTH mechanism name" -+ with pytest.raises(ValueError, match=expectre): - auth_mechanism(name) - - -diff --git a/aiosmtpd/tests/test_starttls.py b/aiosmtpd/tests/test_starttls.py -index 6bb2cbd..5e0a180 100644 ---- a/aiosmtpd/tests/test_starttls.py -+++ b/aiosmtpd/tests/test_starttls.py -@@ -12,6 +12,7 @@ import pytest - from aiosmtpd.controller import Controller - from aiosmtpd.handlers import Sink - from aiosmtpd.smtp import SMTP as Server -+from aiosmtpd.smtp import Envelope - from aiosmtpd.smtp import Session as Sess_ - from aiosmtpd.smtp import TLSSetupException - from aiosmtpd.testing.helpers import ReceivingHandler, catchup_delay -@@ -31,14 +32,18 @@ class EOFingHandler: - ssl_existed = None - result = None - -- async def handle_NOOP(self, server: Server, session: Sess_, envelope, arg): -+ async def handle_NOOP( -+ self, server: Server, session: Sess_, envelope: Envelope, arg: str -+ ) -> str: - self.ssl_existed = session.ssl is not None - self.result = server.eof_received() - return "250 OK" - - - class HandshakeFailingHandler: -- def handle_STARTTLS(self, server, session, envelope): -+ def handle_STARTTLS( -+ self, server: Server, session: Sess_, envelope: Envelope -+ ) -> bool: - return False - - -@@ -198,7 +203,7 @@ class TestStartTLS: - class ExceptionCaptureHandler: - error = None - -- async def handle_exception(self, error): -+ async def handle_exception(self, error: Exception) -> str: - self.error = error - return "500 ExceptionCaptureHandler handling error" - -@@ -354,7 +359,7 @@ class TestRequireTLSAUTH: - class TestTLSContext: - def test_verify_mode_nochange(self, ssl_context_server): - context = ssl_context_server -- for mode in (ssl.CERT_NONE, ssl.CERT_OPTIONAL): -+ for mode in (ssl.CERT_NONE, ssl.CERT_OPTIONAL): # noqa: DUO122 - context.verify_mode = mode - _ = Server(Sink(), tls_context=context) - assert context.verify_mode == mode -@@ -370,10 +375,10 @@ class TestTLSContext: - - def test_nocertreq_chkhost_warn(self, caplog, ssl_context_server): - context = ssl_context_server -- context.verify_mode = ssl.CERT_OPTIONAL -+ context.verify_mode = ssl.CERT_OPTIONAL # noqa: DUO122 - context.check_hostname = True - _ = Server(Sink(), tls_context=context) -- assert context.verify_mode == ssl.CERT_OPTIONAL -+ assert context.verify_mode == ssl.CERT_OPTIONAL # noqa: DUO122 - logmsg = caplog.record_tuples[0][-1] - assert "tls_context.check_hostname == True" in logmsg - assert "might cause client connection problems" in logmsg -diff --git a/housekeep.py b/housekeep.py -index 88dddd5..92b8cb6 100644 ---- a/housekeep.py -+++ b/housekeep.py -@@ -69,7 +69,8 @@ TERM_WIDTH, TERM_HEIGHT = shutil.get_terminal_size() - def deldir(targ: Path, verbose: bool = True): - if not targ.exists(): - return -- for i, pp in enumerate(reversed(sorted(targ.rglob("*"))), start=1): -+ rev_items = sorted(targ.rglob("*"), reverse=True) -+ for i, pp in enumerate(rev_items, start=1): - if pp.is_symlink(): - pp.unlink() - elif pp.is_file(): -diff --git a/setup.cfg b/setup.cfg -index 7cfbf7f..6638b75 100644 ---- a/setup.cfg -+++ b/setup.cfg -@@ -66,4 +66,54 @@ source-dir = aiosmtpd/docs - [flake8] - jobs = 1 - max-line-length = 88 --ignore = E123, E133, W503, W504, W293, E203 -+# "E,F,W,C90" are flake8 defaults -+# For others, take a gander at tox.ini to see which prefix provided by who -+select = E,F,W,C90,C4,MOD,JS,PIE,PT,SIM,ECE,C801,DUO,TAE,ANN,YTT,N400 -+ignore = -+ # black conflicts with E123 & E133 -+ E123 -+ E133 -+ # W503 conflicts with PEP8... -+ W503 -+ # W293 is a bit too noisy. Many files have been edited using editors that do not remove spaces from blank lines. -+ W293 -+ # Sometimes spaces around colons improve readability -+ E203 -+ # Sometimes we prefer the func()-based creation, not literal, for readability -+ C408 -+ # Sometimes we need to catch Exception broadly -+ PIE786 -+ # We don't really care about pytest.fixture vs pytest.fixture() -+ PT001 -+ # Good idea, but too many changes. Remove this in the future, and create separate PR -+ PT004 -+ # Sometimes exception needs to be explicitly raised in special circumstances, needing additional lines of code -+ PT012 -+ # I still can't grok the need to annotate "self" or "cls" ... -+ ANN101 -+ ANN102 -+ # I don't think forcing annotation for *args and **kwargs is a wise idea... -+ ANN002 -+ ANN003 -+ # We have too many "if..elif..else: raise" structures that does not convert well to "error-first" design -+ SIM106 -+per-file-ignores = -+ aiosmtpd/tests/test_*:ANN001 -+ aiosmtpd/tests/test_proxyprotocol.py:DUO102 -+ aiosmtpd/docs/_exts/autoprogramm.py:C801 -+# flake8-coding -+no-accept-encodings = True -+# flake8-copyright -+copyright-check = True -+# The number below was determined empirically by bisecting from 100 until no copyright-unnecessary files appear -+copyright-min-file-size = 44 -+copyright-author = The aiosmtpd Developers -+# flake8-annotations-complexity -+max-annotations-complexity = 4 -+# flake8-annotations-coverage -+min-coverage-percents = 12 -+# flake8-annotations -+mypy-init-return = True -+suppress-none-returning = True -+suppress-dummy-args = True -+allow-untyped-defs = True -diff --git a/tox.ini b/tox.ini -index 17d246e..eb2f4f6 100644 ---- a/tox.ini -+++ b/tox.ini -@@ -10,11 +10,14 @@ envdir = - py37: {toxworkdir}/3.7 - py38: {toxworkdir}/3.8 - py39: {toxworkdir}/3.9 -+ py310: {toxworkdir}/3.10 - pypy3: {toxworkdir}/pypy3 - py: {toxworkdir}/py - commands = - python housekeep.py prep -- !diffcov: bandit -c bandit.yml -r aiosmtpd -+ # Bandit is not needed on diffcov, and seems to be incompatible with 310 -+ # So, run only if "not (310 or diffcov)" ==> "(not 310) and (not diffcov)" -+ !py310-!diffcov: bandit -c bandit.yml -r aiosmtpd - nocov: pytest --verbose -p no:cov --tb=short {posargs} - cov: pytest --cov --cov-report=xml --cov-report=html --cov-report=term --tb=short {posargs} - diffcov: diff-cover _dump/coverage-{env:INTERP}.xml --html-report htmlcov/diffcov-{env:INTERP}.html -@@ -24,6 +27,7 @@ commands = - #sitepackages = True - usedevelop = True - deps = -+ # do NOT make these conditional, that way we can reuse same envdir for nocov+cov+diffcov - bandit - colorama - coverage[toml] -@@ -43,6 +47,7 @@ setenv = - py37: INTERP=py37 - py38: INTERP=py38 - py39: INTERP=py39 -+ py310: INTERP=py310 - pypy3: INTERP=pypy3 - py: INTERP=py - passenv = -@@ -51,18 +56,62 @@ passenv = - CI - GITHUB* - -+[flake8_plugins] -+# This is a pseudo-section that feeds into [testenv:qa] and GA -+# Snippets of letters above these plugins are tests that need to be "select"-ed in flake8 config (in -+# setup.cfg) to activate the respective plugins. If no snippet is given, that means the plugin is -+# always active. -+deps = -+ flake8-bugbear -+ flake8-builtins -+ flake8-coding -+ # C4 -+ flake8-comprehensions -+ # JS -+ flake8-multiline-containers -+ # PIE -+ flake8-pie -+ # MOD -+ flake8-printf-formatting -+ # PT -+ flake8-pytest-style -+ # SIM -+ flake8-simplify -+ # Cognitive Complexity looks like a good idea, but to fix the complaints... it will be an epic effort. -+ # So we disable it for now and reenable when we're ready, probably just before 2.0 -+ # # CCR -+ # flake8-cognitive-complexity -+ # ECE -+ flake8-expression-complexity -+ # C801 -+ flake8-copyright -+ # DUO -+ dlint -+ # TAE -+ flake8-annotations-complexity -+ # TAE -+ flake8-annotations-coverage -+ # ANN -+ flake8-annotations -+ # YTT -+ flake8-2020 -+ # N400 -+ flake8-broken-line -+ - [testenv:qa] - basepython = python3 - envdir = {toxworkdir}/qa - commands = - python housekeep.py prep -+ # The next line lists enabled plugins -+ python -m flake8 --version - python -m flake8 aiosmtpd setup.py housekeep.py release.py - check-manifest -v - pytest -v --tb=short aiosmtpd/qa - deps = - colorama - flake8 -- flake8-bugbear -+ {[flake8_plugins]deps} - pytest - check-manifest - -@@ -79,11 +128,13 @@ deps: - # - .github/workflows/unit-testing-and-coverage.yml - # - aiosmtpd/docs/RTD-requirements.txt - colorama -- pytest - sphinx - sphinx-autofixture - sphinx_rtd_theme - pickle5 ; python_version < '3.8' -+ # The below used as deps, need to be installed so autofixture work properly -+ pytest -+ pytest-mock - - [testenv:static] - basepython = python3 --- -2.32.0 - diff --git a/0003-URGENT-Fix-RTD-docs-gen.patch b/0003-URGENT-Fix-RTD-docs-gen.patch deleted file mode 100644 index 53c6009..0000000 --- a/0003-URGENT-Fix-RTD-docs-gen.patch +++ /dev/null @@ -1,24 +0,0 @@ -From b50563035ebf72502e25488367b46fccce5d6991 Mon Sep 17 00:00:00 2001 -From: Pandu E POLUAN -Date: Wed, 24 Mar 2021 11:03:53 +0700 -Subject: [PATCH 3/4] URGENT: Fix RTD docs gen - ---- - aiosmtpd/docs/RTD-requirements.txt | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/aiosmtpd/docs/RTD-requirements.txt b/aiosmtpd/docs/RTD-requirements.txt -index 42c1f7b..cfdaa48 100644 ---- a/aiosmtpd/docs/RTD-requirements.txt -+++ b/aiosmtpd/docs/RTD-requirements.txt -@@ -4,6 +4,7 @@ sphinx-autofixture - sphinx_rtd_theme - # Required by Sphinx.autodoc - pytest>=6.0 -+pytest-mock - - # aiosmtpd deps - atpublic --- -2.32.0 - diff --git a/0004-Make-Sphinx-RTD-deps-SSOT.patch b/0004-Make-Sphinx-RTD-deps-SSOT.patch deleted file mode 100644 index 72966bc..0000000 --- a/0004-Make-Sphinx-RTD-deps-SSOT.patch +++ /dev/null @@ -1,120 +0,0 @@ -From 215b854447e2567bbc5e3665d9a648d7b1fa2c82 Mon Sep 17 00:00:00 2001 -From: Pandu POLUAN -Date: Wed, 24 Mar 2021 12:14:03 +0700 -Subject: [PATCH 4/4] Make Sphinx/RTD deps SSOT - -Previously we can accidentally forgot to sync between tox.ini, GA yml, -and RTD-requirements.txt. - -Now tox.ini and GA yml actually refers to RTD-requirements.txt, so we -have achieved SSOT (Single Source Of Truth) for Sphinx/RTD deps. ---- - .github/workflows/unit-testing-and-coverage.yml | 7 +++++-- - aiosmtpd/docs/RTD-requirements.txt | 11 +++++++---- - aiosmtpd/docs/conf.py | 7 ++++--- - tox.ini | 11 +---------- - 4 files changed, 17 insertions(+), 19 deletions(-) - -diff --git a/.github/workflows/unit-testing-and-coverage.yml b/.github/workflows/unit-testing-and-coverage.yml -index ebc2248..eb8daa1 100644 ---- a/.github/workflows/unit-testing-and-coverage.yml -+++ b/.github/workflows/unit-testing-and-coverage.yml -@@ -37,6 +37,8 @@ jobs: - run: | - python -m pip install --upgrade pip setuptools wheel - python setup.py develop -+ # Common deps -+ pip install colorama - - name: "flake8 Style Checking" - shell: bash - # language=bash -@@ -48,12 +50,13 @@ jobs: - "config.read('tox.ini');" - "print(config['flake8_plugins']['deps']);" - ) -- pip install colorama flake8 $(python -c "${grab_f8_plugins[*]}") -+ pip install flake8 $(python -c "${grab_f8_plugins[*]}") - python -m flake8 aiosmtpd setup.py housekeep.py release.py - - name: "Docs Checking" - # language=bash - run: | -- pip install colorama pytest pytest-mock sphinx sphinx-autofixture sphinx_rtd_theme -+ # Prepare sphinx and the deps for sphinx extensions -+ pip install -r aiosmtpd/docs/RTD-requirements.txt - sphinx-build --color -b doctest -d build/.doctree aiosmtpd/docs build/doctest - sphinx-build --color -b html -d build/.doctree aiosmtpd/docs build/html - sphinx-build --color -b man -d build/.doctree aiosmtpd/docs build/man -diff --git a/aiosmtpd/docs/RTD-requirements.txt b/aiosmtpd/docs/RTD-requirements.txt -index cfdaa48..e26dc75 100644 ---- a/aiosmtpd/docs/RTD-requirements.txt -+++ b/aiosmtpd/docs/RTD-requirements.txt -@@ -1,11 +1,14 @@ --# Sphinx deps --sphinx>=2.1 -+### Sphinx deps -+pickle5 ; python_version < '3.8' -+# Sync the ver limit below with conf.py -+sphinx>=3.2 - sphinx-autofixture - sphinx_rtd_theme --# Required by Sphinx.autodoc -+ -+### Required by Sphinx.autodoc - pytest>=6.0 - pytest-mock - --# aiosmtpd deps -+### aiosmtpd deps - atpublic - attrs -diff --git a/aiosmtpd/docs/conf.py b/aiosmtpd/docs/conf.py -index d3273f1..689e4a7 100644 ---- a/aiosmtpd/docs/conf.py -+++ b/aiosmtpd/docs/conf.py -@@ -50,6 +50,8 @@ syspath_insert(repo_root / "aiosmtpd") - # :classmethod: needs Sphinx>=2.1 - # :noindex: needs Sphinx>=3.2 - needs_sphinx = "3.2" -+# If you change the above, don't forget to change the version limit in -+# `RTD-requirements.txt` - - # Add any Sphinx extension module names here, as strings. They can be - # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -@@ -62,9 +64,8 @@ extensions = [ - "autoprogramm", - "sphinx_rtd_theme" - ] --# IMPORTANT: If you edit this, also edit the following: --# - aiosmtpd/docs/RTD-requirements.txt --# - tox.ini -+# IMPORTANT: If you edit the above list, check if you need to edit the deps list -+# in `RTD-requirements.txt` - - # Add any paths that contain templates here, relative to this directory. - templates_path = ["_templates"] -diff --git a/tox.ini b/tox.ini -index eb2f4f6..e5ac6a3 100644 ---- a/tox.ini -+++ b/tox.ini -@@ -124,17 +124,8 @@ commands = - sphinx-build --color -b html -d build/.doctree aiosmtpd/docs build/html - sphinx-build --color -b man -d build/.doctree aiosmtpd/docs build/man - deps: -- # IMPORTANT: If you edit this, also edit the files: -- # - .github/workflows/unit-testing-and-coverage.yml -- # - aiosmtpd/docs/RTD-requirements.txt - colorama -- sphinx -- sphinx-autofixture -- sphinx_rtd_theme -- pickle5 ; python_version < '3.8' -- # The below used as deps, need to be installed so autofixture work properly -- pytest -- pytest-mock -+ -raiosmtpd/docs/RTD-requirements.txt - - [testenv:static] - basepython = python3 --- -2.32.0 - diff --git a/1.4.2.tar.gz b/1.4.2.tar.gz deleted file mode 100644 index 65d42fbc7e3abdb0d5bc007867a4f81232aa27e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139929 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ⅅ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

0=q7d9R#9Kb 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 HEAz{;7ojRF&3HmcGcGn2 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≧5~Lm}&N2v1IrJIA}nhZqd( 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 diff --git a/284.patch b/284.patch deleted file mode 100644 index 89e8d7a..0000000 --- a/284.patch +++ /dev/null @@ -1,46 +0,0 @@ -From e302182240ea59f4cf65c7d4b128be29417f33a2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= -Date: Thu, 23 Sep 2021 15:55:02 +0200 -Subject: [PATCH] Avoid SSLError: Cannot create a client socket with a - PROTOCOL_TLS_SERVER context - -When we build mailman3 in Fedora with Python 3.10.0rc2, -we see the following problem: - - Traceback (most recent call last): - File "/builddir/build/BUILD/mailman-3.3.4/src/mailman/testing/layers.py", line 297, in setUp - cls.smtpd.start() - File "/builddir/build/BUILD/mailman-3.3.4/src/mailman/testing/mta.py", line 177, in start - super().start() - File "/usr/lib/python3.10/site-packages/aiosmtpd/controller.py", line 288, in start - self._trigger_server() - File "/usr/lib/python3.10/site-packages/aiosmtpd/controller.py", line 481, in _trigger_server - InetMixin._trigger_server(self) - File "/usr/lib/python3.10/site-packages/aiosmtpd/controller.py", line 428, in _trigger_server - s = stk.enter_context(self.ssl_context.wrap_socket(s)) - File "/usr/lib64/python3.10/ssl.py", line 512, in wrap_socket - return self.sslsocket_class._create( - File "/usr/lib64/python3.10/ssl.py", line 1061, in _create - self._sslobj = self._context._wrap_socket( - ssl.SSLError: Cannot create a client socket with a PROTOCOL_TLS_SERVER context (_ssl.c:801) - -This makes the problem go away. - -Disclaimer: I have no idea what I'm doing here. ---- - aiosmtpd/controller.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/aiosmtpd/controller.py b/aiosmtpd/controller.py -index 79bdbd04..30fd4a11 100644 ---- a/aiosmtpd/controller.py -+++ b/aiosmtpd/controller.py -@@ -424,7 +424,7 @@ def _trigger_server(self): - hostname = self.hostname or self._localhost - with ExitStack() as stk: - s = stk.enter_context(create_connection((hostname, self.port), 1.0)) -- if self.ssl_context: -+ if self.ssl_context and self.ssl_context.protocol != ssl.PROTOCOL_TLS_SERVER: - s = stk.enter_context(self.ssl_context.wrap_socket(s)) - s.recv(1024) - diff --git a/aiosmtpd-1.4.4.tar.gz b/aiosmtpd-1.4.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..8a6f56c15297b8fb1a314346889e0658ac68c229 GIT binary patch literal 151390 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

A^x>#`(a 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 literal 0 HcmV?d00001 diff --git a/python-aiosmtpd.spec b/python-aiosmtpd.spec index 0623b3e..42d8a84 100644 --- a/python-aiosmtpd.spec +++ b/python-aiosmtpd.spec @@ -1,19 +1,14 @@ %global _empty_manifest_terminate_build 0 Name: python-aiosmtpd -Version: 1.4.2 +Version: 1.4.4 Release: 1 Summary: aiosmtpd - asyncio based SMTP server License: Apache 2.0 URL: https://github.com/aio-libs/aiosmtpd -Source0: https://github.com/aio-libs/aiosmtpd/archive/%{version}.tar.gz -Patch0001: 0001-Implement-Unthreaded-Controller-256.patch -Patch0002: 0002-Code-Hygiene-259.patch -Patch0003: 0003-URGENT-Fix-RTD-docs-gen.patch -Patch0004: 0004-Make-Sphinx-RTD-deps-SSOT.patch -Patch0005: %{url}/pull/284.patch - +Source0: https://github.com/aio-libs/aiosmtpd/archive/%{version}.tar.gz#/aiosmtpd-%{version}.tar.gz BuildArch: noarch + %description This is a server for SMTP and related protocols, similar in utility to the standard library's smtpd.py module, but rewritten to be based on asyncio for @@ -21,10 +16,9 @@ Python 3. %package -n python3-aiosmtpd Summary: aiosmtpd - asyncio based SMTP server -Provides: python-aiosmtpd +Provides: python-aiosmtpd = %{version}-%{release} BuildRequires: python3-devel BuildRequires: python3-setuptools - %description -n python3-aiosmtpd This is a server for SMTP and related protocols, similar in utility to the standard library's smtpd.py module, but rewritten to be based on asyncio for @@ -33,12 +27,11 @@ Python 3. %package help Summary: Development documents and examples for aiosmtpd Provides: python3-aiosmtpd-doc - %description help Development documents and examples for aiosmtpd. %prep -%autosetup -p1 -n aiosmtpd-%{version} +%autosetup -n aiosmtpd-%{version} %build %py3_build @@ -78,6 +71,9 @@ mv %{buildroot}/doclist.lst . %{_pkgdocdir} %changelog +* Mon Mar 20 2023 jiangxinyu - 1.4.4-1 +- Update package to version 1.4.4 + * Tue Jun 07 2022 SimpleUpdate Robot - 1.4.2-1 - Upgrade to version 1.4.2