HEX
Server: LiteSpeed
System: Linux emerald.serverdnsnetwork.com 5.14.0-611.5.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Nov 11 08:09:09 EST 2025 x86_64
User: mahdetej (1135)
PHP: 8.1.34
Disabled: show_source, system, shell_exec, passthru, exec, popen, proc_open
Upload Files
File: /home/mahdetej/www/wp-content/plugins/Melli-shild/melli-shield.php
<?php
/**
 * Plugin Name:       ملی شیلد | Melli Shield
 * Plugin URI:        https://melli.site
 * Description:       مسدودسازی درخواست‌های خارجی، حفظ حریم خصوصی و بهبود عملکرد در حالت ملی و آفلاین.
 * Version:           2.3.1
 * Requires at least: 5.6
 * Requires PHP:      7.4
 * Author:            Melli.site
 * Author URI:        https://melli.site
 * License:           GPL v2 or later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:       melli-shield
 * Domain Path:       /languages
 */

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

define( 'MELLI_SHIELD_VERSION', '2.3.1' );
define( 'MELLI_SHIELD_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
define( 'MELLI_SHIELD_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
define( 'MELLI_SHIELD_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
define( 'MELLI_SHIELD_PLUGIN_FILE', __FILE__ );

$melli_shield_debug_from_wp_config = defined( 'MELLI_SHIELD_DEBUG' );
if ( ! $melli_shield_debug_from_wp_config ) {
	define( 'MELLI_SHIELD_DEBUG', false );
}

require_once MELLI_SHIELD_PLUGIN_DIR . 'includes/class-melli-shield-config.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'includes/class-melli-shield-debug.php';

Melli_Shield_Debug::init_bootstrap( $melli_shield_debug_from_wp_config );
Melli_Shield_Debug::register_hooks();

add_action( 'plugins_loaded', array( 'Melli_Shield_Debug', 'boot' ), 1 );

global $melli_shield_protected_handles;
$melli_shield_protected_handles = Melli_Shield_Config::protected_handles();

require_once MELLI_SHIELD_PLUGIN_DIR . 'includes/class-melli-shield-migrator.php';
Melli_Shield_Migrator::boot();

require_once MELLI_SHIELD_PLUGIN_DIR . 'includes/class-melli-shield-loader.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'includes/class-melli-shield-activator.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'includes/class-melli-shield-deactivator.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'includes/class-melli-shield-i18n.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'includes/class-melli-shield-utils.php';

require_once MELLI_SHIELD_PLUGIN_DIR . 'admin/class-melli-shield-admin-ui.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'admin/class-melli-shield-admin.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'admin/class-melli-shield-settings.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/class-melli-shield-probe-ajax.php';

require_once MELLI_SHIELD_PLUGIN_DIR . 'core/class-melli-shield-blocker.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/class-melli-shield-logger.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/class-melli-shield-whitelist.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/class-melli-shield-scanner.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/class-melli-shield-scanner-ajax.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/class-melli-shield-performance.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/class-melli-shield-performance-ajax.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/class-melli-shield-output-buffer.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/class-melli-shield-compatibility.php';

require_once MELLI_SHIELD_PLUGIN_DIR . 'core/modes/class-melli-shield-mode-normal.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/modes/class-melli-shield-mode-national.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/modes/class-melli-shield-mode-offline.php';

require_once MELLI_SHIELD_PLUGIN_DIR . 'core/blockers/class-melli-shield-block-fonts.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/blockers/class-melli-shield-block-cdn.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/blockers/class-melli-shield-block-analytics.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/blockers/class-melli-shield-block-updates.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/blockers/class-melli-shield-block-gravatar.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/blockers/class-melli-shield-block-embeds.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/blockers/class-melli-shield-block-recaptcha.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/blockers/class-melli-shield-block-heartbeat.php';
require_once MELLI_SHIELD_PLUGIN_DIR . 'core/blockers/class-melli-shield-block-email.php';

register_activation_hook( __FILE__, array( 'Melli_Shield_Activator', 'activate' ) );
register_deactivation_hook( __FILE__, array( 'Melli_Shield_Deactivator', 'deactivate' ) );

add_filter( 'plugin_action_links_' . MELLI_SHIELD_PLUGIN_BASENAME, function ( $links ) {
	$url = esc_url( Melli_Shield_Config::admin_url() );
	array_unshift( $links, '<a href="' . $url . '">' . esc_html__( 'تنظیمات', 'melli-shield' ) . '</a>' );
	return $links;
} );

add_action( 'admin_notices', function () {
	if ( get_transient( Melli_Shield_Config::ACTIVATION_TRANSIENT ) ) {
		delete_transient( Melli_Shield_Config::ACTIVATION_TRANSIENT );
		echo '<div class="notice notice-success is-dismissible"><p>';
		echo '<strong>' . esc_html__( 'ملی شیلد فعال شد!', 'melli-shield' ) . '</strong> ';
		echo esc_html__( 'حالت سپر خود را تنظیم کنید.', 'melli-shield' ) . ' ';
		echo '<a href="' . esc_url( Melli_Shield_Config::admin_url() ) . '" class="button button-primary">';
		echo esc_html__( 'رفتن به داشبورد', 'melli-shield' );
		echo '</a></p></div>';
	}
} );

final class Melli_Shield_Plugin {

	private static $instance = null;
	private $loader;

	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}
		return self::$instance;
	}

	private function __construct() {
		$this->loader = new Melli_Shield_Loader();

		$this->load_textdomain();
		$this->register_ajax_hooks();
		$this->register_admin_hooks();
		$this->register_core_hooks();
		$this->register_cron();

		Melli_Shield_Utils::ensure_tables();

		$this->loader->run();
	}

	private function load_textdomain() {
		$i18n = new Melli_Shield_I18n();
		$this->loader->add_action( 'plugins_loaded', $i18n, 'load_textdomain' );
	}

	private function register_ajax_hooks() {
		Melli_Shield_Scanner_Ajax::instance()->register();
		Melli_Shield_Performance_Ajax::instance()->register();
		Melli_Shield_Probe_Ajax::instance()->register();
	}

	private function register_admin_hooks() {
		$admin = new Melli_Shield_Admin();

		if ( ! is_admin() ) {
			$this->loader->add_action( 'admin_bar_menu', $admin, 'admin_bar_status', 100 );
			$this->loader->add_action( 'wp_enqueue_scripts', $admin, 'enqueue_frontend_perf' );
			return;
		}

		$this->loader->add_action( 'admin_menu', $admin, 'add_menu_pages' );
		$this->loader->add_action( 'admin_enqueue_scripts', $admin, 'enqueue_assets' );
		$this->loader->add_action( 'admin_bar_menu', $admin, 'admin_bar_status', 100 );

		$settings = new Melli_Shield_Settings();
		$this->loader->add_action( 'admin_init', $settings, 'register_settings' );
	}

	private function register_core_hooks() {
		$blocker = new Melli_Shield_Blocker();
		$this->loader->add_action( 'init', $blocker, 'init' );

		$output = new Melli_Shield_Output_Buffer();
		$output->register();

		if ( is_admin() ) {
			$compat = new Melli_Shield_Compatibility();
			$compat->register();
		}
	}

	private function register_cron() {
		if ( ! wp_next_scheduled( Melli_Shield_Config::CRON_CLEANUP ) ) {
			wp_schedule_event( time(), 'daily', Melli_Shield_Config::CRON_CLEANUP );
		}
		add_action( Melli_Shield_Config::CRON_CLEANUP, function () {
			$logger = new Melli_Shield_Logger();
			$logger->cleanup();
		} );
	}
}

function melli_shield() {
	return Melli_Shield_Plugin::instance();
}

melli_shield();