1
0
mirror of https://github.com/danog/telerpc.git synced 2024-11-26 20:14:48 +01:00

Use same checks

This commit is contained in:
Daniil Gentili 2024-01-20 19:13:43 +01:00
parent 475d3605ff
commit 6c6d257880
2 changed files with 22 additions and 37 deletions

View File

@ -2,6 +2,10 @@
"name": "danog/telerpc",
"description": "RPC Error reporting API",
"type": "project",
"require": {
"danog/madelineproto": "^8"
},
"minimum-stability": "dev",
"require-dev": {
"amphp/php-cs-fixer-config": "dev-master",
"friendsofphp/php-cs-fixer": "^2.16"

View File

@ -1,5 +1,7 @@
<?php
use danog\MadelineProto\RPCErrorException;
final class Main
{
private ?\PDO $pdo = null;
@ -26,34 +28,6 @@ final class Main
return \json_encode(['ok' => true, 'result' => $result]);
}
private static function isBad(string $error, int $code): bool
{
return \in_array($error, ['PEER_FLOOD', 'INPUT_CONSTRUCTOR_INVALID_X', 'USER_DEACTIVATED_BAN', 'INPUT_METHOD_INVALID', 'INPUT_FETCH_ERROR', 'AUTH_KEY_UNREGISTERED', 'SESSION_REVOKED', 'USER_DEACTIVATED', 'RPC_SEND_FAIL', 'RPC_CALL_FAIL', 'RPC_MCGET_FAIL', 'INTERDC_5_CALL_ERROR', 'INTERDC_4_CALL_ERROR', 'INTERDC_3_CALL_ERROR', 'INTERDC_2_CALL_ERROR', 'INTERDC_1_CALL_ERROR', 'INTERDC_5_CALL_RICH_ERROR', 'INTERDC_4_CALL_RICH_ERROR', 'INTERDC_3_CALL_RICH_ERROR', 'INTERDC_2_CALL_RICH_ERROR', 'INTERDC_1_CALL_RICH_ERROR', 'AUTH_KEY_DUPLICATED', 'CONNECTION_NOT_INITED', 'LOCATION_NOT_AVAILABLE', 'AUTH_KEY_INVALID', 'LANG_CODE_EMPTY', 'memory limit exit', 'memory limit(?)', 'INPUT_REQUEST_TOO_LONG', 'SESSION_PASSWORD_NEEDED', 'INPUT_FETCH_FAIL',
'CONNECTION_SYSTEM_EMPTY',
'FILE_WRITE_FAILED',
'STORAGE_CHOOSE_VOLUME_FAILED',
'CONNECTION_SYSTEM_EMPTY', 'xxx',
'FILE_WRITE_FAILED', 'AES_DECRYPT_FAILED',
'STORAGE_CHOOSE_VOLUME_FAILED',
'Timedout', 'SEND_REACTION_RESULT1_INVALID',
'BOT_POLLS_DISABLED', 'TEMPNAM_FAILED', 'MSG_WAIT_TIMEOUT', 'MEMBER_CHAT_ADD_FAILED',
'CHAT_FROM_CALL_CHANGED', 'MTPROTO_CLUSTER_INVALID',
'CONNECTION_DEVICE_MODEL_EMPTY', 'AUTH_KEY_PERM_EMPTY', 'UNKNOWN_METHOD', 'ENCRYPTION_OCCUPY_FAILED', 'ENCRYPTION_OCCUPY_ADMIN_FAILED', 'CHAT_OCCUPY_USERNAME_FAILED', 'REG_ID_GENERATE_FAILED',
'CONNECTION_LANG_PACK_INVALID', 'MSGID_DECREASE_RETRY', 'API_CALL_ERROR', 'STORAGE_CHECK_FAILED', 'INPUT_LAYER_INVALID', 'NEED_MEMBER_INVALID', 'NEED_CHAT_INVALID', 'HISTORY_GET_FAILED', 'CHP_CALL_FAIL', 'IMAGE_ENGINE_DOWN', 'MSG_RANGE_UNSYNC', 'PTS_CHANGE_EMPTY',
'CONNECTION_SYSTEM_LANG_CODE_EMPTY', 'WORKER_BUSY_TOO_LONG_RETRY', 'WP_ID_GENERATE_FAILED', 'ARR_CAS_FAILED', 'CHANNEL_ADD_INVALID', 'CHANNEL_ADMINS_INVALID', 'CHAT_OCCUPY_LOC_FAILED', 'GROUPED_ID_OCCUPY_FAILED', 'GROUPED_ID_OCCUPY_FAULED', 'LOG_WRAP_FAIL', 'MEMBER_FETCH_FAILED', 'MEMBER_OCCUPY_PRIMARY_LOC_FAILED', 'MEMBER_FETCH_FAILED', 'MEMBER_NO_LOCATION', 'MEMBER_OCCUPY_USERNAME_FAILED', 'MT_SEND_QUEUE_TOO_LONG', 'POSTPONED_TIMEOUT', 'RPC_CONNECT_FAILED', 'SHORTNAME_OCCUPY_FAILED', 'STORE_INVALID_OBJECT_TYPE', 'STORE_INVALID_SCALAR_TYPE', 'TMSG_ADD_FAILED', 'UNKNOWN_ERROR', 'UPLOAD_NO_VOLUME', 'USER_NOT_AVAILABLE', 'VOLUME_LOC_NOT_FOUND', ])
|| \str_contains($error, 'Received bad_msg_notification')
|| \str_contains($error, 'FLOOD_WAIT_')
|| \str_contains($error, '_MIGRATE_')
|| \str_contains($error, 'INPUT_METHOD_INVALID')
|| \str_contains($error, 'INPUT_CONSTRUCTOR_INVALID')
|| \str_contains($error, 'INPUT_FETCH_ERROR_')
|| \str_contains($error, 'https://telegram.org/dl')
|| \str_starts_with($error, 'Received bad_msg_notification')
|| \str_starts_with($error, 'No workers running')
|| \str_starts_with($error, 'All workers are busy. Active_queries ')
|| \preg_match('/FILE_PART_\d*_MISSING/', $error);
}
private static function sanitize(string $error): string
{
$error = \preg_replace('/_XMIN$/', '_%dMIN', $error);
@ -210,12 +184,17 @@ final class Main
$q->execute();
$r = $q->fetchAll(PDO::FETCH_COLUMN | PDO::FETCH_GROUP);
foreach ($r as $error => $methods) {
if (self::isBad($error, 0)) {
$q = $this->pdo->prepare('DELETE FROM errors WHERE error=?');
$q->execute([$error]);
$q = $this->pdo->prepare('DELETE FROM error_descriptions WHERE error=?');
$q->execute([$error]);
echo 'Delete '.$error."\n";
$anyok = false;
foreach ($methods as $method) {
if (RPCErrorException::isBad($error, 0, $method)) {
$q = $this->pdo->prepare('DELETE FROM errors WHERE error=? AND method=?');
$q->execute([$error, $method]);
echo "Delete $error for $method\n";
continue;
}
$anyok = true;
}
if (!$anyok) {
continue;
}
$allowed[$error] = true;
@ -284,9 +263,11 @@ final class Main
&& $_REQUEST['error'] !== ''
&& $_REQUEST['method'] !== ''
&& \is_numeric($_REQUEST['code'])
&& !self::isBad($_REQUEST['error'], (int) $_REQUEST['code'])
&& !($_REQUEST['error'] === 'Timeout' && !\in_array(\strtolower($_REQUEST['method']), ['messages.getbotcallbackanswer', 'messages.getinlinebotresults']))
&& !($_REQUEST['error'] === 'BOT_MISSING' && \in_array($_REQUEST['method'], ['stickers.changeStickerPosition', 'stickers.createStickerSet', 'messages.uploadMedia']))
&& !RPCErrorException::isBad(
$_REQUEST['error'],
(int) $_REQUEST['code'],
$_REQUEST['method']
)
) {
$error = self::sanitize($_REQUEST['error']);
$method = $_REQUEST['method'];