mirror of
https://github.com/danog/MadelineProto.git
synced 2024-11-27 08:14:39 +01:00
Trying to fix the handling of responses
This commit is contained in:
parent
5070c4616e
commit
09350d0cab
23
composer.lock
generated
23
composer.lock
generated
@ -123,22 +123,23 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "paragonie/constant_time_encoding",
|
"name": "paragonie/constant_time_encoding",
|
||||||
"version": "v2.0.3",
|
"version": "v1.0.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/paragonie/constant_time_encoding.git",
|
"url": "https://github.com/paragonie/constant_time_encoding.git",
|
||||||
"reference": "e085e08c939de49707dbf64315d178d90fbc708d"
|
"reference": "d96e63b79a7135a65659ba5b1cb02826172bfedd"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/e085e08c939de49707dbf64315d178d90fbc708d",
|
"url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d96e63b79a7135a65659ba5b1cb02826172bfedd",
|
||||||
"reference": "e085e08c939de49707dbf64315d178d90fbc708d",
|
"reference": "d96e63b79a7135a65659ba5b1cb02826172bfedd",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7"
|
"php": "^5.3|^7"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
|
"paragonie/random_compat": "^1.4|^2.0",
|
||||||
"phpunit/phpunit": "4.*|5.*"
|
"phpunit/phpunit": "4.*|5.*"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
@ -180,7 +181,7 @@
|
|||||||
"hex2bin",
|
"hex2bin",
|
||||||
"rfc4648"
|
"rfc4648"
|
||||||
],
|
],
|
||||||
"time": "2016-07-11 20:32:06"
|
"time": "2016-06-13 01:00:24"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "paragonie/random_compat",
|
"name": "paragonie/random_compat",
|
||||||
@ -232,16 +233,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpseclib/phpseclib",
|
"name": "phpseclib/phpseclib",
|
||||||
"version": "2.0.2",
|
"version": "2.0.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpseclib/phpseclib.git",
|
"url": "https://github.com/phpseclib/phpseclib.git",
|
||||||
"reference": "3d265f7c079f5b37d33475f996d7a383c5fc8aeb"
|
"reference": "41f85e9c2582b3f6d1b7d20395fb40c687ad5370"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/3d265f7c079f5b37d33475f996d7a383c5fc8aeb",
|
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/41f85e9c2582b3f6d1b7d20395fb40c687ad5370",
|
||||||
"reference": "3d265f7c079f5b37d33475f996d7a383c5fc8aeb",
|
"reference": "41f85e9c2582b3f6d1b7d20395fb40c687ad5370",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -320,7 +321,7 @@
|
|||||||
"x.509",
|
"x.509",
|
||||||
"x509"
|
"x509"
|
||||||
],
|
],
|
||||||
"time": "2016-05-13 01:15:21"
|
"time": "2016-08-18 18:49:14"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"packages-dev": [],
|
"packages-dev": [],
|
||||||
|
@ -21,9 +21,7 @@ class API
|
|||||||
set_error_handler(['\danog\MadelineProto\Exception', 'ExceptionErrorHandler']);
|
set_error_handler(['\danog\MadelineProto\Exception', 'ExceptionErrorHandler']);
|
||||||
$this->session = new Session($params);
|
$this->session = new Session($params);
|
||||||
$future_salts = $this->get_future_salts(3);
|
$future_salts = $this->get_future_salts(3);
|
||||||
$this->session->log->log($future_salts);
|
|
||||||
$future_salts = $this->get_future_salts(3);
|
$future_salts = $this->get_future_salts(3);
|
||||||
$this->session->log->log($future_salts);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __destruct()
|
public function __destruct()
|
||||||
|
@ -113,7 +113,6 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
|
|
||||||
public function check_message_id($new_message_id, $outgoing)
|
public function check_message_id($new_message_id, $outgoing)
|
||||||
{
|
{
|
||||||
$new_message_id = $this->struct->unpack('<Q', $new_message_id)[0];
|
|
||||||
if (((int) ((time() + $this->timedelta - 300) * pow(2, 30)) * 4) > $new_message_id) {
|
if (((int) ((time() + $this->timedelta - 300) * pow(2, 30)) * 4) > $new_message_id) {
|
||||||
throw new Exception('Given message id ('.$new_message_id.') is too old.');
|
throw new Exception('Given message id ('.$new_message_id.') is too old.');
|
||||||
}
|
}
|
||||||
@ -146,7 +145,6 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
|
|
||||||
public function ack_outgoing_message_id($message_id)
|
public function ack_outgoing_message_id($message_id)
|
||||||
{
|
{
|
||||||
$message_id = $this->struct->unpack('<Q', $message_id)[0];
|
|
||||||
// The server acknowledges that it received my message
|
// The server acknowledges that it received my message
|
||||||
if (!in_array($message_id, $this->outgoing_message_ids)) {
|
if (!in_array($message_id, $this->outgoing_message_ids)) {
|
||||||
throw new Exception("Couldn't find message id ".$message_id.' in the array of outgoing message ids. Maybe try to increase its size?');
|
throw new Exception("Couldn't find message id ".$message_id.' in the array of outgoing message ids. Maybe try to increase its size?');
|
||||||
@ -162,7 +160,6 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
if ($this->settings['authorization']['temp_auth_key']['id'] === null || $this->settings['authorization']['temp_auth_key']['id'] == Tools::string2bin('\x00\x00\x00\x00\x00\x00\x00\x00')) {
|
if ($this->settings['authorization']['temp_auth_key']['id'] === null || $this->settings['authorization']['temp_auth_key']['id'] == Tools::string2bin('\x00\x00\x00\x00\x00\x00\x00\x00')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$message_id = $this->struct->unpack('<Q', $message_id)[0];
|
|
||||||
// I let the server know that I received its message
|
// I let the server know that I received its message
|
||||||
if (!in_array($message_id, $this->incoming_message_ids)) {
|
if (!in_array($message_id, $this->incoming_message_ids)) {
|
||||||
throw new Exception("Couldn't find message id ".$message_id.' in the array of incoming message ids. Maybe try to increase its size?');
|
throw new Exception("Couldn't find message id ".$message_id.' in the array of incoming message ids. Maybe try to increase its size?');
|
||||||
@ -190,11 +187,12 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
*/
|
*/
|
||||||
public function send_message($message_data, $content_related)
|
public function send_message($message_data, $content_related)
|
||||||
{
|
{
|
||||||
$message_id = $this->struct->pack('<Q', (int) ((time() + $this->timedelta) * pow(2, 30)) * 4);
|
$int_message_id = (int) ((time() + $this->timedelta) * pow(2, 30)) * 4;
|
||||||
$this->check_message_id($message_id, true);
|
$message_id = $this->struct->pack('<Q', $int_message_id);
|
||||||
|
$this->check_message_id($int_message_id, true);
|
||||||
if (($this->settings['authorization']['temp_auth_key']['auth_key'] == null) || ($this->settings['authorization']['temp_auth_key']['server_salt'] == null)) {
|
if (($this->settings['authorization']['temp_auth_key']['auth_key'] == null) || ($this->settings['authorization']['temp_auth_key']['server_salt'] == null)) {
|
||||||
$message = Tools::string2bin('\x00\x00\x00\x00\x00\x00\x00\x00').$message_id.$this->struct->pack('<I', strlen($message_data)).$message_data;
|
$message = Tools::string2bin('\x00\x00\x00\x00\x00\x00\x00\x00').$message_id.$this->struct->pack('<I', strlen($message_data)).$message_data;
|
||||||
$this->last_sent = ['message_id' => $message_id];
|
$this->last_sent = ['message_id' => $int_message_id];
|
||||||
} else {
|
} else {
|
||||||
$seq_no = $this->generate_seq_no($content_related);
|
$seq_no = $this->generate_seq_no($content_related);
|
||||||
$encrypted_data = $this->settings['authorization']['temp_auth_key']['server_salt'].$this->settings['authorization']['session_id'].$message_id.$this->struct->pack('<II', $seq_no, strlen($message_data)).$message_data;
|
$encrypted_data = $this->settings['authorization']['temp_auth_key']['server_salt'].$this->settings['authorization']['session_id'].$message_id.$this->struct->pack('<II', $seq_no, strlen($message_data)).$message_data;
|
||||||
@ -202,7 +200,7 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
$padding = \phpseclib\Crypt\Random::string(Tools::posmod(-strlen($encrypted_data), 16));
|
$padding = \phpseclib\Crypt\Random::string(Tools::posmod(-strlen($encrypted_data), 16));
|
||||||
list($aes_key, $aes_iv) = $this->aes_calculate($message_key);
|
list($aes_key, $aes_iv) = $this->aes_calculate($message_key);
|
||||||
$message = $this->settings['authorization']['temp_auth_key']['id'].$message_key.Crypt::ige_encrypt($encrypted_data.$padding, $aes_key, $aes_iv);
|
$message = $this->settings['authorization']['temp_auth_key']['id'].$message_key.Crypt::ige_encrypt($encrypted_data.$padding, $aes_key, $aes_iv);
|
||||||
$this->last_sent = ['message_id' => $message_id, 'seq_no' => $seq_no];
|
$this->last_sent = ['message_id' => $int_message_id, 'seq_no' => $seq_no];
|
||||||
}
|
}
|
||||||
$this->sock->send_message($message);
|
$this->sock->send_message($message);
|
||||||
}
|
}
|
||||||
@ -218,7 +216,7 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
}
|
}
|
||||||
$auth_key_id = fread($payload, 8);
|
$auth_key_id = fread($payload, 8);
|
||||||
if ($auth_key_id == Tools::string2bin('\x00\x00\x00\x00\x00\x00\x00\x00')) {
|
if ($auth_key_id == Tools::string2bin('\x00\x00\x00\x00\x00\x00\x00\x00')) {
|
||||||
list($message_id, $message_length) = $this->struct->unpack('<8sI', fread($payload, 12));
|
list($message_id, $message_length) = $this->struct->unpack('<QI', fread($payload, 12));
|
||||||
$this->check_message_id($message_id, false);
|
$this->check_message_id($message_id, false);
|
||||||
$message_data = fread($payload, $message_length);
|
$message_data = fread($payload, $message_length);
|
||||||
$this->last_received = ['message_id' => $message_id];
|
$this->last_received = ['message_id' => $message_id];
|
||||||
@ -238,7 +236,7 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
throw new Exception('Session id mismatch.');
|
throw new Exception('Session id mismatch.');
|
||||||
}
|
}
|
||||||
|
|
||||||
$message_id = substr($decrypted_data, 16, 8);
|
$message_id = $this->struct->unpack('<Q', substr($decrypted_data, 16, 8))[0];
|
||||||
$this->check_message_id($message_id, false);
|
$this->check_message_id($message_id, false);
|
||||||
|
|
||||||
$seq_no = $this->struct->unpack('<I', substr($decrypted_data, 24, 4)) [0];
|
$seq_no = $this->struct->unpack('<I', substr($decrypted_data, 24, 4)) [0];
|
||||||
@ -301,16 +299,17 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
foreach (range(1, $this->settings['max_tries']['query']) as $i) {
|
foreach (range(1, $this->settings['max_tries']['query']) as $i) {
|
||||||
try {
|
try {
|
||||||
$this->send_message($this->tl->serialize_obj($object, $kwargs), $this->tl->content_related($object));
|
$this->send_message($this->tl->serialize_obj($object, $kwargs), $this->tl->content_related($object));
|
||||||
$server_answer = $this->recv_message();
|
// $server_answer = $this->recv_message();
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$this->log->log('An error occurred while calling object '.$object.': '.$e->getMessage().' in '.$e->getFile().':'.$e->getLine().'. Recreating connection and retrying to call object...');
|
$this->log->log('An error occurred while calling object '.$object.': '.$e->getMessage().' in '.$e->getFile().':'.$e->getLine().'. Recreating connection and retrying to call object...');
|
||||||
unset($this->sock);
|
unset($this->sock);
|
||||||
$this->sock = new Connection($this->settings['connection']['ip_address'], $this->settings['connection']['port'], $this->settings['connection']['protocol']);
|
$this->sock = new Connection($this->settings['connection']['ip_address'], $this->settings['connection']['port'], $this->settings['connection']['protocol']);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($server_answer == null) {
|
return;
|
||||||
throw new Exception('An error occurred while calling object '.$object.'.');
|
// if ($server_answer == null) {
|
||||||
}
|
// throw new Exception('An error occurred while calling object '.$object.'.');
|
||||||
|
// }
|
||||||
// $deserialized = $this->tl->deserialize(Tools::fopen_and_write('php://memory', 'rw+b', $server_answer));
|
// $deserialized = $this->tl->deserialize(Tools::fopen_and_write('php://memory', 'rw+b', $server_answer));
|
||||||
// return $deserialized;
|
// return $deserialized;
|
||||||
}
|
}
|
||||||
@ -323,8 +322,8 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
case 'rpc_result':
|
case 'rpc_result':
|
||||||
$this->ack_incoming_message_id($this->last_received['message_id']); // Acknowledge that I received the server's response
|
$this->ack_incoming_message_id($this->last_received['message_id']); // Acknowledge that I received the server's response
|
||||||
$this->ack_outgoing_message_id($response['req_msg_id']); // Acknowledge that the server received my
|
$this->ack_outgoing_message_id($response['req_msg_id']); // Acknowledge that the server received my
|
||||||
if ($response['req_msg_id'] != $last_sent['message_id']) {
|
if ($response['req_msg_id'] != $this->last_sent['message_id']) {
|
||||||
throw new Exception('Message id mismatch.');
|
throw new Exception('Message id mismatch; req_msg_id ('.$response['req_msg_id'].') != last sent msg id ('.$this->last_sent['message_id'].').');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->handle_response($response['result'], $name, $args);
|
return $this->handle_response($response['result'], $name, $args);
|
||||||
@ -351,11 +350,11 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
return $response; // I'm not handling this
|
return $response; // I'm not handling this
|
||||||
break;
|
break;
|
||||||
case 'future_salts':
|
case 'future_salts':
|
||||||
$this->ack_incoming_message_id($this->last_received['message_id']); // Acknowledge that I received the server's response
|
|
||||||
$this->ack_outgoing_message_id($this->last_sent['message_id']); // Acknowledge that the server received my message
|
$this->ack_outgoing_message_id($this->last_sent['message_id']); // Acknowledge that the server received my message
|
||||||
if ($response['req_msg_id'] != $last_sent['message_id']) {
|
if ($response['req_msg_id'] != $this->last_sent['message_id']) {
|
||||||
throw new Exception('Message id mismatch.');
|
throw new Exception('Message id mismatch; req_msg_id ('.$response['req_msg_id'].') != last sent msg id ('.$this->last_sent['message_id'].').');
|
||||||
}
|
}
|
||||||
|
$this->log->log("Received future salts.");
|
||||||
$this->future_salts = $response['salts'];
|
$this->future_salts = $response['salts'];
|
||||||
break;
|
break;
|
||||||
case 'pong':
|
case 'pong':
|
||||||
@ -374,7 +373,6 @@ Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
|||||||
$this->log->log($response);
|
$this->log->log($response);
|
||||||
break;
|
break;
|
||||||
case 'msg_container':
|
case 'msg_container':
|
||||||
$this->ack_incoming_message_id($this->last_received['message_id']); // Acknowledge that I received the server's response
|
|
||||||
$responses = [];
|
$responses = [];
|
||||||
$this->log->log('Received container.');
|
$this->log->log('Received container.');
|
||||||
$this->log->log($response['messages']);
|
$this->log->log($response['messages']);
|
||||||
|
Loading…
Reference in New Issue
Block a user