Add back auth key generation process

This commit is contained in:
Lonami Exo 2018-10-01 09:58:53 +02:00
parent 5edc2216c7
commit 3b1142aaca
3 changed files with 18 additions and 9 deletions

View File

@ -30,7 +30,7 @@ class MTProtoPlainSender:
body = bytes(request) body = bytes(request)
msg_id = self._state._get_new_msg_id() msg_id = self._state._get_new_msg_id()
await self._connection.send( await self._connection.send(
struct.pack('<QQi', 0, msg_id, len(body)) + body struct.pack('<qqi', 0, msg_id, len(body)) + body
) )
body = await self._connection.recv() body = await self._connection.recv()

View File

@ -2,11 +2,13 @@ import asyncio
import collections import collections
import logging import logging
from . import authenticator
from .mtprotolayer import MTProtoLayer from .mtprotolayer import MTProtoLayer
from .mtprotoplainsender import MTProtoPlainSender
from .requeststate import RequestState from .requeststate import RequestState
from .. import utils from .. import utils
from ..errors import ( from ..errors import (
BadMessageError, TypeNotFoundError, rpc_message_to_error BadMessageError, SecurityError, TypeNotFoundError, rpc_message_to_error
) )
from ..extensions import BinaryReader from ..extensions import BinaryReader
from ..helpers import _ReadyQueue from ..helpers import _ReadyQueue
@ -206,18 +208,18 @@ class MTProtoSender:
.format(self._retries)) .format(self._retries))
__log__.debug('Connection success!') __log__.debug('Connection success!')
# TODO Handle this, maybe an empty MTProtoState that does no encryption state = self._connection._state
""" if state.auth_key is None:
if self.state.auth_key is None: plain = MTProtoPlainSender(self._connection._connection)
plain = MTProtoPlainSender(self._connection)
for retry in range(1, self._retries + 1): for retry in range(1, self._retries + 1):
try: try:
__log__.debug('New auth_key attempt {}...'.format(retry)) __log__.debug('New auth_key attempt {}...'.format(retry))
self.state.auth_key, self.state.time_offset =\ state.auth_key, state.time_offset =\
await authenticator.do_authentication(plain) await authenticator.do_authentication(plain)
# TODO This callback feels out of place
if self._auth_key_callback: if self._auth_key_callback:
self._auth_key_callback(self.state.auth_key) self._auth_key_callback(state.auth_key)
break break
except (SecurityError, AssertionError) as e: except (SecurityError, AssertionError) as e:
@ -228,7 +230,6 @@ class MTProtoSender:
.format(self._retries)) .format(self._retries))
await self._disconnect(error=e) await self._disconnect(error=e)
raise e raise e
"""
__log__.debug('Starting send loop') __log__.debug('Starting send loop')
self._send_loop_handle = self._loop.create_task(self._send_loop()) self._send_loop_handle = self._loop.create_task(self._send_loop())

View File

@ -28,6 +28,14 @@ class MTProtoState:
for all these is not a good idea as each need their own authkey, and for all these is not a good idea as each need their own authkey, and
the concept of "copying" sessions with the unnecessary entities or the concept of "copying" sessions with the unnecessary entities or
updates state for these connections doesn't make sense. updates state for these connections doesn't make sense.
While it would be possible to have a `MTProtoPlainState` that does no
encryption so that it was usable through the `MTProtoLayer` and thus
avoid the need for a `MTProtoPlainSender`, the `MTProtoLayer` is more
focused to efficiency and this state is also more advanced (since it
supports gzipping and invoking after other message IDs). There are too
many methods that would be needed to make it convenient to use for the
authentication process, at which point the `MTProtoPlainSender` is better.
""" """
def __init__(self, auth_key): def __init__(self, auth_key):
# Session IDs can be random on every connection # Session IDs can be random on every connection