2022-12-30 21:54:44 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
2018-04-08 19:44:01 +02:00
|
|
|
|
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
|
|
|
/**
|
|
|
|
* Magic module.
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
* MadelineProto 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/>.
|
|
|
|
*
|
|
|
|
* @author Daniil Gentili <daniil@daniil.it>
|
2023-01-04 12:43:01 +01:00
|
|
|
* @copyright 2016-2023 Daniil Gentili <daniil@daniil.it>
|
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
|
|
|
* @license https://opensource.org/licenses/AGPL-3.0 AGPLv3
|
2019-10-31 15:07:35 +01:00
|
|
|
* @link https://docs.madelineproto.xyz MadelineProto documentation
|
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
|
|
|
*/
|
2018-04-08 19:44:01 +02:00
|
|
|
|
|
|
|
namespace danog\MadelineProto;
|
|
|
|
|
2022-12-30 20:24:13 +01:00
|
|
|
use Amp\DeferredFuture;
|
2023-01-15 16:12:12 +01:00
|
|
|
use Amp\SignalException;
|
2021-05-02 17:18:10 +02:00
|
|
|
use danog\MadelineProto\TL\Conversion\Extension;
|
2022-12-30 19:21:36 +01:00
|
|
|
use phpseclib3\Math\BigInteger;
|
2022-12-30 21:43:58 +01:00
|
|
|
use Revolt\EventLoop;
|
2022-12-30 19:21:36 +01:00
|
|
|
use Throwable;
|
|
|
|
|
|
|
|
use const DIRECTORY_SEPARATOR;
|
|
|
|
use const E_ALL;
|
|
|
|
use const MADELINE_WORKER_TYPE;
|
|
|
|
use const PHP_INT_SIZE;
|
|
|
|
use const PHP_MAJOR_VERSION;
|
|
|
|
use const PHP_MINOR_VERSION;
|
|
|
|
|
|
|
|
use const PHP_SAPI;
|
|
|
|
use const SIG_DFL;
|
|
|
|
use const SIGINT;
|
|
|
|
use const SIGTERM;
|
2020-09-22 11:48:12 +02:00
|
|
|
use function Amp\Log\hasColorSupport;
|
2022-12-30 19:21:36 +01:00
|
|
|
use function define;
|
|
|
|
use function function_exists;
|
Merge alpha into master (async, huge bugfixes and more) (#546)
* Implement async and lots of bugfixes
* Implement more async
* Implement async, implement bugfixes for the connection module, for the datacenter module, huge bugfixes, huge perfomance improvements, media DCs for https, advanced selecting, custom var_dump, totally rewritten IOLoop and response mechanism, promises, improvements to the TL parser, custom mb_substr
* Apply fixes from StyleCI
* Bugfixes
* Apply fixes from StyleCI
* Bugfixes, implement combined promises
* Apply fixes from StyleCI
* Support passing method arguments as callable
* Starting to write async upload logic
* Apply fixes from StyleCI
* Start implementing async file upload
* Apply fixes from StyleCI
* bugfix
* Apply fixes from StyleCI
* Start rewriting connection module
* Add PHP file docblocks for all classes
* Start working on new async stream API
* Finish writing stream API
* More stream API fixes
* Apply fixes from StyleCI
* Rewrite DataCenter and Connection modules
* Clean up stream API documentation
* Fixes
* Apply fixes from StyleCI
* Add referenced parameter to get length of buffer to read in getReadBuffer API
* Moved all MessageHandler code in the Connection module, added a PHP version warning in the phar
* Start fixing reads
* Fix all protocol stream wrappers
* Apply fixes from StyleCI
* Implement disconnection, and remove end function
* Working async RPC
* Implement async file upload
* Bugfix
* Method recall bugfixes
* Bugfixes
* Trait bugfixes
* Fix FIFO buffer
* Bugfixes and speedtests
* Async logging
* Implement websocket streams
* Implement loop API, signal API, clean closing and start changing layer
* Small magna, websocket and HTTP fixes
* Clean up loop API
* Improved stack traces, 2FA and async
* Login fixes
* Added instructions for manual verification
* Small fixes
* More app info improvements
* More app info improvements
* TL and 2FA fixes
* Update to layer 89
* More bugfixes
* Implement broken media reporting
* Remove debug comments
* PHP 7.2 backwards compatibility
* Bugfixes
* Async key generation
* Some simplifications
* Transport fixes
* Cleanup
* async API
* Performance fixes
* Fixes to async API
* Bugfixes
* Implement one-time async loop
* Authorization and logging fixes
* Update to layer 91
* 7to5 fix
* Null coalesce conversion
* Implement socks5 proxy
* Implement HTTP proxy
* Fixes to HTTP proxy
* MTProxy and socks5 fixes
* Disable PHP 5 conversion
* Proxies have higher priority
* Avoid error handling in vendor
* Override composer dependencies
* Fix travis build
* Final composer fixes
* Proxy logic fixes
* Fix get_updates update handling
* Do not use parallel file driver if not supported
* Refactor loader and implement HTTP fixes
* Suppress errors in loader
* HTTP and authorization fixes
* HTTP fixes
* Improved peer management
* Use HTTP protocol on altervista
* Small bugfixes
* Minor fixes
* Docufix
* Docufix
* Legacy fixes
* Fix message queue
* Avoid updating if using MTProxy
* Improve logs and examples
* Trim final newlines while converting parse mode
* Reimplement noResponse flag
* Async combined event handler and APIFactory fixes
* Actually return config
* Case-insensitive methods
* Bugfix
* Apply fixes from StyleCI (#545)
* MTProxy fixes
* PHP 5 warning
* Improved PHP 5 warning
* Use <br> along with newlines in web logs
* Update docs
2018-12-26 20:51:14 +01:00
|
|
|
|
2023-01-15 12:05:38 +01:00
|
|
|
final class Magic
|
2018-04-08 19:44:01 +02:00
|
|
|
{
|
2021-12-05 17:37:23 +01:00
|
|
|
const ZERO_CHANNEL_ID = -1000000000000;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Static storage.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static array $storage = [];
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Whether this system is bigendian.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static bool $BIG_ENDIAN = false;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Whether this is a TTY console.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static bool $isatty = false;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Whether we're in a fork.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static bool $isFork = false;
|
2020-09-27 19:36:17 +02:00
|
|
|
/**
|
2020-09-27 21:51:55 +02:00
|
|
|
* Whether this is an IPC worker.
|
2020-09-27 19:36:17 +02:00
|
|
|
*/
|
|
|
|
public static bool $isIpcWorker = false;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Whether we can get our PID.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static bool $can_getmypid = true;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Whether we can get our CWD.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static bool $can_getcwd = false;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Whether we've processed forks.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static bool $processed_fork = false;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Whether we can use ipv6.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static bool $ipv6 = false;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Our PID.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-15 11:21:57 +01:00
|
|
|
public static ?int $pid = null;
|
2020-07-11 20:01:54 +02:00
|
|
|
/**
|
|
|
|
* Whether we've inited all light constants.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
private static bool $initedLight = false;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Whether we've inited all static constants.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
private static bool $inited = false;
|
2021-04-20 15:01:53 +02:00
|
|
|
/**
|
|
|
|
* Whether we've inited the ipv6 property.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
private static bool $initedIpv6 = false;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Bigint zero.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static BigInteger $zero;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Bigint one.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static BigInteger $one;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Bigint two.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static BigInteger $two;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Bigint 2^1984.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static BigInteger $twoe1984;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Bigint 2^2047.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static BigInteger $twoe2047;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Bigint 2^2048.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static BigInteger $twoe2048;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Decoded UTF8 emojis for call fingerprint.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static array $emojis;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* MadelineProto revision.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static string $revision;
|
2021-12-10 17:50:41 +01:00
|
|
|
/**
|
|
|
|
* MadelineProto version (clean).
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:26:06 +01:00
|
|
|
public static ?string $version;
|
2021-12-10 17:50:41 +01:00
|
|
|
/**
|
|
|
|
* Latest MadelineProto version.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:26:06 +01:00
|
|
|
public static ?string $version_latest;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Our CWD.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static string $cwd;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Caller script CWD.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static string $script_cwd;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Whether we're running on altervista.
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static bool $altervista = false;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Wether we're running on 000webhost (yuck).
|
|
|
|
*
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static bool $zerowebhost = false;
|
2020-12-14 16:31:46 +01:00
|
|
|
/**
|
|
|
|
* Whether to suspend certain stdout log printing, when reading input.
|
|
|
|
*/
|
2023-01-04 12:12:44 +01:00
|
|
|
public static ?DeferredFuture $suspendPeriodicLogging = null;
|
2021-05-02 17:18:10 +02:00
|
|
|
/**
|
|
|
|
* All mime types.
|
|
|
|
*
|
|
|
|
* @var array<string, string>
|
|
|
|
*/
|
2023-01-04 15:13:55 +01:00
|
|
|
public static array $allMimes = [];
|
2021-12-06 19:14:34 +01:00
|
|
|
/**
|
|
|
|
* Whether the openssl extension is loaded.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public static bool $hasOpenssl = false;
|
2019-12-15 13:21:57 +01:00
|
|
|
/**
|
|
|
|
* Encoded emojis.
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
2018-04-17 11:17:44 +02:00
|
|
|
const JSON_EMOJIS = '["\\ud83d\\ude09","\\ud83d\\ude0d","\\ud83d\\ude1b","\\ud83d\\ude2d","\\ud83d\\ude31","\\ud83d\\ude21","\\ud83d\\ude0e","\\ud83d\\ude34","\\ud83d\\ude35","\\ud83d\\ude08","\\ud83d\\ude2c","\\ud83d\\ude07","\\ud83d\\ude0f","\\ud83d\\udc6e","\\ud83d\\udc77","\\ud83d\\udc82","\\ud83d\\udc76","\\ud83d\\udc68","\\ud83d\\udc69","\\ud83d\\udc74","\\ud83d\\udc75","\\ud83d\\ude3b","\\ud83d\\ude3d","\\ud83d\\ude40","\\ud83d\\udc7a","\\ud83d\\ude48","\\ud83d\\ude49","\\ud83d\\ude4a","\\ud83d\\udc80","\\ud83d\\udc7d","\\ud83d\\udca9","\\ud83d\\udd25","\\ud83d\\udca5","\\ud83d\\udca4","\\ud83d\\udc42","\\ud83d\\udc40","\\ud83d\\udc43","\\ud83d\\udc45","\\ud83d\\udc44","\\ud83d\\udc4d","\\ud83d\\udc4e","\\ud83d\\udc4c","\\ud83d\\udc4a","\\u270c","\\u270b","\\ud83d\\udc50","\\ud83d\\udc46","\\ud83d\\udc47","\\ud83d\\udc49","\\ud83d\\udc48","\\ud83d\\ude4f","\\ud83d\\udc4f","\\ud83d\\udcaa","\\ud83d\\udeb6","\\ud83c\\udfc3","\\ud83d\\udc83","\\ud83d\\udc6b","\\ud83d\\udc6a","\\ud83d\\udc6c","\\ud83d\\udc6d","\\ud83d\\udc85","\\ud83c\\udfa9","\\ud83d\\udc51","\\ud83d\\udc52","\\ud83d\\udc5f","\\ud83d\\udc5e","\\ud83d\\udc60","\\ud83d\\udc55","\\ud83d\\udc57","\\ud83d\\udc56","\\ud83d\\udc59","\\ud83d\\udc5c","\\ud83d\\udc53","\\ud83c\\udf80","\\ud83d\\udc84","\\ud83d\\udc9b","\\ud83d\\udc99","\\ud83d\\udc9c","\\ud83d\\udc9a","\\ud83d\\udc8d","\\ud83d\\udc8e","\\ud83d\\udc36","\\ud83d\\udc3a","\\ud83d\\udc31","\\ud83d\\udc2d","\\ud83d\\udc39","\\ud83d\\udc30","\\ud83d\\udc38","\\ud83d\\udc2f","\\ud83d\\udc28","\\ud83d\\udc3b","\\ud83d\\udc37","\\ud83d\\udc2e","\\ud83d\\udc17","\\ud83d\\udc34","\\ud83d\\udc11","\\ud83d\\udc18","\\ud83d\\udc3c","\\ud83d\\udc27","\\ud83d\\udc25","\\ud83d\\udc14","\\ud83d\\udc0d","\\ud83d\\udc22","\\ud83d\\udc1b","\\ud83d\\udc1d","\\ud83d\\udc1c","\\ud83d\\udc1e","\\ud83d\\udc0c","\\ud83d\\udc19","\\ud83d\\udc1a","\\ud83d\\udc1f","\\ud83d\\udc2c","\\ud83d\\udc0b","\\ud83d\\udc10","\\ud83d\\udc0a","\\ud83d\\udc2b","\\ud83c\\udf40","\\ud83c\\udf39","\\ud83c\\udf3b","\\ud83c\\udf41","\\ud83c\\udf3e","\\ud83c\\udf44","\\ud83c\\udf35","\\ud83c\\udf34","\\ud83c\\udf33","\\ud83c\\udf1e","\\ud83c\\udf1a","\\ud83c\\udf19","\\ud83c\\udf0e","\\ud83c\\udf0b","\\u26a1","\\u2614","\\u2744","\\u26c4","\\ud83c\\udf00","\\ud83c\\udf08","\\ud83c\\udf0a","\\ud83c\\udf93","\\ud83c\\udf86","\\ud83c\\udf83","\\ud83d\\udc7b","\\ud83c\\udf85","\\ud83c\\udf84","\\ud83c\\udf81","\\ud83c\\udf88","\\ud83d\\udd2e","\\ud83c\\udfa5","\\ud83d\\udcf7","\\ud83d\\udcbf","\\ud83d\\udcbb","\\u260e","\\ud83d\\udce1","\\ud83d\\udcfa","\\ud83d\\udcfb","\\ud83d\\udd09","\\ud83d\\udd14","\\u23f3","\\u23f0","\\u231a","\\ud83d\\udd12","\\ud83d\\udd11","\\ud83d\\udd0e","\\ud83d\\udca1","\\ud83d\\udd26","\\ud83d\\udd0c","\\ud83d\\udd0b","\\ud83d\\udebf","\\ud83d\\udebd","\\ud83d\\udd27","\\ud83d\\udd28","\\ud83d\\udeaa","\\ud83d\\udeac","\\ud83d\\udca3","\\ud83d\\udd2b","\\ud83d\\udd2a","\\ud83d\\udc8a","\\ud83d\\udc89","\\ud83d\\udcb0","\\ud83d\\udcb5","\\ud83d\\udcb3","\\u2709","\\ud83d\\udceb","\\ud83d\\udce6","\\ud83d\\udcc5","\\ud83d\\udcc1","\\u2702","\\ud83d\\udccc","\\ud83d\\udcce","\\u2712","\\u270f","\\ud83d\\udcd0","\\ud83d\\udcda","\\ud83d\\udd2c","\\ud83d\\udd2d","\\ud83c\\udfa8","\\ud83c\\udfac","\\ud83c\\udfa4","\\ud83c\\udfa7","\\ud83c\\udfb5","\\ud83c\\udfb9","\\ud83c\\udfbb","\\ud83c\\udfba","\\ud83c\\udfb8","\\ud83d\\udc7e","\\ud83c\\udfae","\\ud83c\\udccf","\\ud83c\\udfb2","\\ud83c\\udfaf","\\ud83c\\udfc8","\\ud83c\\udfc0","\\u26bd","\\u26be","\\ud83c\\udfbe","\\ud83c\\udfb1","\\ud83c\\udfc9","\\ud83c\\udfb3","\\ud83c\\udfc1","\\ud83c\\udfc7","\\ud83c\\udfc6","\\ud83c\\udfca","\\ud83c\\udfc4","\\u2615","\\ud83c\\udf7c","\\ud83c\\udf7a","\\ud83c\\udf77","\\ud83c\\udf74","\\ud83c\\udf55","\\ud83c\\udf54","\\ud83c\\udf5f","\\ud83c\\udf57","\\ud83c\\udf71","\\ud83c\\udf5a","\\ud83c\\udf5c","\\ud83c\\udf61","\\ud83c\\udf73","\\ud83c\\udf5e","\\ud83c\\udf69","\\ud83c\\udf66","\\ud83c\\udf82","\\ud83c\\udf70","\\ud83c\\udf6a","\\ud83c\\udf6b","\\ud83c\\udf6d","\\ud83c\\udf6f","\\ud83c\\udf4e","\\ud83c\\udf4f","\\ud8
|
2019-10-31 11:17:22 +01:00
|
|
|
/**
|
2019-10-31 15:06:25 +01:00
|
|
|
* Initialize magic constants.
|
2019-10-31 11:17:22 +01:00
|
|
|
*
|
2020-07-11 20:01:54 +02:00
|
|
|
* @param bool $light Use lightweight initialization routine
|
2019-10-31 11:17:22 +01:00
|
|
|
*/
|
2023-01-24 12:45:55 +01:00
|
|
|
public static function start(bool $light): void
|
2018-04-08 19:44:01 +02:00
|
|
|
{
|
2020-07-11 20:01:54 +02:00
|
|
|
if (self::$inited || (self::$initedLight && $light)) {
|
|
|
|
return;
|
|
|
|
}
|
2021-12-03 18:15:56 +01:00
|
|
|
if (PHP_INT_SIZE < 8) {
|
2022-12-30 19:21:36 +01:00
|
|
|
throw new Exception('A 64-bit build of PHP is required to run MadelineProto, PHP 8.0+ recommended.', 0, null, 'MadelineProto', 1);
|
2021-12-03 18:15:56 +01:00
|
|
|
}
|
2023-01-15 20:13:47 +01:00
|
|
|
if (!\defined('AMP_WORKER')) {
|
|
|
|
\define('AMP_WORKER', 1);
|
|
|
|
}
|
2020-07-11 20:01:54 +02:00
|
|
|
if (!self::$initedLight) {
|
|
|
|
// Setup error reporting
|
2023-01-15 16:12:12 +01:00
|
|
|
Shutdown::init();
|
2023-01-11 18:47:27 +01:00
|
|
|
\set_error_handler(Exception::exceptionErrorHandler(...));
|
|
|
|
\set_exception_handler(Exception::exceptionHandler(...));
|
2022-12-30 19:21:36 +01:00
|
|
|
self::$isIpcWorker = \defined('MADELINE_WORKER_TYPE') ? MADELINE_WORKER_TYPE === 'madeline-ipc' : false;
|
2021-09-25 14:27:58 +02:00
|
|
|
// Important, obtain root relative to caller script
|
|
|
|
$backtrace = \debug_backtrace(0);
|
|
|
|
self::$script_cwd = self::$cwd = \dirname(\end($backtrace)['file']);
|
2020-07-11 20:01:54 +02:00
|
|
|
if (PHP_SAPI !== 'cli' && PHP_SAPI !== 'phpdbg') {
|
|
|
|
try {
|
|
|
|
\error_reporting(E_ALL);
|
|
|
|
\ini_set('log_errors', 1);
|
2022-12-30 19:21:36 +01:00
|
|
|
\ini_set('error_log', self::$script_cwd.DIRECTORY_SEPARATOR.'MadelineProto.log');
|
|
|
|
} catch (Throwable $e) {
|
2020-07-11 20:01:54 +02:00
|
|
|
//$this->logger->logger('Could not enable PHP logging');
|
2018-04-08 19:44:01 +02:00
|
|
|
}
|
|
|
|
}
|
2020-09-27 23:06:57 +02:00
|
|
|
try {
|
|
|
|
\ini_set('memory_limit', -1);
|
2022-12-30 19:21:36 +01:00
|
|
|
} catch (Throwable $e) {
|
2020-09-27 23:06:57 +02:00
|
|
|
}
|
2020-07-11 20:01:54 +02:00
|
|
|
// Check if we're in a console, for colorful log output
|
2018-04-08 19:44:01 +02:00
|
|
|
try {
|
2020-10-04 14:55:05 +02:00
|
|
|
self::$isatty = \defined('STDOUT') && hasColorSupport();
|
2022-12-30 19:21:36 +01:00
|
|
|
} catch (Throwable $e) {
|
2018-04-08 19:44:01 +02:00
|
|
|
}
|
2018-12-29 18:04:16 +01:00
|
|
|
try {
|
2019-09-02 17:08:36 +02:00
|
|
|
self::$cwd = \getcwd();
|
2018-12-29 18:04:16 +01:00
|
|
|
self::$can_getcwd = true;
|
2022-12-30 19:21:36 +01:00
|
|
|
} catch (Throwable $e) {
|
2019-06-04 14:55:58 +02:00
|
|
|
}
|
2022-01-02 11:44:18 +01:00
|
|
|
try {
|
|
|
|
if (\function_exists('set_time_limit')) {
|
|
|
|
\set_time_limit(-1);
|
|
|
|
}
|
2022-12-30 19:21:36 +01:00
|
|
|
} catch (Throwable $e) {
|
2022-01-02 11:44:18 +01:00
|
|
|
}
|
2020-07-11 20:01:54 +02:00
|
|
|
// Define signal handlers
|
2020-10-04 14:55:05 +02:00
|
|
|
if (\defined('SIGINT')) {
|
2019-06-12 18:26:55 +02:00
|
|
|
//if (function_exists('pcntl_async_signals')) pcntl_async_signals(true);
|
2020-03-14 17:29:49 +01:00
|
|
|
try {
|
2020-08-27 18:04:55 +02:00
|
|
|
\pcntl_signal(SIGINT, fn () => null);
|
|
|
|
\pcntl_signal(SIGINT, SIG_DFL);
|
2022-12-30 21:43:58 +01:00
|
|
|
EventLoop::unreference(EventLoop::onSignal(SIGINT, static function (): void {
|
2023-01-15 16:12:12 +01:00
|
|
|
if (self::$suspendPeriodicLogging) {
|
|
|
|
self::togglePeriodicLogging();
|
|
|
|
}
|
|
|
|
throw new SignalException('SIGINT received');
|
2020-03-14 17:29:49 +01:00
|
|
|
}));
|
2022-12-30 21:43:58 +01:00
|
|
|
EventLoop::unreference(EventLoop::onSignal(SIGTERM, static function (): void {
|
2023-01-15 16:12:12 +01:00
|
|
|
if (self::$suspendPeriodicLogging) {
|
|
|
|
self::togglePeriodicLogging();
|
|
|
|
}
|
|
|
|
throw new SignalException('SIGTERM received');
|
2020-03-14 17:29:49 +01:00
|
|
|
}));
|
2022-12-30 19:21:36 +01:00
|
|
|
} catch (Throwable $e) {
|
2020-03-14 17:29:49 +01:00
|
|
|
}
|
2019-06-07 19:15:12 +02:00
|
|
|
}
|
2021-09-25 14:02:12 +02:00
|
|
|
self::$altervista = isset($_SERVER['SERVER_ADMIN']) && \strpos($_SERVER['SERVER_ADMIN'], 'altervista.org');
|
|
|
|
self::$zerowebhost = isset($_SERVER['SERVER_ADMIN']) && \strpos($_SERVER['SERVER_ADMIN'], '000webhost.io');
|
2023-01-04 15:26:06 +01:00
|
|
|
self::$can_getmypid = !self::$altervista && !self::$zerowebhost;
|
2023-01-16 22:54:05 +01:00
|
|
|
self::$version = null;
|
2023-01-28 14:53:07 +01:00
|
|
|
if (\file_exists(__DIR__.'/../.git/refs/heads/stable')) {
|
2023-01-04 15:26:06 +01:00
|
|
|
try {
|
2023-01-28 14:53:07 +01:00
|
|
|
self::$version = \trim(@\file_get_contents(__DIR__.'/../.git/refs/heads/stable'));
|
2023-01-04 15:26:06 +01:00
|
|
|
} catch (Throwable $e) {
|
|
|
|
}
|
|
|
|
}
|
2023-01-16 23:12:58 +01:00
|
|
|
self::$revision = 'Revision: '.self::$version;
|
2020-07-11 20:01:54 +02:00
|
|
|
self::$initedLight = true;
|
|
|
|
if ($light) {
|
|
|
|
return;
|
2019-06-13 14:43:30 +02:00
|
|
|
}
|
2020-07-11 20:01:54 +02:00
|
|
|
}
|
|
|
|
foreach (['xml', 'fileinfo', 'json', 'mbstring'] as $extension) {
|
|
|
|
if (!\extension_loaded($extension)) {
|
|
|
|
throw Exception::extension($extension);
|
2019-06-30 15:12:43 +02:00
|
|
|
}
|
2018-04-08 19:44:01 +02:00
|
|
|
}
|
2020-07-11 20:01:54 +02:00
|
|
|
self::$BIG_ENDIAN = \pack('L', 1) === \pack('N', 1);
|
|
|
|
if (\class_exists('\\danog\\MadelineProto\\VoIP')) {
|
2022-12-30 19:21:36 +01:00
|
|
|
if (!\defined('\\danog\\MadelineProto\\VoIP::PHP_LIBTGVOIP_VERSION') || !\in_array(VoIP::PHP_LIBTGVOIP_VERSION, ['1.5.0'])) {
|
|
|
|
throw new Exception(\hex2bin(Lang::$current_lang['v_tgerror']), 0, null, 'MadelineProto', 1);
|
2020-07-11 20:01:54 +02:00
|
|
|
}
|
|
|
|
}
|
2021-12-06 19:14:34 +01:00
|
|
|
self::$hasOpenssl = \extension_loaded('openssl');
|
2020-07-11 20:01:54 +02:00
|
|
|
self::$emojis = \json_decode(self::JSON_EMOJIS);
|
2022-12-30 19:21:36 +01:00
|
|
|
self::$zero = new BigInteger(0);
|
|
|
|
self::$one = new BigInteger(1);
|
|
|
|
self::$two = new BigInteger(2);
|
|
|
|
self::$twoe1984 = new BigInteger('010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 16);
|
|
|
|
self::$twoe2047 = new BigInteger('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 16);
|
|
|
|
self::$twoe2048 = new BigInteger('0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 16);
|
2021-12-10 17:50:41 +01:00
|
|
|
if (self::$version) {
|
|
|
|
self::$version_latest = null;
|
2021-04-08 16:23:25 +02:00
|
|
|
try {
|
2021-12-15 15:55:44 +01:00
|
|
|
$php = (string) \min(81, (int) (PHP_MAJOR_VERSION.PHP_MINOR_VERSION));
|
2023-01-22 15:39:10 +01:00
|
|
|
self::$version_latest = \trim(@\file_get_contents("https://phar.madelineproto.xyz/release$php"));
|
2022-12-30 19:21:36 +01:00
|
|
|
} catch (Throwable $e) {
|
2021-04-09 17:21:37 +02:00
|
|
|
}
|
2021-12-10 17:50:41 +01:00
|
|
|
if (self::$version_latest !== self::$version) {
|
|
|
|
self::$revision .= ' (AN UPDATE IS REQUIRED)';
|
2023-01-04 15:13:55 +01:00
|
|
|
}
|
2020-07-11 20:01:54 +02:00
|
|
|
}
|
2021-04-08 16:23:25 +02:00
|
|
|
try {
|
|
|
|
$res = \json_decode(@\file_get_contents('https://rpc.madelineproto.xyz/v3.json'), true);
|
2022-12-30 19:21:36 +01:00
|
|
|
} catch (Throwable $e) {
|
2021-04-09 17:21:37 +02:00
|
|
|
}
|
2021-04-08 16:23:25 +02:00
|
|
|
if (isset($res, $res['ok']) && $res['ok']) {
|
2020-07-11 20:01:54 +02:00
|
|
|
RPCErrorException::$errorMethodMap = $res['result'];
|
|
|
|
RPCErrorException::$descriptions += $res['human_result'];
|
|
|
|
}
|
2021-05-02 17:18:10 +02:00
|
|
|
foreach (Extension::ALL_MIMES as $ext => $mimes) {
|
|
|
|
$ext = ".$ext";
|
|
|
|
foreach ($mimes as $mime) {
|
|
|
|
if (!isset(self::$allMimes[$mime])) {
|
|
|
|
self::$allMimes[$mime] = $ext;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-01-20 15:47:40 +01:00
|
|
|
GarbageCollector::start();
|
2020-07-11 20:01:54 +02:00
|
|
|
self::$inited = true;
|
2018-04-08 19:44:01 +02:00
|
|
|
}
|
2019-10-31 11:17:22 +01:00
|
|
|
/**
|
2019-10-31 15:06:25 +01:00
|
|
|
* Check if this is a POSIX fork of the main PHP process.
|
2019-10-31 11:17:22 +01:00
|
|
|
*/
|
2022-12-30 19:21:36 +01:00
|
|
|
public static function isFork(): bool
|
2018-04-08 19:44:01 +02:00
|
|
|
{
|
2019-10-29 22:41:31 +01:00
|
|
|
if (self::$isFork) {
|
2018-04-08 19:44:01 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (!self::$can_getmypid) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
if (self::$pid === null) {
|
2019-09-02 17:08:36 +02:00
|
|
|
self::$pid = \getmypid();
|
2018-04-08 19:44:01 +02:00
|
|
|
}
|
2019-10-29 22:41:31 +01:00
|
|
|
return self::$isFork = self::$pid !== \getmypid();
|
2022-12-30 19:21:36 +01:00
|
|
|
} catch (Throwable $e) {
|
2018-04-08 19:44:01 +02:00
|
|
|
return self::$can_getmypid = false;
|
|
|
|
}
|
|
|
|
}
|
2019-10-31 11:17:22 +01:00
|
|
|
/**
|
2019-10-31 15:06:25 +01:00
|
|
|
* Get current working directory.
|
2019-10-31 11:17:22 +01:00
|
|
|
*/
|
2019-09-03 17:55:44 +02:00
|
|
|
public static function getcwd(): string
|
2018-12-29 18:04:16 +01:00
|
|
|
{
|
2019-09-02 17:08:36 +02:00
|
|
|
return self::$can_getcwd ? \getcwd() : self::$cwd;
|
2018-12-29 18:04:16 +01:00
|
|
|
}
|
2020-12-14 16:31:46 +01:00
|
|
|
/**
|
|
|
|
* Toggle periodic logging.
|
|
|
|
*/
|
|
|
|
public static function togglePeriodicLogging(): void
|
|
|
|
{
|
2021-05-09 22:33:59 +02:00
|
|
|
if (self::$suspendPeriodicLogging) {
|
|
|
|
$deferred = self::$suspendPeriodicLogging;
|
|
|
|
self::$suspendPeriodicLogging = null;
|
2022-12-30 21:43:58 +01:00
|
|
|
$deferred->complete();
|
2021-05-09 22:33:59 +02:00
|
|
|
} else {
|
2022-12-30 20:24:13 +01:00
|
|
|
self::$suspendPeriodicLogging = new DeferredFuture;
|
2021-05-09 22:33:59 +02:00
|
|
|
}
|
2020-12-14 16:31:46 +01:00
|
|
|
}
|
2021-04-20 15:01:53 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Set whether we can use ipv6.
|
|
|
|
*
|
|
|
|
* @param bool $ipv6 Whether we can use ipv6.
|
|
|
|
*/
|
|
|
|
public static function setIpv6(bool $ipv6): void
|
|
|
|
{
|
|
|
|
if (!self::$initedIpv6) {
|
|
|
|
self::$ipv6 = $ipv6;
|
|
|
|
self::$initedIpv6 = true;
|
|
|
|
}
|
|
|
|
}
|
2018-04-08 19:44:01 +02:00
|
|
|
}
|