Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-aiosmtplib for 
openSUSE:Factory checked in at 2021-05-02 18:35:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-aiosmtplib (Old)
 and      /work/SRC/openSUSE:Factory/.python-aiosmtplib.new.1947 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-aiosmtplib"

Sun May  2 18:35:58 2021 rev:5 rq:889680 version:1.1.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-aiosmtplib/python-aiosmtplib.changes      
2020-12-01 14:23:20.941629823 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-aiosmtplib.new.1947/python-aiosmtplib.changes
    2021-05-02 18:39:05.204188289 +0200
@@ -1,0 +2,9 @@
+Fri Apr 30 10:00:09 UTC 2021 - Matej Cepl <[email protected]>
+
+- Update to 1.1.5:
+  - Bugfix: avoid raising asyncio.CancelledError on connection lost
+  - Bugfix: allow UTF-8 chars in usernames and password strings
+  - Feature: allow bytes type args for login usernames and passwords
+- Switch off failing tests because of gh#cole/aiosmtplib#171.
+
+-------------------------------------------------------------------

Old:
----
  aiosmtplib-1.1.4.tar.gz

New:
----
  aiosmtplib-1.1.5.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-aiosmtplib.spec ++++++
--- /var/tmp/diff_new_pack.LEAG8U/_old  2021-05-02 18:39:05.640186431 +0200
+++ /var/tmp/diff_new_pack.LEAG8U/_new  2021-05-02 18:39:05.640186431 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-aiosmtplib
 #
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %define skip_python2 1
 Name:           python-aiosmtplib
-Version:        1.1.4
+Version:        1.1.5
 Release:        0
 Summary:        Python asyncio SMTP client
 License:        MIT
@@ -53,8 +53,8 @@
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 
 %check
-# test_qq_login or test_starttls_gmail are online
-%pytest -rs -k 'not (test_qq_login or test_starttls_gmail)'
+# gh#cole/aiosmtplib#171
+%pytest -rs -k 'not (test_qq_login or test_starttls_gmail or 
test_send_with_login or test_connect_with_login)'
 
 %files %{python_files}
 %doc README.rst docs/*.rst

++++++ aiosmtplib-1.1.4.tar.gz -> aiosmtplib-1.1.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/PKG-INFO 
new/aiosmtplib-1.1.5/PKG-INFO
--- old/aiosmtplib-1.1.4/PKG-INFO       2020-09-12 19:20:12.445738000 +0200
+++ new/aiosmtplib-1.1.5/PKG-INFO       2021-04-25 19:31:03.087155800 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: aiosmtplib
-Version: 1.1.4
+Version: 1.1.5
 Summary: asyncio SMTP client
 Home-page: https://github.com/cole/aiosmtplib
 License: MIT
@@ -19,6 +19,7 @@
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
 Classifier: Topic :: Communications
 Classifier: Topic :: Communications :: Email
 Classifier: Topic :: Software Development :: Libraries
@@ -36,7 +37,7 @@
 aiosmtplib
 ==========
 
-|circleci| |codecov| |pypi-version| |pypi-python-versions| |pypi-status|
+|circleci| |codecov| |pypi-version| |pypi-python-versions| |pypi-status| 
|downloads|
 |pypi-license| |black|
 
 ------------
@@ -76,8 +77,8 @@
 
 
 
-.. |circleci| image:: 
https://circleci.com/gh/cole/aiosmtplib/tree/master.svg?style=shield
-           :target: https://circleci.com/gh/cole/aiosmtplib/tree/master
+.. |circleci| image:: 
https://circleci.com/gh/cole/aiosmtplib/tree/main.svg?style=shield
+           :target: https://circleci.com/gh/cole/aiosmtplib/tree/main
            :alt: "aiosmtplib CircleCI build status"
 .. |pypi-version| image:: https://img.shields.io/pypi/v/aiosmtplib.svg
                  :target: https://pypi.python.org/pypi/aiosmtplib
@@ -85,10 +86,13 @@
 .. |pypi-python-versions| image:: 
https://img.shields.io/pypi/pyversions/aiosmtplib.svg
 .. |pypi-status| image:: https://img.shields.io/pypi/status/aiosmtplib.svg
 .. |pypi-license| image:: https://img.shields.io/pypi/l/aiosmtplib.svg
-.. |codecov| image:: 
https://codecov.io/gh/cole/aiosmtplib/branch/master/graph/badge.svg
+.. |codecov| image:: 
https://codecov.io/gh/cole/aiosmtplib/branch/main/graph/badge.svg
              :target: https://codecov.io/gh/cole/aiosmtplib
 .. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg
            :target: https://github.com/ambv/black
            :alt: "Code style: black"
+.. |downloads| image:: https://pepy.tech/badge/aiosmtplib
+               :target: https://pepy.tech/project/aiosmtplib
+               :alt: "aiosmtplib on pypy.tech"
 .. _Read The Docs: https://aiosmtplib.readthedocs.io/en/stable/overview.html
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/README.rst 
new/aiosmtplib-1.1.5/README.rst
--- old/aiosmtplib-1.1.4/README.rst     2020-09-12 19:19:34.795263800 +0200
+++ new/aiosmtplib-1.1.5/README.rst     2021-04-25 19:31:01.233004600 +0200
@@ -1,7 +1,7 @@
 aiosmtplib
 ==========
 
-|circleci| |codecov| |pypi-version| |pypi-python-versions| |pypi-status|
+|circleci| |codecov| |pypi-version| |pypi-python-versions| |pypi-status| 
|downloads|
 |pypi-license| |black|
 
 ------------
@@ -41,8 +41,8 @@
 
 
 
-.. |circleci| image:: 
https://circleci.com/gh/cole/aiosmtplib/tree/master.svg?style=shield
-           :target: https://circleci.com/gh/cole/aiosmtplib/tree/master
+.. |circleci| image:: 
https://circleci.com/gh/cole/aiosmtplib/tree/main.svg?style=shield
+           :target: https://circleci.com/gh/cole/aiosmtplib/tree/main
            :alt: "aiosmtplib CircleCI build status"
 .. |pypi-version| image:: https://img.shields.io/pypi/v/aiosmtplib.svg
                  :target: https://pypi.python.org/pypi/aiosmtplib
@@ -50,9 +50,12 @@
 .. |pypi-python-versions| image:: 
https://img.shields.io/pypi/pyversions/aiosmtplib.svg
 .. |pypi-status| image:: https://img.shields.io/pypi/status/aiosmtplib.svg
 .. |pypi-license| image:: https://img.shields.io/pypi/l/aiosmtplib.svg
-.. |codecov| image:: 
https://codecov.io/gh/cole/aiosmtplib/branch/master/graph/badge.svg
+.. |codecov| image:: 
https://codecov.io/gh/cole/aiosmtplib/branch/main/graph/badge.svg
              :target: https://codecov.io/gh/cole/aiosmtplib
 .. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg
            :target: https://github.com/ambv/black
            :alt: "Code style: black"
+.. |downloads| image:: https://pepy.tech/badge/aiosmtplib
+               :target: https://pepy.tech/project/aiosmtplib
+               :alt: "aiosmtplib on pypy.tech"
 .. _Read The Docs: https://aiosmtplib.readthedocs.io/en/stable/overview.html
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/__init__.py 
new/aiosmtplib-1.1.5/aiosmtplib/__init__.py
--- old/aiosmtplib-1.1.4/aiosmtplib/__init__.py 2020-09-12 19:19:34.803263700 
+0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/__init__.py 2021-04-25 19:31:01.233004600 
+0200
@@ -32,10 +32,10 @@
 
 
 __title__ = "aiosmtplib"
-__version__ = "1.1.4"
+__version__ = "1.1.5"
 __author__ = "Cole Maclean"
 __license__ = "MIT"
-__copyright__ = "Copyright 2020 Cole Maclean"
+__copyright__ = "Copyright 2021 Cole Maclean"
 __all__ = (
     "send",
     "SMTP",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/api.py 
new/aiosmtplib-1.1.5/aiosmtplib/api.py
--- old/aiosmtplib-1.1.4/aiosmtplib/api.py      2020-09-12 19:19:34.807263600 
+0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/api.py      2021-04-25 19:31:01.233004600 
+0200
@@ -35,8 +35,8 @@
     recipients: Optional[Union[str, Sequence[str]]] = ...,
     hostname: str = ...,
     port: Optional[int] = ...,
-    username: Optional[str] = ...,
-    password: Optional[str] = ...,
+    username: Optional[Union[str, bytes]] = ...,
+    password: Optional[Union[str, bytes]] = ...,
     mail_options: Optional[List[str]] = ...,
     rcpt_options: Optional[List[str]] = ...,
     timeout: Optional[float] = ...,
@@ -61,8 +61,8 @@
     recipients: Union[str, Sequence[str]] = ...,
     hostname: str = ...,
     port: Optional[int] = ...,
-    username: Optional[str] = ...,
-    password: Optional[str] = ...,
+    username: Optional[Union[str, bytes]] = ...,
+    password: Optional[Union[str, bytes]] = ...,
     mail_options: Optional[List[str]] = ...,
     rcpt_options: Optional[List[str]] = ...,
     timeout: Optional[float] = ...,
@@ -87,8 +87,8 @@
     recipients: Optional[Union[str, Sequence[str]]] = ...,
     hostname: str = ...,
     port: Optional[int] = ...,
-    username: Optional[str] = ...,
-    password: Optional[str] = ...,
+    username: Optional[Union[str, bytes]] = ...,
+    password: Optional[Union[str, bytes]] = ...,
     mail_options: Optional[List[str]] = ...,
     rcpt_options: Optional[List[str]] = ...,
     timeout: Optional[float] = ...,
@@ -113,8 +113,8 @@
     recipients: Union[str, Sequence[str]] = ...,
     hostname: str = ...,
     port: Optional[int] = ...,
-    username: Optional[str] = ...,
-    password: Optional[str] = ...,
+    username: Optional[Union[str, bytes]] = ...,
+    password: Optional[Union[str, bytes]] = ...,
     mail_options: Optional[List[str]] = ...,
     rcpt_options: Optional[List[str]] = ...,
     timeout: Optional[float] = ...,
@@ -139,8 +139,8 @@
     recipients: Optional[Union[str, Sequence[str]]] = ...,
     hostname: None = ...,
     port: None = ...,
-    username: Optional[str] = ...,
-    password: Optional[str] = ...,
+    username: Optional[Union[str, bytes]] = ...,
+    password: Optional[Union[str, bytes]] = ...,
     mail_options: Optional[List[str]] = ...,
     rcpt_options: Optional[List[str]] = ...,
     timeout: Optional[float] = ...,
@@ -165,8 +165,8 @@
     recipients: Union[str, Sequence[str]] = ...,
     hostname: None = ...,
     port: None = ...,
-    username: Optional[str] = ...,
-    password: Optional[str] = ...,
+    username: Optional[Union[str, bytes]] = ...,
+    password: Optional[Union[str, bytes]] = ...,
     mail_options: Optional[List[str]] = ...,
     rcpt_options: Optional[List[str]] = ...,
     timeout: Optional[float] = ...,
@@ -191,8 +191,8 @@
     recipients: Optional[Union[str, Sequence[str]]] = ...,
     hostname: None = ...,
     port: None = ...,
-    username: Optional[str] = ...,
-    password: Optional[str] = ...,
+    username: Optional[Union[str, bytes]] = ...,
+    password: Optional[Union[str, bytes]] = ...,
     mail_options: Optional[List[str]] = ...,
     rcpt_options: Optional[List[str]] = ...,
     timeout: Optional[float] = ...,
@@ -217,8 +217,8 @@
     recipients: Union[str, Sequence[str]] = ...,
     hostname: None = ...,
     port: None = ...,
-    username: Optional[str] = ...,
-    password: Optional[str] = ...,
+    username: Optional[Union[str, bytes]] = ...,
+    password: Optional[Union[str, bytes]] = ...,
     mail_options: Optional[List[str]] = ...,
     rcpt_options: Optional[List[str]] = ...,
     timeout: Optional[float] = ...,
@@ -243,8 +243,8 @@
     recipients: Optional[Union[str, Sequence[str]]] = ...,
     hostname: None = ...,
     port: None = ...,
-    username: Optional[str] = ...,
-    password: Optional[str] = ...,
+    username: Optional[Union[str, bytes]] = ...,
+    password: Optional[Union[str, bytes]] = ...,
     mail_options: Optional[List[str]] = ...,
     rcpt_options: Optional[List[str]] = ...,
     timeout: Optional[float] = ...,
@@ -269,8 +269,8 @@
     recipients: Union[str, Sequence[str]] = ...,
     hostname: None = ...,
     port: None = ...,
-    username: Optional[str] = ...,
-    password: Optional[str] = ...,
+    username: Optional[Union[str, bytes]] = ...,
+    password: Optional[Union[str, bytes]] = ...,
     mail_options: Optional[List[str]] = ...,
     rcpt_options: Optional[List[str]] = ...,
     timeout: Optional[float] = ...,
@@ -295,8 +295,8 @@
     recipients: Optional[Union[str, Sequence[str]]] = ...,
     hostname: None = ...,
     port: None = ...,
-    username: Optional[str] = ...,
-    password: Optional[str] = ...,
+    username: Optional[Union[str, bytes]] = ...,
+    password: Optional[Union[str, bytes]] = ...,
     mail_options: Optional[List[str]] = ...,
     rcpt_options: Optional[List[str]] = ...,
     timeout: Optional[float] = ...,
@@ -321,8 +321,8 @@
     recipients: Union[str, Sequence[str]] = ...,
     hostname: None = ...,
     port: None = ...,
-    username: Optional[str] = ...,
-    password: Optional[str] = ...,
+    username: Optional[Union[str, bytes]] = ...,
+    password: Optional[Union[str, bytes]] = ...,
     mail_options: Optional[List[str]] = ...,
     rcpt_options: Optional[List[str]] = ...,
     timeout: Optional[float] = ...,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/auth.py 
new/aiosmtplib-1.1.5/aiosmtplib/auth.py
--- old/aiosmtplib-1.1.4/aiosmtplib/auth.py     2020-09-12 19:19:34.807263600 
+0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/auth.py     2021-04-25 19:31:01.233004600 
+0200
@@ -18,7 +18,7 @@
 def crammd5_verify(username: bytes, password: bytes, challenge: bytes) -> 
bytes:
     decoded_challenge = base64.b64decode(challenge)
     md5_digest = hmac.new(password, msg=decoded_challenge, digestmod="md5")
-    verification = username + b" " + md5_digest.hexdigest().encode("ascii")
+    verification = username + b" " + md5_digest.hexdigest().encode("utf-8")
     encoded_verification = base64.b64encode(verification)
 
     return encoded_verification
@@ -42,8 +42,8 @@
 
     async def login(
         self,
-        username: str,
-        password: str,
+        username: Union[str, bytes],
+        password: Union[str, bytes],
         timeout: Optional[Union[float, Default]] = _default,
     ) -> SMTPResponse:
         """
@@ -90,8 +90,8 @@
 
     async def auth_crammd5(
         self,
-        username: str,
-        password: str,
+        username: Union[str, bytes],
+        password: Union[str, bytes],
         timeout: Optional[Union[float, Default]] = _default,
     ) -> SMTPResponse:
         """
@@ -115,9 +115,17 @@
                 initial_response.code, initial_response.message
             )
 
-        password_bytes = password.encode("ascii")
-        username_bytes = username.encode("ascii")
-        response_bytes = initial_response.message.encode("ascii")
+        if isinstance(password, bytes):
+            password_bytes = password
+        else:
+            password_bytes = password.encode("utf-8")
+
+        if isinstance(username, bytes):
+            username_bytes = username
+        else:
+            username_bytes = username.encode("utf-8")
+
+        response_bytes = initial_response.message.encode("utf-8")
 
         verification_bytes = crammd5_verify(
             username_bytes, password_bytes, response_bytes
@@ -132,8 +140,8 @@
 
     async def auth_plain(
         self,
-        username: str,
-        password: str,
+        username: Union[str, bytes],
+        password: Union[str, bytes],
         timeout: Optional[Union[float, Default]] = _default,
     ) -> SMTPResponse:
         """
@@ -147,8 +155,16 @@
             235 ok, go ahead (#2.0.0)
 
         """
-        username_bytes = username.encode("ascii")
-        password_bytes = password.encode("ascii")
+        if isinstance(password, bytes):
+            password_bytes = password
+        else:
+            password_bytes = password.encode("utf-8")
+
+        if isinstance(username, bytes):
+            username_bytes = username
+        else:
+            username_bytes = username.encode("utf-8")
+
         username_and_password = b"\0" + username_bytes + b"\0" + password_bytes
         encoded = base64.b64encode(username_and_password)
 
@@ -163,8 +179,8 @@
 
     async def auth_login(
         self,
-        username: str,
-        password: str,
+        username: Union[str, bytes],
+        password: Union[str, bytes],
         timeout: Optional[Union[float, Default]] = _default,
     ) -> SMTPResponse:
         """
@@ -190,8 +206,18 @@
         However, since most servers seem to support both, we send the username
         with the initial request.
         """
-        encoded_username = base64.b64encode(username.encode("ascii"))
-        encoded_password = base64.b64encode(password.encode("ascii"))
+        if isinstance(password, bytes):
+            password_bytes = password
+        else:
+            password_bytes = password.encode("utf-8")
+
+        if isinstance(username, bytes):
+            username_bytes = username
+        else:
+            username_bytes = username.encode("utf-8")
+
+        encoded_username = base64.b64encode(username_bytes)
+        encoded_password = base64.b64encode(password_bytes)
 
         initial_response = await self.execute_command(
             b"AUTH", b"LOGIN", encoded_username, timeout=timeout
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/compat.py 
new/aiosmtplib-1.1.5/aiosmtplib/compat.py
--- old/aiosmtplib-1.1.4/aiosmtplib/compat.py   2020-09-12 19:19:34.811263600 
+0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/compat.py   2021-04-25 19:31:01.233004600 
+0200
@@ -36,7 +36,7 @@
     if PY37_OR_LATER:
         return asyncio.all_tasks(loop=loop)
 
-    return asyncio.Task.all_tasks(loop=loop)
+    return asyncio.Task.all_tasks(loop=loop)  # type: ignore
 
 
 async def start_tls(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/connection.py 
new/aiosmtplib-1.1.5/aiosmtplib/connection.py
--- old/aiosmtplib-1.1.4/aiosmtplib/connection.py       2020-09-12 
19:19:34.815263700 +0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/connection.py       2021-04-25 
19:31:01.233004600 +0200
@@ -53,8 +53,8 @@
         self,
         hostname: Optional[str] = "localhost",
         port: Optional[int] = None,
-        username: Optional[str] = None,
-        password: Optional[str] = None,
+        username: Optional[Union[str, bytes]] = None,
+        password: Optional[Union[str, bytes]] = None,
         source_address: Optional[str] = None,
         timeout: Optional[float] = DEFAULT_TIMEOUT,
         loop: Optional[asyncio.AbstractEventLoop] = None,
@@ -174,8 +174,8 @@
         self,
         hostname: Optional[Union[str, Default]] = _default,
         port: Optional[Union[int, Default]] = _default,
-        username: Optional[Union[str, Default]] = _default,
-        password: Optional[Union[str, Default]] = _default,
+        username: Optional[Union[str, bytes, Default]] = _default,
+        password: Optional[Union[str, bytes, Default]] = _default,
         source_address: Optional[Union[str, Default]] = _default,
         timeout: Optional[Union[float, Default]] = _default,
         loop: Optional[Union[asyncio.AbstractEventLoop, Default]] = _default,
@@ -432,8 +432,8 @@
 
     async def login(
         self,
-        username: str,
-        password: str,
+        username: Union[str, bytes],
+        password: Union[str, bytes],
         timeout: Optional[Union[float, Default]] = _default,
     ) -> SMTPResponse:
         raise NotImplementedError
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/protocol.py 
new/aiosmtplib-1.1.5/aiosmtplib/protocol.py
--- old/aiosmtplib-1.1.4/aiosmtplib/protocol.py 2020-09-12 19:19:34.823263600 
+0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/protocol.py 2021-04-25 19:31:01.233004600 
+0200
@@ -138,15 +138,12 @@
     def connection_lost(self, exc: Optional[Exception]) -> None:
         super().connection_lost(exc)
 
+        smtp_exc = SMTPServerDisconnected("Connection lost")
         if exc:
-            smtp_exc = SMTPServerDisconnected("Connection lost")
             smtp_exc.__cause__ = exc
 
         if self._response_waiter and not self._response_waiter.done():
-            if exc:
-                self._response_waiter.set_exception(smtp_exc)
-            else:
-                self._response_waiter.cancel()
+            self._response_waiter.set_exception(smtp_exc)
 
         if self._connection_lost_waiter and not 
self._connection_lost_waiter.done():
             if exc:
@@ -195,8 +192,7 @@
         return False
 
     def _read_response_from_buffer(self) -> Optional[SMTPResponse]:
-        """Parse the actual response (if any) from the data buffer
-        """
+        """Parse the actual response (if any) from the data buffer"""
         code = -1
         message = bytearray()
         offset = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/response.py 
new/aiosmtplib-1.1.5/aiosmtplib/response.py
--- old/aiosmtplib-1.1.4/aiosmtplib/response.py 2020-09-12 19:19:34.831263500 
+0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/response.py 2021-04-25 19:31:01.233004600 
+0200
@@ -7,7 +7,7 @@
 __all__ = ("SMTPResponse",)
 
 
-BaseResponse = NamedTuple("SMTPResponse", [("code", int), ("message", str)])
+BaseResponse = NamedTuple("BaseResponse", [("code", int), ("message", str)])
 
 
 class SMTPResponse(BaseResponse):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/docs/conf.py 
new/aiosmtplib-1.1.5/docs/conf.py
--- old/aiosmtplib-1.1.4/docs/conf.py   2020-09-12 19:19:34.843263600 +0200
+++ new/aiosmtplib-1.1.5/docs/conf.py   2021-04-25 19:31:01.233004600 +0200
@@ -186,6 +186,7 @@
     ("py:class", "typing.Tuple"),
     ("py:class", "concurrent.futures._base.TimeoutError"),
     ("py:class", "asyncio.exceptions.TimeoutError"),
+    ("py:class", "socket.socket"),
 ]
 
 doctest_global_setup = """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/pyproject.toml 
new/aiosmtplib-1.1.5/pyproject.toml
--- old/aiosmtplib-1.1.4/pyproject.toml 2020-09-12 19:19:34.859263700 +0200
+++ new/aiosmtplib-1.1.5/pyproject.toml 2021-04-25 19:31:01.233004600 +0200
@@ -4,7 +4,7 @@
 
 [tool.poetry]
 name = "aiosmtplib"
-version = "1.1.4"
+version = "1.1.5"
 description = "asyncio SMTP client"
 authors = ["Cole Maclean <[email protected]>"]
 license = "MIT"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/setup.py 
new/aiosmtplib-1.1.5/setup.py
--- old/aiosmtplib-1.1.4/setup.py       2020-09-12 19:20:12.445069300 +0200
+++ new/aiosmtplib-1.1.5/setup.py       2021-04-25 19:31:03.086809200 +0200
@@ -13,9 +13,9 @@
 
 setup_kwargs = {
     'name': 'aiosmtplib',
-    'version': '1.1.4',
+    'version': '1.1.5',
     'description': 'asyncio SMTP client',
-    'long_description': 'aiosmtplib\n==========\n\n|circleci| |codecov| 
|pypi-version| |pypi-python-versions| |pypi-status|\n|pypi-license| 
|black|\n\n------------\n\naiosmtplib is an asynchronous SMTP client for use 
with asyncio.\n\nFor documentation, see `Read The 
Docs`_.\n\nQuickstart\n----------\n\n.. code-block:: python\n\n    import 
asyncio\n    from email.message import EmailMessage\n\n    import 
aiosmtplib\n\n    message = EmailMessage()\n    message["From"] = 
"root@localhost"\n    message["To"] = "[email protected]"\n    
message["Subject"] = "Hello World!"\n    message.set_content("Sent via 
aiosmtplib")\n\n    loop = asyncio.get_event_loop()\n    
loop.run_until_complete(aiosmtplib.send(message, hostname="127.0.0.1", 
port=25))\n\n\nRequirements\n------------\nPython 3.5.2+, compiled with SSL 
support, is required.\n\n\nBug reporting\n-------------\nBug reports (and 
feature requests) are welcome via Github issues.\n\n\n\n.. |circleci| image:: 
https://circleci.com/gh/cole/ai
 osmtplib/tree/master.svg?style=shield\n           :target: 
https://circleci.com/gh/cole/aiosmtplib/tree/master\n           :alt: 
"aiosmtplib CircleCI build status"\n.. |pypi-version| image:: 
https://img.shields.io/pypi/v/aiosmtplib.svg\n                 :target: 
https://pypi.python.org/pypi/aiosmtplib\n                 :alt: "aiosmtplib on 
the Python Package Index"\n.. |pypi-python-versions| image:: 
https://img.shields.io/pypi/pyversions/aiosmtplib.svg\n.. |pypi-status| image:: 
https://img.shields.io/pypi/status/aiosmtplib.svg\n.. |pypi-license| image:: 
https://img.shields.io/pypi/l/aiosmtplib.svg\n.. |codecov| image:: 
https://codecov.io/gh/cole/aiosmtplib/branch/master/graph/badge.svg\n           
  :target: https://codecov.io/gh/cole/aiosmtplib\n.. |black| image:: 
https://img.shields.io/badge/code%20style-black-000000.svg\n           :target: 
https://github.com/ambv/black\n           :alt: "Code style: black"\n.. _Read 
The Docs: https://aiosmtplib.readthedocs.io/en/stable/overview.
 html\n',
+    'long_description': 'aiosmtplib\n==========\n\n|circleci| |codecov| 
|pypi-version| |pypi-python-versions| |pypi-status| |downloads|\n|pypi-license| 
|black|\n\n------------\n\naiosmtplib is an asynchronous SMTP client for use 
with asyncio.\n\nFor documentation, see `Read The 
Docs`_.\n\nQuickstart\n----------\n\n.. code-block:: python\n\n    import 
asyncio\n    from email.message import EmailMessage\n\n    import 
aiosmtplib\n\n    message = EmailMessage()\n    message["From"] = 
"root@localhost"\n    message["To"] = "[email protected]"\n    
message["Subject"] = "Hello World!"\n    message.set_content("Sent via 
aiosmtplib")\n\n    loop = asyncio.get_event_loop()\n    
loop.run_until_complete(aiosmtplib.send(message, hostname="127.0.0.1", 
port=25))\n\n\nRequirements\n------------\nPython 3.5.2+, compiled with SSL 
support, is required.\n\n\nBug reporting\n-------------\nBug reports (and 
feature requests) are welcome via Github issues.\n\n\n\n.. |circleci| image:: 
https://circleci.co
 m/gh/cole/aiosmtplib/tree/main.svg?style=shield\n           :target: 
https://circleci.com/gh/cole/aiosmtplib/tree/main\n           :alt: "aiosmtplib 
CircleCI build status"\n.. |pypi-version| image:: 
https://img.shields.io/pypi/v/aiosmtplib.svg\n                 :target: 
https://pypi.python.org/pypi/aiosmtplib\n                 :alt: "aiosmtplib on 
the Python Package Index"\n.. |pypi-python-versions| image:: 
https://img.shields.io/pypi/pyversions/aiosmtplib.svg\n.. |pypi-status| image:: 
https://img.shields.io/pypi/status/aiosmtplib.svg\n.. |pypi-license| image:: 
https://img.shields.io/pypi/l/aiosmtplib.svg\n.. |codecov| image:: 
https://codecov.io/gh/cole/aiosmtplib/branch/main/graph/badge.svg\n             
:target: https://codecov.io/gh/cole/aiosmtplib\n.. |black| image:: 
https://img.shields.io/badge/code%20style-black-000000.svg\n           :target: 
https://github.com/ambv/black\n           :alt: "Code style: black"\n.. 
|downloads| image:: https://pepy.tech/badge/aiosmtplib\n       
         :target: https://pepy.tech/project/aiosmtplib\n               :alt: 
"aiosmtplib on pypy.tech"\n.. _Read The Docs: 
https://aiosmtplib.readthedocs.io/en/stable/overview.html\n',
     'author': 'Cole Maclean',
     'author_email': '[email protected]',
     'maintainer': None,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/tests/conftest.py 
new/aiosmtplib-1.1.5/tests/conftest.py
--- old/aiosmtplib-1.1.4/tests/conftest.py      2020-09-12 19:19:34.879263400 
+0200
+++ new/aiosmtplib-1.1.5/tests/conftest.py      2021-04-25 19:31:01.233004600 
+0200
@@ -110,8 +110,7 @@
 
 @pytest.fixture(scope="session")
 def bind_address(request):
-    """Server side address for socket binding
-    """
+    """Server side address for socket binding"""
     return request.config.getoption("--bind-addr")
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/tests/test_auth.py 
new/aiosmtplib-1.1.5/tests/test_auth.py
--- old/aiosmtplib-1.1.4/tests/test_auth.py     2020-09-12 19:19:34.887263500 
+0200
+++ new/aiosmtplib-1.1.5/tests/test_auth.py     2021-04-25 19:31:01.233004600 
+0200
@@ -93,8 +93,8 @@
 
 @pytest.mark.parametrize(
     "username,password",
-    [("test", "test"), ("admin124", "$3cr3t$")],
-    ids=["test user", "admin user"],
+    [("test", "test"), ("admin124", "$3cr3t$"), ("f????", "b??r???")],
+    ids=["test user", "admin user", "utf-8 user"],
 )
 async def test_auth_plain_success(mock_auth, username, password):
     """
@@ -104,11 +104,24 @@
     await mock_auth.auth_plain(username, password)
 
     b64data = base64.b64encode(
-        b"\0" + username.encode("ascii") + b"\0" + password.encode("ascii")
+        b"\0" + username.encode("utf-8") + b"\0" + password.encode("utf-8")
     )
     assert mock_auth.received_commands == [b"AUTH PLAIN " + b64data]
 
 
+async def test_auth_plain_success_bytes(mock_auth):
+    """
+    Check that auth_plain base64 encodes the username/password when given as 
bytes.
+    """
+    username = "????????????".encode("tis-620")
+    password = "?????????".encode("tis-620")
+    mock_auth.responses.append(SUCCESS_RESPONSE)
+    await mock_auth.auth_plain(username, password)
+
+    b64data = base64.b64encode(b"\0" + username + b"\0" + password)
+    assert mock_auth.received_commands == [b"AUTH PLAIN " + b64data]
+
+
 async def test_auth_plain_error(mock_auth):
     mock_auth.responses.append(FAILURE_RESPONSE)
 
@@ -118,16 +131,30 @@
 
 @pytest.mark.parametrize(
     "username,password",
-    [("test", "test"), ("admin124", "$3cr3t$")],
-    ids=["test user", "admin user"],
+    [("test", "test"), ("admin124", "$3cr3t$"), ("f????", "b??r???")],
+    ids=["test user", "admin user", "utf-8 user"],
 )
 async def test_auth_login_success(mock_auth, username, password):
     continue_response = (SMTPStatus.auth_continue, "VXNlcm5hbWU6")
     mock_auth.responses.extend([continue_response, SUCCESS_RESPONSE])
     await mock_auth.auth_login(username, password)
 
-    b64username = base64.b64encode(username.encode("ascii"))
-    b64password = base64.b64encode(password.encode("ascii"))
+    b64username = base64.b64encode(username.encode("utf-8"))
+    b64password = base64.b64encode(password.encode("utf-8"))
+
+    assert mock_auth.received_commands == [b"AUTH LOGIN " + b64username, 
b64password]
+
+
+async def test_auth_login_success_bytes(mock_auth):
+    continue_response = (SMTPStatus.auth_continue, "VXNlcm5hbWU6")
+    mock_auth.responses.extend([continue_response, SUCCESS_RESPONSE])
+
+    username = "????????????".encode("tis-620")
+    password = "?????????".encode("tis-620")
+    await mock_auth.auth_login(username, password)
+
+    b64username = base64.b64encode(username)
+    b64password = base64.b64encode(password)
 
     assert mock_auth.received_commands == [b"AUTH LOGIN " + b64username, 
b64password]
 
@@ -148,25 +175,43 @@
 
 @pytest.mark.parametrize(
     "username,password",
-    [("test", "test"), ("admin124", "$3cr3t$")],
-    ids=["test user", "admin user"],
+    [("test", "test"), ("admin124", "$3cr3t$"), ("f????", "b??r???")],
+    ids=["test user", "admin user", "utf-8 user"],
 )
 async def test_auth_crammd5_success(mock_auth, username, password):
     continue_response = (
         SMTPStatus.auth_continue,
-        base64.b64encode(b"secretteststring").decode("ascii"),
+        base64.b64encode(b"secretteststring").decode("utf-8"),
     )
     mock_auth.responses.extend([continue_response, SUCCESS_RESPONSE])
     await mock_auth.auth_crammd5(username, password)
 
-    password_bytes = password.encode("ascii")
-    username_bytes = username.encode("ascii")
-    response_bytes = continue_response[1].encode("ascii")
+    password_bytes = password.encode("utf-8")
+    username_bytes = username.encode("utf-8")
+    response_bytes = continue_response[1].encode("utf-8")
 
     expected_command = crammd5_verify(username_bytes, password_bytes, 
response_bytes)
 
     assert mock_auth.received_commands == [b"AUTH CRAM-MD5", expected_command]
 
+
+async def test_auth_crammd5_success_bytes(mock_auth):
+    continue_response = (
+        SMTPStatus.auth_continue,
+        base64.b64encode(b"secretteststring").decode("utf-8"),
+    )
+    mock_auth.responses.extend([continue_response, SUCCESS_RESPONSE])
+
+    username = "????????????".encode("tis-620")
+    password = "?????????".encode("tis-620")
+    await mock_auth.auth_crammd5(username, password)
+
+    response_bytes = continue_response[1].encode("utf-8")
+
+    expected_command = crammd5_verify(username, password, response_bytes)
+
+    assert mock_auth.received_commands == [b"AUTH CRAM-MD5", expected_command]
+
 
 async def test_auth_crammd5_initial_error(mock_auth):
     mock_auth.responses.append(FAILURE_RESPONSE)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/tests/test_live.py 
new/aiosmtplib-1.1.5/tests/test_live.py
--- old/aiosmtplib-1.1.4/tests/test_live.py     2020-09-12 19:19:34.907263500 
+0200
+++ new/aiosmtplib-1.1.5/tests/test_live.py     2021-04-25 19:31:01.237004500 
+0200
@@ -8,7 +8,13 @@
 
 import pytest
 
-from aiosmtplib import SMTP, SMTPAuthenticationError, SMTPStatus, send
+from aiosmtplib import (
+    SMTP,
+    SMTPAuthenticationError,
+    SMTPSenderRefused,
+    SMTPStatus,
+    send,
+)
 
 
 pytestmark = [
@@ -35,7 +41,6 @@
         await client.login("test", "test")
 
 
[email protected]()
 async def test_qq_login():
     client = SMTP(hostname="smtp.qq.com", port=587, use_tls=False)
     await client.connect(timeout=2.0)
@@ -62,3 +67,18 @@
             password="test",
             username="test",
         )
+
+
+async def test_office365_skip_login():
+    message = EmailMessage()
+    message["From"] = "[email protected]"
+    message["To"] = "[email protected]"
+    message["Subject"] = "Hello World!"
+    message.set_content("Sent via aiosmtplib")
+
+    smtp_client = SMTP("smtp.office365.com", 587)
+    await smtp_client.connect()
+    await smtp_client.starttls()
+    # skip login, which is required
+    with pytest.raises(SMTPSenderRefused):
+        await smtp_client.send_message(message)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aiosmtplib-1.1.4/tests/test_tls.py 
new/aiosmtplib-1.1.5/tests/test_tls.py
--- old/aiosmtplib-1.1.4/tests/test_tls.py      2020-09-12 19:19:34.923263300 
+0200
+++ new/aiosmtplib-1.1.5/tests/test_tls.py      2021-04-25 19:31:01.237004500 
+0200
@@ -269,4 +269,4 @@
     with pytest.raises(SMTPConnectError) as exception_info:
         await tls_smtp_client.connect(validate_certs=True)
 
-    assert "CERTIFICATE_VERIFY_FAILED" in str(exception_info.value)
+    assert "CERTIFICATE" in str(exception_info.value).upper()

Reply via email to