From 5ffae641d2532ace3802186a66ff75b8e955fe11 Mon Sep 17 00:00:00 2001 From: Daniil Gentili Date: Mon, 31 Dec 2018 14:02:24 +0100 Subject: [PATCH] PFS fixes --- src/danog/MadelineProto/DataCenter.php | 16 ++++++++++++---- .../MadelineProto/Loop/Connection/WriteLoop.php | 2 +- src/danog/MadelineProto/MTProto.php | 2 +- .../MTProtoTools/AuthKeyHandler.php | 3 ++- .../MTProtoTools/ResponseHandler.php | 12 ++++++++---- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/danog/MadelineProto/DataCenter.php b/src/danog/MadelineProto/DataCenter.php index 3c87ad74..d68c7450 100644 --- a/src/danog/MadelineProto/DataCenter.php +++ b/src/danog/MadelineProto/DataCenter.php @@ -80,6 +80,9 @@ class DataCenter return false; } $ctxs = $this->generate_contexts($dc_number); + if (empty($ctxs)) { + return false; + } foreach ($ctxs as $ctx) { try { if (isset($this->sockets[$dc_number]->old)) { @@ -242,12 +245,10 @@ class DataCenter foreach ($ipv6 as $ipv6) { if (!isset($this->dclist[$test][$ipv6][$dc_number]['ip_address'])) { - unset($this->sockets[$dc_number]); - - $this->API->logger->logger("No info for DC $dc_number", \danog\MadelineProto\Logger::ERROR); - continue; } + + $address = $this->dclist[$test][$ipv6][$dc_number]['ip_address']; $port = $this->dclist[$test][$ipv6][$dc_number]['port']; @@ -307,6 +308,13 @@ class DataCenter $ctxs = array_merge($ctxs, $this->generate_contexts($dc_number.'_bk')); } + if (empty($ctxs)) { + unset($this->sockets[$dc_number]); + + $this->API->logger->logger("No info for DC $dc_number", \danog\MadelineProto\Logger::ERROR); + + } + return $ctxs; } diff --git a/src/danog/MadelineProto/Loop/Connection/WriteLoop.php b/src/danog/MadelineProto/Loop/Connection/WriteLoop.php index c9ecde90..1a6e2e20 100644 --- a/src/danog/MadelineProto/Loop/Connection/WriteLoop.php +++ b/src/danog/MadelineProto/Loop/Connection/WriteLoop.php @@ -292,7 +292,7 @@ class WriteLoop extends ResumableSignalLoop $connection->http_req_count++; - $API->logger->logger("Sent encrypted payload to DC {$datacenter}, speed ".((($len * 8) / (microtime(true) - $t)) / 1000000).' mbps!', \danog\MadelineProto\Logger::ULTRA_VERBOSE); + $API->logger->logger("Sent encrypted payload to DC {$datacenter}", \danog\MadelineProto\Logger::ULTRA_VERBOSE); $sent = time(); diff --git a/src/danog/MadelineProto/MTProto.php b/src/danog/MadelineProto/MTProto.php index e7e93a75..5bef2c33 100644 --- a/src/danog/MadelineProto/MTProto.php +++ b/src/danog/MadelineProto/MTProto.php @@ -898,7 +898,7 @@ class MTProto implements TLCallback } $curdc = $this->datacenter->curdc; $this->logger->logger('Got new DC options, reconnecting'); - yield $this->connect_to_all_dcs(); + yield $this->connect_to_all_dcs_async(); $this->datacenter->curdc = $curdc; } diff --git a/src/danog/MadelineProto/MTProtoTools/AuthKeyHandler.php b/src/danog/MadelineProto/MTProtoTools/AuthKeyHandler.php index a09557df..c941fc2d 100644 --- a/src/danog/MadelineProto/MTProtoTools/AuthKeyHandler.php +++ b/src/danog/MadelineProto/MTProtoTools/AuthKeyHandler.php @@ -556,7 +556,7 @@ trait AuthKeyHandler }; } yield array_shift($dcs)(); - foreach ($dcs as &$dc) { + foreach ($dcs as $id => &$dc) { $dc = $dc(); } yield $dcs; @@ -592,6 +592,7 @@ trait AuthKeyHandler $cdn = strpos($id, 'cdn'); $media = strpos($id, 'media'); + if ($socket->temp_auth_key === null || $socket->auth_key === null) { $dc_config_number = isset($this->settings['connection_settings'][$id]) ? $id : 'all'; if ($socket->auth_key === null && !$cdn && !$media) { diff --git a/src/danog/MadelineProto/MTProtoTools/ResponseHandler.php b/src/danog/MadelineProto/MTProtoTools/ResponseHandler.php index e5fb8406..328b3985 100644 --- a/src/danog/MadelineProto/MTProtoTools/ResponseHandler.php +++ b/src/danog/MadelineProto/MTProtoTools/ResponseHandler.php @@ -308,12 +308,13 @@ trait ResponseHandler unset($this->datacenter->sockets[$datacenter]->incoming_messages[$response_id]['content']); $request = &$this->datacenter->sockets[$datacenter]->outgoing_messages[$request_id]; - if (isset($request['method']) && $request['method'] && $request['_'] !== 'auth.bindTempAuthKey' && $this->datacenter->sockets[$datacenter]->temp_auth_key !== null && (!isset($this->datacenter->sockets[$datacenter]->temp_auth_key['connection_inited']) || $this->datacenter->sockets[$datacenter]->temp_auth_key['connection_inited'] === false)) { - $this->datacenter->sockets[$datacenter]->temp_auth_key['connection_inited'] = true; - } if (isset($response['_'])) { switch ($response['_']) { case 'rpc_error': + if (isset($request['method']) && $request['method'] && $request['_'] !== 'auth.bindTempAuthKey' && $this->datacenter->sockets[$datacenter]->temp_auth_key !== null && (!isset($this->datacenter->sockets[$datacenter]->temp_auth_key['connection_inited']) || $this->datacenter->sockets[$datacenter]->temp_auth_key['connection_inited'] === false)) { + $this->datacenter->sockets[$datacenter]->temp_auth_key['connection_inited'] = true; + } + if (in_array($response['error_message'], ['PERSISTENT_TIMESTAMP_EMPTY', 'PERSISTENT_TIMESTAMP_OUTDATED', 'PERSISTENT_TIMESTAMP_INVALID'])) { $this->got_response_for_outgoing_message_id($request_id, $datacenter); $this->handle_reject($datacenter, $request, new \danog\MadelineProto\PTSException($response['error_message'])); @@ -488,7 +489,6 @@ trait ResponseHandler break; case 'bad_server_salt': case 'bad_msg_notification': - $this->logger->logger('Received bad_msg_notification: '.self::BAD_MSG_ERROR_CODES[$response['error_code']], \danog\MadelineProto\Logger::WARNING); switch ($response['error_code']) { case 48: @@ -516,6 +516,10 @@ trait ResponseHandler } } + if (isset($request['method']) && $request['method'] && $request['_'] !== 'auth.bindTempAuthKey' && $this->datacenter->sockets[$datacenter]->temp_auth_key !== null && (!isset($this->datacenter->sockets[$datacenter]->temp_auth_key['connection_inited']) || $this->datacenter->sockets[$datacenter]->temp_auth_key['connection_inited'] === false)) { + $this->datacenter->sockets[$datacenter]->temp_auth_key['connection_inited'] = true; + } + if (!isset($request['promise'])) { $this->logger->logger('Response: already got response for '.(isset($request['_']) ? $request['_'] : '-').' with message ID '.$this->unpack_signed_long($request_id));