%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/komfo908/manutencao.komforthouse.com.br/wp-content/plugins/hide-my-wp/classes/
Upload File :
Create Path :
Current File : /home/komfo908/manutencao.komforthouse.com.br/wp-content/plugins/hide-my-wp/classes/Tools.php

<?php
/**
 * Handles the parameters and URLs
 *
 * @file The Tools file
 * @package HMWP/Tools
 * @since 4.0.0
 */

defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );

class HMWP_Classes_Tools {

	/**
	 * Saved options in database.
	 *
	 * @var array
	 */
	public static $init = array(), $default = array(), $lite = array();
	/**
	 * Configuration settings for the application.
	 *
	 * @var array
	 */
	public static $options = array();
	/**
	 * Stores debugging information and configurations.
	 *
	 * @var array
	 */
	public static $debug = array();
	/**
	 * List of active plugins in the system.
	 *
	 * @var array
	 */
	public static $active_plugins;

	/**
	 * Represents the role of the current user.
	 *
	 * @var string
	 */
	static $current_user_role = 'default';

	/**
	 * Plugin constructor to initialize options, load multilanguage support, and handle admin-specific tasks.
	 *
	 * @return void
	 */
	public function __construct() {

		// Get the plugin options from database
		self::$options = self::getOptions();

		// Load multilanguage
		add_action( "init", array( $this, 'loadMultilanguage' ) );

		// If it's admin panel
		if ( is_admin() || is_network_admin() ) {
			// Check the Plugin database update
			self::updateDatabase();

			// Add setting link in plugin
			add_filter( 'plugin_action_links_' . HMWP_BASENAME, array( $this, 'hookActionlink' ) );
			add_filter( 'network_admin_plugin_action_links_' . HMWP_BASENAME, array( $this, 'hookActionlink' ) );

			// Check plugin license
			add_action( 'request_metadata_http_result', array( $this, 'checkLicenseOnUpdate' ) );

		}

	}

	/**
	 * Load the Options from user option table in DB
	 *
	 * @param  bool  $safe
	 *
	 * @return array
	 */
	public static function getOptions( $safe = false ) {
		// Set key metadata based on safe parameter.
		$keymeta = $safe ? HMWP_OPTION_SAFE : HMWP_OPTION;

		// Parse the site URL and plugin/content paths.
		$homepath   = wp_parse_url( site_url(), PHP_URL_PATH ) ? ltrim( wp_parse_url( site_url(), PHP_URL_PATH ), '/' ) : '';
		$pluginurl  = ltrim( wp_parse_url( plugins_url(), PHP_URL_PATH ), '/' );
		$contenturl = ltrim( wp_parse_url( content_url(), PHP_URL_PATH ), '/' );

		// Get relative paths for plugin and content URLs.
		$plugin_relative_url  = trim( preg_replace( '/' . str_replace( '/', '\/', $homepath ) . '/', '', $pluginurl, 1 ), '/' );
		$content_relative_url = trim( preg_replace( '/' . str_replace( '/', '\/', $homepath ) . '/', '', $contenturl, 1 ), '/' );

		// Set default options.
		self::$init = array(
			'hmwp_ver'                       => 0,
			//--
			'api_token'                      => false,
			'hmwp_token'                     => false,
			//--
			'hmwp_valid'                     => 1,
			'hmwp_expires'                   => 0,
			'hmwp_disable'                   => HMWP_Classes_Tools::generateRandomString( 16 ),
			'hmwp_disable_name'              => HMWP_Classes_Tools::generateRandomString( 16 ),
			//--
			'hmwp_plugin_name'               => _HMWP_PLUGIN_FULL_NAME_,
			'hmwp_plugin_menu'               => _HMWP_PLUGIN_FULL_NAME_,
			'hmwp_plugin_logo'               => false,
			'hmwp_plugin_icon'               => 'dashicons-shield-alt',
			'hmwp_plugin_website'            => 'https://wpghost.com',
			'hmwp_plugin_account_show'       => 1,
			//--
			'logout'                         => 0,
			'error'                          => 0,
			'file_mappings'                  => array(),
			'test_frontend'                  => 0,
			'changes'                        => 0,
			'admin_notice'                   => array(),
			'prevent_slow_loading'           => 1,
			'hmwp_rewrites_in_wp_rules'      => 0,
			'hmwp_server_type'               => 'auto',
			//--
			'hmwp_loading_hook'              => array( 'normal' ), //load when the other plugins are initialized
			'hmwp_firstload'                 => 0, //load the plugin as Must Use Plugin
			'hmwp_priorityload'              => 0, //load the plugin on plugin start
			'hmwp_laterload'                 => 0, //load the plugin on template redirect
			//--
			'hmwp_fix_relative'              => 0,
			'hmwp_remove_third_hooks'        => 0,
			'hmwp_send_email'                => 0,
			'hmwp_activity_log'              => 0,
			'hmwp_activity_log_roles'        => array(),
			'hmwp_email_address'             => '',

			//-- Firewall
			'whitelist_ip'                   => array(),
			'whitelist_paths'                => 0,
			'whitelist_urls'                 => array(),
			'banlist_ip'                     => array(),
			'banlist_hostname'               => array(),
			'banlist_user_agent'             => array(),
			'banlist_referrer'               => array(),

			//Temporary Login
			'hmwp_templogin'                 => 0,
			'hmwp_templogin_role'            => 'administrator',
			'hmwp_templogin_redirect'        => false,
			'hmwp_templogin_delete_uninstal' => false,

			//Geoblock Login
			'hmwp_geoblock'                  => 0,
			'hmwp_geoblock_countries'        => array(),
			'hmwp_geoblock_urls'             => array(),

			//2FA Login
			'hmwp_2falogin'                  => 0,
			'hmwp_2falogin_status'           => 1,
			'hmwp_2fa_totp'                  => 1,
			'hmwp_2fa_email'                 => 0,
			'hmwp_2falogin_max_attempts'     => 5,
			'hmwp_2falogin_max_timeout'      => 900,
			'hmwp_2falogin_message'          => '',
			'hmwp_2falogin_fail_message'     => '',

			//-- Brute Force
			'hmwp_bruteforce'                => 0,
			'hmwp_bruteforce_register'       => 0,
			'hmwp_bruteforce_lostpassword'   => 0,
			'hmwp_bruteforce_comments'       => 0,
			'hmwp_bruteforce_woocommerce'    => 0,
			'hmwp_bruteforce_username'       => 0,
			'hmwp_brute_message'             => esc_html__( 'Your IP has been flagged for potential security violations. Please try again in a little while.', 'hide-my-wp' ),
			'hmwp_hide_classes'              => json_encode( array() ),
			'trusted_ip_header'              => '',

			//Unique Login
			'hmwp_uniquelogin'               => 0,
			'hmwp_uniquelogin_woocommerce'   => 0,

			//Math reCaptcha
			'brute_use_math'                 => 1,
			'brute_max_attempts'             => 5,
			'brute_max_timeout'              => 3600,
			//reCaptcha V2
			'brute_use_captcha'              => 0,
			'brute_captcha_site_key'         => '',
			'brute_captcha_secret_key'       => '',
			'brute_captcha_theme'            => 'light',
			'brute_captcha_language'         => '',
			//reCaptcha V2
			'brute_use_captcha_v3'           => 0,
			'brute_captcha_site_key_v3'      => '',
			'brute_captcha_secret_key_v3'    => '',

			//tweaks
			'hmwp_hide_admin_toolbar'        => 0,
			'hmwp_hide_admin_toolbar_roles'  => array( 'customer', 'subscriber' ),
			//--
			'hmwp_change_in_cache'           => ( ( defined( 'WP_CACHE' ) && WP_CACHE ) ? 1 : 0 ),
			'hmwp_change_in_cache_directory' => '',
			'hmwp_hide_loggedusers'          => 1,
			'hmwp_hide_version'              => 1,
			'hmwp_hide_version_random'       => 1,
			'hmwp_hide_generator'            => 1,
			'hmwp_hide_prefetch'             => 1,
			'hmwp_hide_comments'             => 1,
			'hmwp_hide_wp_text'              => 0,

			'hmwp_hide_feed'              => 0,
			'hmwp_hide_in_feed'           => 0,
			'hmwp_hide_in_sitemap'        => 0,
			'hmwp_hide_author_in_sitemap' => 1,
			'hmwp_robots'                 => 0,

			'hmwp_disable_emojicons'         => 0,
			'hmwp_disable_manifest'          => 1,
			'hmwp_disable_embeds'            => 0,
			'hmwp_disable_debug'             => 1,
			//--
			'hmwp_disable_click'             => 0,
			'hmwp_disable_click_loggedusers' => 0,
			'hmwp_disable_click_roles'       => array( 'subscriber' ),
			'hmwp_disable_click_message'     => "Right click is disabled!",

			'hmwp_disable_inspect'             => 0,
			'hmwp_disable_inspect_blank'       => 0,
			'hmwp_disable_inspect_loggedusers' => 0,
			'hmwp_disable_inspect_roles'       => array( 'subscriber' ),
			'hmwp_disable_inspect_message'     => "Inspect Element is disabled!",

			'hmwp_disable_source'             => 0,
			'hmwp_disable_source_loggedusers' => 0,
			'hmwp_disable_source_roles'       => array( 'subscriber' ),
			'hmwp_disable_source_message'     => "View Source is disabled!",

			'hmwp_disable_copy_paste'             => 0,
			'hmwp_disable_paste'                  => 1,
			'hmwp_disable_copy_paste_loggedusers' => 0,
			'hmwp_disable_copy_paste_roles'       => array( 'subscriber' ),
			'hmwp_disable_copy_paste_message'     => "Copy/Paste is disabled!",

			'hmwp_disable_drag_drop'             => 0,
			'hmwp_disable_drag_drop_loggedusers' => 0,
			'hmwp_disable_drag_drop_roles'       => array( 'subscriber' ),
			'hmwp_disable_drag_drop_message'     => "Drag-n-Drop is disabled!",

			'hmwp_disable_recording'             => 0,
			'hmwp_disable_recording_loggedusers' => 0,
			'hmwp_disable_recording_roles'       => array( 'subscriber' ),
			'hmwp_disable_recording_message'     => "Screen Recording is disabled!",
			//--
			'hmwp_disable_screen_capture'        => 0,
			'hmwp_file_cache'                    => 0,
			'hmwp_url_mapping'                   => json_encode( array() ),
			'hmwp_mapping_classes'               => 1,
			'hmwp_mapping_file'                  => 0,
			'hmwp_text_mapping'                  => json_encode( array(
				'from' => array(),
				'to'   => array(),
			) ),
			'hmwp_cdn_urls'                      => json_encode( array() ),
			'hmwp_security_alert'                => 1,
			//--
			'hmwp_hide_plugins_advanced'         => 0,
			'hmwp_hide_themes_advanced'          => 0,
			//--

			//redirects
			'hmwp_url_redirect'                  => 'NFError',
			'hmwp_do_redirects'                  => 0,
			'hmwp_logged_users_redirect'         => 0,
			'hmwp_url_redirects'                 => array( 'default' => array( 'login' => '', 'logout' => '' ) ),
			'hmwp_signup_template'               => 0,

			'hmwp_mapping_text_show' => 1,
			'hmwp_mapping_url_show'  => 1,
			'hmwp_mapping_cdn_show'  => 1,

		);

		// Set WordPress options when security is disables.
		self::$default = array(
			'hmwp_mode'             => 'default',
			'hmwp_admin_url'        => 'wp-admin',
			'hmwp_login_url'        => 'wp-login.php',
			'hmwp_activate_url'     => 'wp-activate.php',
			'hmwp_lostpassword_url' => '',
			'hmwp_register_url'     => '',
			'hmwp_logout_url'       => '',

			'hmwp_plugin_url'                => $plugin_relative_url,
			'hmwp_plugins'                   => array(),
			'hmwp_themes_url'                => 'themes',
			'hmwp_themes'                    => array(),
			'hmwp_upload_url'                => 'uploads',
			'hmwp_admin-ajax_url'            => 'admin-ajax.php',
			'hmwp_wp-signup_url'             => 'wp-signup.php',
			'hmwp_hideajax_paths'            => 0,
			'hmwp_hideajax_admin'            => 0,
			'hmwp_tags_url'                  => 'tag',
			'hmwp_wp-content_url'            => $content_relative_url,
			'hmwp_wp-includes_url'           => 'wp-includes',
			'hmwp_author_url'                => 'author',
			'hmwp_hide_authors'              => 0,
			'hmwp_wp-comments-post'          => 'wp-comments-post.php',
			'hmwp_themes_style'              => 'style.css',
			'hmwp_hide_img_classes'          => 0,
			'hmwp_hide_styleids'             => 0,
			'hmwp_noncekey'                  => '_wpnonce',
			'hmwp_wp-json'                   => 'wp-json',
			'hmwp_hide_rest_api'             => 0,
			'hmwp_disable_rest_api'          => 0,
			'hmwp_disable_rest_api_param'    => 0,
			'hmwp_disable_xmlrpc'            => 0,
			'hmwp_hide_rsd'                  => 0,
			'hmwp_hide_admin'                => 0,
			'hmwp_hide_newadmin'             => 0,
			'hmwp_hide_admin_loggedusers'    => 0,
			'hmwp_hide_login'                => 0,
			'hmwp_hide_wplogin'              => 0,
			'hmwp_hide_newlogin'             => 0,
			'hmwp_disable_language_switcher' => 0,
			'hmwp_hide_plugins'              => 0,
			'hmwp_hide_all_plugins'          => 0,
			'hmwp_hide_themes'               => 0,
			'hmwp_emulate_cms'               => '',

			//--secure headers
			'hmwp_sqlinjection'              => 0,
			'hmwp_sqlinjection_location'     => 'onload',
			'hmwp_sqlinjection_level'        => 2,
			'hmwp_security_header'           => 0,
			'hmwp_hide_unsafe_headers'       => 0,
			'hmwp_security_headers'          => array(
				"Strict-Transport-Security" => "max-age=15768000;includeSubdomains",
				"Content-Security-Policy"   => "object-src 'none'",
				"X-XSS-Protection"          => "1; mode=block",
			),
			//--
			'hmwp_detectors_block'           => 0,
			'hmwp_hide_commonfiles'          => 0,
			'hmwp_disable_browsing'          => 0,
			'hmwp_hide_oldpaths'             => 0,
			'hmwp_hide_oldpaths_plugins'     => 0,
			'hmwp_hide_oldpaths_themes'      => 0,
			'hmwp_hide_oldpaths_types'       => array( 'css', 'js', 'php', 'txt', 'html' ),
			'hmwp_hide_commonfiles_files'    => array(
				'wp-config-sample.php',
				'readme.html',
				'readme.txt',
				'install.php',
				'license.txt',
				'php.ini',
				'upgrade.php',
				'bb-config.php',
				'error_log'
			),
			//
			'hmwp_category_base'             => '',
			'hmwp_tag_base'                  => '',
			//
		);

		// Set options for "Lite Mode".
		self::$lite = array(
			'hmwp_mode'                      => 'lite',
			'hmwp_login_url'                 => 'newlogin',
			'hmwp_activate_url'              => 'activate',
			'hmwp_lostpassword_url'          => 'lostpass',
			'hmwp_register_url'              => 'register',
			'hmwp_logout_url'                => '',
			'hmwp_admin-ajax_url'            => 'admin-ajax.php',
			'hmwp_hideajax_admin'            => 0,
			'hmwp_hideajax_paths'            => 0,
			'hmwp_plugin_url'                => 'core/modules',
			'hmwp_themes_url'                => 'core/views',
			'hmwp_upload_url'                => 'storage',
			'hmwp_wp-content_url'            => 'core',
			'hmwp_wp-includes_url'           => 'lib',
			'hmwp_author_url'                => 'writer',
			'hmwp_hide_authors'              => 1,
			'hmwp_wp-comments-post'          => 'comments',
			'hmwp_themes_style'              => 'design.css',
			'hmwp_wp-json'                   => 'wp-json',
			'hmwp_hide_admin'                => 1,
			'hmwp_hide_newadmin'             => 0,
			'hmwp_hide_admin_loggedusers'    => 0,
			'hmwp_hide_login'                => 1,
			'hmwp_hide_wplogin'              => 1,
			'hmwp_hide_newlogin'             => 1,
			'hmwp_disable_language_switcher' => 0,
			'hmwp_hide_plugins'              => 1,
			'hmwp_hide_all_plugins'          => 0,
			'hmwp_hide_themes'               => 1,
			'hmwp_emulate_cms'               => 'drupal11',
			//
			'hmwp_hide_img_classes'          => 1,
			'hmwp_hide_rest_api'             => 1,
			'hmwp_disable_rest_api'          => 0,
			'hmwp_disable_rest_api_param'    => 1,
			'hmwp_disable_xmlrpc'            => 1,
			'hmwp_hide_rsd'                  => 1,
			//
			'hmwp_sqlinjection'              => 1,
			'hmwp_security_header'           => 1,
			'hmwp_hide_unsafe_headers'       => 1,
			'hmwp_detectors_block'           => 1,

			//PRO
			'hmwp_hide_styleids'             => 0,
			'hmwp_disable_browsing'          => 0,
			'hmwp_hide_commonfiles'          => 0,
			'hmwp_hide_oldpaths'             => 0,
			'hmwp_hide_oldpaths_plugins'     => 0,
			'hmwp_hide_oldpaths_themes'      => 0,
		);

		// Fetch the options based on whether it's a multisite and merge with defaults.
		if ( self::isMultisites() && defined( 'BLOG_ID_CURRENT_SITE' ) ) {
			$options = json_decode( get_blog_option( BLOG_ID_CURRENT_SITE, $keymeta ), true );
		} else {
			$options = json_decode( get_option( $keymeta ), true );
		}

		// Ensure compatibility with WP Client plugin.
		if ( self::isPluginActive( 'wp-client/wp-client.php' ) ) {
			self::$lite['hmwp_wp-content_url'] = 'include';
		}

		// Merge the options with initial and default values.
		if ( is_array( $options ) ) {
			$options = @array_merge( self::$init, self::$default, $options );
		} else {
			$options = @array_merge( self::$init, self::$default );
		}

		// Validate the custom cache directory and reset if it contains 'wp-content'.
		if ( isset( $options['hmwp_change_in_cache_directory'] ) && $options['hmwp_change_in_cache_directory'] <> '' ) {
			if ( strpos( $options['hmwp_change_in_cache_directory'], 'wp-content' ) !== false ) {
				$options['hmwp_change_in_cache_directory'] = '';
			}
		}

		// Update the whitelist level based on whitelist paths setting.
		if ( isset( $options['whitelist_paths'] ) && ! isset( $options['whitelist_level'] ) ) {
			$options['whitelist_level'] = ( $options['whitelist_paths'] == 1 ? 2 : 1 );
		}

		// Set the category and tag bases considering multisite setup.
		$category_base = get_option( 'category_base' );
		$tag_base      = get_option( 'tag_base' );

		if ( self::isMultisites() && ! is_subdomain_install() && is_main_site() && 0 === strpos( get_option( 'permalink_structure' ), '/blog/' ) ) {
			$category_base = preg_replace( '|^/?blog|', '', $category_base );
			$tag_base      = preg_replace( '|^/?blog|', '', $tag_base );
		}

		$options['hmwp_category_base'] = $category_base;
		$options['hmwp_tag_base']      = $tag_base;

		// Set priority and rewrite rules settings if defined constants are set.
		if ( HMW_PRIORITY ) {
			$options['hmwp_priorityload'] = 1;
		}
		if ( HMW_RULES_IN_WP_RULES ) {
			$options['hmwp_rewrites_in_wp_rules'] = 1;
		}

		// Return the final options array.
		return $options;
	}

	/**
	 * Update the database configuration and options for the plugin.
	 *
	 * This method is called during a plugin update to migrate existing settings and set new defaults.
	 * It handles various tasks such as upgrading from a lite version, migrating specific options,
	 * and initializing default values where necessary.
	 *
	 * @return void
	 */
	private static function updateDatabase() {
		// Check if the plugin version is updated
		if ( self::$options['hmwp_ver'] < HMWP_VERSION_ID ) {

			// Upgrade from Old Version if hmwp_options exist in the database
			if ( get_option( 'hmw_options' ) ) {
				$options = json_decode( get_option( 'hmw_options' ), true );
				// If options are not empty, migrate them to the new format
				if ( ! empty( $options ) ) {
					foreach ( $options as $key => $value ) {
						self::$options[ str_replace( 'hmw_', 'hmwp_', $key ) ] = $value;
					}
				}
				// Delete old options to prevent conflicts
				delete_option( 'hmw_options' );
			}

			// Set default value for hmwp_hide_wplogin if it's not set and hmwp_hide_login is set
			if ( ! isset( self::$options['hmwp_hide_wplogin'] ) && isset( self::$options['hmwp_hide_login'] ) && self::$options['hmwp_hide_login'] ) {
				self::$options['hmwp_hide_wplogin'] = self::$options['hmwp_hide_login'];
			}

			// Initialize the account show option if not set
			if ( ! isset( self::$options['hmwp_plugin_account_show'] ) ) {
				self::$options['hmwp_plugin_account_show'] = 1;
			}

			// Upgrade logout redirect options to the new format
			if ( isset( self::$options['hmwp_logout_redirect'] ) && self::$options['hmwp_logout_redirect'] ) {
				self::$options['hmwp_url_redirects']['default']['logout'] = self::$options['hmwp_logout_redirect'];
				unset( self::$options['hmwp_logout_redirect'] );
			}

			// Upgrade admin toolbar visibility option to the new format
			if ( isset( self::$options['hmwp_in_dashboard'] ) && self::$options['hmwp_in_dashboard'] ) {
				self::$options['hmwp_hide_admin_toolbar'] = self::$options['hmwp_in_dashboard'];
				unset( self::$options['hmwp_in_dashboard'] );
			}

			// Upgrade sitemap visibility option to the new format
			if ( isset( self::$options['hmwp_shutdownload'] ) && self::$options['hmwp_shutdownload'] ) {
				self::$options['hmwp_hide_in_sitemap'] = self::$options['hmwp_shutdownload'];
				unset( self::$options['hmwp_shutdownload'] );
			}

			// Remove old whitelist_paths option
			if ( isset( self::$options['whitelist_paths'] ) ) {
				unset( self::$options['whitelist_paths'] );
			}

			// Update the login paths on Cloud when the plugin is updated
			self::sendLoginPathsApi();

			// Set the current version ID
			self::$options['hmwp_ver'] = HMWP_VERSION_ID;
			// Save updated options
			self::saveOptions();
		}
	}

	/**
	 * Get the default value for a given key
	 *
	 * @param  string  $key  The key for which default value is to be retrieved
	 *
	 * @return mixed The default value associated with the key, or false if the key does not exist
	 * @since 5.0.19
	 */
	public static function getDefault( $key ) {
		if ( isset( self::$default[ $key ] ) ) {
			return self::$default[ $key ];
		}

		return false;

	}

	/**
	 * Retrieve an option value by key.
	 *
	 * @param  string  $key  The key for the option to retrieve.
	 *
	 * @return mixed The value of the option, possibly filtered.
	 */
	public static function getOption( $key ) {
		if ( ! isset( self::$options[ $key ] ) ) {
			self::$options = self::getOptions();

			if ( ! isset( self::$options[ $key ] ) ) {
				self::$options[ $key ] = 0;
			}
		}

		return apply_filters( 'hmwp_option_' . $key, self::$options[ $key ] );
	}

	/**
	 * Save the specified options in the WordPress options table
	 *
	 * @param  string|null  $key  The key of the option to save. If null, no key will be set.
	 * @param  mixed  $value  The value of the option to save.
	 * @param  bool  $safe  Whether to save the option safely or not.
	 *
	 * @return void
	 */
	public static function saveOptions( $key = null, $value = '', $safe = false ) {
		// Default option key
		$keymeta = HMWP_OPTION;

		// Use a different option key if the $safe parameter is true
		if ( $safe ) {
			$keymeta = HMWP_OPTION_SAFE;
		}

		// If a specific key is provided, update the value in the options array
		if ( isset( $key ) ) {
			self::$options[ $key ] = $value;
		}

		// If the site is a multisite and BLOG_ID_CURRENT_SITE is defined
		if ( self::isMultisites() && defined( 'BLOG_ID_CURRENT_SITE' ) ) {
			// Update the option for the current blog in the network
			update_blog_option( BLOG_ID_CURRENT_SITE, $keymeta, json_encode( self::$options ) );
		} else {
			// Otherwise, update the option normally
			update_option( $keymeta, json_encode( self::$options ) );
		}
	}

	/**
	 * Save the current working options into a backup storage.
	 *
	 * @return void
	 */
	public static function saveOptionsBackup() {
		// Save the working options into backup
		foreach ( self::$options as $key => $value ) {
			HMWP_Classes_Tools::saveOptions( $key, $value, true );
		}
	}

	/**
	 * Add a link to settings in the plugin list
	 *
	 * @param  array  $links
	 *
	 * @return array
	 */
	public function hookActionlink( $links ) {
		if ( HMWP_Classes_Tools::userCan( HMWP_CAPABILITY ) ) {
			if ( get_transient( 'hmwp_disable' ) ) {
				$links[] = '<a href="' . esc_url( add_query_arg( array( 'hmwp_nonce' => wp_create_nonce( 'hmwp_pause_disable' ), 'action' => 'hmwp_pause_disable' ) ) ) . '" class="btn btn-default btn-sm mt-3" />' . esc_html__( "Resume Security", 'hide-my-wp' ) . '</a>';
			} else {
				$links[] = '<a href="' . esc_url( add_query_arg( array( 'hmwp_nonce' => wp_create_nonce( 'hmwp_pause_enable' ), 'action' => 'hmwp_pause_enable' ) ) ) . '" class="btn btn-default btn-sm mt-3" />' . esc_html__( "Pause for 5 minutes", 'hide-my-wp' ) . '</a>';
			}
			$links[] = '<a href="' . esc_url( self::getSettingsUrl() ) . '">' . esc_html__( 'Settings', 'hide-my-wp' ) . '</a>';
		}
		$links[] = '<a href="https://hidemywpghost.com/hide-my-wp-pricing/" target="_blank" style="font-weight: bold;color: #007cba">' . esc_html__( 'Go PRO', 'hide-my-wp' ) . '</a>';

		return array_reverse( $links );
	}


	/**
	 * Load the plugin text domain for multilanguage support.
	 *
	 * @return void
	 */
	public static function loadMultilanguage() {
		load_plugin_textdomain( dirname( HMWP_BASENAME ), false, dirname( HMWP_BASENAME ) . '/languages/' );
	}

	/**
	 * Check if it's Rest Api call
	 *
	 * @return bool
	 */
	public static function isApi() {
		if ( isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '/' . HMWP_Classes_Tools::getOption( 'hmwp_wp-json' ) . '/' ) !== false ) {
			return true;
		}

		return false;
	}

	/**
	 * Check if it's Ajax call
	 *
	 * @return bool
	 */
	public static function isAjax() {
		if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
			return true;
		}

		return false;
	}

	/**
	 * Check if it's Cron call
	 *
	 * @return bool
	 */
	public static function isCron() {
		if ( defined( 'DOING_CRON' ) && DOING_CRON ) {
			return true;
		}

		return false;
	}

	/**
	 * Check if it's valid to load firewall on the page
	 *
	 * @return bool
	 */
	public static function doFirewall() {

		//If allways change paths admin & frontend
		if ( defined( 'HMW_ALWAYS_RUN_FIREWALL' ) && HMW_ALWAYS_RUN_FIREWALL ) {
			return true;
		}

		//If firewall process is activated
		if ( ! apply_filters( 'hmwp_process_firewall', true ) ) {
			return false;
		}

		if ( HMWP_Classes_Tools::isApi() ) {
			return false;
		}

		//If not admin
		if ( ! is_admin() && ! is_network_admin() ) {
			//if user is not logged in
			if ( function_exists( 'is_user_logged_in' ) && ! is_user_logged_in() ) {
				return true;
			}

		}

		return false;
	}

	/**
	 * Check if it's valid for changing the paths
	 * Change the paths in admin, logged users or visitors
	 *
	 * @return bool
	 */
	public static function doChangePaths() {

		//If allways change paths admin & frontend
		if ( HMW_ALWAYS_CHANGE_PATHS ) {
			return true;
		}

		if ( HMWP_Classes_Tools::isApi() ) {
			return false;
		}

		//If not admin
		if ( ( ! is_admin() && ! is_network_admin() ) || HMWP_Classes_Tools::isAjax() ) {

			//if process the change paths
			if ( HMWP_Classes_Tools::getOption( 'hmwp_hide_loggedusers' ) || ( function_exists( 'is_user_logged_in' ) && ! is_user_logged_in() ) ) {
				return true;
			}

		}

		return false;
	}

	/**
	 * Check if it's valid for hiding and disable things in site
	 *
	 * @return bool
	 */
	public static function doHideDisable() {

		//Check if is valid for moving on
		if ( ! apply_filters( 'hmwp_process_hide_disable', true ) ) {
			return false;
		}

		if ( self::isCron() ) {
			return false;
		}

		if ( HMWP_Classes_Tools::isAjax() || HMWP_Classes_Tools::isApi() ) {
			return false;
		}

		//If not admin
		if ( ! is_admin() && ! is_network_admin() ) {
			//if process the change paths
			if ( HMWP_Classes_Tools::getOption( 'hmwp_hide_loggedusers' ) || ( function_exists( 'is_user_logged_in' ) && ! is_user_logged_in() ) ) {
				return true;
			}

		}

		return false;
	}

	/**
	 * Check if it's valid for click disabl, source code and inspect element
	 *
	 * @return bool
	 */
	public static function doDisableClick() {

		//Check if is valid for moving on
		if ( ! apply_filters( 'hmwp_process_hide_disable', true ) ) {
			return false;
		}

		if ( self::isCron() ) {
			return false;
		}

		//If not admin
		if ( ! is_admin() && ! is_network_admin() ) {

			if ( function_exists( 'is_user_logged_in' ) && ( HMWP_Classes_Tools::getOption( 'hmwp_disable_click' ) || HMWP_Classes_Tools::getOption( 'hmwp_disable_inspect' ) || HMWP_Classes_Tools::getOption( 'hmwp_disable_source' ) || HMWP_Classes_Tools::getOption( 'hmwp_disable_copy_paste' ) || HMWP_Classes_Tools::getOption( 'hmwp_disable_drag_drop' ) ) ) {

				return true;
			}

		}

		return false;
	}

	/**
	 * Check if the option to hide the URLs is active
	 *
	 * @return bool
	 */
	public static function doHideURLs() {

		//Check if is valid for moving on
		if ( ! apply_filters( 'hmwp_process_hide_urls', true ) ) {
			return false;
		}

		//make sure the function is loaded
		if ( ! function_exists( 'is_user_logged_in' ) ) {
			include_once ABSPATH . WPINC . '/pluggable.php';
		}

		if ( ! isset( $_SERVER['REQUEST_URI'] ) ) {
			return false;
		}

		if ( self::isCron() ) {
			return false;
		}

		return true;
	}


	/**
	 * Get the plugin settings URL
	 *
	 * @param  string  $page
	 * @param  string  $relative
	 *
	 * @return string
	 */
	public static function getSettingsUrl( $page = 'hmwp_settings', $relative = false ) {
		if ( $relative ) {
			return 'admin.php?page=' . $page;
		} else {
			if ( ! self::isMultisites() ) {
				return admin_url( 'admin.php?page=' . $page );
			} else {
				return network_admin_url( 'admin.php?page=' . $page );
			}
		}
	}

	public static function getCloudUrl( $page = 'login' ) {
		return _HMWP_ACCOUNT_SITE_ . '/user/auth/' . $page;
	}

	/**
	 * Get the config file for WordPress
	 *
	 * @return string
	 */
	public static function getConfigFile() {

		//Initialize WordPress Filesystem
		$wp_filesystem = HMWP_Classes_ObjController::initFilesystem();

		if ( $wp_filesystem->exists( self::getRootPath() . 'wp-config.php' ) ) {
			return self::getRootPath() . 'wp-config.php';
		}

		if ( $wp_filesystem->exists( dirname( ABSPATH ) . '/wp-config.php' ) ) {
			return dirname( ABSPATH ) . '/wp-config.php';
		}

		return false;
	}

	/**
	 * Set the header type
	 *
	 * @param  string  $type
	 */
	public static function setHeader( $type ) {
		switch ( $type ) {
			case 'json':
				header( 'Content-Type: application/json' );
				break;
			case 'html':
				header( "Content-type: text/html" );
				break;
			case 'text':
				header( "Content-type: text/plain" );
				break;
		}
	}

	/**
	 * Get a value from $_POST / $_GET
	 * if unavailable, take a default value
	 *
	 * @param  string  $key  Value key
	 * @param  boolean  $keep_newlines  Keep the new lines in variable in case of texareas
	 * @param  mixed  $defaultValue  (optional)
	 *
	 * @return array|false|string Value
	 */
	public static function getValue( $key = null, $defaultValue = false, $keep_newlines = false ) {
		if ( ! isset( $key ) || $key == '' ) {
			return false;
		}

		//Get the parameters based on the form method
		//Sanitize each parameter based on the parameter type
		$ret = ( isset( $_POST[ $key ] ) ? $_POST[ $key ] : ( isset( $_GET[ $key ] ) ? $_GET[ $key ] : $defaultValue ) );

		if ( is_string( $ret ) === true ) {
			if ( $keep_newlines === false ) {
				//Validate the param based on its type
				if ( in_array( $key, array( 'hmwp_email_address', 'hmwp_email', 'whitelist_ip', 'banlist_ip' ) ) ) { //validate email address
					$ret = preg_replace( '/[^A-Za-z0-9-_.+*#:~@\!\'\/]/', '', $ret );
				} elseif ( in_array( $key, array( 'hmwp_disable_name' ) ) ) { //validate url parameter
					$ret = preg_replace( '/[^A-Za-z0-9-_]/', '', $ret );
				} elseif ( in_array( $key, array( 'hmwp_admin_url' ) ) ) { //validate url parameter
					$ret = preg_replace( '/[^A-Za-z0-9-_.]/', '', $ret );
				} else {
					$ret = preg_replace( '/[^A-Za-z0-9-_.\/]/', '', $ret ); //validate fields
				}
				//Sanitize the text field
				$ret = sanitize_text_field( $ret );

			} else {

				//Validate the text areas
				$ret = preg_replace( '/[^A-Za-z0-9-_.+*#:~\!\'\n\r\s\/]@/', '', $ret );

				//Sanitize the textarea
				if ( function_exists( 'sanitize_textarea_field' ) ) {
					$ret = sanitize_textarea_field( $ret );
				}
			}
		}

		//Return the unsplas validated and sanitized value
		return wp_unslash( $ret );
	}

	/**
	 * Check if the parameter is set
	 *
	 * @param  string  $key
	 *
	 * @return boolean
	 */
	public static function getIsset( $key = null ) {
		if ( ! isset( $key ) || $key == '' ) {
			return false;
		}

		return isset( $_POST[ $key ] ) || isset( $_GET[ $key ] );
	}

	/**
	 * Show the notices to WP
	 *
	 * @param  string  $message
	 * @param  string  $type
	 *
	 * @return string
	 */
	public static function showNotices( $message, $type = '' ) {

		//Initialize WordPress Filesystem
		$wp_filesystem = HMWP_Classes_ObjController::initFilesystem();

		if ( $wp_filesystem->exists( _HMWP_THEME_DIR_ . 'Notices.php' ) ) {
			ob_start();
			include _HMWP_THEME_DIR_ . 'Notices.php';
			$message = ob_get_contents();
			ob_end_clean();
		}

		return $message;
	}

	/**
	 * Connect remote with wp_remote_get
	 *
	 * @param $url
	 * @param  array  $params
	 * @param  array  $options
	 *
	 * @return bool|string
	 */
	public static function hmwp_remote_get( $url, $params = array(), $options = array() ) {

		$parameters = '';
		if ( ! empty( $params ) ) {
			foreach ( $params as $key => $value ) {
				if ( $key <> '' ) {
					$parameters .= ( $parameters == "" ? "" : "&" ) . $key . "=" . $value;
				}
			}

			if ( $parameters <> '' ) {
				$url .= ( ( strpos( $url, "?" ) === false ) ? "?" : "&" ) . $parameters;
			}
		}

		$response = self::hmwp_wpcall( $url, $params, $options );

		if ( is_wp_error( $response ) ) {
			return false;
		}

		return self::cleanResponce( wp_remote_retrieve_body( $response ) ); //clear and get the body

	}


	/**
	 * Connect remote with wp_remote_get
	 *
	 * @param $url
	 * @param  array  $params
	 * @param  array  $options
	 *
	 * @return bool|string
	 */
	public static function hmwp_remote_post( $url, $params = array(), $options = array() ) {
		$options['method'] = 'POST';

		$response = self::hmwp_wpcall( $url, $params, $options );

		if ( is_wp_error( $response ) ) {
			return false;
		}

		return self::cleanResponce( wp_remote_retrieve_body( $response ) ); //clear and get the body

	}

	/**
	 * Use the WP remote call
	 *
	 * @param  string  $url
	 * @param  array  $params
	 * @param  array  $options
	 *
	 * @return array|WP_Error The response or WP_Error on failure.
	 */
	public static function hmwp_wpcall( $url, $params, $options ) {
		//predefined options
		$options = array_replace_recursive( array(
			'sslverify' => _HMWP_CHECK_SSL_,
			'method'    => 'GET',
			'timeout'   => 30,
			'headers'   => array(
				'TOKEN'     => HMWP_Classes_Tools::getOption( 'hmwp_token' ),
				'API-TOKEN' => HMWP_Classes_Tools::getOption( 'api_token' ),
				'USER-URL'  => home_url(),
				'LANG'      => get_bloginfo( 'language' ),
				'VER'       => HMWP_VERSION
			)
		), $options );

		if ( $options['method'] == 'POST' ) {

			$options['body'] = $params;
			unset( $options['method'] );
			$response = wp_remote_post( $url, $options );
		} else {

			unset( $options['method'] );
			$response = wp_remote_get( $url, $options );

		}

		if ( is_wp_error( $response ) ) {
			//For debugging
			do_action( 'hmwp_debug_request', $url, $options, $response );
		}

		return $response;
	}

	/**
	 * Call the local URLs for Security Check
	 *
	 * @param $url
	 * @param $options
	 *
	 * @return array|WP_Error
	 */
	public static function hmwp_localcall( $url, $options = array() ) {
		//predefined options
		$options = array_merge( array(
			'sslverify' => false,
			'timeout'   => 10,
		), $options );

		$response = wp_remote_get( $url, $options );

		if ( is_wp_error( $response ) ) {
			//For debugging
			do_action( 'hmwp_debug_local_request', $url, $options, $response );
		}

		return $response;
	}

	/**
	 * Get the Json from responce if any
	 *
	 * @param  string  $response
	 *
	 * @return string
	 */
	private static function cleanResponce( $response ) {
		return trim( $response, '()' );
	}

	/**
	 * Check if HTML Headers to prevent chenging the code for other file extension
	 *
	 * @param  array  $types
	 *
	 * @return bool
	 * @throws Exception
	 */
	public static function isContentHeader( $types = array( 'text/html', 'text/xml' ) ) {
		$headers = headers_list();

		//check the Content Type
		if ( ! empty( $headers ) && ! empty( $types ) ) {
			foreach ( $headers as $value ) {
				if ( strpos( $value, ':' ) !== false ) {
					if ( stripos( $value, 'Content-Type' ) !== false ) {

						foreach ( $types as $type ) {
							if ( stripos( $value, $type ) !== false ) {
								return true;
							}
						}

						return false;

					}
				}
			}
		}

		return false;
	}


	/**
	 * Returns true if server is Apache
	 *
	 * @return boolean
	 */
	public static function isApache() {
		global $is_apache;

		//If custom defined
		if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) <> 'auto' ) {
			return in_array( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ), array(
				'apache',
				'litespeed',
				'siteground'
			) );
		}

		//If custom defined
		if ( defined( 'HMWP_SERVER_TYPE' ) && strtolower( HMWP_SERVER_TYPE ) == 'apache' ) {
			return true;
		}

		if ( self::isFlywheel() ) { //force Nginx on Flywheel server
			return false;
		}

		return $is_apache;
	}

	/**
	 * Check if mode rewrite is on
	 *
	 * @return bool
	 */
	public static function isModeRewrite() {
		if ( function_exists( 'apache_get_modules' ) ) {
			$modules = apache_get_modules();
			if ( ! empty( $modules ) ) {
				return in_array( 'mod_rewrite', $modules );
			}
		}

		return true;
	}

	/**
	 * Check whether server is LiteSpeed
	 *
	 * @return bool
	 */
	public static function isLitespeed() {
		$litespeed = false;

		//If custom defined
		if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) <> 'auto' ) {
			return ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) == 'litespeed' );
		}

		//If custom defined
		if ( defined( 'HMWP_SERVER_TYPE' ) && strtolower( HMWP_SERVER_TYPE ) == 'litespeed' ) {
			return true;
		}

		if ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stripos( $_SERVER['SERVER_SOFTWARE'], 'LiteSpeed' ) !== false ) {
			$litespeed = true;
		} elseif ( isset( $_SERVER['SERVER_NAME'] ) && stripos( $_SERVER['SERVER_NAME'], 'LiteSpeed' ) !== false ) {
			$litespeed = true;
		} elseif ( isset( $_SERVER['X-Litespeed-Cache-Control'] ) ) {
			$litespeed = true;
		}

		if ( self::isFlywheel() ) {
			return false;
		}

		return $litespeed;
	}

	/**
	 * Check whether server is Lighthttp
	 *
	 * @return bool
	 */
	public static function isLighthttp() {
		return ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stripos( $_SERVER['SERVER_SOFTWARE'], 'lighttpd' ) !== false );
	}

	/**
	 * Check whether server is AWS StoreFront Bitnami
	 *
	 * @return bool
	 */
	public static function isAWS() {
		//If custom defined
		if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) <> 'auto' ) {
			return ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) == 'bitnami' );
		}

		if ( isset( $_SERVER["DOCUMENT_ROOT"] ) && strpos( $_SERVER["DOCUMENT_ROOT"], "/bitnami/" ) ) {
			return true;
		}

		$headers = headers_list();

		foreach ( $headers as $header ) {
			if ( strpos( $header, 'x-amz-cf-id' ) !== false ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Check if multisites
	 *
	 * @return bool
	 */
	public static function isMultisites() {
		return is_multisite();
	}

	/**
	 * Check if multisites with path
	 *
	 * @return bool
	 */
	public static function isMultisiteWithPath() {
		return ( is_multisite() && ( ( defined( 'SUBDOMAIN_INSTALL' ) && ! SUBDOMAIN_INSTALL ) || ( defined( 'VHOST' ) && VHOST == 'no' ) ) );
	}

	/**
	 * Returns true if server is nginx
	 *
	 * @return boolean
	 */
	public static function isNginx() {
		global $is_nginx;

		//If custom defined
		if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) <> 'auto' ) {
			if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) == 'nginx' ) {
				return true;
			}
		}

		//If custom defined
		if ( defined( 'HMWP_SERVER_TYPE' ) && strtolower( HMWP_SERVER_TYPE ) == 'nginx' ) {
			return true;
		}

		return ( $is_nginx || ( isset( $_SERVER['SERVER_SOFTWARE'] ) && ( stripos( $_SERVER['SERVER_SOFTWARE'], 'nginx' ) !== false || stripos( $_SERVER['SERVER_SOFTWARE'], 'TasteWP' ) !== false ) ) );
	}

	/**
	 * Returns true if server is Wpengine
	 *
	 * @return boolean
	 */
	public static function isWpengine() {
		//If custom defined
		if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) <> 'auto' ) {
			return ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) == 'wpengine' );
		}

		//If custom defined
		if ( defined( 'HMWP_SERVER_TYPE' ) && strtolower( HMWP_SERVER_TYPE ) == 'wpengine' ) {
			return true;
		}

		return ( isset( $_SERVER['WPENGINE_PHPSESSIONS'] ) );
	}

	/**
	 * Returns true if server is Local by Flywheel
	 *
	 * @return boolean
	 */
	public static function isLocalFlywheel() {

		//If custom defined
		if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) <> 'auto' ) {
			return ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) == 'local' );
		}

		return false;
	}

	/**
	 * Returns true if server is Wpengine
	 *
	 * @return boolean
	 */
	public static function isFlywheel() {

		//If custom defined
		if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) <> 'auto' ) {
			return ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) == 'flywheel' );
		}

		//If custom defined
		if ( defined( 'HMWP_SERVER_TYPE' ) && strtolower( HMWP_SERVER_TYPE ) == 'flywheel' ) {
			return true;
		}

		if ( isset( $_SERVER['SERVER'] ) && stripos( $_SERVER['SERVER'], 'Flywheel' ) !== false ) {
			return true;
		}

		return ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stripos( $_SERVER['SERVER_SOFTWARE'], 'Flywheel' ) !== false );
	}

	/**
	 * Returns true if server is Inmotion
	 *
	 * @return boolean
	 */
	public static function isInmotion() {

		//If custom defined
		if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) <> 'auto' ) {
			return ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) == 'inmotion' );
		}

		//If custom defined
		if ( defined( 'HMWP_SERVER_TYPE' ) && strtolower( HMWP_SERVER_TYPE ) == 'inmotion' ) {
			return true;
		}

		return ( isset( $_SERVER['SERVER_ADDR'] ) && stripos( @gethostbyaddr( $_SERVER['SERVER_ADDR'] ), 'inmotionhosting.com' ) !== false );
	}

	/**
	 * Returns true if server is Godaddy
	 *
	 * @return boolean
	 */
	public static function isGodaddy() {

		//If custom defined
		if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) <> 'auto' ) {
			return ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) == 'godaddy' );
		}

		//If custom defined
		if ( defined( 'HMWP_SERVER_TYPE' ) && strtolower( HMWP_SERVER_TYPE ) == 'godaddy' ) {
			return true;
		}

		return ( file_exists( ABSPATH . 'gd-config.php' ) );
	}

	/**
	 * Returns true if server is IIS
	 *
	 * @return boolean
	 */
	public static function isIIS() {
		global $is_IIS, $is_iis7;

		//If custom defined
		if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) <> 'auto' ) {
			return ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) == 'iis' );
		}

		//If custom defined
		if ( defined( 'HMWP_SERVER_TYPE' ) && strtolower( HMWP_SERVER_TYPE ) == 'iis' ) {
			return true;
		}

		return ( $is_iis7 || $is_IIS || ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stripos( $_SERVER['SERVER_SOFTWARE'], 'microsoft-iis' ) !== false ) );
	}

	/**
	 * Returns true if windows
	 *
	 * @return bool
	 */
	public static function isWindows() {
		return ( strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN' );
	}

	/**
	 * Check if IIS has rewritten 2 structure enabled
	 *
	 * @return bool
	 */
	public static function isPHPPermalink() {
		if ( get_option( 'permalink_structure' ) ) {
			if ( strpos( get_option( 'permalink_structure' ), 'index.php' ) !== false || stripos( get_option( 'permalink_structure' ), 'index.html' ) !== false || strpos( get_option( 'permalink_structure' ), 'index.htm' ) !== false ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns true if server is Godaddy
	 *
	 * @return boolean
	 */
	public static function isCloudPanel() {

		global $is_nginx;

		//If custom defined
		if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) <> 'auto' ) {
			if ( HMWP_Classes_Tools::getOption( 'hmwp_server_type' ) == 'cloudpanel' ) {
				$is_nginx = true;

				return true;
			}
		}

		return false;
	}

	/**
	 * Is a cache plugin installed in WordPress?
	 *
	 * @return bool
	 */
	public static function isCachePlugin() {
		return ( HMWP_Classes_Tools::isPluginActive( 'autoptimize/autoptimize.php' ) || HMWP_Classes_Tools::isPluginActive( 'beaver-builder-lite-version/fl-builder.php' ) || HMWP_Classes_Tools::isPluginActive( 'beaver-builder/fl-builder.php' ) || HMWP_Classes_Tools::isPluginActive( 'breeze/breeze.php' ) || HMWP_Classes_Tools::isPluginActive( 'cache-enabler/cache-enabler.php' ) || HMWP_Classes_Tools::isPluginActive( 'comet-cache/comet-cache.php' ) || HMWP_Classes_Tools::isPluginActive( 'hummingbird-performance/wp-hummingbird.php' ) || HMWP_Classes_Tools::isPluginActive( 'hyper-cache/plugin.php' ) || HMWP_Classes_Tools::isPluginActive( 'jch-optimize/jch-optimize.php' ) || HMWP_Classes_Tools::isPluginActive( 'litespeed-cache/litespeed-cache.php' ) || HMWP_Classes_Tools::isPluginActive( 'powered-cache/powered-cache.php' ) || HMWP_Classes_Tools::isPluginActive( 'sg-cachepress/sg-cachepress.php' ) || HMWP_Classes_Tools::isPluginActive( 'w3-total-cache/w3-total-cache.php' ) || HMWP_Classes_Tools::isPluginActive( 'wp-asset-clean-up/wpacu.php' ) || HMWP_Classes_Tools::isPluginActive( 'wp-fastest-cache/wpFastestCache.php' ) || HMWP_Classes_Tools::isPluginActive( 'wp-rocket/wp-rocket.php' ) || HMWP_Classes_Tools::isPluginActive( 'wp-super-cache/wp-cache.php' ) || HMWP_Classes_Tools::isPluginActive( 'swift-performance/performance.php' ) || HMWP_Classes_Tools::isPluginActive( 'swift-performance-lite/performance.php' ) || HMWP_Classes_Tools::isPluginActive( 'nitropack/main.php' ) || WP_CACHE );
	}

	/**
	 * Check whether the plugin is active by checking the active_plugins list.
	 *
	 * @source wp-admin/includes/plugin.php
	 *
	 * @param  string  $plugin  Plugin folder/main file.
	 *
	 * @return boolean
	 */
	public static function isPluginActive( $plugin ) {

		if ( empty( self::$active_plugins ) ) {

			if ( self::isMultisites() ) {

				if ( ! $sitewide_plugins = get_site_option( 'active_sitewide_plugins' ) ) {
					$sitewide_plugins = array();
				}

				self::$active_plugins = array_keys( $sitewide_plugins );

				$sites = get_sites( array( 'number' => 10000, 'public' => 1, 'deleted' => 0, ) );
				foreach ( $sites as $site ) {
					switch_to_blog( $site->blog_id );

					$active_plugins = (array) get_option( 'active_plugins', array() );

					self::$active_plugins = array_merge( self::$active_plugins, $active_plugins );

					restore_current_blog();
				}

				if ( ! empty( self::$active_plugins ) ) {
					self::$active_plugins = array_unique( self::$active_plugins );
				}

			} else {
				self::$active_plugins = (array) get_option( 'active_plugins', array() );
			}

		}

		return in_array( $plugin, self::$active_plugins, true );
	}

	/**
	 * Check whether the theme is active.
	 *
	 * @param  string  $name  Theme folder/main file.
	 *
	 * @return boolean
	 */
	public static function isThemeActive( $name ) {
		$theme = get_option( 'template' );

		if ( $theme ) {
			if ( strtolower( $theme ) == strtolower( $name ) || strtolower( $theme ) == strtolower( $name ) . ' child' || strtolower( $theme ) == strtolower( $name ) . ' child theme' ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Get all the plugin names
	 *
	 * @return array
	 */
	public static function getAllPlugins() {
		// Check if the HMWP option to hide all plugins is enabled
		if ( HMWP_Classes_Tools::getOption( 'hmwp_hide_all_plugins' ) ) {
			// Ensure the get_plugins() function is included before use
			if ( ! function_exists( 'get_plugins' ) ) {
				include_once ABSPATH . 'wp-admin/includes/plugin.php';
			}

			// Retrieve all plugin file paths from WordPress
			$all_plugins = array_keys( get_plugins() );
		} else {
			// Retrieve only the active plugins from WordPress options
			$all_plugins = (array) get_option( 'active_plugins', array() );
		}

		// Check if WordPress is running as a multisite
		if ( self::isMultisites() ) {
			// Merge active plugins with any sitewide active plugins
			$all_plugins = array_merge( array_values( $all_plugins ), array_keys( get_site_option( 'active_sitewide_plugins' ) ) );
		}

		// Remove duplicate entries from the plugins array
		if ( ! empty( $all_plugins ) ) {
			$all_plugins = array_unique( $all_plugins );
		}

		return $all_plugins;
	}

	/**
	 * Get all the themes names
	 *
	 * @return array
	 */
	public static function getAllThemes() {
		return search_theme_directories();
	}

	/**
	 * Get the absolute filesystem path to the root of the WordPress installation
	 *
	 * @return string Full filesystem path to the root of the WordPress installation
	 */
	public static function getRootPath() {
		$root_path = ABSPATH;

		if ( defined( '_HMWP_CONFIGPATH' ) ) {
			$root_path = _HMWP_CONFIGPATH;
		} elseif ( self::isFlywheel() && defined( 'WP_CONTENT_DIR' ) && dirname( WP_CONTENT_DIR ) ) {
			$root_path = str_replace( '\\', '/', dirname( WP_CONTENT_DIR ) ) . '/';
		}

		return apply_filters( 'hmwp_root_path', $root_path );

	}

	/**
	 * Get the absolute filesystem path to the root of the WordPress installation
	 *
	 * @return string Full filesystem path to the root of the WordPress installation
	 */
	public static function getHomeRootPath() {
		$home_root = '/';
		if ( HMWP_Classes_Tools::isMultisites() && defined( 'PATH_CURRENT_SITE' ) ) {
			$path = PATH_CURRENT_SITE;
		} else {
			$path = wp_parse_url( site_url(), PHP_URL_PATH );
		}

		if ( $path ) {
			$home_root = trailingslashit( $path );
		}

		return apply_filters( 'hmwp_home_root', $home_root );
	}

	/**
	 * Get Relative path for the current blog in case of WP Multisite
	 *
	 * @param $url
	 *
	 * @return string
	 */
	public static function getRelativePath( $url ) {

		if ( $url <> '' ) {
			// Get the relative url path
			$url = wp_make_link_relative( $url );

			// Get the relative domain
			$domain = site_url();

			// f WP Multisite, get the root domain
			if ( self::isMultisiteWithPath() ) {
				$domain = network_site_url();
			}

			// Get relative path and exclude any root domain from URL
			if($domain = wp_make_link_relative( trim($domain , '/') )){
				$url = str_replace( $domain, '', $url );
			}

			//remove the domain path if exists
			if ( self::isMultisiteWithPath() && defined( 'PATH_CURRENT_SITE' ) && PATH_CURRENT_SITE <> '/' ) {
				$url = str_replace( rtrim( PATH_CURRENT_SITE, '/' ), '', $url );
			}
		}

		return trailingslashit( $url );
	}

	/**
	 * Check if wp-content is changed and set in a different location
	 *
	 * @ver 7.0.12
	 *
	 * @return bool
	 */
	public static function isDifferentWPContentPath() {
		$homepath = '';
		if ( wp_parse_url( site_url(), PHP_URL_PATH ) ) {
			$homepath = ltrim( wp_parse_url( site_url(), PHP_URL_PATH ), '/' );
		}

		if ( $homepath <> '/' ) {
			$contenturl = ltrim( wp_parse_url( content_url(), PHP_URL_PATH ), '/' );

			return ( strpos( $contenturl, $homepath . '/' ) === false );
		}

		return false;
	}

	/**
	 * Empty the cache from other cache plugins when save the settings
	 */
	public static function emptyCache() {

		try {
			//Empty WordPress rewrites count for 404 error.
			//This happens when the rules are not saved through config file
			HMWP_Classes_Tools::saveOptions( 'file_mappings', array() );

			//For debugging
			do_action( 'hmwp_debug_cache', '' );

			if ( class_exists( '\FlyingPress\Purge' ) && method_exists( '\FlyingPress\Purge', 'purge_everything' ) ) {
				\FlyingPress\Purge::purge_everything();
			}

			if ( class_exists( '\JchOptimize\Platform\Cache' ) && method_exists( '\JchOptimize\Platform\Cache', 'deleteCache' ) ) {
				\JchOptimize\Platform\Cache::deleteCache();
			}

			//////////////////////////////////////////////////////////////////////////////
			if ( function_exists( 'w3tc_pgcache_flush' ) ) {
				w3tc_pgcache_flush();
			}

			if ( function_exists( 'w3tc_minify_flush' ) ) {
				w3tc_minify_flush();
			}
			if ( function_exists( 'w3tc_dbcache_flush' ) ) {
				w3tc_dbcache_flush();
			}
			if ( function_exists( 'w3tc_objectcache_flush' ) ) {
				w3tc_objectcache_flush();
			}
			//////////////////////////////////////////////////////////////////////////////

			if ( function_exists( 'wp_cache_clear_cache' ) ) {
				wp_cache_clear_cache();
			}

			if ( function_exists( 'rocket_clean_domain' ) && function_exists( 'rocket_clean_minify' ) && function_exists( 'rocket_clean_cache_busting' ) ) {
				// Remove all cache files
				rocket_clean_domain();
				rocket_clean_minify();
				rocket_clean_cache_busting();
			}
			//////////////////////////////////////////////////////////////////////////////

			if ( function_exists( 'apc_clear_cache' ) ) {
				// Remove all apc if enabled
				apc_clear_cache();
			}
			//////////////////////////////////////////////////////////////////////////////

			if ( class_exists( 'Cache_Enabler_Disk' ) && method_exists( 'Cache_Enabler_Disk', 'clear_cache' ) ) {
				// clear disk cache
				Cache_Enabler_Disk::clear_cache();
			}
			//////////////////////////////////////////////////////////////////////////////
			if ( self::isPluginActive( 'litespeed-cache/litespeed-cache.php' ) ) {
				header( "X-LiteSpeed-Purge: *" );
			}
			//////////////////////////////////////////////////////////////////////////////

			if ( self::isPluginActive( 'hummingbird-performance/wp-hummingbird.php' ) ) {
				do_action( 'wphb_clear_page_cache' );
			}
			//////////////////////////////////////////////////////////////////////////////

			if ( class_exists( 'WpeCommon' ) ) {
				if ( method_exists( 'WpeCommon', 'purge_memcached' ) ) {
					WpeCommon::purge_memcached();
				}
				if ( method_exists( 'WpeCommon', 'clear_maxcdn_cache' ) ) {
					WpeCommon::clear_maxcdn_cache();
				}
				if ( method_exists( 'WpeCommon', 'purge_varnish_cache' ) ) {
					WpeCommon::purge_varnish_cache();
				}
			}
			//////////////////////////////////////////////////////////////////////////////

			if ( self::isPluginActive( 'sg-cachepress/sg-cachepress.php' ) && class_exists( 'Supercacher' ) ) {
				if ( method_exists( 'Supercacher', 'purge_cache' ) && method_exists( 'Supercacher', 'delete_assets' ) ) {
					Supercacher::purge_cache();
					Supercacher::delete_assets();
				}
			}

			//Clear the fastest cache
			global $wp_fastest_cache;
			if ( isset( $wp_fastest_cache ) && method_exists( $wp_fastest_cache, 'deleteCache' ) ) {
				$wp_fastest_cache->deleteCache();
			}
			//////////////////////////////////////////////////////////////////////////////
		} catch ( Exception $e ) {
			// handle exception
		}

	}

	/**
	 * Flush the WordPress rewrites
	 */
	public static function flushWPRewrites() {
		if ( HMWP_Classes_Tools::isPluginActive( 'woocommerce/woocommerce.php' ) ) {
			update_option( 'woocommerce_queue_flush_rewrite_rules', 'yes' );
		}

	}

	/**
	 * Called on plugin activation
	 *
	 * @throws Exception
	 */
	public function hmwp_activate() {
		set_transient( 'hmwp_activate', true );

		//set restore settings option on plugin activate
		$lastsafeoptions = self::getOptions( true );
		if ( isset( $lastsafeoptions['hmwp_mode'] ) && ( $lastsafeoptions['hmwp_mode'] == 'ninja' || $lastsafeoptions['hmwp_mode'] == 'lite' ) ) {
			set_transient( 'hmwp_restore', true );
		}

		//Initialize the compatibility with other plugins
		HMWP_Classes_ObjController::getClass( 'HMWP_Models_Compatibility' )->install();
	}

	/**
	 * Called on plugin deactivation
	 * Remove all the rewrite rules on deactivation
	 *
	 * @throws Exception
	 */
	public function hmwp_deactivate() {
		$options = self::$default;
		//Prevent duplicates
		foreach ( $options as $key => $value ) {
			//set the default params from tools
			self::saveOptions( $key, $value );
		}

		//remove the custom rules
		HMWP_Classes_ObjController::getClass( 'HMWP_Models_Rules' )->writeToFile( '', 'HMWP_VULNERABILITY' );
		HMWP_Classes_ObjController::getClass( 'HMWP_Models_Rules' )->writeToFile( '', 'HMWP_RULES' );

		//clear the locked ips
		HMWP_Classes_ObjController::getClass( 'HMWP_Controllers_Brute' )->clearBlockedIPs();

		//Build the redirect table
		HMWP_Classes_ObjController::getClass( 'HMWP_Models_Rewrite' )->flushChanges();

		//Delete the compatibility with other plugins
		HMWP_Classes_ObjController::getClass( 'HMWP_Models_Compatibility' )->uninstall();
	}

	/**
	 * Call this function on rewrite update from other plugins
	 *
	 * @param  array  $wp_rules
	 *
	 * @return array
	 * @throws Exception
	 */
	public function checkRewriteUpdate( $wp_rules = array() ) {
		try {
			if ( ! HMWP_Classes_Tools::getOption( 'error' ) && ! HMWP_Classes_Tools::getOption( 'logout' ) ) {

				//Build the redirect table
				HMWP_Classes_ObjController::getClass( 'HMWP_Models_Rewrite' )->clearRedirect()->setRewriteRules()->flushRewrites();

				//INSERT SEURITY RULES
				if ( ! HMWP_Classes_Tools::isIIS() ) {
					//For Nginx and Apache the rules can be inserted separately
					$rules = HMWP_Classes_ObjController::getClass( 'HMWP_Models_Rules' )->getInjectionRewrite();

					HMWP_Classes_ObjController::getClass( 'HMWP_Models_Rules' )->writeToFile( $rules, 'HMWP_VULNERABILITY' );

				}
			}

		} catch ( Exception $e ) {

		}

		return $wp_rules;
	}

	/**
	 * Check if new themes or plugins are added in WordPress
	 */
	public function checkPluginsThemesUpdates() {

		try {
			//Check if tere are plugins added to website
			if ( HMWP_Classes_Tools::getOption( 'hmwp_hide_plugins' ) ) {
				$all_plugins = HMWP_Classes_Tools::getAllPlugins();
				$dbplugins   = HMWP_Classes_Tools::getOption( 'hmwp_plugins' );
				foreach ( $all_plugins as $plugin ) {
					if ( function_exists( 'is_plugin_active' ) && is_plugin_active( $plugin ) && isset( $dbplugins['from'] ) && ! empty( $dbplugins['from'] ) ) {
						if ( ! in_array( plugin_dir_path( $plugin ), $dbplugins['from'] ) ) {
							HMWP_Classes_Tools::saveOptions( 'changes', true );
						}
					}
				}
			}

			//Check if there are themes added to website
			if ( HMWP_Classes_Tools::getOption( 'hmwp_hide_themes' ) ) {

				//Initialize WordPress Filesystem
				$wp_filesystem = HMWP_Classes_ObjController::initFilesystem();

				$all_themes = HMWP_Classes_Tools::getAllThemes();
				$dbthemes   = HMWP_Classes_Tools::getOption( 'hmwp_themes' );
				foreach ( $all_themes as $theme => $value ) {
					if ( $wp_filesystem->is_dir( $value['theme_root'] ) && isset( $dbthemes['from'] ) && ! empty( $dbthemes['from'] ) ) {
						if ( ! in_array( $theme . '/', $dbthemes['from'] ) ) {
							HMWP_Classes_Tools::saveOptions( 'changes', true );
						}
					}
				}
			}

			//If there are changed (new plugins, new themes)
			if ( self::getOption( 'changes' ) ) {
				//Initialize the compatibility with other plugins
				HMWP_Classes_ObjController::getClass( 'HMWP_Models_Compatibility' )->install();
			}
		} catch ( Exception $e ) {

		}
	}

	/**
	 * Send the login URL to Cloud for this URL
	 *
	 * @return void
	 */
	public static function sendLoginPathsApi() {

		if ( HMWP_Classes_Tools::getOption( 'api_token' ) ) {

			$domain  = ( self::isMultisites() && defined( 'BLOG_ID_CURRENT_SITE' ) ) ? get_home_url( BLOG_ID_CURRENT_SITE ) : home_url();
			$options = array( 'timeout' => 10, 'headers' => array( 'USER-URL' => $domain ) );

			$login = array(
				'path'      => HMWP_Classes_Tools::getOption( 'hmwp_login_url' ),
				'parameter' => HMWP_Classes_Tools::getOption( 'hmwp_disable_name' ),
				'value'     => HMWP_Classes_Tools::getOption( 'hmwp_disable' ),
			);

			self::hmwp_remote_post( _HMWP_API_SITE_ . '/api/settings', array(
				'login' => wp_json_encode( $login ),
				'url'   => $domain
			), $options );
		}
	}

	/**
	 * Call Account API Server
	 *
	 * @param  string  $email
	 * @param  string  $redirect_to
	 *
	 * @return array|mixed|void
	 */
	public static function checkAccountApi( $email = null, $redirect_to = '' ) {

		$check   = array();
		$monitor = HMWP_Classes_Tools::getValue( 'hmwp_monitor', 0 );
		$domain  = ( self::isMultisites() && defined( 'BLOG_ID_CURRENT_SITE' ) ) ? get_home_url( BLOG_ID_CURRENT_SITE ) : home_url();

		if ( isset( $email ) && $email <> '' ) {
			$args     = array(
				'email'        => $email,
				'url'          => $domain,
				'howtolessons' => 1,
				'monitor'      => (int) $monitor,
				'source'       => 'hide-my-wp'
			);
			$response = HMWP_Classes_Tools::hmwp_remote_get( _HMWP_API_SITE_ . '/api/free/token', $args, array( 'timeout' => 10 ) );
		} elseif ( HMWP_Classes_Tools::getOption( 'hmwp_token' ) ) {
			$args     = array(
				'token'        => self::getOption( 'hmwp_token' ),
				'url'          => $domain,
				'howtolessons' => 1,
				'monitor'      => (int) $monitor,
				'source'       => 'hide-my-wp'
			);
			$response = HMWP_Classes_Tools::hmwp_remote_get( _HMWP_API_SITE_ . '/api/free/token', $args, array( 'timeout' => 10 ) );
		} else {
			return $check;
		}

		if ( $response && $response = json_decode( $response, true ) ) {

			HMWP_Classes_Tools::saveOptions( 'hmwp_token', ( isset( $response['token'] ) ? $response['token'] : 0 ) );
			HMWP_Classes_Tools::saveOptions( 'api_token', ( isset( $response['api_token'] ) ? $response['api_token'] : false ) );
			HMWP_Classes_Tools::saveOptions( 'error', isset( $response['error'] ) );

			if ( ! isset( $response['error'] ) ) {
				if ( $redirect_to <> '' ) {
					wp_redirect( $redirect_to );
					exit();
				}
			} elseif ( isset( $response['message'] ) ) {
				HMWP_Classes_Error::setNotification( $response['message'], 'notice', false );
			}
		} else {
			HMWP_Classes_Error::setNotification( sprintf( __( 'CONNECTION ERROR! Make sure your website can access: %s', 'hide-my-wp' ), '<a href="' . _HMWP_ACCOUNT_SITE_ . '" target="_blank">' . _HMWP_ACCOUNT_SITE_ . '</a>' ), 'notice', false );
		}

		return $response;

	}

	/**
	 * Verify the API response on update
	 *
	 * @param  $result
	 */
	public function checkLicenseOnUpdate( $result ) {

		// check the token
		if ( ! self::getOption( 'hmwp_token' ) ) {
			return;
		}

		if ( $body = json_decode( wp_remote_retrieve_body( $result ) ) ) {

			//if data received is valid
			HMWP_Classes_Tools::saveOptions( 'hmwp_valid', 1 );

			if ( isset( $body->expires ) && (int) $body->expires > 0 && (int) $body->expires < time() ) {
				HMWP_Classes_Tools::saveOptions( 'hmwp_valid', 0 );
				HMWP_Classes_Tools::saveOptions( 'hmwp_expires', $body->expires );
			} elseif ( isset( $body->download_url ) && ! $body->download_url ) {
				HMWP_Classes_Tools::saveOptions( 'hmwp_valid', 0 );
				HMWP_Classes_Tools::saveOptions( 'hmwp_expires', 0 );
			}

		} else {
			HMWP_Classes_Tools::saveOptions( 'hmwp_valid', 0 );
			HMWP_Classes_Tools::saveOptions( 'hmwp_expires', 0 );
		}

	}

	/**
	 * Send the email is case there are major changes
	 *
	 * @return bool
	 */
	public static function sendEmail() {
		$email = self::getOption( 'hmwp_email_address' );
		if ( $email == '' ) {
			global $current_user;
			$email = $current_user->user_email;
		}

		$line    = "\n" . "________________________________________" . "\n";
		$to      = $email;
		$subject = self::getOption( 'hmwp_plugin_name' ) . ' - ' . esc_html__( 'New Login Data', 'hide-my-wp' );
		$message = sprintf( esc_html__( "Thank you for using %s!", 'hide-my-wp' ), self::getOption( 'hmwp_plugin_name' ) ) . "\n";
		$message .= $line;
		$message .= esc_html__( "Your new site URLs are", 'hide-my-wp' ) . ':' . "\n";
		$message .= esc_html__( "Admin URL", 'hide-my-wp' ) . ': ' . admin_url() . "\n";
		$message .= esc_html__( "Login URL", 'hide-my-wp' ) . ': ' . site_url( self::$options['hmwp_login_url'] ) . "\n";
		$message .= $line;
		$message .= esc_html__( "Note: If you can`t login to your site, just access this URL", 'hide-my-wp' ) . ':' . "\n";
		$message .= site_url() . "/wp-login.php?" . self::getOption( 'hmwp_disable_name' ) . "=" . self::$options['hmwp_disable'] . "\n\n";
		$message .= $line;
		$message .= esc_html__( "Best regards", 'hide-my-wp' ) . ',' . "\n";
		$message .= self::getOption( 'hmwp_plugin_name' ) . "\n";

		$headers   = array();
		$headers[] = sprintf( esc_html__( "From: %s <%s>", 'hide-my-wp' ), self::getOption( 'hmwp_plugin_name' ), $email );
		$headers[] = 'Content-type: text/plain';

		add_filter( 'wp_mail_content_type', array( 'HMWP_Classes_Tools', 'setContentType' ) );

		if ( @wp_mail( $to, $subject, $message, $headers ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Set the content type to text/plain
	 *
	 * @return string
	 */
	public static function setContentType() {
		return "text/plain";
	}

	/**
	 * Set the current user role for later use
	 *
	 * @param  WP_User  $user
	 *
	 * @return string
	 */
	public static function setCurrentUserRole( $user = null ) {
		$roles = array();

		if ( isset( $user ) && isset( $user->roles ) && is_array( $user->roles ) ) {
			$roles = $user->roles;
		} elseif ( function_exists( 'wp_get_current_user' ) ) {
			$user = wp_get_current_user();

			if ( isset( $user->roles ) && is_array( $user->roles ) ) {
				$roles = $user->roles;
			}
		}

		if ( ! empty( $roles ) ) {
			self::$current_user_role = current( $roles );
		}

		return self::$current_user_role;
	}

	/**
	 * Get the user main Role or default
	 *
	 * @return string
	 */
	public static function getUserRole() {
		return self::$current_user_role;
	}

	/**
	 * Check the user capability for the roles attached
	 *
	 * @param  $cap
	 *
	 * @return bool
	 */
	public static function userCan( $cap ) {

		if ( function_exists( 'current_user_can' ) ) {

			if ( current_user_can( $cap ) ) {
				return true;
			}

			//Get the current user roles
			$user = wp_get_current_user();

			//If the user has multiple roles
			if ( isset( $user->roles ) && is_array( $user->roles ) && count( $user->roles ) > 1 ) {
				foreach ( $user->roles as $role ) {

					//Get the role
					$role_object = get_role( $role );

					//Check if it has capability
					if ( $role_object->has_cap( $cap ) ) {
						return true;
					}
				}
			}

		}

		return false;
	}

	/**
	 * Search for a substring within an array of strings.
	 *
	 * @param  string  $needle  The substring to search for.
	 * @param  array  $haystack  The array of strings to search within.
	 *
	 * @return bool  True if the substring is found in any of the strings in the array, false otherwise.
	 */
	public static function searchInString( $needle, $haystack ) {
		foreach ( $haystack as $value ) {
			if ( $needle && $value && $needle <> '' && $value <> '' ) {

				//add trail slash to make sure the path matches entirely
				$needle = trailingslashit( $needle );
				$value  = trailingslashit( $value );

				//use mb_stripos is possible
				if ( function_exists( 'mb_stripos' ) ) {
					if ( mb_stripos( $needle, $value ) !== false ) {
						return true;
					}
				} elseif ( stripos( $needle, $value ) !== false ) {
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Customize the redirect for the logout process
	 *
	 * @param  $redirect
	 *
	 * @return mixed
	 */
	public static function getCustomLogoutURL( $redirect ) {
		//Get Logout based on user Role
		$role         = HMWP_Classes_Tools::getUserRole();
		$urlRedirects = HMWP_Classes_Tools::getOption( 'hmwp_url_redirects' );
		if ( isset( $urlRedirects[ $role ]['logout'] ) && $urlRedirects[ $role ]['logout'] <> '' ) {
			$redirect = $urlRedirects[ $role ]['logout'];
		} elseif ( isset( $urlRedirects['default']['logout'] ) && $urlRedirects['default']['logout'] <> '' ) {
			$redirect = $urlRedirects['default']['logout'];
		}

		return $redirect;
	}

	/**
	 * Customize the redirect for the login process
	 *
	 * @param  string  $redirect
	 *
	 * @return string
	 */
	public static function getCustomLoginURL( $redirect ) {

		//Get Logout based on user Role
		$role         = HMWP_Classes_Tools::getUserRole();
		$urlRedirects = HMWP_Classes_Tools::getOption( 'hmwp_url_redirects' );
		if ( isset( $urlRedirects[ $role ]['login'] ) && $urlRedirects[ $role ]['login'] <> '' ) {
			$redirect = $urlRedirects[ $role ]['login'];
		} elseif ( isset( $urlRedirects['default']['login'] ) && $urlRedirects['default']['login'] <> '' ) {
			$redirect = $urlRedirects['default']['login'];
		}

		return $redirect;
	}

	/**
	 * Generate a string
	 *
	 * @param  int  $length
	 *
	 * @return bool|string
	 */
	public static function generateRandomString( $length = 10 ) {
		return substr( str_shuffle( str_repeat( $x = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil( $length / strlen( $x ) ) ) ), 1, $length );
	}

	/**
	 * make this plugin the first plugin that loads
	 */
	public static function movePluginFirst() {
		//Make sure the plugin is loaded first
		$plugin         = dirname( HMWP_BASENAME ) . '/index.php';
		$active_plugins = get_option( 'active_plugins' );

		if ( ! empty( $active_plugins ) ) {

			$this_plugin_key = array_search( $plugin, $active_plugins );

			if ( $this_plugin_key > 0 ) {
				array_splice( $active_plugins, $this_plugin_key, 1 );
				array_unshift( $active_plugins, $plugin );
				update_option( 'active_plugins', $active_plugins );


			}

		}
	}

	/**
	 * Instantiates the WordPress filesystem
	 *
	 * @static
	 * @access public
	 * @return WP_Filesystem_Base|WP_Filesystem_Direct
	 */
	public static function initFilesystem() {
		return HMWP_Classes_ObjController::initFilesystem();
	}

	public static function isWhitelistedIP( $ip ) {
		$wl_items = array();

		if ( ! filter_var( $ip, FILTER_VALIDATE_IP ) ) {
			return true;
		}

		//jetpack whitelist
		$wl_jetpack = array(
			'122.248.245.244/32',
			'54.217.201.243/32',
			'54.232.116.4/32',
			'185.64.140.0/22',
			'76.74.255.0/22',
			'192.0.64.0/18',
			'192.0.65.0/22',
			'192.0.80.0/22',
			'192.0.96.0/22',
			'192.0.112.0/20',
			'192.0.123.0/22',
			'195.234.108.0/22',
			'54.148.171.133',//wordfence
			'35.83.41.128', //wordfence
			'52.25.185.95', //wordfence
		);

		$domain = ( self::isMultisites() && defined( 'BLOG_ID_CURRENT_SITE' ) ) ? get_home_url( BLOG_ID_CURRENT_SITE ) : site_url();

		if ( filter_var( $domain, FILTER_VALIDATE_URL ) !== false && strpos( $domain, '.' ) !== false ) {
			if ( ! self::isLocalFlywheel() ) {
				$wl_jetpack[] = '127.0.0.1';

				//set local domain IP
				if ( HMWP_Classes_Tools::getOption( 'hmwp_disable_rest_api' ) ) {
					if( $local_ip = get_transient('hmwp_local_ip') ){
						$wl_jetpack[] = $local_ip;
					}elseif( $local_ip = @gethostbyname( wp_parse_url($domain, PHP_URL_HOST) ) ) {
						set_transient( 'hmwp_local_ip', $local_ip );
						$wl_jetpack[] = $local_ip;
					}
				}
			}
		}

		if ( HMWP_Classes_Tools::getOption( 'whitelist_ip' ) ) {
			$wl_items = (array) json_decode( HMWP_Classes_Tools::getOption( 'whitelist_ip' ), true );
		}

		//merge all the whitelisted ips and also add the hook for users
		$wl_items = apply_filters( 'hmwp_whitelisted_ips', array_merge( $wl_jetpack, $wl_items ) );

		try {
			foreach ( $wl_items as $item ) {
				$item = trim( $item );

				if ( filter_var( $item, FILTER_VALIDATE_IP ) && $ip == $item ) {
					return true;
				}

				if ( strpos( $item, '*' ) === false && strpos( $item, '/' ) === false ) { //no match, no wildcard
					continue;
				}

				if ( strpos( $ip, '.' ) !== false ) {

					if ( strpos( $item, '/' ) !== false ) {
						list( $range, $bits ) = explode( '/', $item, 2 );

						if ( 0 == (int) $bits ) {
							continue;
						}

						if ( (int) $bits < 0 || (int) $bits > 32 ) {
							continue;
						}

						$subnet = ip2long( $range );
						$iplong = ip2long( $ip );
						$mask   = - 1 << ( 32 - $bits );
						$subnet &= $mask;

						if ( ( $iplong & $mask ) == $subnet ) {
							return true;
						}
					}

					$iplong  = ip2long( $ip );
					$ip_low  = ip2long( str_replace( '*', '0', $item ) );
					$ip_high = ip2long( str_replace( '*', '255', $item ) );

					if ( $iplong >= $ip_low && $iplong <= $ip_high ) {//IP is within wildcard range
						return true;
					}
				}

			}
		} catch ( Exception $e ) {
		}

		return false;
	}

	/**
	 * Check if there are banned IPs for accessing the hidden paths
	 *
	 * @return bool
	 */
	public static function isBlacklistedIP( $ip ) {
		$bl_items = array();

		$bl_blacklisted = array(
			'35.214.130.0/22', // detector
			'54.86.50.0/22', // detector
			'172.105.48.0/22', // detector
			'15.235.50.223', // detector
			'192.185.4.40', // detector
			'172.105.48.130', // detector
			'167.99.233.123', // detector
		);

		if ( HMWP_Classes_Tools::getOption( 'banlist_ip' ) ) {
			$bl_items = (array) json_decode( HMWP_Classes_Tools::getOption( 'banlist_ip' ), true );
		}

		//merge all the whitelisted ips and also add the hook for users
		$bl_items = apply_filters( 'hmwp_banlist_ips', array_merge( $bl_blacklisted, $bl_items ) );

		try {
			foreach ( $bl_items as $item ) {
				$item = trim( $item );

				if ( filter_var( $item, FILTER_VALIDATE_IP ) && $ip == $item ) {
					return true;
				}

				if ( strpos( $item, '*' ) === false && strpos( $item, '/' ) === false ) { //no match, no wildcard
					continue;
				}

				if ( strpos( $ip, '.' ) !== false ) {

					if ( strpos( $item, '/' ) !== false ) {
						list( $range, $bits ) = explode( '/', $item, 2 );

						if ( 0 == (int) $bits ) {
							continue;
						}

						if ( (int) $bits < 0 || (int) $bits > 32 ) {
							continue;
						}

						$subnet = ip2long( $range );
						$iplong = ip2long( $ip );
						$mask   = - 1 << ( 32 - $bits );
						$subnet &= $mask;

						if ( ( $iplong & $mask ) == $subnet ) {
							return true;
						}
					}

					$iplong  = ip2long( $ip );
					$ip_low  = ip2long( str_replace( '*', '0', $item ) );
					$ip_high = ip2long( str_replace( '*', '255', $item ) );

					if ( $iplong >= $ip_low && $iplong <= $ip_high ) {//IP is within wildcard range
						return true;
					}
				}

			}
		} catch ( Exception $e ) {
		}

		return false;
	}

	/**
	 * Check if the Advanced Pack is installed by verifying the definition of a constant.
	 *
	 * @return bool
	 */
	public static function isAdvancedpackInstalled() {
		return ( defined( 'HMWPP_VERSION' ) );
	}
}

Zerion Mini Shell 1.0