diff --git a/.gitignore b/.gitignore index 72ae230d..e85dd3cc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +SocksProxy.php magnabroadcast.php broadcast.php diff --git a/composer.json b/composer.json index 77393e6e..1f223428 100644 --- a/composer.json +++ b/composer.json @@ -12,13 +12,12 @@ "php": ">=5.6.0", "danog/primemodule": "dev-master", "danog/magicalserializer": "dev-master", - "phpseclib/phpseclib": "dev-master#200c2a9", + "phpseclib/phpseclib": "dev-master#52c068ac", "vlucas/phpdotenv": "^2.4", "erusev/parsedown": "^1.6", "rollbar/rollbar": "~1.1", "ext-mbstring": "*", "ext-curl": "*", - "ext-sockets": "*", "ext-xml": "*" }, "require-dev": { @@ -44,7 +43,8 @@ "src/Volatile.php", "src/Thread.php", "src/Worker.php", - "src/Pool.php" + "src/Pool.php", + "src/BigIntegor.php" ] } } diff --git a/src/BigIntegor.php b/src/BigIntegor.php new file mode 100644 index 00000000..205245a7 --- /dev/null +++ b/src/BigIntegor.php @@ -0,0 +1,6 @@ +. */ if (!extension_loaded('pthreads')) { + if (extension_loaded('sockets')) { class Socket { private $sock; @@ -106,4 +107,100 @@ if (!extension_loaded('pthreads')) { return $port ? ['host' => $address, 'port' => $port] : ['host' => $address]; } } + } else { + define('AF_INET', 0); + define('AF_INET6', 1); + define('SOCK_STREAM', 2); + define('SOL_SOCKET', 3); + define('SO_RCVTIMEO', 4); + define('SO_SNDTIMEO', 5); + + class Socket + { + private $sock; + private $protocol; + private $timeout = ['sec' => 0, 'usec' => 0]; + private $blocking = false; + public function __construct(int $domain, int $type, int $protocol) + { + $this->protocol = getprotobynumber($protocol); + } + + public function setOption(int $level, int $name, $value) + { + if (in_array($name, [\SO_RCVTIMEO, \SO_SNDTIMEO])) { + $this->timeout = ['sec' => (int) $value, 'usec' => (int) (($value - (int) $value) * 1000000)]; + stream_set_timeout($this->sock, $this->timeout['sec'], $this->timeout['usec']); + return true; + } + throw new \danog\MadelineProto\Exception('Not supported'); + } + + public function getOption(int $level, int $name) + { + throw new \danog\MadelineProto\Exception('Not supported'); + } + + public function setBlocking(bool $blocking) + { + return stream_set_blocking($this->sock, $blocking); + } + + public function bind(string $address, int $port = 0) + { + throw new \danog\MadelineProto\Exception('Not supported'); + } + + public function listen(int $backlog = 0) + { + throw new \danog\MadelineProto\Exception('Not supported'); + } + + public function accept() + { + throw new \danog\MadelineProto\Exception('Not supported'); + } + + public function connect(string $address, int $port = 0) + { + $this->sock = fsockopen($this->protocol.'://'.$address, $port); + return true; + } + + public function select(array &$read, array &$write, array &$except, int $tv_sec, int $tv_usec = 0) + { + return stream_select($read, $write, $except, $tv_sec, $tv_usec); + } + + public function read(int $length, int $flags = 0) + { + return stream_get_contents($this->sock, $length); + } + + public function write(string $buffer, int $length = -1) + { + return $length === -1 ? fwrite($this->sock, $buffer) : fwrite($this->sock, $buffer, $length); + } + + public function send(string $data, int $length, int $flags) + { + throw new \danog\MadelineProto\Exception('Not supported'); + } + + public function close() + { + return fclose($this->sock); + } + + public function getPeerName(bool $port = true) + { + throw new \danog\MadelineProto\Exception('Not supported'); + } + + public function getSockName(bool $port = true) + { + throw new \danog\MadelineProto\Exception('Not supported'); + } + } + } } diff --git a/src/danog/MadelineProto/Connection.php b/src/danog/MadelineProto/Connection.php index 01a76595..48a305f8 100644 --- a/src/danog/MadelineProto/Connection.php +++ b/src/danog/MadelineProto/Connection.php @@ -82,14 +82,14 @@ class Connection if ($has_proxy && $this->extra !== []) { $this->sock->setExtra($this->extra); } + if (!$this->sock->connect($ip, $port)) { + throw new Exception(\danog\MadelineProto\Lang::$current_lang['socket_con_error']); + } if (!\danog\MadelineProto\Logger::$has_thread) { $this->sock->setOption(\SOL_SOCKET, \SO_RCVTIMEO, $timeout); $this->sock->setOption(\SOL_SOCKET, \SO_SNDTIMEO, $timeout); } $this->sock->setBlocking(true); - if (!$this->sock->connect($ip, $port)) { - throw new Exception(\danog\MadelineProto\Lang::$current_lang['socket_con_error']); - } $this->write(chr(239)); break; case 'tcp_intermediate': @@ -97,11 +97,11 @@ class Connection if ($has_proxy && $this->extra !== []) { $this->sock->setExtra($this->extra); } - $this->sock->setOption(\SOL_SOCKET, \SO_RCVTIMEO, $timeout); - $this->sock->setOption(\SOL_SOCKET, \SO_SNDTIMEO, $timeout); if (!$this->sock->connect($ip, $port)) { throw new Exception(\danog\MadelineProto\Lang::$current_lang['socket_con_error']); } + $this->sock->setOption(\SOL_SOCKET, \SO_RCVTIMEO, $timeout); + $this->sock->setOption(\SOL_SOCKET, \SO_SNDTIMEO, $timeout); if (!\danog\MadelineProto\Logger::$has_thread) { $this->sock->setOption(\SOL_SOCKET, \SO_RCVTIMEO, $timeout); $this->sock->setOption(\SOL_SOCKET, \SO_SNDTIMEO, $timeout); @@ -146,7 +146,7 @@ class Connection $random[56] = $random[57] = $random[58] = $random[59] = chr(0xef); $reversed = strrev(substr($random, 8, 48)); - $this->obfuscated = ['encryption' => new \phpseclib\Crypt\AES(\phpseclib\Crypt\AES::MODE_CTR), 'decryption' => new \phpseclib\Crypt\AES(\phpseclib\Crypt\AES::MODE_CTR)]; + $this->obfuscated = ['encryption' => new \phpseclib\Crypt\AES('ctr'), 'decryption' => new \phpseclib\Crypt\AES('ctr')]; $this->obfuscated['encryption']->enableContinuousBuffer(); $this->obfuscated['decryption']->enableContinuousBuffer(); @@ -158,7 +158,7 @@ class Connection $random = substr_replace( $random, substr( - $this->obfuscated['encryption']->encrypt($random), + @$this->obfuscated['encryption']->encrypt($random), 56, 8 ), @@ -254,7 +254,7 @@ class Connection switch ($this->protocol) { case 'obfuscated2': - $what = $this->obfuscated['encryption']->encrypt($what); + $what = @$this->obfuscated['encryption']->encrypt($what); case 'tcp_abridged': case 'tcp_intermediate': case 'tcp_full': @@ -293,7 +293,7 @@ class Connection throw new Exception(sprintf(\danog\MadelineProto\Lang::$current_lang['wrong_length_read'], $length, strlen($packet))); } - return $this->obfuscated['decryption']->encrypt($packet); + return @$this->obfuscated['decryption']->encrypt($packet); case 'tcp_abridged': case 'tcp_intermediate': diff --git a/src/danog/MadelineProto/Lang.php b/src/danog/MadelineProto/Lang.php index 17152f54..662db1b2 100644 --- a/src/danog/MadelineProto/Lang.php +++ b/src/danog/MadelineProto/Lang.php @@ -14,431 +14,433 @@ namespace danog\MadelineProto; class Lang { - public static $lang = [ - 'it' => [ - 'phpseclib_fork' => 'Per favore installa questo fork di phpseclib: https://github.com/danog/phpseclib', - 'inst_dc' => 'Istanziamento dei DataCenter...', - 'load_rsa' => 'Caricamento delle chiavi RSA...', - 'TL_translation' => 'Translazione degli schemi TL...', - 'dh_prime_check_0' => 'Esecuzione dei check dh_prime (0/3)...', - 'nearest_dc' => 'Siamo in %s, il DC corrente è %d, il DC più vicino è %d.', - 'serialization_ofd' => 'La serializzazione non è aggiornata, reistanziamento dell\'oggetto in corso!', - 'getupdates_deserialization' => 'Ottenimento aggiornamenti dopo deserializzazione...', - 'shutdown_reader_pool' => 'Chiusura pool di lettura, %d thread rimasti', - 'threading_on' => 'IL THREADING È ABILITATO', - 'socket_reader' => 'Lettore socket su DC %s: ', - 'socket_status_1' => 'CREAZIONE', - 'socket_status_2' => 'INVIO', - 'socket_status_3' => 'ATTESA', - 'socket_status_4' => 'PRONTO', - 'socket_status_5' => 'AVVIATO', - 'api_not_set' => 'Devi specificare una chiave ed un ID API, ottienili su https://my.telegram.org', - 'session_corrupted' => 'La sessione si è corrotta!', - 'reset_session_seqno' => 'Resettando ID sessione e numero di sequenza sul DC %s...', - 'gen_perm_auth_key' => 'Generando chiave di autorizzazione permanente per il DC %s...', - 'gen_temp_auth_key' => 'Generando chiave di autorizzazione temporanea per il DC %s...', - 'copy_auth_dcs' => 'Copiando autorizzazione dal DC %s al DC %s...', - 'write_client_info' => 'Scrittura info sul client (eseguendo nel contempo il metodo %s)...', - 'config_updated' => 'La configurazione è stata aggiornata!', - 'length_not_4' => 'La lunghezza non è uguale a 4', - 'length_not_8' => 'La lunghezza non è uguale a 8', - 'value_bigger_than_2147483647' => 'Il valore fornito (%s) è maggiore di 2147483647', - 'value_smaller_than_2147483648' => 'Il valore fornito (%s) è minore di -2147483648', - 'value_bigger_than_9223372036854775807' => 'Il valore fornito (%s) è maggiore di 9223372036854775807', + public static $lang = array ( + 'it' => + array ( + 'phpseclib_fork' => 'Per favore installa questo fork di phpseclib: https://github.com/danog/phpseclib', + 'inst_dc' => 'Istanziamento dei DataCenter...', + 'load_rsa' => 'Caricamento delle chiavi RSA...', + 'TL_translation' => 'Translazione degli schemi TL...', + 'dh_prime_check_0' => 'Esecuzione dei check dh_prime (0/3)...', + 'nearest_dc' => 'Siamo in %s, il DC corrente è %d, il DC più vicino è %d.', + 'serialization_ofd' => 'La serializzazione non è aggiornata, reistanziamento dell\'oggetto in corso!', + 'getupdates_deserialization' => 'Ottenimento aggiornamenti dopo deserializzazione...', + 'shutdown_reader_pool' => 'Chiusura pool di lettura, %d thread rimasti', + 'threading_on' => 'IL THREADING È ABILITATO', + 'socket_reader' => 'Lettore socket su DC %s: ', + 'socket_status_1' => 'CREAZIONE', + 'socket_status_2' => 'INVIO', + 'socket_status_3' => 'ATTESA', + 'socket_status_4' => 'PRONTO', + 'socket_status_5' => 'AVVIATO', + 'api_not_set' => 'Devi specificare una chiave ed un ID API, ottienili su https://my.telegram.org', + 'session_corrupted' => 'La sessione si è corrotta!', + 'reset_session_seqno' => 'Resettando ID sessione e numero di sequenza sul DC %s...', + 'gen_perm_auth_key' => 'Generando chiave di autorizzazione permanente per il DC %s...', + 'gen_temp_auth_key' => 'Generando chiave di autorizzazione temporanea per il DC %s...', + 'copy_auth_dcs' => 'Copiando autorizzazione dal DC %s al DC %s...', + 'write_client_info' => 'Scrittura info sul client (eseguendo nel contempo il metodo %s)...', + 'config_updated' => 'La configurazione è stata aggiornata!', + 'length_not_4' => 'La lunghezza non è uguale a 4', + 'length_not_8' => 'La lunghezza non è uguale a 8', + 'value_bigger_than_2147483647' => 'Il valore fornito (%s) è maggiore di 2147483647', + 'value_smaller_than_2147483648' => 'Il valore fornito (%s) è minore di -2147483648', + 'value_bigger_than_9223372036854775807' => 'Il valore fornito (%s) è maggiore di 9223372036854775807', 'value_smaller_than_9223372036854775808' => 'Il valore fornito (%s) è minore di -9223372036854775808', - 'value_bigger_than_4294967296' => 'Il valore fornito (%s) è maggiore di 4294967296', - 'value_smaller_than_0' => 'Il valore fornito (%s) è minore di 0', - 'encode_double_error' => 'Non sono riuscito a codificare il numero a virgola mobile fornito', - 'file_not_exist' => 'Il file specificato non esiste', - 'deserialization_error' => 'C\'è stato un errore durante la deserializzazione', - 'rsa_init' => 'Istanziamento di \\phpseclib\\Crypt\\RSA in corso...', - 'loading_key' => 'Caricamento della chiave in corso...', - 'computing_fingerprint' => 'Calcolo del fingerprint in corso...', - 'rsa_encrypting' => 'Criptando con chiave RSA...', - 'rpc_tg_error' => 'Telegram ha ritornato un errore RPC: %s (%s), causato da %s:%sTL trace:', - 'v_error' => '506572206661766f726520616767696f726e612071756573746120696e7374616c6c617a696f6e65206469204d6164656c696e6550726f746f20636f6e206769742070756c6c206520636f6d706f73657220757064617465', - 'v_tgerror' => '506572206661766f726520616767696f726e61207068702d6c69627467766f6970', - 'no_mode_specified' => 'Nessuna modalità di logging è stata specificata!', - 'constructor_function_uncalled' => 'Il metodo costruttore non è stato ancora chiamato! Per favore chiama il metodo costruttore prima di usare questo metodo.', - 'proxy_class_invalid' => 'È stata specificata una classe proxy errata!', - 'socket_con_error' => 'Connessione fallita.', - 'protocol_not_implemented' => 'Questo protocollo non è stato ancora implementato.', - 'protocol_invalid' => 'È stato fornito un protocollo non valido', - 'nothing_in_socket' => 'Non c\'è niente nel socket!', - 'wrong_length_read' => 'ATTENZIONE: Non sono stati letti abbastanza byte (dovevo leggere %s, ho letto %s)!', - 'no_data_in_socket' => 'Non ci sono dati nel socket!', - 'dc_con_start' => 'Connessione al DC %s in corso...', - 'dc_con_stop' => 'Disconnessione dal DC %s in corso...', - 'dc_con_test_start' => 'Connessione al DC %s (server %s, %s, %s)...', - 'script_not_exist' => 'Lo script fornito non esiste', - 'apifactory_start' => 'Sto avviando la fabbrica di API...', - 'madelineproto_ready' => 'MadelineProto è pronto!', - 'logout_error' => 'C\'è stato un errore durante il logout!', - 'logout_ok' => 'Il logout è stato eseguito correttamente!', - 'already_logged_in' => 'Questa istanza di MadelineProto è già loggata, prima faccio il logout...', - 'login_ok' => 'Il login è stato eseguito correttamente!', - 'login_user' => 'Sto eseguendo il login come utente normale...', - 'login_bot' => 'Sto eseguendo il login come bot...', - 'login_code_sending' => 'Sto inviando il codice...', - 'login_code_sent' => 'Il codice è stato inviato correttamente! Una volta ricevuto il codice dovrai usare la funzione complete_phone_login.', - 'login_code_uncalled' => 'Non sto aspettando il codice! Usa la funzione phone_login.', - 'login_2fa_enabled' => 'L\'autenticazione a due fattori è abilitata, dovrai chiamare il metodo complete_2fa_login...', - 'login_need_signup' => 'Questo numero non è registrato su telegram, dovrai chiamare la funzione complete_signup...', - 'login_auth_key' => 'Sto facendo il login con la chiave di autorizzazione...', - 'not_logged_in' => 'Non ho ancora fatto il login!', - 'signup_uncalled' => 'Chiama prima le funzioni phone_login e complete_phone_login.', - 'signing_up' => 'Mi sto registrando su telegram come utente normale...', - 'signup_ok' => 'Mi sono registrato su Telegram!', - '2fa_uncalled' => 'Non sto aspettando la password, chiama prima le funzioni phone_login e complete_phone_login!', - 'getting_dialogs' => 'Sto ottenendo la lista delle chat...', - 'libtgvoip_required' => 'È necessario installare l\'estensione php-libtgvoip per accettare e gestire chiamate vocali, vistate https://docs.madelineproto.xyz per più info.', - 'peer_not_in_db' => 'Questo utente/gruppo/canale non è presente nel database interno MadelineProto', - 'calling_user' => 'Sto chiamando %s...', - 'generating_a' => 'Sto generando a...', - 'generating_g_a' => 'Sto generando g_a...', - 'call_error_1' => 'Impossibile trovare ed accettare la chiamata %s', - 'accepting_call' => 'Sto accettando una chiamata da %s...', - 'generating_b' => 'Sto generando b...', - 'call_already_accepted' => 'La chiamata %s è già stata accettata.', - 'call_already_declined' => 'La chiamata %s è già stata annullata.', - 'call_error_2' => 'Impossibile trovare e confermare la chiamata %s', - 'call_confirming' => 'Sto confermando una chiamata da %s', - 'call_error_3' => 'Impossibile trovare e completare la chiamata %s', - 'call_completing' => 'Sto completando una chiamata da %s...', - 'invalid_g_a' => 'g_a non valido!', - 'fingerprint_invalid' => 'fingerprint della chiave non valido!', - 'call_discarding' => 'Sto rifiutando la chiamata %s...', - 'call_set_rating' => 'Sto inviando la recensione della chiamata %s...', - 'call_debug_saving' => 'Sto inviando i dati di debug della chiamata %s...', - 'TL_loading' => 'Sto caricando gli schemi TL...', - 'file_parsing' => 'Leggendo %s...', - 'crc32_mismatch' => 'CRC32 non valido (%s diverso da %s) per %s', - 'src_file_invalid' => 'È stato fornito un file sorgente non valido: ', - 'translating_obj' => 'Traducendo gli oggetti...', - 'translating_methods' => 'Traducendo i metodi...', - 'bool_error' => 'Non sono riuscito ad estrarre un booleano', - 'not_numeric' => 'Il valore fornito non è numerico', - 'long_not_16' => 'Il valore fornito non è lungo 16 byte', - 'long_not_32' => 'Il valore fornito non è lungo 32 byte', - 'long_not_64' => 'Il valore fornito non è lungo 64 byte', - 'array_invalid' => 'Il valore fornito non è un array', - 'predicate_not_set' => 'Il predicato (valore sotto chiave _, esempio [\'_\' => \'inputPeer\']) non è impostato!', - 'type_extract_error' => 'Impossibile estrarre il tipo "%s"', - 'method_not_found' => 'Impossibile trovare il seguente metodo: ', - 'params_missing' => 'Non hai fornito un parametro obbligatorio, rileggi la documentazione API', - 'sec_peer_not_in_db' => 'La chat segreta non è presente nel database interno MadelineProto', - 'stream_handle_invalid' => 'Il valore fornito non è uno stream', - 'length_too_big' => 'Il valore fornito è troppo lungo', - 'deserialize_not_str' => 'Il valore generato non è una stringa', - 'type_extract_error_id' => 'Non sono riuscito ad estrarre il tipo %s con ID %s', - 'vector_invalid' => 'ID vettore non valido: ', - 'constructor_not_found' => 'Costruttore non trovato per tipo: ', - 'rand_bytes_too_small' => 'random_bytes è troppo corto!', - 'botapi_conversion_error' => 'NOn sono risucito a convertire %s in un oggetto bot API', - 'non_text_conversion' => 'Non posso ancora convertire messaggi media', - 'last_byte_invalid' => 'L\'ultimo byte non è valido', - 'file_type_invalid' => 'È stato fornito un tipo file errato', - 'recreate_temp_auth_key' => 'Sono stato costretto a rigenerare la chiave di autorizzazione temporanea', - 'resetting_auth_key' => 'ATTENZIONE: Sto resettando la chiave temporanea...', - 'shutting_down_reader_pool' => 'Chisura pool di lettura', - 'shutting_down_handler_pool' => 'Chiusura pool di gestione per DC %s, %d thread rimasti', - 'secret_chat_skipping' => 'Non ho la chat segreta %s nel database, ignorando messaggio', - 'fingerprint_mismatch' => 'Fingerprint della chiave non valido', - 'msg_data_length_too_big' => 'message_data_length è troppo grande', - 'length_not_divisible_16' => 'La lunghezza dei dati decifrati non è divisibile per 16', - 'msg_key_mismatch' => 'msg_key non valido', - 'rand_bytes_too_short' => 'random_bytes è troppo corto!', - 'resending_unsupported' => 'IL riinvio di messaggi non è ancora supportato', - 'unrecognized_dec_msg' => 'È stato ricevuto un messaggio decifrato sconosciuto: ', - 'serializing_madelineproto' => 'Sto serializzando MadelineProto...', - 'req_pq' => 'Sto richiedendo p_q...', - 'done' => 'Fatto!', - 'cdn_reupload' => 'Il file non è disponibile sul nostro CDN, richiedo la copia!', - 'stored_on_cdn' => 'Il file è scaricabile tramite CDN!', - ], - 'en' => [ - 'req_pq' => 'Requesting p_q...', - 'done' => 'Done!', - 'cdn_reupload' => 'File is not stored on CDN, requesting reupload!', - 'stored_on_cdn' => 'File is stored on CDN!', - 'serializing_madelineproto' => 'Serializing MadelineProto...', - 'phpseclib_fork' => 'Please install this fork of phpseclib: https://github.com/danog/phpseclib', - 'inst_dc' => 'Istantiating DataCenter...', - 'load_rsa' => 'Loading RSA keys...', - 'TL_translation' => 'Translating TL schemas...', - 'dh_prime_check_0' => 'Executing dh_prime checks (0/3)...', - 'nearest_dc' => 'We\'re in %s, current DC is %d, nearest DC is %d.', - 'serialization_ofd' => 'Serialization is out of date, reconstructing object!', - 'getupdates_deserialization' => 'Getting updates after deserialization...', - 'shutdown_reader_pool' => 'Shutting down reader pool, %d jobs left', - 'threading_on' => 'THREADING IS ENABLED', - 'socket_reader' => 'Socket reader on DC %s: ', - 'socket_status_1' => 'CREATING', - 'socket_status_2' => 'SUBMITTING', - 'socket_status_3' => 'WAITING', - 'socket_status_4' => 'READY', - 'socket_status_5' => 'WORKING', - 'api_not_set' => 'You must provide an api key and an api id, get your own @ my.telegram.org', - 'session_corrupted' => 'The session is corrupted!', - 'reset_session_seqno' => 'Resetting session id and seq_no in DC %s...', - 'gen_perm_auth_key' => 'Generating permanent authorization key for DC %s...', - 'gen_temp_auth_key' => 'Generating temporary authorization key for DC %s...', - 'copy_auth_dcs' => 'Copying authorization from DC %s to DC %s...', - 'write_client_info' => 'Writing client info (also executing %s)...', - 'config_updated' => 'Updated config!', - 'length_not_4' => 'Length is not equal to 4', - 'length_not_8' => 'Length is not equal to 8', - 'value_bigger_than_2147483647' => 'Provided value %s is bigger than 2147483647', - 'value_smaller_than_2147483648' => 'Provided value %s is smaller than -2147483648', - 'value_bigger_than_9223372036854775807' => 'Provided value %s is bigger than 9223372036854775807', + 'value_bigger_than_4294967296' => 'Il valore fornito (%s) è maggiore di 4294967296', + 'value_smaller_than_0' => 'Il valore fornito (%s) è minore di 0', + 'encode_double_error' => 'Non sono riuscito a codificare il numero a virgola mobile fornito', + 'file_not_exist' => 'Il file specificato non esiste', + 'deserialization_error' => 'C\'è stato un errore durante la deserializzazione', + 'rsa_init' => 'Istanziamento di \\phpseclib\\Crypt\\RSA in corso...', + 'loading_key' => 'Caricamento della chiave in corso...', + 'computing_fingerprint' => 'Calcolo del fingerprint in corso...', + 'rsa_encrypting' => 'Criptando con chiave RSA...', + 'rpc_tg_error' => 'Telegram ha ritornato un errore RPC: %s (%s), causato da %s:%sTL trace:', + 'v_error' => '506572206661766f726520616767696f726e612071756573746120696e7374616c6c617a696f6e65206469204d6164656c696e6550726f746f20636f6e206769742070756c6c206520636f6d706f73657220757064617465', + 'v_tgerror' => '506572206661766f726520616767696f726e61207068702d6c69627467766f6970', + 'no_mode_specified' => 'Nessuna modalità di logging è stata specificata!', + 'constructor_function_uncalled' => 'Il metodo costruttore non è stato ancora chiamato! Per favore chiama il metodo costruttore prima di usare questo metodo.', + 'proxy_class_invalid' => 'È stata specificata una classe proxy errata!', + 'socket_con_error' => 'Connessione fallita.', + 'protocol_not_implemented' => 'Questo protocollo non è stato ancora implementato.', + 'protocol_invalid' => 'È stato fornito un protocollo non valido', + 'nothing_in_socket' => 'Non c\'è niente nel socket!', + 'wrong_length_read' => 'ATTENZIONE: Non sono stati letti abbastanza byte (dovevo leggere %s, ho letto %s)!', + 'no_data_in_socket' => 'Non ci sono dati nel socket!', + 'dc_con_start' => 'Connessione al DC %s in corso...', + 'dc_con_stop' => 'Disconnessione dal DC %s in corso...', + 'dc_con_test_start' => 'Connessione al DC %s (server %s, %s, %s)...', + 'script_not_exist' => 'Lo script fornito non esiste', + 'apifactory_start' => 'Sto avviando la fabbrica di API...', + 'madelineproto_ready' => 'MadelineProto è pronto!', + 'logout_error' => 'C\'è stato un errore durante il logout!', + 'logout_ok' => 'Il logout è stato eseguito correttamente!', + 'already_logged_in' => 'Questa istanza di MadelineProto è già loggata, prima faccio il logout...', + 'login_ok' => 'Il login è stato eseguito correttamente!', + 'login_user' => 'Sto eseguendo il login come utente normale...', + 'login_bot' => 'Sto eseguendo il login come bot...', + 'login_code_sending' => 'Sto inviando il codice...', + 'login_code_sent' => 'Il codice è stato inviato correttamente! Una volta ricevuto il codice dovrai usare la funzione complete_phone_login.', + 'login_code_uncalled' => 'Non sto aspettando il codice! Usa la funzione phone_login.', + 'login_2fa_enabled' => 'L\'autenticazione a due fattori è abilitata, dovrai chiamare il metodo complete_2fa_login...', + 'login_need_signup' => 'Questo numero non è registrato su telegram, dovrai chiamare la funzione complete_signup...', + 'login_auth_key' => 'Sto facendo il login con la chiave di autorizzazione...', + 'not_logged_in' => 'Non ho ancora fatto il login!', + 'signup_uncalled' => 'Chiama prima le funzioni phone_login e complete_phone_login.', + 'signing_up' => 'Mi sto registrando su telegram come utente normale...', + 'signup_ok' => 'Mi sono registrato su Telegram!', + '2fa_uncalled' => 'Non sto aspettando la password, chiama prima le funzioni phone_login e complete_phone_login!', + 'getting_dialogs' => 'Sto ottenendo la lista delle chat...', + 'libtgvoip_required' => 'È necessario installare l\'estensione php-libtgvoip per accettare e gestire chiamate vocali, vistate https://docs.madelineproto.xyz per più info.', + 'peer_not_in_db' => 'Questo utente/gruppo/canale non è presente nel database interno MadelineProto', + 'calling_user' => 'Sto chiamando %s...', + 'generating_a' => 'Sto generando a...', + 'generating_g_a' => 'Sto generando g_a...', + 'call_error_1' => 'Impossibile trovare ed accettare la chiamata %s', + 'accepting_call' => 'Sto accettando una chiamata da %s...', + 'generating_b' => 'Sto generando b...', + 'call_already_accepted' => 'La chiamata %s è già stata accettata.', + 'call_already_declined' => 'La chiamata %s è già stata annullata.', + 'call_error_2' => 'Impossibile trovare e confermare la chiamata %s', + 'call_confirming' => 'Sto confermando una chiamata da %s', + 'call_error_3' => 'Impossibile trovare e completare la chiamata %s', + 'call_completing' => 'Sto completando una chiamata da %s...', + 'invalid_g_a' => 'g_a non valido!', + 'fingerprint_invalid' => 'fingerprint della chiave non valido!', + 'call_discarding' => 'Sto rifiutando la chiamata %s...', + 'call_set_rating' => 'Sto inviando la recensione della chiamata %s...', + 'call_debug_saving' => 'Sto inviando i dati di debug della chiamata %s...', + 'TL_loading' => 'Sto caricando gli schemi TL...', + 'file_parsing' => 'Leggendo %s...', + 'crc32_mismatch' => 'CRC32 non valido (%s diverso da %s) per %s', + 'src_file_invalid' => 'È stato fornito un file sorgente non valido: ', + 'translating_obj' => 'Traducendo gli oggetti...', + 'translating_methods' => 'Traducendo i metodi...', + 'bool_error' => 'Non sono riuscito ad estrarre un booleano', + 'not_numeric' => 'Il valore fornito non è numerico', + 'long_not_16' => 'Il valore fornito non è lungo 16 byte', + 'long_not_32' => 'Il valore fornito non è lungo 32 byte', + 'long_not_64' => 'Il valore fornito non è lungo 64 byte', + 'array_invalid' => 'Il valore fornito non è un array', + 'predicate_not_set' => 'Il predicato (valore sotto chiave _, esempio [\'_\' => \'inputPeer\']) non è impostato!', + 'type_extract_error' => 'Impossibile estrarre il tipo "%s"', + 'method_not_found' => 'Impossibile trovare il seguente metodo: ', + 'params_missing' => 'Non hai fornito un parametro obbligatorio, rileggi la documentazione API', + 'sec_peer_not_in_db' => 'La chat segreta non è presente nel database interno MadelineProto', + 'stream_handle_invalid' => 'Il valore fornito non è uno stream', + 'length_too_big' => 'Il valore fornito è troppo lungo', + 'deserialize_not_str' => 'Il valore generato non è una stringa', + 'type_extract_error_id' => 'Non sono riuscito ad estrarre il tipo %s con ID %s', + 'vector_invalid' => 'ID vettore non valido: ', + 'constructor_not_found' => 'Costruttore non trovato per tipo: ', + 'rand_bytes_too_small' => 'random_bytes è troppo corto!', + 'botapi_conversion_error' => 'NOn sono risucito a convertire %s in un oggetto bot API', + 'non_text_conversion' => 'Non posso ancora convertire messaggi media', + 'last_byte_invalid' => 'L\'ultimo byte non è valido', + 'file_type_invalid' => 'È stato fornito un tipo file errato', + 'recreate_temp_auth_key' => 'Sono stato costretto a rigenerare la chiave di autorizzazione temporanea', + 'resetting_auth_key' => 'ATTENZIONE: Sto resettando la chiave temporanea...', + 'shutting_down_reader_pool' => 'Chisura pool di lettura', + 'shutting_down_handler_pool' => 'Chiusura pool di gestione per DC %s, %d thread rimasti', + 'secret_chat_skipping' => 'Non ho la chat segreta %s nel database, ignorando messaggio', + 'fingerprint_mismatch' => 'Fingerprint della chiave non valido', + 'msg_data_length_too_big' => 'message_data_length è troppo grande', + 'length_not_divisible_16' => 'La lunghezza dei dati decifrati non è divisibile per 16', + 'msg_key_mismatch' => 'msg_key non valido', + 'rand_bytes_too_short' => 'random_bytes è troppo corto!', + 'resending_unsupported' => 'IL riinvio di messaggi non è ancora supportato', + 'unrecognized_dec_msg' => 'È stato ricevuto un messaggio decifrato sconosciuto: ', + 'serializing_madelineproto' => 'Sto serializzando MadelineProto...', + 'req_pq' => 'Sto richiedendo pq...', + 'done' => 'Fatto!', + 'cdn_reupload' => 'Il file non è disponibile sul nostro CDN, richiedo la copia!', + 'stored_on_cdn' => 'Il file è scaricabile tramite CDN!', + ), + 'en' => + array ( + 'req_pq' => 'Requesting pq...', + 'done' => 'Done!', + 'cdn_reupload' => 'File is not stored on CDN, requesting reupload!', + 'stored_on_cdn' => 'File is stored on CDN!', + 'serializing_madelineproto' => 'Serializing MadelineProto...', + 'phpseclib_fork' => 'Please install this fork of phpseclib: https://github.com/danog/phpseclib', + 'inst_dc' => 'Istantiating DataCenter...', + 'load_rsa' => 'Loading RSA keys...', + 'TL_translation' => 'Translating TL schemas...', + 'dh_prime_check_0' => 'Executing dh_prime checks (0/3)...', + 'nearest_dc' => 'We\'re in %s, current DC is %d, nearest DC is %d.', + 'serialization_ofd' => 'Serialization is out of date, reconstructing object!', + 'getupdates_deserialization' => 'Getting updates after deserialization...', + 'shutdown_reader_pool' => 'Shutting down reader pool, %d jobs left', + 'threading_on' => 'THREADING IS ENABLED', + 'socket_reader' => 'Socket reader on DC %s: ', + 'socket_status_1' => 'CREATING', + 'socket_status_2' => 'SUBMITTING', + 'socket_status_3' => 'WAITING', + 'socket_status_4' => 'READY', + 'socket_status_5' => 'WORKING', + 'api_not_set' => 'You must provide an api key and an api id, get your own @ my.telegram.org', + 'session_corrupted' => 'The session is corrupted!', + 'reset_session_seqno' => 'Resetting session id and seq_no in DC %s...', + 'gen_perm_auth_key' => 'Generating permanent authorization key for DC %s...', + 'gen_temp_auth_key' => 'Generating temporary authorization key for DC %s...', + 'copy_auth_dcs' => 'Copying authorization from DC %s to DC %s...', + 'write_client_info' => 'Writing client info (also executing %s)...', + 'config_updated' => 'Updated config!', + 'length_not_4' => 'Length is not equal to 4', + 'length_not_8' => 'Length is not equal to 8', + 'value_bigger_than_2147483647' => 'Provided value %s is bigger than 2147483647', + 'value_smaller_than_2147483648' => 'Provided value %s is smaller than -2147483648', + 'value_bigger_than_9223372036854775807' => 'Provided value %s is bigger than 9223372036854775807', 'value_smaller_than_9223372036854775808' => 'Provided value %s is smaller than -9223372036854775808', - 'value_bigger_than_4294967296' => 'Provided value %s is bigger than 4294967296', - 'value_smaller_than_0' => 'Provided value %s is smaller than 0', - 'encode_double_error' => 'Could not properly encode double', - 'file_not_exist' => 'File does not exist', - 'deserialization_error' => 'An error occurred on deserialization', - 'rsa_init' => 'Istantiating \\phpseclib\\Crypt\\RSA...', - 'loading_key' => 'Loading key...', - 'computing_fingerprint' => 'Computing fingerprint...', - 'rsa_encrypting' => 'Encrypting with rsa key...', - 'rpc_tg_error' => 'Telegram returned an RPC error: %s (%s), caused by %s:%sTL trace:', - 'v_error' => '506c656173652075706461746520746f20746865206c61746573742076657273696f6e206f66204d6164656c696e6550726f746f2e', - 'v_tgerror' => '506c6561736520757064617465207068702d6c69627467766f6970', - 'no_mode_specified' => 'No mode was specified!', - 'constructor_function_uncalled' => 'The constructor function wasn\'t called! Please call the constructor function before using this method.', - 'proxy_class_invalid' => 'Invalid proxy class provided!', - 'socket_con_error' => 'Connection: couldn\'t connect to socket.', - 'protocol_not_implemented' => 'Connection: This protocol isn\'t implemented yet.', - 'protocol_invalid' => 'Connection: invalid protocol specified.', - 'nothing_in_socket' => 'Nothing in the socket!', - 'wrong_length_read' => 'WARNING: Wrong length was read (should\'ve read %s, read %s)!', - 'no_data_in_socket' => 'No data in the socket!', - 'dc_con_start' => 'Connecting to DC %s...', - 'dc_con_stop' => 'Disconnecting from DC %s...', - 'dc_con_test_start' => 'Connecting to DC %s (%s server, %s, %s)...', - 'script_not_exist' => 'Provided script does not exist', - 'apifactory_start' => 'Running APIFactory...', - 'madelineproto_ready' => 'MadelineProto is ready!', - 'logout_error' => 'An error occurred while logging out!', - 'logout_ok' => 'Logged out successfully!', - 'already_logged_in' => 'This instance of MadelineProto is already logged in. Logging out first...', - 'login_ok' => 'Logged in successfully!', - 'login_user' => 'Logging in as a normal user...', - 'login_bot' => 'Logging in as a bot...', - 'login_code_sending' => 'Sending code...', - 'login_code_sent' => 'Code sent successfully! Once you receive the code you should use the complete_phone_login function.', - 'login_code_uncalled' => 'I\'m not waiting for the code! Please call the phone_login method first', - 'login_2fa_enabled' => '2FA enabled, you will have to call the complete_2fa_login function...', - 'login_need_signup' => 'An account has not been created for this number, you will have to call the complete_signup function...', - 'login_auth_key' => 'Logging in using auth key...', - 'not_logged_in' => 'I\'m not logged in!', - 'signup_uncalled' => 'I\'m not waiting to signup! Please call the phone_login and the complete_phone_login methods first!', - 'signing_up' => 'Signing up as a normal user...', - 'signup_ok' => 'Signed up in successfully!', - '2fa_uncalled' => 'I\'m not waiting for the password! Please call the phone_login and the complete_phone_login methods first!', - 'getting_dialogs' => 'Getting dialogs...', - 'libtgvoip_required' => 'The php-libtgvoip extension is required to accept and manage calls. See daniil.it/MadelineProto for more info.', - 'peer_not_in_db' => 'This peer is not present in the internal peer database', - 'calling_user' => 'Calling %s...', - 'generating_a' => 'Generating a...', - 'generating_g_a' => 'Generating g_a...', - 'call_error_1' => 'Could not find and accept call %s', - 'accepting_call' => 'Accepting call from %s...', - 'generating_b' => 'Generating b...', - 'call_already_accepted' => 'Call %s already accepted', - 'call_already_declined' => 'Call %s already declined', - 'call_error_2' => 'Could not find and confirm call %s', - 'call_confirming' => 'Confirming call from %s...', - 'call_error_3' => 'Could not find and complete call %s', - 'call_completing' => 'Completing call from %s...', - 'invalid_g_a' => 'Invalid g_a!', - 'fingerprint_invalid' => 'Invalid key fingerprint!', - 'call_discarding' => 'Discarding call %s...', - 'call_set_rating' => 'Setting rating for call %s...', - 'call_debug_saving' => 'Saving debug data for call %s...', - 'TL_loading' => 'Loading TL schemes...', - 'file_parsing' => 'Parsing %s...', - 'crc32_mismatch' => 'CRC32 mismatch (%s, %s) for %s', - 'src_file_invalid' => 'Invalid source file was provided: ', - 'translating_obj' => 'Translating objects...', - 'translating_methods' => 'Translating methods...', - 'bool_error' => 'Could not extract boolean', - 'not_numeric' => 'Given value isn\'t numeric', - 'long_not_16' => 'Given value is not 16 bytes long', - 'long_not_32' => 'Given value is not 32 bytes long', - 'long_not_64' => 'Given value is not 64 bytes long', - 'array_invalid' => 'You didn\'t provide a valid array', - 'predicate_not_set' => 'Predicate (value under _) was not set!', - 'type_extract_error' => 'Could not extract type "%s"', - 'method_not_found' => 'Could not find method: ', - 'params_missing' => 'Missing required parameter', - 'sec_peer_not_in_db' => 'This secret peer is not present in the internal peer database', - 'stream_handle_invalid' => 'An invalid stream handle was provided.', - 'length_too_big' => 'Length is too big', - 'deserialize_not_str' => 'Deserialize: Generated value isn\'t a string', - 'type_extract_error_id' => 'Could not extract type: %s with id %s', - 'vector_invalid' => 'Invalid vector constructor: ', - 'constructor_not_found' => 'Constructor not found for type: ', - 'rand_bytes_too_small' => 'random_bytes is too small!', - 'botapi_conversion_error' => 'Can\'t convert %s to a bot API object', - 'non_text_conversion' => 'Can\'t convert non text messages yet!', - 'last_byte_invalid' => 'Invalid last byte', - 'file_type_invalid' => 'Invalid file type detected (%s)', - 'recreate_temp_auth_key' => 'I had to recreate the temporary authorization key', - 'resetting_auth_key' => 'WARNING: Resetting auth key...', - 'shutting_down_reader_pool' => 'Shutting down reader pool ', - 'shutting_down_handler_pool' => 'Shutting down handler pool for dc %s, %d jobs left', - 'secret_chat_skipping' => 'I do not have the secret chat %s in the database, skipping message...', - 'fingerprint_mismatch' => 'Key fingerprint mismatch', - 'msg_data_length_too_big' => 'message_data_length is too big', - 'length_not_divisible_16' => 'Length of decrypted data is not divisible by 16', - 'msg_key_mismatch' => 'msg_key mismatch', - 'rand_bytes_too_short' => 'random_bytes is too short!', - 'resending_unsupported' => 'Resending of messages is not yet supported', - 'unrecognized_dec_msg' => 'Unrecognized decrypted message received: ', - ], -]; + 'value_bigger_than_4294967296' => 'Provided value %s is bigger than 4294967296', + 'value_smaller_than_0' => 'Provided value %s is smaller than 0', + 'encode_double_error' => 'Could not properly encode double', + 'file_not_exist' => 'File does not exist', + 'deserialization_error' => 'An error occurred on deserialization', + 'rsa_init' => 'Istantiating \\phpseclib\\Crypt\\RSA...', + 'loading_key' => 'Loading key...', + 'computing_fingerprint' => 'Computing fingerprint...', + 'rsa_encrypting' => 'Encrypting with rsa key...', + 'rpc_tg_error' => 'Telegram returned an RPC error: %s (%s), caused by %s:%sTL trace:', + 'v_error' => '506c656173652075706461746520746f20746865206c61746573742076657273696f6e206f66204d6164656c696e6550726f746f2e', + 'v_tgerror' => '506c6561736520757064617465207068702d6c69627467766f6970', + 'no_mode_specified' => 'No mode was specified!', + 'constructor_function_uncalled' => 'The constructor function wasn\'t called! Please call the constructor function before using this method.', + 'proxy_class_invalid' => 'Invalid proxy class provided!', + 'socket_con_error' => 'Connection: couldn\'t connect to socket.', + 'protocol_not_implemented' => 'Connection: This protocol isn\'t implemented yet.', + 'protocol_invalid' => 'Connection: invalid protocol specified.', + 'nothing_in_socket' => 'Nothing in the socket!', + 'wrong_length_read' => 'WARNING: Wrong length was read (should\'ve read %s, read %s)!', + 'no_data_in_socket' => 'No data in the socket!', + 'dc_con_start' => 'Connecting to DC %s...', + 'dc_con_stop' => 'Disconnecting from DC %s...', + 'dc_con_test_start' => 'Connecting to DC %s (%s server, %s, %s)...', + 'script_not_exist' => 'Provided script does not exist', + 'apifactory_start' => 'Running APIFactory...', + 'madelineproto_ready' => 'MadelineProto is ready!', + 'logout_error' => 'An error occurred while logging out!', + 'logout_ok' => 'Logged out successfully!', + 'already_logged_in' => 'This instance of MadelineProto is already logged in. Logging out first...', + 'login_ok' => 'Logged in successfully!', + 'login_user' => 'Logging in as a normal user...', + 'login_bot' => 'Logging in as a bot...', + 'login_code_sending' => 'Sending code...', + 'login_code_sent' => 'Code sent successfully! Once you receive the code you should use the complete_phone_login function.', + 'login_code_uncalled' => 'I\'m not waiting for the code! Please call the phone_login method first', + 'login_2fa_enabled' => '2FA enabled, you will have to call the complete_2fa_login function...', + 'login_need_signup' => 'An account has not been created for this number, you will have to call the complete_signup function...', + 'login_auth_key' => 'Logging in using auth key...', + 'not_logged_in' => 'I\'m not logged in!', + 'signup_uncalled' => 'I\'m not waiting to signup! Please call the phone_login and the complete_phone_login methods first!', + 'signing_up' => 'Signing up as a normal user...', + 'signup_ok' => 'Signed up in successfully!', + '2fa_uncalled' => 'I\'m not waiting for the password! Please call the phone_login and the complete_phone_login methods first!', + 'getting_dialogs' => 'Getting dialogs...', + 'libtgvoip_required' => 'The php-libtgvoip extension is required to accept and manage calls. See daniil.it/MadelineProto for more info.', + 'peer_not_in_db' => 'This peer is not present in the internal peer database', + 'calling_user' => 'Calling %s...', + 'generating_a' => 'Generating a...', + 'generating_g_a' => 'Generating g_a...', + 'call_error_1' => 'Could not find and accept call %s', + 'accepting_call' => 'Accepting call from %s...', + 'generating_b' => 'Generating b...', + 'call_already_accepted' => 'Call %s already accepted', + 'call_already_declined' => 'Call %s already declined', + 'call_error_2' => 'Could not find and confirm call %s', + 'call_confirming' => 'Confirming call from %s...', + 'call_error_3' => 'Could not find and complete call %s', + 'call_completing' => 'Completing call from %s...', + 'invalid_g_a' => 'Invalid g_a!', + 'fingerprint_invalid' => 'Invalid key fingerprint!', + 'call_discarding' => 'Discarding call %s...', + 'call_set_rating' => 'Setting rating for call %s...', + 'call_debug_saving' => 'Saving debug data for call %s...', + 'TL_loading' => 'Loading TL schemes...', + 'file_parsing' => 'Parsing %s...', + 'crc32_mismatch' => 'CRC32 mismatch (%s, %s) for %s', + 'src_file_invalid' => 'Invalid source file was provided: ', + 'translating_obj' => 'Translating objects...', + 'translating_methods' => 'Translating methods...', + 'bool_error' => 'Could not extract boolean', + 'not_numeric' => 'Given value isn\'t numeric', + 'long_not_16' => 'Given value is not 16 bytes long', + 'long_not_32' => 'Given value is not 32 bytes long', + 'long_not_64' => 'Given value is not 64 bytes long', + 'array_invalid' => 'You didn\'t provide a valid array', + 'predicate_not_set' => 'Predicate (value under _) was not set!', + 'type_extract_error' => 'Could not extract type "%s"', + 'method_not_found' => 'Could not find method: ', + 'params_missing' => 'Missing required parameter', + 'sec_peer_not_in_db' => 'This secret peer is not present in the internal peer database', + 'stream_handle_invalid' => 'An invalid stream handle was provided.', + 'length_too_big' => 'Length is too big', + 'deserialize_not_str' => 'Deserialize: Generated value isn\'t a string', + 'type_extract_error_id' => 'Could not extract type: %s with id %s', + 'vector_invalid' => 'Invalid vector constructor: ', + 'constructor_not_found' => 'Constructor not found for type: ', + 'rand_bytes_too_small' => 'random_bytes is too small!', + 'botapi_conversion_error' => 'Can\'t convert %s to a bot API object', + 'non_text_conversion' => 'Can\'t convert non text messages yet!', + 'last_byte_invalid' => 'Invalid last byte', + 'file_type_invalid' => 'Invalid file type detected (%s)', + 'recreate_temp_auth_key' => 'I had to recreate the temporary authorization key', + 'resetting_auth_key' => 'WARNING: Resetting auth key...', + 'shutting_down_reader_pool' => 'Shutting down reader pool ', + 'shutting_down_handler_pool' => 'Shutting down handler pool for dc %s, %d jobs left', + 'secret_chat_skipping' => 'I do not have the secret chat %s in the database, skipping message...', + 'fingerprint_mismatch' => 'Key fingerprint mismatch', + 'msg_data_length_too_big' => 'message_data_length is too big', + 'length_not_divisible_16' => 'Length of decrypted data is not divisible by 16', + 'msg_key_mismatch' => 'msg_key mismatch', + 'rand_bytes_too_short' => 'random_bytes is too short!', + 'resending_unsupported' => 'Resending of messages is not yet supported', + 'unrecognized_dec_msg' => 'Unrecognized decrypted message received: ', + ), +); // THIS WILL BE OVERWRITTEN BY $lang["en"] - public static $current_lang = [ - 'req_pq' => 'Requesting p_q...', - 'done' => 'Done!', - 'cdn_reupload' => 'File is not stored on CDN, requesting reupload!', - 'stored_on_cdn' => 'File is stored on CDN!', - 'serializing_madelineproto' => 'Serializing MadelineProto...', - 'phpseclib_fork' => 'Please install this fork of phpseclib: https://github.com/danog/phpseclib', - 'inst_dc' => 'Istantiating DataCenter...', - 'load_rsa' => 'Loading RSA keys...', - 'TL_translation' => 'Translating TL schemas...', - 'dh_prime_check_0' => 'Executing dh_prime checks (0/3)...', - 'nearest_dc' => 'We\'re in %s, current DC is %d, nearest DC is %d.', - 'serialization_ofd' => 'Serialization is out of date, reconstructing object!', - 'getupdates_deserialization' => 'Getting updates after deserialization...', - 'shutdown_reader_pool' => 'Shutting down reader pool, %d jobs left', - 'threading_on' => 'THREADING IS ENABLED', - 'socket_reader' => 'Socket reader on DC %s: ', - 'socket_status_1' => 'CREATING', - 'socket_status_2' => 'SUBMITTING', - 'socket_status_3' => 'WAITING', - 'socket_status_4' => 'READY', - 'socket_status_5' => 'WORKING', - 'api_not_set' => 'You must provide an api key and an api id, get your own @ my.telegram.org', - 'session_corrupted' => 'The session is corrupted!', - 'reset_session_seqno' => 'Resetting session id and seq_no in DC %s...', - 'gen_perm_auth_key' => 'Generating permanent authorization key for DC %s...', - 'gen_temp_auth_key' => 'Generating temporary authorization key for DC %s...', - 'copy_auth_dcs' => 'Copying authorization from DC %s to DC %s...', - 'write_client_info' => 'Writing client info (also executing %s)...', - 'config_updated' => 'Updated config!', - 'length_not_4' => 'Length is not equal to 4', - 'length_not_8' => 'Length is not equal to 8', - 'value_bigger_than_2147483647' => 'Provided value %s is bigger than 2147483647', - 'value_smaller_than_2147483648' => 'Provided value %s is smaller than -2147483648', - 'value_bigger_than_9223372036854775807' => 'Provided value %s is bigger than 9223372036854775807', + public static $current_lang = array ( + 'req_pq' => 'Requesting pq...', + 'done' => 'Done!', + 'cdn_reupload' => 'File is not stored on CDN, requesting reupload!', + 'stored_on_cdn' => 'File is stored on CDN!', + 'serializing_madelineproto' => 'Serializing MadelineProto...', + 'phpseclib_fork' => 'Please install this fork of phpseclib: https://github.com/danog/phpseclib', + 'inst_dc' => 'Istantiating DataCenter...', + 'load_rsa' => 'Loading RSA keys...', + 'TL_translation' => 'Translating TL schemas...', + 'dh_prime_check_0' => 'Executing dh_prime checks (0/3)...', + 'nearest_dc' => 'We\'re in %s, current DC is %d, nearest DC is %d.', + 'serialization_ofd' => 'Serialization is out of date, reconstructing object!', + 'getupdates_deserialization' => 'Getting updates after deserialization...', + 'shutdown_reader_pool' => 'Shutting down reader pool, %d jobs left', + 'threading_on' => 'THREADING IS ENABLED', + 'socket_reader' => 'Socket reader on DC %s: ', + 'socket_status_1' => 'CREATING', + 'socket_status_2' => 'SUBMITTING', + 'socket_status_3' => 'WAITING', + 'socket_status_4' => 'READY', + 'socket_status_5' => 'WORKING', + 'api_not_set' => 'You must provide an api key and an api id, get your own @ my.telegram.org', + 'session_corrupted' => 'The session is corrupted!', + 'reset_session_seqno' => 'Resetting session id and seq_no in DC %s...', + 'gen_perm_auth_key' => 'Generating permanent authorization key for DC %s...', + 'gen_temp_auth_key' => 'Generating temporary authorization key for DC %s...', + 'copy_auth_dcs' => 'Copying authorization from DC %s to DC %s...', + 'write_client_info' => 'Writing client info (also executing %s)...', + 'config_updated' => 'Updated config!', + 'length_not_4' => 'Length is not equal to 4', + 'length_not_8' => 'Length is not equal to 8', + 'value_bigger_than_2147483647' => 'Provided value %s is bigger than 2147483647', + 'value_smaller_than_2147483648' => 'Provided value %s is smaller than -2147483648', + 'value_bigger_than_9223372036854775807' => 'Provided value %s is bigger than 9223372036854775807', 'value_smaller_than_9223372036854775808' => 'Provided value %s is smaller than -9223372036854775808', - 'value_bigger_than_4294967296' => 'Provided value %s is bigger than 4294967296', - 'value_smaller_than_0' => 'Provided value %s is smaller than 0', - 'encode_double_error' => 'Could not properly encode double', - 'file_not_exist' => 'File does not exist', - 'deserialization_error' => 'An error occurred on deserialization', - 'rsa_init' => 'Istantiating \\phpseclib\\Crypt\\RSA...', - 'loading_key' => 'Loading key...', - 'computing_fingerprint' => 'Computing fingerprint...', - 'rsa_encrypting' => 'Encrypting with rsa key...', - 'rpc_tg_error' => 'Telegram returned an RPC error: %s (%s), caused by %s:%sTL trace:', - 'v_error' => '506c656173652075706461746520746f20746865206c61746573742076657273696f6e206f66204d6164656c696e6550726f746f2e', - 'v_tgerror' => '506c6561736520757064617465207068702d6c69627467766f6970', - 'no_mode_specified' => 'No mode was specified!', - 'constructor_function_uncalled' => 'The constructor function wasn\'t called! Please call the constructor function before using this method.', - 'proxy_class_invalid' => 'Invalid proxy class provided!', - 'socket_con_error' => 'Connection: couldn\'t connect to socket.', - 'protocol_not_implemented' => 'Connection: This protocol isn\'t implemented yet.', - 'protocol_invalid' => 'Connection: invalid protocol specified.', - 'nothing_in_socket' => 'Nothing in the socket!', - 'wrong_length_read' => 'WARNING: Wrong length was read (should\'ve read %s, read %s)!', - 'no_data_in_socket' => 'No data in the socket!', - 'dc_con_start' => 'Connecting to DC %s...', - 'dc_con_stop' => 'Disconnecting from DC %s...', - 'dc_con_test_start' => 'Connecting to DC %s (%s server, %s, %s)...', - 'script_not_exist' => 'Provided script does not exist', - 'apifactory_start' => 'Running APIFactory...', - 'madelineproto_ready' => 'MadelineProto is ready!', - 'logout_error' => 'An error occurred while logging out!', - 'logout_ok' => 'Logged out successfully!', - 'already_logged_in' => 'This instance of MadelineProto is already logged in. Logging out first...', - 'login_ok' => 'Logged in successfully!', - 'login_user' => 'Logging in as a normal user...', - 'login_bot' => 'Logging in as a bot...', - 'login_code_sending' => 'Sending code...', - 'login_code_sent' => 'Code sent successfully! Once you receive the code you should use the complete_phone_login function.', - 'login_code_uncalled' => 'I\'m not waiting for the code! Please call the phone_login method first', - 'login_2fa_enabled' => '2FA enabled, you will have to call the complete_2fa_login function...', - 'login_need_signup' => 'An account has not been created for this number, you will have to call the complete_signup function...', - 'login_auth_key' => 'Logging in using auth key...', - 'not_logged_in' => 'I\'m not logged in!', - 'signup_uncalled' => 'I\'m not waiting to signup! Please call the phone_login and the complete_phone_login methods first!', - 'signing_up' => 'Signing up as a normal user...', - 'signup_ok' => 'Signed up in successfully!', - '2fa_uncalled' => 'I\'m not waiting for the password! Please call the phone_login and the complete_phone_login methods first!', - 'getting_dialogs' => 'Getting dialogs...', - 'libtgvoip_required' => 'The php-libtgvoip extension is required to accept and manage calls. See daniil.it/MadelineProto for more info.', - 'peer_not_in_db' => 'This peer is not present in the internal peer database', - 'calling_user' => 'Calling %s...', - 'generating_a' => 'Generating a...', - 'generating_g_a' => 'Generating g_a...', - 'call_error_1' => 'Could not find and accept call %s', - 'accepting_call' => 'Accepting call from %s...', - 'generating_b' => 'Generating b...', - 'call_already_accepted' => 'Call %s already accepted', - 'call_already_declined' => 'Call %s already declined', - 'call_error_2' => 'Could not find and confirm call %s', - 'call_confirming' => 'Confirming call from %s...', - 'call_error_3' => 'Could not find and complete call %s', - 'call_completing' => 'Completing call from %s...', - 'invalid_g_a' => 'Invalid g_a!', - 'fingerprint_invalid' => 'Invalid key fingerprint!', - 'call_discarding' => 'Discarding call %s...', - 'call_set_rating' => 'Setting rating for call %s...', - 'call_debug_saving' => 'Saving debug data for call %s...', - 'TL_loading' => 'Loading TL schemes...', - 'file_parsing' => 'Parsing %s...', - 'crc32_mismatch' => 'CRC32 mismatch (%s, %s) for %s', - 'src_file_invalid' => 'Invalid source file was provided: ', - 'translating_obj' => 'Translating objects...', - 'translating_methods' => 'Translating methods...', - 'bool_error' => 'Could not extract boolean', - 'not_numeric' => 'Given value isn\'t numeric', - 'long_not_16' => 'Given value is not 16 bytes long', - 'long_not_32' => 'Given value is not 32 bytes long', - 'long_not_64' => 'Given value is not 64 bytes long', - 'array_invalid' => 'You didn\'t provide a valid array', - 'predicate_not_set' => 'Predicate (value under _) was not set!', - 'type_extract_error' => 'Could not extract type "%s"', - 'method_not_found' => 'Could not find method: ', - 'params_missing' => 'Missing required parameter', - 'sec_peer_not_in_db' => 'This secret peer is not present in the internal peer database', - 'stream_handle_invalid' => 'An invalid stream handle was provided.', - 'length_too_big' => 'Length is too big', - 'deserialize_not_str' => 'Deserialize: Generated value isn\'t a string', - 'type_extract_error_id' => 'Could not extract type: %s with id %s', - 'vector_invalid' => 'Invalid vector constructor: ', - 'constructor_not_found' => 'Constructor not found for type: ', - 'rand_bytes_too_small' => 'random_bytes is too small!', - 'botapi_conversion_error' => 'Can\'t convert %s to a bot API object', - 'non_text_conversion' => 'Can\'t convert non text messages yet!', - 'last_byte_invalid' => 'Invalid last byte', - 'file_type_invalid' => 'Invalid file type detected (%s)', - 'recreate_temp_auth_key' => 'I had to recreate the temporary authorization key', - 'resetting_auth_key' => 'WARNING: Resetting auth key...', - 'shutting_down_reader_pool' => 'Shutting down reader pool ', - 'shutting_down_handler_pool' => 'Shutting down handler pool for dc %s, %d jobs left', - 'secret_chat_skipping' => 'I do not have the secret chat %s in the database, skipping message...', - 'fingerprint_mismatch' => 'Key fingerprint mismatch', - 'msg_data_length_too_big' => 'message_data_length is too big', - 'length_not_divisible_16' => 'Length of decrypted data is not divisible by 16', - 'msg_key_mismatch' => 'msg_key mismatch', - 'rand_bytes_too_short' => 'random_bytes is too short!', - 'resending_unsupported' => 'Resending of messages is not yet supported', - 'unrecognized_dec_msg' => 'Unrecognized decrypted message received: ', -]; -} + 'value_bigger_than_4294967296' => 'Provided value %s is bigger than 4294967296', + 'value_smaller_than_0' => 'Provided value %s is smaller than 0', + 'encode_double_error' => 'Could not properly encode double', + 'file_not_exist' => 'File does not exist', + 'deserialization_error' => 'An error occurred on deserialization', + 'rsa_init' => 'Istantiating \\phpseclib\\Crypt\\RSA...', + 'loading_key' => 'Loading key...', + 'computing_fingerprint' => 'Computing fingerprint...', + 'rsa_encrypting' => 'Encrypting with rsa key...', + 'rpc_tg_error' => 'Telegram returned an RPC error: %s (%s), caused by %s:%sTL trace:', + 'v_error' => '506c656173652075706461746520746f20746865206c61746573742076657273696f6e206f66204d6164656c696e6550726f746f2e', + 'v_tgerror' => '506c6561736520757064617465207068702d6c69627467766f6970', + 'no_mode_specified' => 'No mode was specified!', + 'constructor_function_uncalled' => 'The constructor function wasn\'t called! Please call the constructor function before using this method.', + 'proxy_class_invalid' => 'Invalid proxy class provided!', + 'socket_con_error' => 'Connection: couldn\'t connect to socket.', + 'protocol_not_implemented' => 'Connection: This protocol isn\'t implemented yet.', + 'protocol_invalid' => 'Connection: invalid protocol specified.', + 'nothing_in_socket' => 'Nothing in the socket!', + 'wrong_length_read' => 'WARNING: Wrong length was read (should\'ve read %s, read %s)!', + 'no_data_in_socket' => 'No data in the socket!', + 'dc_con_start' => 'Connecting to DC %s...', + 'dc_con_stop' => 'Disconnecting from DC %s...', + 'dc_con_test_start' => 'Connecting to DC %s (%s server, %s, %s)...', + 'script_not_exist' => 'Provided script does not exist', + 'apifactory_start' => 'Running APIFactory...', + 'madelineproto_ready' => 'MadelineProto is ready!', + 'logout_error' => 'An error occurred while logging out!', + 'logout_ok' => 'Logged out successfully!', + 'already_logged_in' => 'This instance of MadelineProto is already logged in. Logging out first...', + 'login_ok' => 'Logged in successfully!', + 'login_user' => 'Logging in as a normal user...', + 'login_bot' => 'Logging in as a bot...', + 'login_code_sending' => 'Sending code...', + 'login_code_sent' => 'Code sent successfully! Once you receive the code you should use the complete_phone_login function.', + 'login_code_uncalled' => 'I\'m not waiting for the code! Please call the phone_login method first', + 'login_2fa_enabled' => '2FA enabled, you will have to call the complete_2fa_login function...', + 'login_need_signup' => 'An account has not been created for this number, you will have to call the complete_signup function...', + 'login_auth_key' => 'Logging in using auth key...', + 'not_logged_in' => 'I\'m not logged in!', + 'signup_uncalled' => 'I\'m not waiting to signup! Please call the phone_login and the complete_phone_login methods first!', + 'signing_up' => 'Signing up as a normal user...', + 'signup_ok' => 'Signed up in successfully!', + '2fa_uncalled' => 'I\'m not waiting for the password! Please call the phone_login and the complete_phone_login methods first!', + 'getting_dialogs' => 'Getting dialogs...', + 'libtgvoip_required' => 'The php-libtgvoip extension is required to accept and manage calls. See daniil.it/MadelineProto for more info.', + 'peer_not_in_db' => 'This peer is not present in the internal peer database', + 'calling_user' => 'Calling %s...', + 'generating_a' => 'Generating a...', + 'generating_g_a' => 'Generating g_a...', + 'call_error_1' => 'Could not find and accept call %s', + 'accepting_call' => 'Accepting call from %s...', + 'generating_b' => 'Generating b...', + 'call_already_accepted' => 'Call %s already accepted', + 'call_already_declined' => 'Call %s already declined', + 'call_error_2' => 'Could not find and confirm call %s', + 'call_confirming' => 'Confirming call from %s...', + 'call_error_3' => 'Could not find and complete call %s', + 'call_completing' => 'Completing call from %s...', + 'invalid_g_a' => 'Invalid g_a!', + 'fingerprint_invalid' => 'Invalid key fingerprint!', + 'call_discarding' => 'Discarding call %s...', + 'call_set_rating' => 'Setting rating for call %s...', + 'call_debug_saving' => 'Saving debug data for call %s...', + 'TL_loading' => 'Loading TL schemes...', + 'file_parsing' => 'Parsing %s...', + 'crc32_mismatch' => 'CRC32 mismatch (%s, %s) for %s', + 'src_file_invalid' => 'Invalid source file was provided: ', + 'translating_obj' => 'Translating objects...', + 'translating_methods' => 'Translating methods...', + 'bool_error' => 'Could not extract boolean', + 'not_numeric' => 'Given value isn\'t numeric', + 'long_not_16' => 'Given value is not 16 bytes long', + 'long_not_32' => 'Given value is not 32 bytes long', + 'long_not_64' => 'Given value is not 64 bytes long', + 'array_invalid' => 'You didn\'t provide a valid array', + 'predicate_not_set' => 'Predicate (value under _) was not set!', + 'type_extract_error' => 'Could not extract type "%s"', + 'method_not_found' => 'Could not find method: ', + 'params_missing' => 'Missing required parameter', + 'sec_peer_not_in_db' => 'This secret peer is not present in the internal peer database', + 'stream_handle_invalid' => 'An invalid stream handle was provided.', + 'length_too_big' => 'Length is too big', + 'deserialize_not_str' => 'Deserialize: Generated value isn\'t a string', + 'type_extract_error_id' => 'Could not extract type: %s with id %s', + 'vector_invalid' => 'Invalid vector constructor: ', + 'constructor_not_found' => 'Constructor not found for type: ', + 'rand_bytes_too_small' => 'random_bytes is too small!', + 'botapi_conversion_error' => 'Can\'t convert %s to a bot API object', + 'non_text_conversion' => 'Can\'t convert non text messages yet!', + 'last_byte_invalid' => 'Invalid last byte', + 'file_type_invalid' => 'Invalid file type detected (%s)', + 'recreate_temp_auth_key' => 'I had to recreate the temporary authorization key', + 'resetting_auth_key' => 'WARNING: Resetting auth key...', + 'shutting_down_reader_pool' => 'Shutting down reader pool ', + 'shutting_down_handler_pool' => 'Shutting down handler pool for dc %s, %d jobs left', + 'secret_chat_skipping' => 'I do not have the secret chat %s in the database, skipping message...', + 'fingerprint_mismatch' => 'Key fingerprint mismatch', + 'msg_data_length_too_big' => 'message_data_length is too big', + 'length_not_divisible_16' => 'Length of decrypted data is not divisible by 16', + 'msg_key_mismatch' => 'msg_key mismatch', + 'rand_bytes_too_short' => 'random_bytes is too short!', + 'resending_unsupported' => 'Resending of messages is not yet supported', + 'unrecognized_dec_msg' => 'Unrecognized decrypted message received: ', +); +} \ No newline at end of file diff --git a/src/danog/MadelineProto/MTProto.php b/src/danog/MadelineProto/MTProto.php index 2b8e715b..844254be 100644 --- a/src/danog/MadelineProto/MTProto.php +++ b/src/danog/MadelineProto/MTProto.php @@ -46,7 +46,7 @@ class MTProto /* const V = 71; */ - const V = 74; + const V = 75; const NOT_LOGGED_IN = 0; const WAITING_CODE = 1; @@ -628,7 +628,7 @@ class MTProto public function setup_logger() { - \Rollbar\Rollbar::init(['environment' => 'production', 'root' => __DIR__, 'access_token' => (isset($this->settings['logger']['rollbar_token']) && !in_array($this->settings['logger']['rollbar_token'], ['f9fff6689aea4905b58eec73f66c791d', '300afd7ccef346ea84d0c185ae831718', '11a8c2fe4c474328b40a28193f8d63f5', 'beef2d426496462ba34dcaad33d44a14'])) || $this->settings['pwr']['pwr'] ? $this->settings['logger']['rollbar_token'] : 'c07d9b2f73c2461297b0beaef6c1662f'], false, false); + @\Rollbar\Rollbar::init(['environment' => 'production', 'root' => __DIR__, 'access_token' => (isset($this->settings['logger']['rollbar_token']) && !in_array($this->settings['logger']['rollbar_token'], ['f9fff6689aea4905b58eec73f66c791d', '300afd7ccef346ea84d0c185ae831718', '11a8c2fe4c474328b40a28193f8d63f5', 'beef2d426496462ba34dcaad33d44a14'])) || $this->settings['pwr']['pwr'] ? $this->settings['logger']['rollbar_token'] : 'c07d9b2f73c2461297b0beaef6c1662f'], false, false); \danog\MadelineProto\Logger::constructor($this->settings['logger']['logger'], $this->settings['logger']['logger_param'], isset($this->authorization['user']) ? (isset($this->authorization['user']['username']) ? $this->authorization['user']['username'] : $this->authorization['user']['id']) : '', isset($this->settings['logger']['logger_level']) ? $this->settings['logger']['logger_level'] : Logger::VERBOSE); } diff --git a/src/danog/MadelineProto/MTProtoTools/Crypt.php b/src/danog/MadelineProto/MTProtoTools/Crypt.php index d3c58ba2..b80ab1a3 100644 --- a/src/danog/MadelineProto/MTProtoTools/Crypt.php +++ b/src/danog/MadelineProto/MTProtoTools/Crypt.php @@ -29,28 +29,28 @@ trait Crypt public function ige_encrypt($message, $key, $iv) { - $cipher = new \phpseclib\Crypt\AES(\phpseclib\Crypt\AES::MODE_IGE); + $cipher = new \phpseclib\Crypt\AES('ige'); $cipher->setKey($key); $cipher->setIV($iv); - return $cipher->encrypt($message); + return @$cipher->encrypt($message); } public function ctr_encrypt($message, $key, $iv) { - $cipher = new \phpseclib\Crypt\AES(\phpseclib\Crypt\AES::MODE_CTR); + $cipher = new \phpseclib\Crypt\AES('ctr'); $cipher->setKey($key); $cipher->setIV($iv); - return $cipher->encrypt($message); + return @$cipher->encrypt($message); } public function ige_decrypt($message, $key, $iv) { - $cipher = new \phpseclib\Crypt\AES(\phpseclib\Crypt\AES::MODE_IGE); + $cipher = new \phpseclib\Crypt\AES('ige'); $cipher->setKey($key); $cipher->setIV($iv); - return $cipher->decrypt($message); + return @$cipher->decrypt($message); } } diff --git a/src/danog/MadelineProto/Serialization.php b/src/danog/MadelineProto/Serialization.php index 3919774e..ead9f0a8 100644 --- a/src/danog/MadelineProto/Serialization.php +++ b/src/danog/MadelineProto/Serialization.php @@ -64,6 +64,7 @@ class Serialization $unserialized = file_get_contents($filename); flock($lock, LOCK_UN); fclose($lock); + $tounserialize = str_replace('O:26:"danog\MadelineProto\Button":', 'O:35:"danog\MadelineProto\TL\Types\Button":', $unserialized); foreach (['RSA', 'TL\TLMethod', 'TL\TLConstructor', 'MTProto', 'API', 'DataCenter', 'Connection', 'TL\Types\Button', 'TL\Types\Bytes', 'APIFactory'] as $class) { class_exists('\danog\MadelineProto\\'.$class); @@ -72,6 +73,7 @@ class Serialization \danog\MadelineProto\Logger::class_exists(); try { +// $unserialized = \danog\Serialization::unserialize($tounserialize); $unserialized = unserialize($tounserialize); } catch (\danog\MadelineProto\Bug74586Exception $e) { $unserialized = \danog\Serialization::unserialize($tounserialize); @@ -79,6 +81,7 @@ class Serialization if (Logger::$constructed) { Logger::log([(string) $e], Logger::ERROR); } + if ($e->getMessage() === "Erroneous data format for unserializing 'phpseclib\Math\BigInteger'") $tounserialize = str_replace('phpseclib\Math\BigInteger', 'phpseclib\Math\BigIntegor', $unserialized); $unserialized = \danog\Serialization::unserialize($tounserialize); } if ($unserialized instanceof \danog\PlaceHolder) { diff --git a/tests/testing.php b/tests/testing.php index 21eb5d42..1cc22829 100755 --- a/tests/testing.php +++ b/tests/testing.php @@ -13,7 +13,7 @@ If not, see . set_include_path(get_include_path().':'.realpath(dirname(__FILE__).'/../').':'.realpath(dirname(__FILE__).'/../MadelineProto/')); chdir(dirname(__FILE__).'/../'); require_once 'vendor/autoload.php'; - +//include 'SocksProxy.php'; if (!function_exists('readline')) { function readline($prompt = null) {