diff --git a/telethon/errors/__init__.py b/telethon/errors/__init__.py index f6bc16e5..ebb6ed07 100644 --- a/telethon/errors/__init__.py +++ b/telethon/errors/__init__.py @@ -6,7 +6,7 @@ import re from .common import ( ReadCancelledError, TypeNotFoundError, InvalidChecksumError, - InvalidBufferError, SecurityError, CdnFileTamperedError, + InvalidBufferError, AuthKeyNotFound, SecurityError, CdnFileTamperedError, AlreadyInConversationError, BadMessageError, MultiError ) diff --git a/telethon/errors/common.py b/telethon/errors/common.py index de7d95f8..4f2573d6 100644 --- a/telethon/errors/common.py +++ b/telethon/errors/common.py @@ -1,5 +1,6 @@ """Errors not related to the Telegram API itself""" import struct +import textwrap from ..tl import TLRequest @@ -58,6 +59,22 @@ class InvalidBufferError(BufferError): 'Invalid response buffer (too short {})'.format(self.payload)) +class AuthKeyNotFound(Exception): + """ + The server claims it doesn't know about the authorization key (session + file) currently being used. This might be because it either has never + seen this authorization key, or it used to know about the authorization + key but has forgotten it, either temporarily or permanently (possibly + due to server errors). + + If the issue persists, you may need to recreate the session file and login + again. This is not done automatically because it is not possible to know + if the issue is temporary or permanent. + """ + def __init__(self): + super().__init__(textwrap.dedent(self.__class__.__doc__)) + + class SecurityError(Exception): """ Generic security error, mostly used when generating a new AuthKey. diff --git a/telethon/network/mtprotosender.py b/telethon/network/mtprotosender.py index 05fd39e9..80c0c528 100644 --- a/telethon/network/mtprotosender.py +++ b/telethon/network/mtprotosender.py @@ -10,7 +10,7 @@ from .mtprotostate import MTProtoState from ..tl.tlobject import TLRequest from .. import helpers, utils from ..errors import ( - BadMessageError, InvalidBufferError, SecurityError, + BadMessageError, InvalidBufferError, AuthKeyNotFound, SecurityError, TypeNotFoundError, rpc_message_to_error ) from ..extensions import BinaryReader @@ -377,11 +377,8 @@ class MTProtoSender: except BufferError as e: # TODO there should probably only be one place to except all these errors if isinstance(e, InvalidBufferError) and e.code == 404: - self._log.info('Broken authorization key; resetting') - self.auth_key.key = None - if self._auth_key_callback: - await self._auth_key_callback(None) - + self._log.info('Server does not know about the current auth key; the session may need to be recreated') + last_error = AuthKeyNotFound() ok = False break else: @@ -521,12 +518,8 @@ class MTProtoSender: continue except BufferError as e: if isinstance(e, InvalidBufferError) and e.code == 404: - self._log.info('Broken authorization key; resetting') - self.auth_key.key = None - if self._auth_key_callback: - await self._auth_key_callback(None) - - await self._disconnect(error=e) + self._log.info('Server does not know about the current auth key; the session may need to be recreated') + await self._disconnect(error=AuthKeyNotFound()) else: self._log.warning('Invalid buffer %s', e) self._start_reconnect(e)