From 2e2cf5b40473bbe2fdf1b0771fc28e174603a1c0 Mon Sep 17 00:00:00 2001 From: Richard Schwab Date: Sun, 8 May 2022 22:19:52 +0200 Subject: [PATCH] Add `implicit_tls` connect arg to support non-standard implicit TLS connections, such as Google Cloud SQL fixes #757 --- CHANGES.txt | 5 +++++ aiomysql/connection.py | 14 ++++++++++---- docs/connection.rst | 7 ++++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index c717378f..68523f1f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,11 @@ Changes ------- +next (unreleased) +^^^^^^^^^^^^^^^^^ + +* Add `implicit_tls` connect arg to support non-standard implicit TLS connections, such as Google Cloud SQL #757 + 0.1.1 (2022-05-08) ^^^^^^^^^^^^^^^^^^ diff --git a/aiomysql/connection.py b/aiomysql/connection.py index 022315a9..26be319d 100644 --- a/aiomysql/connection.py +++ b/aiomysql/connection.py @@ -53,7 +53,7 @@ def connect(host="localhost", user=None, password="", connect_timeout=None, read_default_group=None, autocommit=False, echo=False, local_infile=False, loop=None, ssl=None, auth_plugin='', - program_name='', server_public_key=None): + program_name='', server_public_key=None, implicit_tls=False): """See connections.Connection.__init__() for information about defaults.""" coro = _connect(host=host, user=user, password=password, db=db, @@ -66,7 +66,8 @@ def connect(host="localhost", user=None, password="", read_default_group=read_default_group, autocommit=autocommit, echo=echo, local_infile=local_infile, loop=loop, ssl=ssl, - auth_plugin=auth_plugin, program_name=program_name) + auth_plugin=auth_plugin, program_name=program_name, + implicit_tls=implicit_tls) return _ConnectionContextManager(coro) @@ -142,7 +143,7 @@ def __init__(self, host="localhost", user=None, password="", connect_timeout=None, read_default_group=None, autocommit=False, echo=False, local_infile=False, loop=None, ssl=None, auth_plugin='', - program_name='', server_public_key=None): + program_name='', server_public_key=None, implicit_tls=False): """ Establish a connection to the MySQL database. Accepts several arguments: @@ -184,6 +185,9 @@ def __init__(self, host="localhost", user=None, password="", handshaking with MySQL. (omitted by default) :param server_public_key: SHA256 authentication plugin public key value. + :param implicit_tls: Establish TLS immediately, skipping non-TLS + preamble before upgrading to TLS. + (default: False) :param loop: asyncio loop """ self._loop = loop or asyncio.get_event_loop() @@ -218,6 +222,7 @@ def __init__(self, host="localhost", user=None, password="", self._auth_plugin_used = "" self._secure = False self.server_public_key = server_public_key + self._implicit_tls = implicit_tls self.salt = None from . import __version__ @@ -738,7 +743,8 @@ async def _request_authentication(self): charset_id, b'') if self._ssl_context and self.server_capabilities & CLIENT.SSL: - self.write_packet(data_init) + if not self._implicit_tls: + self.write_packet(data_init) # Stop sending events to data_received self._writer.transport.pause_reading() diff --git a/docs/connection.rst b/docs/connection.rst index 49936e01..de23a0cd 100644 --- a/docs/connection.rst +++ b/docs/connection.rst @@ -47,7 +47,7 @@ Example:: connect_timeout=None, read_default_group=None, autocommit=False, echo=False ssl=None, auth_plugin='', program_name='', - server_public_key=None, loop=None) + server_public_key=None, loop=None, implicit_tls=False) A :ref:`coroutine ` that connects to MySQL. @@ -93,6 +93,11 @@ Example:: ``sys.argv[0]`` is no longer passed by default :param server_public_key: SHA256 authenticaiton plugin public key value. :param loop: asyncio event loop instance or ``None`` for default one. + :param implicit_tls: Establish TLS immediately, skipping non-TLS + preamble before upgrading to TLS. + (default: False) + + .. versionadded:: 0.2 :returns: :class:`Connection` instance.