diff --git a/asyncpg/protocol/coreproto.pyx b/asyncpg/protocol/coreproto.pyx index da96c412..5470d6fa 100644 --- a/asyncpg/protocol/coreproto.pyx +++ b/asyncpg/protocol/coreproto.pyx @@ -573,8 +573,14 @@ cdef class CoreProtocol: elif status == AUTH_REQUIRED_PASSWORD: # AuthenticationCleartextPassword - self.result_type = RESULT_OK - self.auth_msg = self._auth_password_message_cleartext() + if self.password is None: + self.result_type = RESULT_FAILED + self.result = apg_exc.InterfaceError( + 'password authentication requested by server, ' + 'but no password was supplied') + else: + self.result_type = RESULT_OK + self.auth_msg = self._auth_password_message_cleartext() elif status == AUTH_REQUIRED_PASSWORDMD5: # AuthenticationMD5Password diff --git a/tests/test_connect.py b/tests/test_connect.py index 955fb825..ba6ac0ea 100644 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -266,6 +266,12 @@ async def test_auth_password_cleartext(self): user='password_user', password='wrongpassword') + async def test_auth_password_cleartext_without_password(self): + with self.assertRaisesRegex( + asyncpg.InterfaceError, 'no password was supplied'): + await self._try_connect( + user='password_user', password=None) + async def test_auth_password_cleartext_callable(self): def get_correctpassword(): return CORRECT_PASSWORD