bugfixes
This commit is contained in:
parent
d92c398716
commit
c00c7c600d
@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
require 'vendor/autoload.php';
|
require 'vendor/autoload.php';
|
||||||
|
|
||||||
$handler = new \danog\MadelineProto\Server(['type' => AF_INET, 'protocol' => 0, 'address' => 'localhost', 'port' => 8002]);
|
$handler = new \danog\MadelineProto\Server(['type' => AF_INET, 'protocol' => 0, 'address' => 'localhost', 'port' => 8002, 'handler' => '\danog\MadelineProto\Server\Proxy', 'extra' => ['madeline' => new \danog\MadelineProto\API(['app_info' => ['api_id' => 6, 'api_hash' => 'eb06d4abfb49dc3eeb1aeb98ae0f581e']]), 'secret' => 'pony']]);
|
||||||
$handler->start();
|
$handler->start();
|
||||||
|
@ -64,7 +64,7 @@ class Server
|
|||||||
} elseif ($pid) {
|
} elseif ($pid) {
|
||||||
return $this->pids[] = $pid;
|
return $this->pids[] = $pid;
|
||||||
}
|
}
|
||||||
$handler = new \danog\MadelineProto\Server\Handler($socket, null, null, null, null, null, null);
|
$handler = new $this->settings['handler']($socket, $this->settings['extra'], null, null, null, null, null);
|
||||||
$handler->loop();
|
$handler->loop();
|
||||||
die;
|
die;
|
||||||
}
|
}
|
||||||
|
85
src/danog/MadelineProto/Server/Proxy.php
Normal file
85
src/danog/MadelineProto/Server/Proxy.php
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2016-2018 Daniil Gentili
|
||||||
|
(https://daniil.it)
|
||||||
|
This file is part of MadelineProto.
|
||||||
|
MadelineProto is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
The PWRTelegram API is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
See the GNU Affero General Public License for more details.
|
||||||
|
You should have received a copy of the GNU General Public License along with MadelineProto.
|
||||||
|
If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace danog\MadelineProto\Server;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Socket handler for server
|
||||||
|
*/
|
||||||
|
class Handler extends \danog\MadelineProto\Connection
|
||||||
|
{
|
||||||
|
use \danog\MadelineProto\Tools;
|
||||||
|
private $madeline;
|
||||||
|
|
||||||
|
public function __magic_construct($socket, $extra, $ip, $port, $protocol, $timeout, $ipv6)
|
||||||
|
{
|
||||||
|
\danog\MadelineProto\Magic::$pid = getmypid();
|
||||||
|
$this->sock = $socket;
|
||||||
|
$this->sock->setBlocking(true);
|
||||||
|
$this->must_open = false;
|
||||||
|
$timeout = 2;
|
||||||
|
$this->sock->setOption(\SOL_SOCKET, \SO_RCVTIMEO, $timeout);
|
||||||
|
$this->sock->setOption(\SOL_SOCKET, \SO_SNDTIMEO, $timeout);
|
||||||
|
$this->logger = new \danog\MadelineProto\Logger(3);
|
||||||
|
$this->extra = $extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __destruct()
|
||||||
|
{
|
||||||
|
echo 'Closing socket in fork '.getmypid().PHP_EOL;
|
||||||
|
unset($this->sock);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function loop()
|
||||||
|
{
|
||||||
|
$this->protocol = 'obfuscated2';
|
||||||
|
$random = $this->sock->read(64);
|
||||||
|
|
||||||
|
$reversed = strrev(substr($random, 8, 48));
|
||||||
|
if (isset($this->extra['secret'])) {
|
||||||
|
$random = substr_replace($random, hash('sha256', $key.$this->extra['secret'], true), 32, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->obfuscated = ['encryption' => new \phpseclib\Crypt\AES('ctr'), 'decryption' => new \phpseclib\Crypt\AES('ctr')];
|
||||||
|
$this->obfuscated['encryption']->enableContinuousBuffer();
|
||||||
|
$this->obfuscated['decryption']->enableContinuousBuffer();
|
||||||
|
$this->obfuscated['decryption']->setKey(substr($random, 8, 32));
|
||||||
|
$this->obfuscated['decryption']->setIV(substr($random, 40, 16));
|
||||||
|
$this->obfuscated['encryption']->setKey(substr($reversed, 0, 32));
|
||||||
|
$this->obfuscated['encryption']->setIV(substr($reversed, 32, 16));
|
||||||
|
$random = substr_replace($random, substr(@$this->obfuscated['encryption']->encrypt($random), 56, 8), 56, 8);
|
||||||
|
|
||||||
|
$random[56] = $random[57] = $random[58] = $random[59] = chr(0xef);
|
||||||
|
|
||||||
|
if (substr($random, 56, 4) !== str_repeat(chr(0xef), 4)) {
|
||||||
|
throw new \danog\MadelineProto\Exception('Wrong protocol version');
|
||||||
|
}
|
||||||
|
$socket = $this->extra['madeline']->API->datacenter->sockets[unpack('v', substr($random, 60, 2)[1]];
|
||||||
|
$socket->close_and_reopen();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
pcntl_signal_dispatch();
|
||||||
|
|
||||||
|
try {
|
||||||
|
$time = time();
|
||||||
|
$socket->send_message($this->read_message());
|
||||||
|
} catch (\danog\MadelineProto\NothingInTheSocketException $e) {
|
||||||
|
echo $e;
|
||||||
|
if (time() - $time < 2) {
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user