Update phpseclib, add support for socket streams, fix localization and other bugfixes

This commit is contained in:
Daniil Gentili 2017-10-05 18:53:56 +03:00
parent 94d186d90f
commit 5de64b4f61
10 changed files with 553 additions and 444 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
SocksProxy.php
magnabroadcast.php magnabroadcast.php
broadcast.php broadcast.php

View File

@ -12,13 +12,12 @@
"php": ">=5.6.0", "php": ">=5.6.0",
"danog/primemodule": "dev-master", "danog/primemodule": "dev-master",
"danog/magicalserializer": "dev-master", "danog/magicalserializer": "dev-master",
"phpseclib/phpseclib": "dev-master#200c2a9", "phpseclib/phpseclib": "dev-master#52c068ac",
"vlucas/phpdotenv": "^2.4", "vlucas/phpdotenv": "^2.4",
"erusev/parsedown": "^1.6", "erusev/parsedown": "^1.6",
"rollbar/rollbar": "~1.1", "rollbar/rollbar": "~1.1",
"ext-mbstring": "*", "ext-mbstring": "*",
"ext-curl": "*", "ext-curl": "*",
"ext-sockets": "*",
"ext-xml": "*" "ext-xml": "*"
}, },
"require-dev": { "require-dev": {
@ -44,7 +43,8 @@
"src/Volatile.php", "src/Volatile.php",
"src/Thread.php", "src/Thread.php",
"src/Worker.php", "src/Worker.php",
"src/Pool.php" "src/Pool.php",
"src/BigIntegor.php"
] ]
} }
} }

6
src/BigIntegor.php Normal file
View File

@ -0,0 +1,6 @@
<?php
namespace phpseclib\Math;
class BigIntegor {
}

View File

@ -11,6 +11,7 @@ If not, see <http://www.gnu.org/licenses/>.
*/ */
if (!extension_loaded('pthreads')) { if (!extension_loaded('pthreads')) {
if (extension_loaded('sockets')) {
class Socket class Socket
{ {
private $sock; private $sock;
@ -106,4 +107,100 @@ if (!extension_loaded('pthreads')) {
return $port ? ['host' => $address, 'port' => $port] : ['host' => $address]; 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');
}
}
}
} }

View File

@ -82,14 +82,14 @@ class Connection
if ($has_proxy && $this->extra !== []) { if ($has_proxy && $this->extra !== []) {
$this->sock->setExtra($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) { if (!\danog\MadelineProto\Logger::$has_thread) {
$this->sock->setOption(\SOL_SOCKET, \SO_RCVTIMEO, $timeout); $this->sock->setOption(\SOL_SOCKET, \SO_RCVTIMEO, $timeout);
$this->sock->setOption(\SOL_SOCKET, \SO_SNDTIMEO, $timeout); $this->sock->setOption(\SOL_SOCKET, \SO_SNDTIMEO, $timeout);
} }
$this->sock->setBlocking(true); $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)); $this->write(chr(239));
break; break;
case 'tcp_intermediate': case 'tcp_intermediate':
@ -97,11 +97,11 @@ class Connection
if ($has_proxy && $this->extra !== []) { if ($has_proxy && $this->extra !== []) {
$this->sock->setExtra($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)) { if (!$this->sock->connect($ip, $port)) {
throw new Exception(\danog\MadelineProto\Lang::$current_lang['socket_con_error']); 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) { if (!\danog\MadelineProto\Logger::$has_thread) {
$this->sock->setOption(\SOL_SOCKET, \SO_RCVTIMEO, $timeout); $this->sock->setOption(\SOL_SOCKET, \SO_RCVTIMEO, $timeout);
$this->sock->setOption(\SOL_SOCKET, \SO_SNDTIMEO, $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); $random[56] = $random[57] = $random[58] = $random[59] = chr(0xef);
$reversed = strrev(substr($random, 8, 48)); $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['encryption']->enableContinuousBuffer();
$this->obfuscated['decryption']->enableContinuousBuffer(); $this->obfuscated['decryption']->enableContinuousBuffer();
@ -158,7 +158,7 @@ class Connection
$random = substr_replace( $random = substr_replace(
$random, $random,
substr( substr(
$this->obfuscated['encryption']->encrypt($random), @$this->obfuscated['encryption']->encrypt($random),
56, 56,
8 8
), ),
@ -254,7 +254,7 @@ class Connection
switch ($this->protocol) { switch ($this->protocol) {
case 'obfuscated2': case 'obfuscated2':
$what = $this->obfuscated['encryption']->encrypt($what); $what = @$this->obfuscated['encryption']->encrypt($what);
case 'tcp_abridged': case 'tcp_abridged':
case 'tcp_intermediate': case 'tcp_intermediate':
case 'tcp_full': case 'tcp_full':
@ -293,7 +293,7 @@ class Connection
throw new Exception(sprintf(\danog\MadelineProto\Lang::$current_lang['wrong_length_read'], $length, strlen($packet))); 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_abridged':
case 'tcp_intermediate': case 'tcp_intermediate':

View File

@ -14,431 +14,433 @@ namespace danog\MadelineProto;
class Lang class Lang
{ {
public static $lang = [ public static $lang = array (
'it' => [ 'it' =>
'phpseclib_fork' => 'Per favore installa questo fork di phpseclib: https://github.com/danog/phpseclib', array (
'inst_dc' => 'Istanziamento dei DataCenter...', 'phpseclib_fork' => 'Per favore installa questo fork di phpseclib: https://github.com/danog/phpseclib',
'load_rsa' => 'Caricamento delle chiavi RSA...', 'inst_dc' => 'Istanziamento dei DataCenter...',
'TL_translation' => 'Translazione degli schemi TL...', 'load_rsa' => 'Caricamento delle chiavi RSA...',
'dh_prime_check_0' => 'Esecuzione dei check dh_prime (0/3)...', 'TL_translation' => 'Translazione degli schemi TL...',
'nearest_dc' => 'Siamo in %s, il DC corrente è %d, il DC più vicino è %d.', 'dh_prime_check_0' => 'Esecuzione dei check dh_prime (0/3)...',
'serialization_ofd' => 'La serializzazione non è aggiornata, reistanziamento dell\'oggetto in corso!', 'nearest_dc' => 'Siamo in %s, il DC corrente è %d, il DC più vicino è %d.',
'getupdates_deserialization' => 'Ottenimento aggiornamenti dopo deserializzazione...', 'serialization_ofd' => 'La serializzazione non è aggiornata, reistanziamento dell\'oggetto in corso!',
'shutdown_reader_pool' => 'Chiusura pool di lettura, %d thread rimasti', 'getupdates_deserialization' => 'Ottenimento aggiornamenti dopo deserializzazione...',
'threading_on' => 'IL THREADING È ABILITATO', 'shutdown_reader_pool' => 'Chiusura pool di lettura, %d thread rimasti',
'socket_reader' => 'Lettore socket su DC %s: ', 'threading_on' => 'IL THREADING È ABILITATO',
'socket_status_1' => 'CREAZIONE', 'socket_reader' => 'Lettore socket su DC %s: ',
'socket_status_2' => 'INVIO', 'socket_status_1' => 'CREAZIONE',
'socket_status_3' => 'ATTESA', 'socket_status_2' => 'INVIO',
'socket_status_4' => 'PRONTO', 'socket_status_3' => 'ATTESA',
'socket_status_5' => 'AVVIATO', 'socket_status_4' => 'PRONTO',
'api_not_set' => 'Devi specificare una chiave ed un ID API, ottienili su https://my.telegram.org', 'socket_status_5' => 'AVVIATO',
'session_corrupted' => 'La sessione si è corrotta!', 'api_not_set' => 'Devi specificare una chiave ed un ID API, ottienili su https://my.telegram.org',
'reset_session_seqno' => 'Resettando ID sessione e numero di sequenza sul DC %s...', 'session_corrupted' => 'La sessione si è corrotta!',
'gen_perm_auth_key' => 'Generando chiave di autorizzazione permanente per il DC %s...', 'reset_session_seqno' => 'Resettando ID sessione e numero di sequenza sul DC %s...',
'gen_temp_auth_key' => 'Generando chiave di autorizzazione temporanea per il DC %s...', 'gen_perm_auth_key' => 'Generando chiave di autorizzazione permanente per il DC %s...',
'copy_auth_dcs' => 'Copiando autorizzazione dal DC %s al DC %s...', 'gen_temp_auth_key' => 'Generando chiave di autorizzazione temporanea per il DC %s...',
'write_client_info' => 'Scrittura info sul client (eseguendo nel contempo il metodo %s)...', 'copy_auth_dcs' => 'Copiando autorizzazione dal DC %s al DC %s...',
'config_updated' => 'La configurazione è stata aggiornata!', 'write_client_info' => 'Scrittura info sul client (eseguendo nel contempo il metodo %s)...',
'length_not_4' => 'La lunghezza non è uguale a 4', 'config_updated' => 'La configurazione è stata aggiornata!',
'length_not_8' => 'La lunghezza non è uguale a 8', 'length_not_4' => 'La lunghezza non è uguale a 4',
'value_bigger_than_2147483647' => 'Il valore fornito (%s) è maggiore di 2147483647', 'length_not_8' => 'La lunghezza non è uguale a 8',
'value_smaller_than_2147483648' => 'Il valore fornito (%s) è minore di -2147483648', 'value_bigger_than_2147483647' => 'Il valore fornito (%s) è maggiore di 2147483647',
'value_bigger_than_9223372036854775807' => 'Il valore fornito (%s) è maggiore di 9223372036854775807', '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_smaller_than_9223372036854775808' => 'Il valore fornito (%s) è minore di -9223372036854775808',
'value_bigger_than_4294967296' => 'Il valore fornito (%s) è maggiore di 4294967296', 'value_bigger_than_4294967296' => 'Il valore fornito (%s) è maggiore di 4294967296',
'value_smaller_than_0' => 'Il valore fornito (%s) è minore di 0', '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', 'encode_double_error' => 'Non sono riuscito a codificare il numero a virgola mobile fornito',
'file_not_exist' => 'Il file specificato non esiste', 'file_not_exist' => 'Il file specificato non esiste',
'deserialization_error' => 'C\'è stato un errore durante la deserializzazione', 'deserialization_error' => 'C\'è stato un errore durante la deserializzazione',
'rsa_init' => 'Istanziamento di \\phpseclib\\Crypt\\RSA in corso...', 'rsa_init' => 'Istanziamento di \\phpseclib\\Crypt\\RSA in corso...',
'loading_key' => 'Caricamento della chiave in corso...', 'loading_key' => 'Caricamento della chiave in corso...',
'computing_fingerprint' => 'Calcolo del fingerprint in corso...', 'computing_fingerprint' => 'Calcolo del fingerprint in corso...',
'rsa_encrypting' => 'Criptando con chiave RSA...', 'rsa_encrypting' => 'Criptando con chiave RSA...',
'rpc_tg_error' => 'Telegram ha ritornato un errore RPC: %s (%s), causato da %s:%sTL trace:', 'rpc_tg_error' => 'Telegram ha ritornato un errore RPC: %s (%s), causato da %s:%sTL trace:',
'v_error' => '506572206661766f726520616767696f726e612071756573746120696e7374616c6c617a696f6e65206469204d6164656c696e6550726f746f20636f6e206769742070756c6c206520636f6d706f73657220757064617465', 'v_error' => '506572206661766f726520616767696f726e612071756573746120696e7374616c6c617a696f6e65206469204d6164656c696e6550726f746f20636f6e206769742070756c6c206520636f6d706f73657220757064617465',
'v_tgerror' => '506572206661766f726520616767696f726e61207068702d6c69627467766f6970', 'v_tgerror' => '506572206661766f726520616767696f726e61207068702d6c69627467766f6970',
'no_mode_specified' => 'Nessuna modalità di logging è stata specificata!', '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.', '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!', 'proxy_class_invalid' => 'È stata specificata una classe proxy errata!',
'socket_con_error' => 'Connessione fallita.', 'socket_con_error' => 'Connessione fallita.',
'protocol_not_implemented' => 'Questo protocollo non è stato ancora implementato.', 'protocol_not_implemented' => 'Questo protocollo non è stato ancora implementato.',
'protocol_invalid' => 'È stato fornito un protocollo non valido', 'protocol_invalid' => 'È stato fornito un protocollo non valido',
'nothing_in_socket' => 'Non c\'è niente nel socket!', 'nothing_in_socket' => 'Non c\'è niente nel socket!',
'wrong_length_read' => 'ATTENZIONE: Non sono stati letti abbastanza byte (dovevo leggere %s, ho letto %s)!', '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!', 'no_data_in_socket' => 'Non ci sono dati nel socket!',
'dc_con_start' => 'Connessione al DC %s in corso...', 'dc_con_start' => 'Connessione al DC %s in corso...',
'dc_con_stop' => 'Disconnessione dal 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)...', 'dc_con_test_start' => 'Connessione al DC %s (server %s, %s, %s)...',
'script_not_exist' => 'Lo script fornito non esiste', 'script_not_exist' => 'Lo script fornito non esiste',
'apifactory_start' => 'Sto avviando la fabbrica di API...', 'apifactory_start' => 'Sto avviando la fabbrica di API...',
'madelineproto_ready' => 'MadelineProto è pronto!', 'madelineproto_ready' => 'MadelineProto è pronto!',
'logout_error' => 'C\'è stato un errore durante il logout!', 'logout_error' => 'C\'è stato un errore durante il logout!',
'logout_ok' => 'Il logout è stato eseguito correttamente!', 'logout_ok' => 'Il logout è stato eseguito correttamente!',
'already_logged_in' => 'Questa istanza di MadelineProto è già loggata, prima faccio il logout...', 'already_logged_in' => 'Questa istanza di MadelineProto è già loggata, prima faccio il logout...',
'login_ok' => 'Il login è stato eseguito correttamente!', 'login_ok' => 'Il login è stato eseguito correttamente!',
'login_user' => 'Sto eseguendo il login come utente normale...', 'login_user' => 'Sto eseguendo il login come utente normale...',
'login_bot' => 'Sto eseguendo il login come bot...', 'login_bot' => 'Sto eseguendo il login come bot...',
'login_code_sending' => 'Sto inviando il codice...', '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_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_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_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_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...', 'login_auth_key' => 'Sto facendo il login con la chiave di autorizzazione...',
'not_logged_in' => 'Non ho ancora fatto il login!', 'not_logged_in' => 'Non ho ancora fatto il login!',
'signup_uncalled' => 'Chiama prima le funzioni phone_login e complete_phone_login.', 'signup_uncalled' => 'Chiama prima le funzioni phone_login e complete_phone_login.',
'signing_up' => 'Mi sto registrando su telegram come utente normale...', 'signing_up' => 'Mi sto registrando su telegram come utente normale...',
'signup_ok' => 'Mi sono registrato su Telegram!', 'signup_ok' => 'Mi sono registrato su Telegram!',
'2fa_uncalled' => 'Non sto aspettando la password, chiama prima le funzioni phone_login e complete_phone_login!', '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...', '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.', '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', 'peer_not_in_db' => 'Questo utente/gruppo/canale non è presente nel database interno MadelineProto',
'calling_user' => 'Sto chiamando %s...', 'calling_user' => 'Sto chiamando %s...',
'generating_a' => 'Sto generando a...', 'generating_a' => 'Sto generando a...',
'generating_g_a' => 'Sto generando g_a...', 'generating_g_a' => 'Sto generando g_a...',
'call_error_1' => 'Impossibile trovare ed accettare la chiamata %s', 'call_error_1' => 'Impossibile trovare ed accettare la chiamata %s',
'accepting_call' => 'Sto accettando una chiamata da %s...', 'accepting_call' => 'Sto accettando una chiamata da %s...',
'generating_b' => 'Sto generando b...', 'generating_b' => 'Sto generando b...',
'call_already_accepted' => 'La chiamata %s è già stata accettata.', 'call_already_accepted' => 'La chiamata %s è già stata accettata.',
'call_already_declined' => 'La chiamata %s è già stata annullata.', 'call_already_declined' => 'La chiamata %s è già stata annullata.',
'call_error_2' => 'Impossibile trovare e confermare la chiamata %s', 'call_error_2' => 'Impossibile trovare e confermare la chiamata %s',
'call_confirming' => 'Sto confermando una chiamata da %s', 'call_confirming' => 'Sto confermando una chiamata da %s',
'call_error_3' => 'Impossibile trovare e completare la chiamata %s', 'call_error_3' => 'Impossibile trovare e completare la chiamata %s',
'call_completing' => 'Sto completando una chiamata da %s...', 'call_completing' => 'Sto completando una chiamata da %s...',
'invalid_g_a' => 'g_a non valido!', 'invalid_g_a' => 'g_a non valido!',
'fingerprint_invalid' => 'fingerprint della chiave non valido!', 'fingerprint_invalid' => 'fingerprint della chiave non valido!',
'call_discarding' => 'Sto rifiutando la chiamata %s...', 'call_discarding' => 'Sto rifiutando la chiamata %s...',
'call_set_rating' => 'Sto inviando la recensione della chiamata %s...', 'call_set_rating' => 'Sto inviando la recensione della chiamata %s...',
'call_debug_saving' => 'Sto inviando i dati di debug della chiamata %s...', 'call_debug_saving' => 'Sto inviando i dati di debug della chiamata %s...',
'TL_loading' => 'Sto caricando gli schemi TL...', 'TL_loading' => 'Sto caricando gli schemi TL...',
'file_parsing' => 'Leggendo %s...', 'file_parsing' => 'Leggendo %s...',
'crc32_mismatch' => 'CRC32 non valido (%s diverso da %s) per %s', 'crc32_mismatch' => 'CRC32 non valido (%s diverso da %s) per %s',
'src_file_invalid' => 'È stato fornito un file sorgente non valido: ', 'src_file_invalid' => 'È stato fornito un file sorgente non valido: ',
'translating_obj' => 'Traducendo gli oggetti...', 'translating_obj' => 'Traducendo gli oggetti...',
'translating_methods' => 'Traducendo i metodi...', 'translating_methods' => 'Traducendo i metodi...',
'bool_error' => 'Non sono riuscito ad estrarre un booleano', 'bool_error' => 'Non sono riuscito ad estrarre un booleano',
'not_numeric' => 'Il valore fornito non è numerico', 'not_numeric' => 'Il valore fornito non è numerico',
'long_not_16' => 'Il valore fornito non è lungo 16 byte', 'long_not_16' => 'Il valore fornito non è lungo 16 byte',
'long_not_32' => 'Il valore fornito non è lungo 32 byte', 'long_not_32' => 'Il valore fornito non è lungo 32 byte',
'long_not_64' => 'Il valore fornito non è lungo 64 byte', 'long_not_64' => 'Il valore fornito non è lungo 64 byte',
'array_invalid' => 'Il valore fornito non è un array', 'array_invalid' => 'Il valore fornito non è un array',
'predicate_not_set' => 'Il predicato (valore sotto chiave _, esempio [\'_\' => \'inputPeer\']) non è impostato!', 'predicate_not_set' => 'Il predicato (valore sotto chiave _, esempio [\'_\' => \'inputPeer\']) non è impostato!',
'type_extract_error' => 'Impossibile estrarre il tipo "%s"', 'type_extract_error' => 'Impossibile estrarre il tipo "%s"',
'method_not_found' => 'Impossibile trovare il seguente metodo: ', 'method_not_found' => 'Impossibile trovare il seguente metodo: ',
'params_missing' => 'Non hai fornito un parametro obbligatorio, rileggi la documentazione API', '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', 'sec_peer_not_in_db' => 'La chat segreta non è presente nel database interno MadelineProto',
'stream_handle_invalid' => 'Il valore fornito non è uno stream', 'stream_handle_invalid' => 'Il valore fornito non è uno stream',
'length_too_big' => 'Il valore fornito è troppo lungo', 'length_too_big' => 'Il valore fornito è troppo lungo',
'deserialize_not_str' => 'Il valore generato non è una stringa', 'deserialize_not_str' => 'Il valore generato non è una stringa',
'type_extract_error_id' => 'Non sono riuscito ad estrarre il tipo %s con ID %s', 'type_extract_error_id' => 'Non sono riuscito ad estrarre il tipo %s con ID %s',
'vector_invalid' => 'ID vettore non valido: ', 'vector_invalid' => 'ID vettore non valido: ',
'constructor_not_found' => 'Costruttore non trovato per tipo: ', 'constructor_not_found' => 'Costruttore non trovato per tipo: ',
'rand_bytes_too_small' => 'random_bytes è troppo corto!', 'rand_bytes_too_small' => 'random_bytes è troppo corto!',
'botapi_conversion_error' => 'NOn sono risucito a convertire %s in un oggetto bot API', 'botapi_conversion_error' => 'NOn sono risucito a convertire %s in un oggetto bot API',
'non_text_conversion' => 'Non posso ancora convertire messaggi media', 'non_text_conversion' => 'Non posso ancora convertire messaggi media',
'last_byte_invalid' => 'L\'ultimo byte non è valido', 'last_byte_invalid' => 'L\'ultimo byte non è valido',
'file_type_invalid' => 'È stato fornito un tipo file errato', 'file_type_invalid' => 'È stato fornito un tipo file errato',
'recreate_temp_auth_key' => 'Sono stato costretto a rigenerare la chiave di autorizzazione temporanea', 'recreate_temp_auth_key' => 'Sono stato costretto a rigenerare la chiave di autorizzazione temporanea',
'resetting_auth_key' => 'ATTENZIONE: Sto resettando la chiave temporanea...', 'resetting_auth_key' => 'ATTENZIONE: Sto resettando la chiave temporanea...',
'shutting_down_reader_pool' => 'Chisura pool di lettura', 'shutting_down_reader_pool' => 'Chisura pool di lettura',
'shutting_down_handler_pool' => 'Chiusura pool di gestione per DC %s, %d thread rimasti', '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', 'secret_chat_skipping' => 'Non ho la chat segreta %s nel database, ignorando messaggio',
'fingerprint_mismatch' => 'Fingerprint della chiave non valido', 'fingerprint_mismatch' => 'Fingerprint della chiave non valido',
'msg_data_length_too_big' => 'message_data_length è troppo grande', 'msg_data_length_too_big' => 'message_data_length è troppo grande',
'length_not_divisible_16' => 'La lunghezza dei dati decifrati non è divisibile per 16', 'length_not_divisible_16' => 'La lunghezza dei dati decifrati non è divisibile per 16',
'msg_key_mismatch' => 'msg_key non valido', 'msg_key_mismatch' => 'msg_key non valido',
'rand_bytes_too_short' => 'random_bytes è troppo corto!', 'rand_bytes_too_short' => 'random_bytes è troppo corto!',
'resending_unsupported' => 'IL riinvio di messaggi non è ancora supportato', 'resending_unsupported' => 'IL riinvio di messaggi non è ancora supportato',
'unrecognized_dec_msg' => 'È stato ricevuto un messaggio decifrato sconosciuto: ', 'unrecognized_dec_msg' => 'È stato ricevuto un messaggio decifrato sconosciuto: ',
'serializing_madelineproto' => 'Sto serializzando MadelineProto...', 'serializing_madelineproto' => 'Sto serializzando MadelineProto...',
'req_pq' => 'Sto richiedendo p_q...', 'req_pq' => 'Sto richiedendo pq...',
'done' => 'Fatto!', 'done' => 'Fatto!',
'cdn_reupload' => 'Il file non è disponibile sul nostro CDN, richiedo la copia!', 'cdn_reupload' => 'Il file non è disponibile sul nostro CDN, richiedo la copia!',
'stored_on_cdn' => 'Il file è scaricabile tramite CDN!', 'stored_on_cdn' => 'Il file è scaricabile tramite CDN!',
], ),
'en' => [ 'en' =>
'req_pq' => 'Requesting p_q...', array (
'done' => 'Done!', 'req_pq' => 'Requesting pq...',
'cdn_reupload' => 'File is not stored on CDN, requesting reupload!', 'done' => 'Done!',
'stored_on_cdn' => 'File is stored on CDN!', 'cdn_reupload' => 'File is not stored on CDN, requesting reupload!',
'serializing_madelineproto' => 'Serializing MadelineProto...', 'stored_on_cdn' => 'File is stored on CDN!',
'phpseclib_fork' => 'Please install this fork of phpseclib: https://github.com/danog/phpseclib', 'serializing_madelineproto' => 'Serializing MadelineProto...',
'inst_dc' => 'Istantiating DataCenter...', 'phpseclib_fork' => 'Please install this fork of phpseclib: https://github.com/danog/phpseclib',
'load_rsa' => 'Loading RSA keys...', 'inst_dc' => 'Istantiating DataCenter...',
'TL_translation' => 'Translating TL schemas...', 'load_rsa' => 'Loading RSA keys...',
'dh_prime_check_0' => 'Executing dh_prime checks (0/3)...', 'TL_translation' => 'Translating TL schemas...',
'nearest_dc' => 'We\'re in %s, current DC is %d, nearest DC is %d.', 'dh_prime_check_0' => 'Executing dh_prime checks (0/3)...',
'serialization_ofd' => 'Serialization is out of date, reconstructing object!', 'nearest_dc' => 'We\'re in %s, current DC is %d, nearest DC is %d.',
'getupdates_deserialization' => 'Getting updates after deserialization...', 'serialization_ofd' => 'Serialization is out of date, reconstructing object!',
'shutdown_reader_pool' => 'Shutting down reader pool, %d jobs left', 'getupdates_deserialization' => 'Getting updates after deserialization...',
'threading_on' => 'THREADING IS ENABLED', 'shutdown_reader_pool' => 'Shutting down reader pool, %d jobs left',
'socket_reader' => 'Socket reader on DC %s: ', 'threading_on' => 'THREADING IS ENABLED',
'socket_status_1' => 'CREATING', 'socket_reader' => 'Socket reader on DC %s: ',
'socket_status_2' => 'SUBMITTING', 'socket_status_1' => 'CREATING',
'socket_status_3' => 'WAITING', 'socket_status_2' => 'SUBMITTING',
'socket_status_4' => 'READY', 'socket_status_3' => 'WAITING',
'socket_status_5' => 'WORKING', 'socket_status_4' => 'READY',
'api_not_set' => 'You must provide an api key and an api id, get your own @ my.telegram.org', 'socket_status_5' => 'WORKING',
'session_corrupted' => 'The session is corrupted!', 'api_not_set' => 'You must provide an api key and an api id, get your own @ my.telegram.org',
'reset_session_seqno' => 'Resetting session id and seq_no in DC %s...', 'session_corrupted' => 'The session is corrupted!',
'gen_perm_auth_key' => 'Generating permanent authorization key for DC %s...', 'reset_session_seqno' => 'Resetting session id and seq_no in DC %s...',
'gen_temp_auth_key' => 'Generating temporary authorization key for DC %s...', 'gen_perm_auth_key' => 'Generating permanent authorization key for DC %s...',
'copy_auth_dcs' => 'Copying authorization from DC %s to DC %s...', 'gen_temp_auth_key' => 'Generating temporary authorization key for DC %s...',
'write_client_info' => 'Writing client info (also executing %s)...', 'copy_auth_dcs' => 'Copying authorization from DC %s to DC %s...',
'config_updated' => 'Updated config!', 'write_client_info' => 'Writing client info (also executing %s)...',
'length_not_4' => 'Length is not equal to 4', 'config_updated' => 'Updated config!',
'length_not_8' => 'Length is not equal to 8', 'length_not_4' => 'Length is not equal to 4',
'value_bigger_than_2147483647' => 'Provided value %s is bigger than 2147483647', 'length_not_8' => 'Length is not equal to 8',
'value_smaller_than_2147483648' => 'Provided value %s is smaller than -2147483648', 'value_bigger_than_2147483647' => 'Provided value %s is bigger than 2147483647',
'value_bigger_than_9223372036854775807' => 'Provided value %s is bigger than 9223372036854775807', '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_smaller_than_9223372036854775808' => 'Provided value %s is smaller than -9223372036854775808',
'value_bigger_than_4294967296' => 'Provided value %s is bigger than 4294967296', 'value_bigger_than_4294967296' => 'Provided value %s is bigger than 4294967296',
'value_smaller_than_0' => 'Provided value %s is smaller than 0', 'value_smaller_than_0' => 'Provided value %s is smaller than 0',
'encode_double_error' => 'Could not properly encode double', 'encode_double_error' => 'Could not properly encode double',
'file_not_exist' => 'File does not exist', 'file_not_exist' => 'File does not exist',
'deserialization_error' => 'An error occurred on deserialization', 'deserialization_error' => 'An error occurred on deserialization',
'rsa_init' => 'Istantiating \\phpseclib\\Crypt\\RSA...', 'rsa_init' => 'Istantiating \\phpseclib\\Crypt\\RSA...',
'loading_key' => 'Loading key...', 'loading_key' => 'Loading key...',
'computing_fingerprint' => 'Computing fingerprint...', 'computing_fingerprint' => 'Computing fingerprint...',
'rsa_encrypting' => 'Encrypting with rsa key...', 'rsa_encrypting' => 'Encrypting with rsa key...',
'rpc_tg_error' => 'Telegram returned an RPC error: %s (%s), caused by %s:%sTL trace:', 'rpc_tg_error' => 'Telegram returned an RPC error: %s (%s), caused by %s:%sTL trace:',
'v_error' => '506c656173652075706461746520746f20746865206c61746573742076657273696f6e206f66204d6164656c696e6550726f746f2e', 'v_error' => '506c656173652075706461746520746f20746865206c61746573742076657273696f6e206f66204d6164656c696e6550726f746f2e',
'v_tgerror' => '506c6561736520757064617465207068702d6c69627467766f6970', 'v_tgerror' => '506c6561736520757064617465207068702d6c69627467766f6970',
'no_mode_specified' => 'No mode was specified!', '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.', '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!', 'proxy_class_invalid' => 'Invalid proxy class provided!',
'socket_con_error' => 'Connection: couldn\'t connect to socket.', 'socket_con_error' => 'Connection: couldn\'t connect to socket.',
'protocol_not_implemented' => 'Connection: This protocol isn\'t implemented yet.', 'protocol_not_implemented' => 'Connection: This protocol isn\'t implemented yet.',
'protocol_invalid' => 'Connection: invalid protocol specified.', 'protocol_invalid' => 'Connection: invalid protocol specified.',
'nothing_in_socket' => 'Nothing in the socket!', 'nothing_in_socket' => 'Nothing in the socket!',
'wrong_length_read' => 'WARNING: Wrong length was read (should\'ve read %s, read %s)!', 'wrong_length_read' => 'WARNING: Wrong length was read (should\'ve read %s, read %s)!',
'no_data_in_socket' => 'No data in the socket!', 'no_data_in_socket' => 'No data in the socket!',
'dc_con_start' => 'Connecting to DC %s...', 'dc_con_start' => 'Connecting to DC %s...',
'dc_con_stop' => 'Disconnecting from DC %s...', 'dc_con_stop' => 'Disconnecting from DC %s...',
'dc_con_test_start' => 'Connecting to DC %s (%s server, %s, %s)...', 'dc_con_test_start' => 'Connecting to DC %s (%s server, %s, %s)...',
'script_not_exist' => 'Provided script does not exist', 'script_not_exist' => 'Provided script does not exist',
'apifactory_start' => 'Running APIFactory...', 'apifactory_start' => 'Running APIFactory...',
'madelineproto_ready' => 'MadelineProto is ready!', 'madelineproto_ready' => 'MadelineProto is ready!',
'logout_error' => 'An error occurred while logging out!', 'logout_error' => 'An error occurred while logging out!',
'logout_ok' => 'Logged out successfully!', 'logout_ok' => 'Logged out successfully!',
'already_logged_in' => 'This instance of MadelineProto is already logged in. Logging out first...', 'already_logged_in' => 'This instance of MadelineProto is already logged in. Logging out first...',
'login_ok' => 'Logged in successfully!', 'login_ok' => 'Logged in successfully!',
'login_user' => 'Logging in as a normal user...', 'login_user' => 'Logging in as a normal user...',
'login_bot' => 'Logging in as a bot...', 'login_bot' => 'Logging in as a bot...',
'login_code_sending' => 'Sending code...', '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_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_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_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_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...', 'login_auth_key' => 'Logging in using auth key...',
'not_logged_in' => 'I\'m not logged in!', '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!', '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...', 'signing_up' => 'Signing up as a normal user...',
'signup_ok' => 'Signed up in successfully!', '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!', '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...', 'getting_dialogs' => 'Getting dialogs...',
'libtgvoip_required' => 'The php-libtgvoip extension is required to accept and manage calls. See daniil.it/MadelineProto for more info.', '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', 'peer_not_in_db' => 'This peer is not present in the internal peer database',
'calling_user' => 'Calling %s...', 'calling_user' => 'Calling %s...',
'generating_a' => 'Generating a...', 'generating_a' => 'Generating a...',
'generating_g_a' => 'Generating g_a...', 'generating_g_a' => 'Generating g_a...',
'call_error_1' => 'Could not find and accept call %s', 'call_error_1' => 'Could not find and accept call %s',
'accepting_call' => 'Accepting call from %s...', 'accepting_call' => 'Accepting call from %s...',
'generating_b' => 'Generating b...', 'generating_b' => 'Generating b...',
'call_already_accepted' => 'Call %s already accepted', 'call_already_accepted' => 'Call %s already accepted',
'call_already_declined' => 'Call %s already declined', 'call_already_declined' => 'Call %s already declined',
'call_error_2' => 'Could not find and confirm call %s', 'call_error_2' => 'Could not find and confirm call %s',
'call_confirming' => 'Confirming call from %s...', 'call_confirming' => 'Confirming call from %s...',
'call_error_3' => 'Could not find and complete call %s', 'call_error_3' => 'Could not find and complete call %s',
'call_completing' => 'Completing call from %s...', 'call_completing' => 'Completing call from %s...',
'invalid_g_a' => 'Invalid g_a!', 'invalid_g_a' => 'Invalid g_a!',
'fingerprint_invalid' => 'Invalid key fingerprint!', 'fingerprint_invalid' => 'Invalid key fingerprint!',
'call_discarding' => 'Discarding call %s...', 'call_discarding' => 'Discarding call %s...',
'call_set_rating' => 'Setting rating for call %s...', 'call_set_rating' => 'Setting rating for call %s...',
'call_debug_saving' => 'Saving debug data for call %s...', 'call_debug_saving' => 'Saving debug data for call %s...',
'TL_loading' => 'Loading TL schemes...', 'TL_loading' => 'Loading TL schemes...',
'file_parsing' => 'Parsing %s...', 'file_parsing' => 'Parsing %s...',
'crc32_mismatch' => 'CRC32 mismatch (%s, %s) for %s', 'crc32_mismatch' => 'CRC32 mismatch (%s, %s) for %s',
'src_file_invalid' => 'Invalid source file was provided: ', 'src_file_invalid' => 'Invalid source file was provided: ',
'translating_obj' => 'Translating objects...', 'translating_obj' => 'Translating objects...',
'translating_methods' => 'Translating methods...', 'translating_methods' => 'Translating methods...',
'bool_error' => 'Could not extract boolean', 'bool_error' => 'Could not extract boolean',
'not_numeric' => 'Given value isn\'t numeric', 'not_numeric' => 'Given value isn\'t numeric',
'long_not_16' => 'Given value is not 16 bytes long', 'long_not_16' => 'Given value is not 16 bytes long',
'long_not_32' => 'Given value is not 32 bytes long', 'long_not_32' => 'Given value is not 32 bytes long',
'long_not_64' => 'Given value is not 64 bytes long', 'long_not_64' => 'Given value is not 64 bytes long',
'array_invalid' => 'You didn\'t provide a valid array', 'array_invalid' => 'You didn\'t provide a valid array',
'predicate_not_set' => 'Predicate (value under _) was not set!', 'predicate_not_set' => 'Predicate (value under _) was not set!',
'type_extract_error' => 'Could not extract type "%s"', 'type_extract_error' => 'Could not extract type "%s"',
'method_not_found' => 'Could not find method: ', 'method_not_found' => 'Could not find method: ',
'params_missing' => 'Missing required parameter', 'params_missing' => 'Missing required parameter',
'sec_peer_not_in_db' => 'This secret peer is not present in the internal peer database', '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.', 'stream_handle_invalid' => 'An invalid stream handle was provided.',
'length_too_big' => 'Length is too big', 'length_too_big' => 'Length is too big',
'deserialize_not_str' => 'Deserialize: Generated value isn\'t a string', 'deserialize_not_str' => 'Deserialize: Generated value isn\'t a string',
'type_extract_error_id' => 'Could not extract type: %s with id %s', 'type_extract_error_id' => 'Could not extract type: %s with id %s',
'vector_invalid' => 'Invalid vector constructor: ', 'vector_invalid' => 'Invalid vector constructor: ',
'constructor_not_found' => 'Constructor not found for type: ', 'constructor_not_found' => 'Constructor not found for type: ',
'rand_bytes_too_small' => 'random_bytes is too small!', 'rand_bytes_too_small' => 'random_bytes is too small!',
'botapi_conversion_error' => 'Can\'t convert %s to a bot API object', 'botapi_conversion_error' => 'Can\'t convert %s to a bot API object',
'non_text_conversion' => 'Can\'t convert non text messages yet!', 'non_text_conversion' => 'Can\'t convert non text messages yet!',
'last_byte_invalid' => 'Invalid last byte', 'last_byte_invalid' => 'Invalid last byte',
'file_type_invalid' => 'Invalid file type detected (%s)', 'file_type_invalid' => 'Invalid file type detected (%s)',
'recreate_temp_auth_key' => 'I had to recreate the temporary authorization key', 'recreate_temp_auth_key' => 'I had to recreate the temporary authorization key',
'resetting_auth_key' => 'WARNING: Resetting auth key...', 'resetting_auth_key' => 'WARNING: Resetting auth key...',
'shutting_down_reader_pool' => 'Shutting down reader pool ', 'shutting_down_reader_pool' => 'Shutting down reader pool ',
'shutting_down_handler_pool' => 'Shutting down handler pool for dc %s, %d jobs left', '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...', 'secret_chat_skipping' => 'I do not have the secret chat %s in the database, skipping message...',
'fingerprint_mismatch' => 'Key fingerprint mismatch', 'fingerprint_mismatch' => 'Key fingerprint mismatch',
'msg_data_length_too_big' => 'message_data_length is too big', 'msg_data_length_too_big' => 'message_data_length is too big',
'length_not_divisible_16' => 'Length of decrypted data is not divisible by 16', 'length_not_divisible_16' => 'Length of decrypted data is not divisible by 16',
'msg_key_mismatch' => 'msg_key mismatch', 'msg_key_mismatch' => 'msg_key mismatch',
'rand_bytes_too_short' => 'random_bytes is too short!', 'rand_bytes_too_short' => 'random_bytes is too short!',
'resending_unsupported' => 'Resending of messages is not yet supported', 'resending_unsupported' => 'Resending of messages is not yet supported',
'unrecognized_dec_msg' => 'Unrecognized decrypted message received: ', 'unrecognized_dec_msg' => 'Unrecognized decrypted message received: ',
], ),
]; );
// THIS WILL BE OVERWRITTEN BY $lang["en"] // THIS WILL BE OVERWRITTEN BY $lang["en"]
public static $current_lang = [ public static $current_lang = array (
'req_pq' => 'Requesting p_q...', 'req_pq' => 'Requesting pq...',
'done' => 'Done!', 'done' => 'Done!',
'cdn_reupload' => 'File is not stored on CDN, requesting reupload!', 'cdn_reupload' => 'File is not stored on CDN, requesting reupload!',
'stored_on_cdn' => 'File is stored on CDN!', 'stored_on_cdn' => 'File is stored on CDN!',
'serializing_madelineproto' => 'Serializing MadelineProto...', 'serializing_madelineproto' => 'Serializing MadelineProto...',
'phpseclib_fork' => 'Please install this fork of phpseclib: https://github.com/danog/phpseclib', 'phpseclib_fork' => 'Please install this fork of phpseclib: https://github.com/danog/phpseclib',
'inst_dc' => 'Istantiating DataCenter...', 'inst_dc' => 'Istantiating DataCenter...',
'load_rsa' => 'Loading RSA keys...', 'load_rsa' => 'Loading RSA keys...',
'TL_translation' => 'Translating TL schemas...', 'TL_translation' => 'Translating TL schemas...',
'dh_prime_check_0' => 'Executing dh_prime checks (0/3)...', 'dh_prime_check_0' => 'Executing dh_prime checks (0/3)...',
'nearest_dc' => 'We\'re in %s, current DC is %d, nearest DC is %d.', 'nearest_dc' => 'We\'re in %s, current DC is %d, nearest DC is %d.',
'serialization_ofd' => 'Serialization is out of date, reconstructing object!', 'serialization_ofd' => 'Serialization is out of date, reconstructing object!',
'getupdates_deserialization' => 'Getting updates after deserialization...', 'getupdates_deserialization' => 'Getting updates after deserialization...',
'shutdown_reader_pool' => 'Shutting down reader pool, %d jobs left', 'shutdown_reader_pool' => 'Shutting down reader pool, %d jobs left',
'threading_on' => 'THREADING IS ENABLED', 'threading_on' => 'THREADING IS ENABLED',
'socket_reader' => 'Socket reader on DC %s: ', 'socket_reader' => 'Socket reader on DC %s: ',
'socket_status_1' => 'CREATING', 'socket_status_1' => 'CREATING',
'socket_status_2' => 'SUBMITTING', 'socket_status_2' => 'SUBMITTING',
'socket_status_3' => 'WAITING', 'socket_status_3' => 'WAITING',
'socket_status_4' => 'READY', 'socket_status_4' => 'READY',
'socket_status_5' => 'WORKING', 'socket_status_5' => 'WORKING',
'api_not_set' => 'You must provide an api key and an api id, get your own @ my.telegram.org', '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!', 'session_corrupted' => 'The session is corrupted!',
'reset_session_seqno' => 'Resetting session id and seq_no in DC %s...', 'reset_session_seqno' => 'Resetting session id and seq_no in DC %s...',
'gen_perm_auth_key' => 'Generating permanent authorization key for DC %s...', 'gen_perm_auth_key' => 'Generating permanent authorization key for DC %s...',
'gen_temp_auth_key' => 'Generating temporary 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...', 'copy_auth_dcs' => 'Copying authorization from DC %s to DC %s...',
'write_client_info' => 'Writing client info (also executing %s)...', 'write_client_info' => 'Writing client info (also executing %s)...',
'config_updated' => 'Updated config!', 'config_updated' => 'Updated config!',
'length_not_4' => 'Length is not equal to 4', 'length_not_4' => 'Length is not equal to 4',
'length_not_8' => 'Length is not equal to 8', 'length_not_8' => 'Length is not equal to 8',
'value_bigger_than_2147483647' => 'Provided value %s is bigger than 2147483647', 'value_bigger_than_2147483647' => 'Provided value %s is bigger than 2147483647',
'value_smaller_than_2147483648' => 'Provided value %s is smaller than -2147483648', '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_9223372036854775807' => 'Provided value %s is bigger than 9223372036854775807',
'value_smaller_than_9223372036854775808' => 'Provided value %s is smaller than -9223372036854775808', 'value_smaller_than_9223372036854775808' => 'Provided value %s is smaller than -9223372036854775808',
'value_bigger_than_4294967296' => 'Provided value %s is bigger than 4294967296', 'value_bigger_than_4294967296' => 'Provided value %s is bigger than 4294967296',
'value_smaller_than_0' => 'Provided value %s is smaller than 0', 'value_smaller_than_0' => 'Provided value %s is smaller than 0',
'encode_double_error' => 'Could not properly encode double', 'encode_double_error' => 'Could not properly encode double',
'file_not_exist' => 'File does not exist', 'file_not_exist' => 'File does not exist',
'deserialization_error' => 'An error occurred on deserialization', 'deserialization_error' => 'An error occurred on deserialization',
'rsa_init' => 'Istantiating \\phpseclib\\Crypt\\RSA...', 'rsa_init' => 'Istantiating \\phpseclib\\Crypt\\RSA...',
'loading_key' => 'Loading key...', 'loading_key' => 'Loading key...',
'computing_fingerprint' => 'Computing fingerprint...', 'computing_fingerprint' => 'Computing fingerprint...',
'rsa_encrypting' => 'Encrypting with rsa key...', 'rsa_encrypting' => 'Encrypting with rsa key...',
'rpc_tg_error' => 'Telegram returned an RPC error: %s (%s), caused by %s:%sTL trace:', 'rpc_tg_error' => 'Telegram returned an RPC error: %s (%s), caused by %s:%sTL trace:',
'v_error' => '506c656173652075706461746520746f20746865206c61746573742076657273696f6e206f66204d6164656c696e6550726f746f2e', 'v_error' => '506c656173652075706461746520746f20746865206c61746573742076657273696f6e206f66204d6164656c696e6550726f746f2e',
'v_tgerror' => '506c6561736520757064617465207068702d6c69627467766f6970', 'v_tgerror' => '506c6561736520757064617465207068702d6c69627467766f6970',
'no_mode_specified' => 'No mode was specified!', '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.', '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!', 'proxy_class_invalid' => 'Invalid proxy class provided!',
'socket_con_error' => 'Connection: couldn\'t connect to socket.', 'socket_con_error' => 'Connection: couldn\'t connect to socket.',
'protocol_not_implemented' => 'Connection: This protocol isn\'t implemented yet.', 'protocol_not_implemented' => 'Connection: This protocol isn\'t implemented yet.',
'protocol_invalid' => 'Connection: invalid protocol specified.', 'protocol_invalid' => 'Connection: invalid protocol specified.',
'nothing_in_socket' => 'Nothing in the socket!', 'nothing_in_socket' => 'Nothing in the socket!',
'wrong_length_read' => 'WARNING: Wrong length was read (should\'ve read %s, read %s)!', 'wrong_length_read' => 'WARNING: Wrong length was read (should\'ve read %s, read %s)!',
'no_data_in_socket' => 'No data in the socket!', 'no_data_in_socket' => 'No data in the socket!',
'dc_con_start' => 'Connecting to DC %s...', 'dc_con_start' => 'Connecting to DC %s...',
'dc_con_stop' => 'Disconnecting from DC %s...', 'dc_con_stop' => 'Disconnecting from DC %s...',
'dc_con_test_start' => 'Connecting to DC %s (%s server, %s, %s)...', 'dc_con_test_start' => 'Connecting to DC %s (%s server, %s, %s)...',
'script_not_exist' => 'Provided script does not exist', 'script_not_exist' => 'Provided script does not exist',
'apifactory_start' => 'Running APIFactory...', 'apifactory_start' => 'Running APIFactory...',
'madelineproto_ready' => 'MadelineProto is ready!', 'madelineproto_ready' => 'MadelineProto is ready!',
'logout_error' => 'An error occurred while logging out!', 'logout_error' => 'An error occurred while logging out!',
'logout_ok' => 'Logged out successfully!', 'logout_ok' => 'Logged out successfully!',
'already_logged_in' => 'This instance of MadelineProto is already logged in. Logging out first...', 'already_logged_in' => 'This instance of MadelineProto is already logged in. Logging out first...',
'login_ok' => 'Logged in successfully!', 'login_ok' => 'Logged in successfully!',
'login_user' => 'Logging in as a normal user...', 'login_user' => 'Logging in as a normal user...',
'login_bot' => 'Logging in as a bot...', 'login_bot' => 'Logging in as a bot...',
'login_code_sending' => 'Sending code...', '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_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_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_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_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...', 'login_auth_key' => 'Logging in using auth key...',
'not_logged_in' => 'I\'m not logged in!', '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!', '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...', 'signing_up' => 'Signing up as a normal user...',
'signup_ok' => 'Signed up in successfully!', '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!', '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...', 'getting_dialogs' => 'Getting dialogs...',
'libtgvoip_required' => 'The php-libtgvoip extension is required to accept and manage calls. See daniil.it/MadelineProto for more info.', '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', 'peer_not_in_db' => 'This peer is not present in the internal peer database',
'calling_user' => 'Calling %s...', 'calling_user' => 'Calling %s...',
'generating_a' => 'Generating a...', 'generating_a' => 'Generating a...',
'generating_g_a' => 'Generating g_a...', 'generating_g_a' => 'Generating g_a...',
'call_error_1' => 'Could not find and accept call %s', 'call_error_1' => 'Could not find and accept call %s',
'accepting_call' => 'Accepting call from %s...', 'accepting_call' => 'Accepting call from %s...',
'generating_b' => 'Generating b...', 'generating_b' => 'Generating b...',
'call_already_accepted' => 'Call %s already accepted', 'call_already_accepted' => 'Call %s already accepted',
'call_already_declined' => 'Call %s already declined', 'call_already_declined' => 'Call %s already declined',
'call_error_2' => 'Could not find and confirm call %s', 'call_error_2' => 'Could not find and confirm call %s',
'call_confirming' => 'Confirming call from %s...', 'call_confirming' => 'Confirming call from %s...',
'call_error_3' => 'Could not find and complete call %s', 'call_error_3' => 'Could not find and complete call %s',
'call_completing' => 'Completing call from %s...', 'call_completing' => 'Completing call from %s...',
'invalid_g_a' => 'Invalid g_a!', 'invalid_g_a' => 'Invalid g_a!',
'fingerprint_invalid' => 'Invalid key fingerprint!', 'fingerprint_invalid' => 'Invalid key fingerprint!',
'call_discarding' => 'Discarding call %s...', 'call_discarding' => 'Discarding call %s...',
'call_set_rating' => 'Setting rating for call %s...', 'call_set_rating' => 'Setting rating for call %s...',
'call_debug_saving' => 'Saving debug data for call %s...', 'call_debug_saving' => 'Saving debug data for call %s...',
'TL_loading' => 'Loading TL schemes...', 'TL_loading' => 'Loading TL schemes...',
'file_parsing' => 'Parsing %s...', 'file_parsing' => 'Parsing %s...',
'crc32_mismatch' => 'CRC32 mismatch (%s, %s) for %s', 'crc32_mismatch' => 'CRC32 mismatch (%s, %s) for %s',
'src_file_invalid' => 'Invalid source file was provided: ', 'src_file_invalid' => 'Invalid source file was provided: ',
'translating_obj' => 'Translating objects...', 'translating_obj' => 'Translating objects...',
'translating_methods' => 'Translating methods...', 'translating_methods' => 'Translating methods...',
'bool_error' => 'Could not extract boolean', 'bool_error' => 'Could not extract boolean',
'not_numeric' => 'Given value isn\'t numeric', 'not_numeric' => 'Given value isn\'t numeric',
'long_not_16' => 'Given value is not 16 bytes long', 'long_not_16' => 'Given value is not 16 bytes long',
'long_not_32' => 'Given value is not 32 bytes long', 'long_not_32' => 'Given value is not 32 bytes long',
'long_not_64' => 'Given value is not 64 bytes long', 'long_not_64' => 'Given value is not 64 bytes long',
'array_invalid' => 'You didn\'t provide a valid array', 'array_invalid' => 'You didn\'t provide a valid array',
'predicate_not_set' => 'Predicate (value under _) was not set!', 'predicate_not_set' => 'Predicate (value under _) was not set!',
'type_extract_error' => 'Could not extract type "%s"', 'type_extract_error' => 'Could not extract type "%s"',
'method_not_found' => 'Could not find method: ', 'method_not_found' => 'Could not find method: ',
'params_missing' => 'Missing required parameter', 'params_missing' => 'Missing required parameter',
'sec_peer_not_in_db' => 'This secret peer is not present in the internal peer database', '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.', 'stream_handle_invalid' => 'An invalid stream handle was provided.',
'length_too_big' => 'Length is too big', 'length_too_big' => 'Length is too big',
'deserialize_not_str' => 'Deserialize: Generated value isn\'t a string', 'deserialize_not_str' => 'Deserialize: Generated value isn\'t a string',
'type_extract_error_id' => 'Could not extract type: %s with id %s', 'type_extract_error_id' => 'Could not extract type: %s with id %s',
'vector_invalid' => 'Invalid vector constructor: ', 'vector_invalid' => 'Invalid vector constructor: ',
'constructor_not_found' => 'Constructor not found for type: ', 'constructor_not_found' => 'Constructor not found for type: ',
'rand_bytes_too_small' => 'random_bytes is too small!', 'rand_bytes_too_small' => 'random_bytes is too small!',
'botapi_conversion_error' => 'Can\'t convert %s to a bot API object', 'botapi_conversion_error' => 'Can\'t convert %s to a bot API object',
'non_text_conversion' => 'Can\'t convert non text messages yet!', 'non_text_conversion' => 'Can\'t convert non text messages yet!',
'last_byte_invalid' => 'Invalid last byte', 'last_byte_invalid' => 'Invalid last byte',
'file_type_invalid' => 'Invalid file type detected (%s)', 'file_type_invalid' => 'Invalid file type detected (%s)',
'recreate_temp_auth_key' => 'I had to recreate the temporary authorization key', 'recreate_temp_auth_key' => 'I had to recreate the temporary authorization key',
'resetting_auth_key' => 'WARNING: Resetting auth key...', 'resetting_auth_key' => 'WARNING: Resetting auth key...',
'shutting_down_reader_pool' => 'Shutting down reader pool ', 'shutting_down_reader_pool' => 'Shutting down reader pool ',
'shutting_down_handler_pool' => 'Shutting down handler pool for dc %s, %d jobs left', '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...', 'secret_chat_skipping' => 'I do not have the secret chat %s in the database, skipping message...',
'fingerprint_mismatch' => 'Key fingerprint mismatch', 'fingerprint_mismatch' => 'Key fingerprint mismatch',
'msg_data_length_too_big' => 'message_data_length is too big', 'msg_data_length_too_big' => 'message_data_length is too big',
'length_not_divisible_16' => 'Length of decrypted data is not divisible by 16', 'length_not_divisible_16' => 'Length of decrypted data is not divisible by 16',
'msg_key_mismatch' => 'msg_key mismatch', 'msg_key_mismatch' => 'msg_key mismatch',
'rand_bytes_too_short' => 'random_bytes is too short!', 'rand_bytes_too_short' => 'random_bytes is too short!',
'resending_unsupported' => 'Resending of messages is not yet supported', 'resending_unsupported' => 'Resending of messages is not yet supported',
'unrecognized_dec_msg' => 'Unrecognized decrypted message received: ', 'unrecognized_dec_msg' => 'Unrecognized decrypted message received: ',
]; );
} }

View File

@ -46,7 +46,7 @@ class MTProto
/* /*
const V = 71; const V = 71;
*/ */
const V = 74; const V = 75;
const NOT_LOGGED_IN = 0; const NOT_LOGGED_IN = 0;
const WAITING_CODE = 1; const WAITING_CODE = 1;
@ -628,7 +628,7 @@ class MTProto
public function setup_logger() 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); \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);
} }

View File

@ -29,28 +29,28 @@ trait Crypt
public function ige_encrypt($message, $key, $iv) 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->setKey($key);
$cipher->setIV($iv); $cipher->setIV($iv);
return $cipher->encrypt($message); return @$cipher->encrypt($message);
} }
public function ctr_encrypt($message, $key, $iv) 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->setKey($key);
$cipher->setIV($iv); $cipher->setIV($iv);
return $cipher->encrypt($message); return @$cipher->encrypt($message);
} }
public function ige_decrypt($message, $key, $iv) 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->setKey($key);
$cipher->setIV($iv); $cipher->setIV($iv);
return $cipher->decrypt($message); return @$cipher->decrypt($message);
} }
} }

View File

@ -64,6 +64,7 @@ class Serialization
$unserialized = file_get_contents($filename); $unserialized = file_get_contents($filename);
flock($lock, LOCK_UN); flock($lock, LOCK_UN);
fclose($lock); fclose($lock);
$tounserialize = str_replace('O:26:"danog\MadelineProto\Button":', 'O:35:"danog\MadelineProto\TL\Types\Button":', $unserialized); $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) { foreach (['RSA', 'TL\TLMethod', 'TL\TLConstructor', 'MTProto', 'API', 'DataCenter', 'Connection', 'TL\Types\Button', 'TL\Types\Bytes', 'APIFactory'] as $class) {
class_exists('\danog\MadelineProto\\'.$class); class_exists('\danog\MadelineProto\\'.$class);
@ -72,6 +73,7 @@ class Serialization
\danog\MadelineProto\Logger::class_exists(); \danog\MadelineProto\Logger::class_exists();
try { try {
// $unserialized = \danog\Serialization::unserialize($tounserialize);
$unserialized = unserialize($tounserialize); $unserialized = unserialize($tounserialize);
} catch (\danog\MadelineProto\Bug74586Exception $e) { } catch (\danog\MadelineProto\Bug74586Exception $e) {
$unserialized = \danog\Serialization::unserialize($tounserialize); $unserialized = \danog\Serialization::unserialize($tounserialize);
@ -79,6 +81,7 @@ class Serialization
if (Logger::$constructed) { if (Logger::$constructed) {
Logger::log([(string) $e], Logger::ERROR); 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); $unserialized = \danog\Serialization::unserialize($tounserialize);
} }
if ($unserialized instanceof \danog\PlaceHolder) { if ($unserialized instanceof \danog\PlaceHolder) {

View File

@ -13,7 +13,7 @@ If not, see <http://www.gnu.org/licenses/>.
set_include_path(get_include_path().':'.realpath(dirname(__FILE__).'/../').':'.realpath(dirname(__FILE__).'/../MadelineProto/')); set_include_path(get_include_path().':'.realpath(dirname(__FILE__).'/../').':'.realpath(dirname(__FILE__).'/../MadelineProto/'));
chdir(dirname(__FILE__).'/../'); chdir(dirname(__FILE__).'/../');
require_once 'vendor/autoload.php'; require_once 'vendor/autoload.php';
//include 'SocksProxy.php';
if (!function_exists('readline')) { if (!function_exists('readline')) {
function readline($prompt = null) function readline($prompt = null)
{ {