HEX
Server: Apache
System: Linux andromeda.lojoweb.com 4.18.0-372.26.1.el8_6.x86_64 #1 SMP Tue Sep 13 06:07:14 EDT 2022 x86_64
User: nakedfoamlojoweb (1056)
PHP: 8.0.30
Disabled: exec,passthru,shell_exec,system
Upload Files
File: /home/nakedfoamlojoweb/www/wp-content/plugins/password-protect-page/admin/class-ppw-admin.php
<?php

/**
 * The admin-specific functionality of the plugin.
 *
 * @link       https://passwordprotectwp.com
 * @since      1.0.0
 *
 * @package    Password_Protect_Page
 * @subpackage Password_Protect_Page/admin
 */

/**
 * The admin-specific functionality of the plugin.
 *
 * Defines the plugin name, version, and two examples hooks for how to
 * enqueue the admin-specific stylesheet and JavaScript.
 *
 * @package    Password_Protect_Page
 * @subpackage Password_Protect_Page/admin
 * @author     BWPS <hello@preventdirectaccess.com>
 */
class PPW_Admin {

	/**
	 * The ID of this plugin.
	 *
	 * @since    1.0.0
	 * @access   private
	 * @var      string $plugin_name The ID of this plugin.
	 */
	private $plugin_name;

	/**
	 * The version of this plugin.
	 *
	 * @since    1.0.0
	 * @access   private
	 * @var      string $version The current version of this plugin.
	 */
	private $version;

	/**
	 * @var PPW_Password_Services
	 * @since 1.2.2
	 */
	private $free_services;


	/**
	 * Subscribe services
	 *
	 * @var PPW_Password_Subscribe
	 */
	private $subscribe_services;

	/**
	 * Asset service in Free version
	 *
	 * @var PPW_Asset_Services
	 */
	private $free_asset_services;

	/**
	 * Initialize the class and set its properties.
	 *
	 * @param string $plugin_name The name of this plugin.
	 * @param string $version     The version of this plugin.
	 *
	 * @since    1.0.0
	 */
	public function __construct( $plugin_name, $version ) {
		$this->plugin_name         = $plugin_name;
		$this->version             = $version;
		$this->free_services       = new PPW_Password_Services();
		$this->subscribe_services  = new PPW_Password_Subscribe();
		$this->free_asset_services = new PPW_Asset_Services( null, null );
	}

	/**
	 * Register the stylesheets and javascript for the admin area.
	 *
	 * @since    1.0.0
	 */
	public function enqueue_assets() {

		/**
		 * This function is provided for demonstration purposes only.
		 *
		 * An instance of this class should be passed to the run() function
		 * defined in Password_Protect_Page_Loader as all of the hooks are defined
		 * in that particular class.
		 *
		 * The Password_Protect_Page_Loader will then create the relationship
		 * between the defined hooks and the functions defined in this
		 * class.
		 */
		if ( function_exists( 'get_current_screen' ) ) {
			$is_pro_activated = apply_filters( PPW_Constants::HOOK_IS_PRO_ACTIVATE, false );
			$screen           = get_current_screen();
			$assert_services  = new PPW_Asset_Services( $screen->id, $_GET ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We no need to verify nonce for enqueue assets
			if ( ! $is_pro_activated ) {
				$assert_services->load_assets_for_entire_site_tab();
				$assert_services->load_assets_for_general_tab();
				$assert_services->load_assets_for_entire_site_page();
			}
			$assert_services->load_assets_for_shortcode_page();
			$assert_services->load_assets_for_external_page();
			$assert_services->load_assets_for_external_configuration();
			$assert_services->load_assets_for_shortcodes();
			$assert_services->load_css_hide_feature_set_password_wp();
			$assert_services->load_js_show_notice_deactivate_plugin();
			$assert_services->load_assets_for_misc_tab();
			$assert_services->load_assets_for_category_page();
			$assert_services->load_assets_for_troubleshoot_tab();
			$assert_services->load_assets_for_shortcode_setting();

			wp_enqueue_style( 'ppw-pro-sidebar-css', PPW_DIR_URL . 'admin/css/ppw-pro-sidebar.css', array(), PPW_VERSION, 'all');
		}
	}

	/**
	 * Add metabox to set password in page and post
	 */
	public function ppw_free_add_custom_meta_box_to_edit_page() {
		include PPW_DIR_PATH . 'includes/views/meta-box/view-ppw-meta-box.php';
	}

	/**
	 * Save password
	 */
	public function ppw_free_set_password() {
		$setting_keys = array( 'save_password', 'id_page_post', 'is_role_selected', 'ppwp_multiple_password' );
		if ( ppw_free_error_before_create_password( $_REQUEST, $setting_keys ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We handle nonce verification in this function
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);
			wp_die();
		}
		if ( ! isset( $_REQUEST['settings'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We handle nonce verification above.
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);

			wp_die();
		}

		$data_settings        = $_REQUEST['settings']; // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We no need to verify nonce for enqueue assets, Don't need use wp_unslash(), and no need to sanitize settings params.
		$new_role_password    = $data_settings['save_password'];
		$id                   = $data_settings['id_page_post'];
		$role_selected        = $data_settings['is_role_selected'];
		$new_global_passwords = is_array( $data_settings['ppwp_multiple_password'] ) ? $data_settings['ppwp_multiple_password'] : array();

		$free_services          = new PPW_Password_Services();
		$current_roles_password = $free_services->create_new_password( $id, $role_selected, $new_global_passwords, $new_role_password );
		wp_send_json( $current_roles_password );
		wp_die();
	}

	/**
	 * Check when user enter password
	 */
	public function ppw_handle_enter_password() {
		if ( ! array_key_exists( 'post_password', $_POST ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- This request for default login form postpass action of WordPress with the action 'post_password' for the hook 'login_form_ppw_postpass', will handle on others.
			wp_safe_redirect( wp_get_referer() );
			exit();
		}

		// Get post_id from referer url if Post data is not exist post_id.
		$post_id = ppw_get_post_id_from_request();

		if ( empty( $post_id ) ) {
			wp_safe_redirect( wp_get_referer() );
			exit();
		}

		$password = wp_unslash( $_POST['post_password'] ); // phpcs:ignore -- not sanitize password because we allow all character.

		$this->free_services->handle_after_enter_password_in_password_form( $post_id, $password );
	}

	/**
	 * This feature will support some user which use postpass and enable protection type of plugin.
	 */
	public function ppw_handle_enter_password_for_default_action() {
		if ( ! array_key_exists( 'post_password', $_POST ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- This request for default login form postpass action of WordPress for the hook 'login_form_postpass', will handle on others.
			return;
		}

		// Get post id from request.
		$post_id = ppw_get_post_id_from_request();
		if ( empty( $post_id ) ) {
			return;
		}

		// Get post type to check post type selected in setting page.
		$post_type = get_post_type( $post_id );

		$password = wp_unslash( $_POST['post_password'] ); // phpcs:ignore -- not sanitize password because we allow all character and verify nonce for the hook 'login_form_postpass'.

		if ( ! empty( $post_type ) && ppw_is_post_type_selected_in_setting( $post_type ) ) {
			$this->free_services->handle_after_enter_password_in_password_form( $post_id, $password );
		}
	}

	/**
	 * Handle redirect after enter password
	 *
	 * @param $is_valid
	 *
	 * @return mixed|void
	 */
	public function ppw_handle_redirect_after_enter_password( $is_valid ) {
		$free_service = new PPW_Password_Services();

		$free_service->handle_redirect_after_enter_password( $is_valid );
	}

	/**
	 * Add row action protect/unprotect posts and pages
	 *
	 * @param array    $actions An array of row action.
	 * @param stdClass $post    The post object.
	 *
	 * @return array
	 */
	public function ppw_custom_row_action( $actions, $post ) {
		$post_status = $post->post_status;
		$post_type   = $post->post_type;
		$post_id     = $post->ID;

		if ( ! in_array( $post_type, array( 'page', 'post' ), true ) || 'trash' === $post_status || ! current_user_can( 'edit_post', $post_id ) ) {
			return $actions;
		}

		wp_enqueue_style( 'ppw-row-action-css', PPW_DIR_URL . 'admin/css/ppw-row-action.css', array(), PPW_VERSION, 'all');
		wp_enqueue_script( 'ppw-row-action-js', PPW_DIR_URL . 'admin/js/dist/ppw-row-action.js', array( 'jquery' ), PPW_VERSION, true );
		wp_localize_script(
			'ppw-row-action-js',
			'ppw_row_action_data',
			array(
				'ajax_url'    => admin_url( 'admin-ajax.php' ),
				'nonce'       => wp_create_nonce( PPW_Constants::ROW_ACTION_NONCE ),
				'plugin_name' => 'Password Protect WordPress Lite',
			)
		);
		$this->free_asset_services->load_toastr_lib();

		return $this->free_services->generate_custom_row_action( $actions, $post );
	}

	/**
	 * Handle feature update post status in row action.
	 */
	public function handle_update_post_status() {
		$_request = wp_unslash( $_REQUEST );
		if ( ! isset( $_request['nonce'] ) || ! wp_verify_nonce( $_request['nonce'], PPW_Constants::ROW_ACTION_NONCE ) ) {
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);
			wp_die();
		}

		return $this->free_services->update_post_status( $_request );
	}

	/**
	 * Add menu
	 */
	public function ppw_add_menu() {
		$setting_page = new PPW_Settings();
		add_menu_page( 'Protect Password Settings', 'Password Protect WordPress', ppw_get_allowed_capability(), PPW_Constants::MENU_NAME, array(
			$setting_page,
			'render_ui'
		), PPW_DIR_URL . 'admin/images/ppw-icon-20x20.png' );
		add_submenu_page( PPW_Constants::MENU_NAME, __( 'PPWP › Settings', PPW_Constants::DOMAIN ), __( 'Settings', PPW_Constants::DOMAIN ), ppw_get_allowed_capability(), PPW_Constants::MENU_NAME );
		$this->partial_protection_submenu();

		// Hide sitewide when Pro activate.
		if ( ! is_pro_active_and_valid_license() ) {
			$this->sitewide_submenu();
		}

		$this->load_external_submenu();
	}

	/**
	 * Add sitewide submenu
	 */
	public function sitewide_submenu() {
		$setting_page = new PPW_Sitewide_Settings();

		add_submenu_page( PPW_Constants::MENU_NAME, __( 'PPWP › Sitewide', PPW_Constants::DOMAIN ), __( 'Sitewide Protection', PPW_Constants::DOMAIN ), ppw_get_allowed_capability(), PPW_Constants::SITEWIDE_PAGE_PREFIX, array(
			$setting_page,
			'render_ui',
		) );
	}


	/**
	 * Add external submenu.
	 */
	public function load_external_submenu() {
		$setting_page = new PPW_External_Settings();

		add_submenu_page(
			PPW_Constants::MENU_NAME,
			__( 'PPWP › Integrations', PPW_Constants::DOMAIN ),
			__( 'Integrations', PPW_Constants::DOMAIN ),
			ppw_get_allowed_capability(),
			PPW_Constants::EXTERNAL_SERVICES_PREFIX,
			array(
				$setting_page,
				'render_ui',
			)
		);
	}

	/**
	 * Add Partial Protection submenu.
	 */
	public function partial_protection_submenu() {
		$setting_page = new PPW_Partial_Protection_Settings();
		add_submenu_page( PPW_Constants::MENU_NAME, __( 'PPWP › Partial Protection', PPW_Constants::DOMAIN ), __( 'Partial Protection', PPW_Constants::DOMAIN ),
			ppw_get_allowed_capability(), PPW_Constants::PCP_PAGE_PREFIX, array(
				$setting_page,
				'render_ui'
			)
		);
	}

	/**
	 * Hide sitewide tab content in Free version.
	 */
	public function ppw_handle_custom_tab( $tabs ) {
		$tab_key = array_search( 'entire_site', $tabs, true );
		if ( false !== $tab_key ) {
			unset( $tabs[ $tab_key ] );
		}

		return $tabs;
	}

	/**
	 * Hide sitewide tab in Free version.
	 */
	public function ppw_handle_add_new_tab( $tabs ) {
		$tab_key = array_search( 'entire_site', array_column( $tabs, 'tab' ), true );
		if ( false !== $tab_key ) {
			unset( $tabs[ $tab_key ] );
		}

		return $tabs;
	}

	/**
	 * Handle hide shortcode tab in Free version.
	 *
	 * @param array $tabs List of tabs in setting page.
	 *
	 * @return array
	 */
	public function ppw_handle_hide_shortcode_tab( $tabs ) {
		foreach ( $tabs as $key => $tab ) {
			if ( array( 'tab' => 'shortcodes', 'tab_name' => 'Shortcodes' ) === $tab ) {
				unset( $tabs[ $key ] );
			}
		}

		return $tabs;
	}

	/**
	 * Handle hide shortcode content in Free version.
	 *
	 * @param array $tabs List of tabs in setting page.
	 *
	 * @return array
	 */
	public function ppw_handle_hide_shortcode_content( $tabs ) {
		$tab_key = array_search( 'shortcodes', $tabs, true );
		if ( false !== $tab_key ) {
			unset( $tabs[ $tab_key ] );
		}

		return $tabs;
	}

	/**
	 * Render General tab
	 */
	public function ppw_free_render_content_general() {
		?>
		<div class="ppw_setting_page">
			<?php
			include PPW_DIR_PATH . 'includes/views/general/view-ppw-general.php';
			include PPW_DIR_PATH . 'includes/views/sidebar/view-ppw-sidebar.php';
			?>
		</div>
		<?php
	}

	/**
	 * Render entire site tab
	 */
	public function ppw_free_render_content_entire_site() {
		?>
		<div class="ppw_setting_page">
			<?php
			include PPW_DIR_PATH . 'includes/views/entire-site/view-ppw-entire-site.php';
			include PPW_DIR_PATH . 'includes/views/sidebar/view-ppw-sidebar.php';
			?>
		</div>
		<?php
	}

	/**
	 * Render shortcodes content.
	 */
	public function ppw_free_render_content_shortcodes() {
		?>
		<div class="ppw_setting_page">
			<?php
			include PPW_DIR_PATH . 'includes/views/shortcode/view-ppw-shortcode-settings.php';
			ppw_free_render_sidebar();
			?>
		</div>
		<?php
	}

	public function ppw_free_render_content_pcp_general_tab() {
		?>
		<div class="ppw_setting_page">
			<?php
			include PPW_DIR_PATH . 'includes/views/partial-protection/view-ppw-pcp-general.php';
			ppw_free_render_sidebar();
			?>
		</div>
		<?php
	}

	public function ppw_free_render_content_external_recaptcha() {
		?>
		<div class="ppw_setting_page">
			<?php
			include PPW_DIR_PATH . 'includes/views/external/view-ppw-general.php';
			ppw_free_render_sidebar();
			?>
		</div>
		<?php
	}

	public function ppw_free_render_content_external_configuration() {
		?>
		<div class="ppw_setting_page">
			<?php
			include PPW_DIR_PATH . 'includes/views/external/view-ppw-general-configuration.php';
			ppw_free_render_sidebar();
			?>
		</div>
		<?php
	}

	/**
	 * Render Master Passwords tab
	 */
	public function ppw_free_render_content_master_passwords() {
		wp_enqueue_script( 'ppw-master-passwords-js', PPW_DIR_URL . 'includes/views/master-passwords/assets/ppw-master-passwords.js', array( 'jquery' ), PPW_VERSION, true );
		wp_enqueue_style( 'ppw-master-passwords-css', PPW_DIR_URL . 'includes/views/master-passwords/assets/ppw-master-passwords.css', array(), PPW_VERSION, 'all' );
		$post_types_selected     = $this->free_services->get_protection_post_types_select();
		$protection_types        = apply_filters( 'ppw_master_password_protection_types', array() );
		$allowed_protection_type = ppw_allowed_master_protection_type();
		wp_localize_script(
			'ppw-master-passwords-js',
			'ppwMasterPasswords',
			array(
				'restUrl'               => get_rest_url(),
				'nonce'                 => wp_create_nonce( 'wp_rest' ),
				'roles'                 => array_keys( get_editable_roles() ),
				'postTypes'             => $post_types_selected,
				'pro'                   => is_pro_active_and_valid_license(),
				'protectionTypes'       => $protection_types,
				'allowedProtectionType' => $allowed_protection_type,
			)
		);
		include PPW_DIR_PATH . 'includes/views/master-passwords/view-ppw-master-passwords.php';
	}

	/**
	 * Render Advanced tab
	 */
	public function ppw_free_render_content_misc() {
		$misc_options = get_option( PPW_Constants::MISC_OPTIONS , false );
		if ( !$misc_options ) {
			update_option( PPW_Constants::MISC_OPTIONS, wp_json_encode(array(PPW_Constants::USE_CUSTOM_FORM_ACTION => true)));
		} else if ( !ppw_core_get_setting_type_bool_by_option_name( PPW_Constants::USE_CUSTOM_FORM_ACTION, PPW_Constants::MISC_OPTIONS ) ) {
			$data = json_decode($misc_options);
			$data->wpp_use_custom_form_action = true;
			update_option( PPW_Constants::MISC_OPTIONS,  wp_json_encode( $data ) );
		}
		?>
		<div class="ppw_setting_page">
			<?php
			include PPW_DIR_PATH . 'includes/views/misc/view-ppw-misc.php';
			ppw_free_render_sidebar();
			?>
		</div>
		<?php
	}

	/**
	 * Render Advanced tab
	 */
	public function ppw_free_render_content_troubleshooting() {
		?>
		<div class="ppw_setting_page">
			<?php
			include PPW_DIR_PATH . 'includes/views/troubleshooting/view-ppw-troubleshooting.php';
			ppw_free_render_sidebar();
			?>
		</div>
		<?php
	}

	/**
	 * Update settings
	 */
	public function ppw_free_update_general_settings() {
		$setting_keys = array(
			PPW_Constants::COOKIE_EXPIRED,
			PPW_Constants::REMOVE_DATA,
		);
		if ( ppw_free_is_setting_data_invalid( $_REQUEST, $setting_keys ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We handle nonce verification in this function.
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);
			wp_die();
		}

		if ( ! isset( $_REQUEST['settings'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We handle nonce verification above.
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);
			wp_die();
		}

		$data_settings = wp_unslash( $_REQUEST['settings'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We handle nonce verification above and no need to sanitize settings.
		update_option( PPW_Constants::GENERAL_OPTIONS, wp_json_encode( $data_settings ), 'no' );
		wp_die( true );
	}

	/**
	 * Update settings
	 */
	public function ppw_free_update_external_settings() {
		if ( ! isset( $_REQUEST['settings'] ) || ! is_array( $_REQUEST['settings'] ) || ppw_free_is_setting_data_invalid( $_REQUEST, array(), false ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We handle nonce verification in ppw_free_is_setting_data_invalid() function.
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);

			wp_die();
		}

		$option = get_option( PPW_Constants::EXTERNAL_OPTIONS );
		if ( empty( $option ) ) {
			$option = array();
		} else {
			$option = (array) json_decode( $option );
		}

		$setting_keys = array(
			PPW_Constants::RECAPTCHA_SCORE,
			PPW_Constants::RECAPTCHA_API_KEY,
			PPW_Constants::RECAPTCHA_V2_CHECKBOX_API_KEY,
			PPW_Constants::RECAPTCHA_API_SECRET,
			PPW_Constants::RECAPTCHA_V2_CHECKBOX_API_SECRET,
			PPW_Constants::USING_RECAPTCHA,
			PPW_Constants::RECAPTCHA_TYPE,
			PPW_Constants::RECAPTCHA_PASSWORD_TYPES,
		);
		$settings     = wp_unslash( $_REQUEST['settings'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We handle nonce verification above and no need to sanitize settings params.
		foreach ( $settings as $key => $value ) {
			if ( in_array( $key, $setting_keys, true ) ) {
				$option[ $key ] = $settings[ $key ];
			}
		}

		update_option(
			PPW_Constants::EXTERNAL_OPTIONS,
			wp_json_encode( $option ),
			'no'
		);
		wp_die( true );
	}

	/**
	 * Update settings
	 */
	public function ppw_free_update_misc_settings() {
		$setting_keys = apply_filters(
			PPW_Constants::HOOK_ADVANCED_VALID_INPUT_DATA,
			array(
				PPW_Constants::PROTECT_EXCERPT,
				PPW_Constants::USE_CUSTOM_FORM_ACTION,
				PPW_Constants::NO_RELOAD_PAGE,
			)
		);
		if ( ppw_free_is_setting_data_invalid( $_REQUEST, $setting_keys, false ) ) { // phpcs:ignore WordPress.Security.NonceVerification -- We handle nonce verification in this function.
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);

			wp_die();
		}

		if ( ! isset( $_REQUEST['settings'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We handle nonce verification above.
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);

			wp_die();
		}
		$data_settings = wp_unslash( $_REQUEST['settings'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We handle nonce verification above and no need to sanitize settings params.

		update_option( PPW_Constants::MISC_OPTIONS, wp_json_encode( $data_settings ), 'no' );

		wp_die( true );
	}


	/**
	 * Update shortcode settings.
	 */
	public function ppw_free_update_shortcode_settings() {
		$setting_keys = apply_filters(
			'ppw_shortcode_valid_input_data',
			array(
				PPW_Constants::USE_SHORTCODE_PAGE_BUILDER,
			)
		);
		if ( ppw_free_is_setting_data_invalid( $_REQUEST, $setting_keys, false ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We handle nonce verification in ppw_free_is_setting_data_invalid() function.
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);

			wp_die();
		}

		if ( ! isset( $_REQUEST['settings'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We handle nonce verification above.
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);

			wp_die();
		}

		$data_settings = wp_unslash( $_REQUEST['settings'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We handle nonce verification above and no need to sanitize settings params.

		update_option( PPW_Constants::SHORTCODE_OPTIONS, wp_json_encode( $data_settings ), 'no' );

		wp_die( true );
	}

	/**
	 * Update category settings.
	 */
	public function ppw_free_update_category_settings() {
		
		$nonce_verification = check_ajax_referer( PPW_Constants::GENERAL_FORM_NONCE, 'security_check' );
		if ( ! $nonce_verification ) {
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);

			wp_die();
		}
		if ( isset( $_REQUEST['settings'], $_REQUEST['settings']['ppwp_is_protect_category'] ) && 'false' === $_REQUEST['settings']['ppwp_is_protect_category'] ) {
			$data = get_option( PPW_Category_Service::OPTION_NAME, false );
			if ( $data ) {
				$data                           = json_decode( $data );
				$data->ppwp_is_protect_category = false;
				update_option( PPW_Category_Service::OPTION_NAME, wp_json_encode( $data ) );
			} else {
				update_option( PPW_Category_Service::OPTION_NAME, wp_json_encode( array( 'ppwp_is_protect_category' => false ) ) );
			}

			return wp_die( true );
		}

		$setting_keys = apply_filters(
			'ppw_category_keys',
			array(
				'ppwp_is_protect_category',
				'ppwp_categories_password',
				'ppwp_protected_categories_selected',
			)
		);

		$data_settings = apply_filters( 'ppw_category_data_settings', wp_unslash( $_REQUEST['settings'] ), $setting_keys ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We no need to sanitize settings params.
		if ( ppw_free_is_setting_data_invalid( $_REQUEST, $setting_keys, false ) ) {
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);

			wp_die();
		}

		do_action( 'ppw_before_update_category_settings', $setting_keys, $data_settings );

		$passwords = PPW_Repository_Passwords::get_instance()->get_all_shared_categories_password();

		// Add new shared password if password is not exist
		// Update password if it is exist.
		if ( count( $passwords ) > 0 ) {
			$password_id = $passwords[0]->id;
			PPW_Repository_Passwords::get_instance()->update_password(
				$password_id,
				array(
					'password' => $data_settings['ppwp_categories_password'],
				)
			);
		} else {
			PPW_Repository_Passwords::get_instance()->add_new_password(
				array(
					'password'          => $data_settings['ppwp_categories_password'],
					'post_id'           => 0,
					'contact_id'        => 0,
					'campaign_app_type' => PPW_Category_Service::SHARED_CATEGORY_TYPE,
					'hits_count'        => 0,
					'created_time'      => time(),
				)
			);
		}

		if(isset($data_settings['ppwp_protected_categories_selected']) && !empty($data_settings['ppwp_protected_categories_selected'])){
			//$all_post_ids=[];
			$ppwp_categories_selected = $data_settings['ppwp_protected_categories_selected'];
			
			$previously_selected_categories = get_option('ppwp_previous_protected_categories', array());

    
    		$unselected_categories = array_diff($previously_selected_categories, $ppwp_categories_selected);

			$args = array(
			    'category__in' => $ppwp_categories_selected, 
			    'fields' => 'ids', 
			    'posts_per_page' => -1, 
			);

			$query = new WP_Query($args);
			
			if ($query->have_posts()) {
			      $all_post_ids = $query->posts; 

			        foreach ($all_post_ids as $post_id) {
			        	if (class_exists('PPW_Pro_Password_Services')) {
			        		$password_pro_service = new PPW_Pro_Password_Services();
			        		if (!$password_pro_service->is_protected_content($post_id)) {
				                $password_pro_service->protect_page_post($post_id);
				            }
			        	}else{
			        		if (!$this->free_services->is_protected_content($post_id)) {
				                $this->free_services->protect_page_post($post_id);
				            }	
			        	}
			            
			        }

			} else {
			    echo 'No posts found in the selected categories.';
			}


			 // Unprotect posts in the unselected categories
		    if (!empty($unselected_categories)) {
		        $unprotect_args = array(
		            'category__in' => $unselected_categories, 
		            'fields' => 'ids', 
		            'posts_per_page' => -1, 
		        );

		        $unprotect_query = new WP_Query($unprotect_args);
		        if ($unprotect_query->have_posts()) {
		            $unprotect_post_ids = $unprotect_query->posts;

		            foreach ($unprotect_post_ids as $post_id) {
		            	if (class_exists('PPW_Pro_Password_Services')) {
			        		$password_pro_service = new PPW_Pro_Password_Services();
			        		if ($password_pro_service->is_protected_content($post_id)) {
				                $password_pro_service->un_protect_page_post($post_id);
				            }
			        	}else{
			                if ($this->free_services->is_protected_content($post_id)) {
			                    $this->free_services->unprotect_page_post($post_id);
			                }
		            	}
		            }
		        }
		    }

		    wp_reset_postdata();

		    update_option('ppwp_previous_protected_categories', $ppwp_categories_selected);
			
		}

		unset( $data_settings['ppwp_categories_password'] );
		
		$category_ids = $data_settings['ppwp_protected_categories_selected'];
		$get_all_protected = json_decode( get_option( PPW_Category_Service::OPTION_NAME) );
		$post_ids = [];

		foreach ($category_ids as $category_id) {
			$posts = get_posts([
				'category' => $category_id,
				'fields' => 'ids',  // Only retrieve post IDs
				'posts_per_page' => -1  // Retrieve all posts
			]);

			$post_ids = array_merge($post_ids, $posts);
		}

		// Remove duplicates and format as "id1;id2;id3"
		$post_ids_str = implode(';', $post_ids);
		$get_paid_res = "";
		if ( class_exists('PPW_Pro_Category_Services') ) {
			$ppw_instance = new PPW_Pro_Category_Services();
			$from_ppwp_free = true;
			$get_paid_res = $ppw_instance->update_category_protect($post_ids_str, $from_ppwp_free);
		}
		update_option( PPW_Category_Service::OPTION_NAME, wp_json_encode( $data_settings ), 'no' );

		wp_die( true );
	}

	/**
	 * Update Tag settings.
	 */
	public function ppw_free_update_tag_settings() {
	
		$nonce_verification = check_ajax_referer( PPW_Constants::GENERAL_FORM_NONCE, 'security_check' );

		if ( ! $nonce_verification ) {
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);

			wp_die();
		}
		if ( isset( $_REQUEST['settings'], $_REQUEST['settings']['ppwp_is_protect_tag'] ) && 'false' === $_REQUEST['settings']['ppwp_is_protect_tag'] ) {
			$data = get_option( PPW_Tag_Service::OPTION_NAME, false );
			if ( $data ) {
				$data                           = json_decode( $data );
				$data->ppwp_is_protect_tag = false;
				update_option( PPW_Tag_Service::OPTION_NAME, wp_json_encode( $data ) );
			} else {
				update_option( PPW_Tag_Service::OPTION_NAME, wp_json_encode( array( 'ppwp_is_protect_tag' => false ) ) );
			}

			return wp_die( true );
		}

		$setting_keys = apply_filters(
			'ppw_tag_keys',
			array(
				'ppwp_is_protect_tag',
				'ppwp_tags_password',
				'ppwp_protected_tags_selected',
			)
		);

		$data_settings = apply_filters( 'ppw_tag_data_settings', wp_unslash( $_REQUEST['settings'] ), $setting_keys ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We no need to sanitize settings params.
		if ( ppw_free_is_setting_data_invalid( $_REQUEST, $setting_keys, false ) ) {
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);

			wp_die();
		}

		do_action( 'ppw_before_update_tag_settings', $setting_keys, $data_settings );

		$passwords = PPW_Repository_Passwords::get_instance()->get_all_shared_tags_password();

		// Add new shared password if password is not exist
		// Update password if it is exist.
		if ( count( $passwords ) > 0 ) {
			$password_id = $passwords[0]->id;
			PPW_Repository_Passwords::get_instance()->update_password(
				$password_id,
				array(
					'password' => $data_settings['ppwp_tags_password'],
				)
			);
		} else {
			PPW_Repository_Passwords::get_instance()->add_new_password(
				array(
					'password'          => $data_settings['ppwp_tags_password'],
					'post_id'           => 0,
					'contact_id'        => 0,
					'campaign_app_type' => PPW_Tag_Service::SHARED_TAG_TYPE,
					'hits_count'        => 0,
					'created_time'      => time(),
				)
			);
		}

		if( isset($data_settings['ppwp_protected_tags_selected']) && !empty($data_settings['ppwp_protected_tags_selected']) ){
			//$all_post_ids=[];
			$ppwp_tags_selected = $data_settings['ppwp_protected_tags_selected'];
			
			$previously_selected_tags = get_option('ppwp_previous_protected_tags', array());

    
    		$unselected_tags = array_diff($previously_selected_tags, $ppwp_tags_selected);

			$args = array(
			    'tag__in' => $ppwp_tags_selected, 
			    'fields' => 'ids', 
			    'posts_per_page' => -1, 
			);

			$query = new WP_Query($args);
			
			if ($query->have_posts()) {
			      $all_post_ids = $query->posts; 

			        foreach ($all_post_ids as $post_id) {
			        	if (class_exists('PPW_Pro_Password_Services')) {
			        		$password_pro_service = new PPW_Pro_Password_Services();
			        		if (!$password_pro_service->is_protected_content($post_id)) {
				                $password_pro_service->protect_page_post($post_id);
				            }
			        	}else{
			        		if (!$this->free_services->is_protected_content($post_id)) {
				                $this->free_services->protect_page_post($post_id);
				            }	
			        	}
			        }

			} else {
			    echo 'No posts found in the selected categories.';
			}


			 // Unprotect posts in the unselected categories
		    if (!empty($unselected_tags)) {
		        $unprotect_args = array(
		            'tag__in' => $unselected_tags, 
		            'fields' => 'ids', 
		            'posts_per_page' => -1, 
		        );

		        $unprotect_query = new WP_Query($unprotect_args);
		        if ($unprotect_query->have_posts()) {
		            $unprotect_post_ids = $unprotect_query->posts;

		            foreach ($unprotect_post_ids as $post_id) {
		            	if (class_exists('PPW_Pro_Password_Services')) {
			        		$password_pro_service = new PPW_Pro_Password_Services();
			        		if ($password_pro_service->is_protected_content($post_id)) {
				                $password_pro_service->un_protect_page_post($post_id);
				            }
			        	}else{
			                if ($this->free_services->is_protected_content($post_id)) {
			                    $this->free_services->unprotect_page_post($post_id);
			                }
		            	}
		            }
		        }
		    }

		    wp_reset_postdata();

		    update_option('ppwp_previous_protected_tags', $ppwp_tags_selected);
			
		}

		unset( $data_settings['ppwp_tags_password'] );

		update_option( PPW_Tag_Service::OPTION_NAME, wp_json_encode( $data_settings ), 'no' );

		wp_die( true );
	}

	public function ppw_free_update_entire_site_settings() {
		$request = wp_unslash( $_REQUEST );
		if ( ppw_free_is_entire_site_settings_data_invalid( $request ) ) {
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);
			wp_die();
		}

		$nonce = $request['security_check'];
		if ( ! wp_verify_nonce( $nonce, PPW_Constants::ENTIRE_SITE_FORM_NONCE ) ) {
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);
			wp_die();
		}
		$data_settings        = $request['settings'];
		$entire_site_services = new PPW_Entire_Site_Services();
		$entire_site_services->handle_before_update_settings( $data_settings );
		wp_die( true );
	}

	/**
	 * Feature entire site
	 */
	public function ppw_render_form_entire_site() {
		if ( ppw_free_has_bypass_sitewide_protection() ) {
			return;
		}

		$is_protect = ppw_core_get_setting_entire_site_type_bool( PPW_Constants::IS_PROTECT_ENTIRE_SITE );
		if ( ! $is_protect ) {
			return;
		}

		$is_render_form = apply_filters( PPW_Constants::HOOK_BEFORE_RENDER_FORM_ENTIRE_SITE, true );
		if ( ! $is_render_form ) {
			return;
		}

		$entire_site_service = new PPW_Entire_Site_Services();
		if ( $entire_site_service->validate_auth_cookie_entire_site() ) {
			return;
		}

		$password = ppw_core_get_setting_entire_site_type_string( PPW_Constants::PASSWORD_ENTIRE_SITE );
		if ( empty( $password ) ) {
			return;
		}

		do_action( 'ppw_sitewide_before_validate_password', $password );

		$password_is_valid = $entire_site_service->entire_site_is_valid_password( $password );
		if ( $password_is_valid ) {
			$entire_site_service->entire_site_set_password_to_cookie( $password );
//			$free_cache = new PPW_Cache_Services();
//			$free_cache->clear_cache_super_cache();
			$entire_site_service->entire_site_redirect_after_enter_password();
			die();
		}

		include PPW_DIR_PATH . 'includes/views/entire-site/view-ppw-form-password.php';
		die();
	}

	/**
	 * Handle protected short code content.
	 *
	 * @return string
	 */
	public function handle_content_protect_short_code() {
		$content = <<<_end_
		<div>
			This feature only runs on free
		</div>
_end_;

		return $content;
	}

	/**
	 * Handle admin init
	 */
	public function handle_admin_init() {
		if ( is_pro_active_and_valid_license() || PPW_Options_Services::get_instance()->get_flag( PPW_Constants::MIGRATED_DEFAULT_PW ) ) {
			return;
		}
		global $migration_free_service;
		$migration_free_service->start_run();
	}

	/**
	 * Handle rest API
	 */
	public function rest_api_init() {
		$api = new PPW_Api();
		$api->register_rest_routes();
	}

    public function exclude_protected_posts_from_api($args, $request) {
   		//Get all the protected post ids
   		if(is_admin() || is_user_logged_in() ){
   			 return $args;
   		}
   		$protected_post_ids = $this->ppwp_get_all_protected_ids();
   		if(!empty($protected_post_ids)){
   			if (isset($args['post_type']) && $args['post_type'] === 'post') {
	        
		        $args['post__not_in'] = $protected_post_ids;
		    }	
   		}
	    

	    return $args;
    }


	public function ppwp_restrict_rest_api_id( $result, $server, $request ) {

	    if ( is_admin() || is_user_logged_in() ) {
	        return $result;
	    }
		
	    $route = strtolower( $request->get_route() );
    	
		$validate = false;
	    // Check for posts/pages endpoints
		if (
			strpos( $route, '/wp/v2/posts' ) !== false ||
			strpos( $route, '/wp/v2/pages' ) !== false
		) {
			$validate = true;
		}
    
		$validate = apply_filters( 'ppwp_should_validate_rest_request', $validate, $route, $request );

	    // Individual post/page check
	    if (
	        preg_match( '/^\/wp\/v2\/posts\/(\d+)$/', $route, $matches ) ||
	        preg_match( '/^\/wp\/v2\/pages\/(\d+)$/', $route, $matches )
	    ) {
	        $post_id              = (int) $matches[1];
	        $PPW_Password_Services = new PPW_Password_Services();
	        $is_protected         = $PPW_Password_Services->is_protected_content( $post_id );
	        $is_protected = apply_filters( 'ppwp_is_rest_protected_post', $is_protected, $post_id, $request );

	        if ( $is_protected ) {
	            return new WP_Error(
	                'rest_forbidden',
	                apply_filters(
	                    'ppwp_rest_protected_post_message',
	                    __( 'The content of this post is restricted and cannot be accessed.', 'password-protect-page' ),
	                    $post_id
	                ),
	                array( 'status' => 403 )
	            );
	        }
	    }

	    // Sitewide protection
	    $is_protect = false;
	    $is_cookie_valid = false;

	    if ( function_exists( 'is_pro_active_and_valid_license' ) && is_pro_active_and_valid_license() ) {
	        //  Pro license check passed
	        $is_protect = ppw_pro_get_setting_entire_site_type_bool( PPW_Constants::IS_PROTECT_ENTIRE_SITE );

	        $entire_site_passwords = ppw_pro_get_setting_entire_site_type_array( PPW_Pro_Constants::PPW_PASSWORD_FOR_ENTIRE_SITE );
	        $passwords = ppw_pro_get_string_key_in_array( $entire_site_passwords );

	        $pro_setting_service = new PPW_Pro_Settings_Services();
	        $is_cookie_valid     = $pro_setting_service->validate_auth_cookie_entire_site( $passwords );
	    } else {
	        //  Free version
	        $entire_site_service = new PPW_Entire_Site_Services();
	        $is_protect          = ppw_core_get_setting_entire_site_type_bool( PPW_Constants::IS_PROTECT_ENTIRE_SITE );
	        $is_cookie_valid     = $entire_site_service->validate_auth_cookie_entire_site();
	    }

	    $is_protect = apply_filters( 'ppwp_is_rest_sitewide_protected', $is_protect, $request );

	    if ( $validate && $is_protect && ! $is_cookie_valid ) {
	        return new WP_Error(
	            'rest_forbidden',
	            apply_filters(
	                'ppwp_rest_sitewide_protection_message',
	                __( 'Access to the REST API is restricted due to sitewide protection.', 'password-protect-page' )
	            ),
	            array( 'status' => 401 )
	        );
	    }

	    return $result;
	}

	public function ppwp_exclude_protected_items_from_qry( $query ) {
	    global $post;

	    if ( ! function_exists( 'is_user_logged_in' ) ) {
	        require_once ABSPATH . 'wp-includes/pluggable.php';
	    }

	    if ( is_admin() || is_user_logged_in() ) {
	        return;
	    }

	    $protected_post_ids = $this->ppwp_get_all_protected_ids();

	    if ( ! empty( $protected_post_ids ) ) {
	        if ( $query->is_search && $query->is_main_query() ) {
	            $query->set( 'post__not_in', $protected_post_ids );
	        }

	        if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) {
	            $query->set( 'post__not_in', $protected_post_ids );
	        }
	    }

	    if ( ! is_admin() && $query->is_main_query() ) {
	        if ( $post && post_password_required( $post->ID ) ) {
	            $meta_query = $query->get( 'meta_query', [] );

	            $meta_query[] = [
	                'key'     => PPW_Constants::GLOBAL_PASSWORDS,
	                'compare' => 'NOT EXISTS',
	            ];

	            $query->set( 'meta_query', $meta_query );
	        }
	    }

	    if ( defined( 'REST_REQUEST' ) && REST_REQUEST && isset( $query->query_vars['s'] ) ) {
	        $meta_query = $query->get( 'meta_query', [] );

	        $meta_query[] = [
	            'key'     => PPW_Constants::GLOBAL_PASSWORDS,
	            'compare' => 'NOT EXISTS',
	        ];

	        $query->set( 'meta_query', $meta_query );
	    }
	}


    public function ppwp_get_all_protected_ids() {
    	global $wpdb;

		$query = $wpdb->prepare(
		        "SELECT DISTINCT post_id 
		         FROM {$wpdb->postmeta} 
		         WHERE meta_key = %s", 
		         PPW_Constants::GLOBAL_PASSWORDS
		    );

		$results = $wpdb->get_col($query);
		
		if ($results === null || empty($results)) {
		  
		    return [];
		}

		return $results;
    }

	/**
	 * Set post pass cookie to prevent cache.
	 *
	 * @param object $post The post data.
	 * @param string $pass The password.
	 */
	public function set_postpass_cookie_to_prevent_cache( $post, $pass ) {
		$free_service = new PPW_Password_Services();
		$free_service->set_password_to_cookie( $pass . $post->ID, PPW_Constants::WP_POST_PASS );
	}

	/**
	 * Handle a post requires the user to supply a password.
	 *
	 * @param bool    $required Whether the user needs to supply a password. True if password has not been
	 *                          provided or is incorrect, false if password has been supplied or is not required.
	 * @param WP_Post $post     Post data.
	 *
	 * @return bool  A post requires the user to supply a password.
	 */
	public function ppw_handle_post_password_required( $required, $post ) {
		if ( empty( $post->ID ) ) {
			return $required;
		}

		if ( empty( $post->post_type ) || ! ppw_is_post_type_selected_in_setting( $post->post_type ) ) {
			return $required;
		}

		if ( ppw_free_has_bypass_single_protection() ) {
			return $required;
		}

		return $this->free_services->is_valid_permission( $required, $post->ID );
	}

	/**
	 * Handle content shortcode for multiple pages.
	 *
	 * @param string $content The post content.
	 * @param object $post    The post data.
	 * @param array  $data    Data from client.
	 *
	 * @return bool|string
	 */
	public function handle_content_shortcode_for_multiple_pages( $content, $post, $data ) {
		if ( ! empty( $data['formType'] ) ) {
			return $content;
		}

		return PPW_Shortcode::get_instance()->get_content_by_page_number( $post, $data['page'] );
	}

	/**
	 * Create passwords table when PPWP Pro is not activated.
	 */
	public function handle_admin_init_when_pro_is_not_activate() {
		PPW_Repository_Passwords::get_instance()->install();
	}

	/**
	 * Handle post password required from Pro version.
	 *
	 * @param array  $protection_data Protection data.
	 * @param string $post_id         Post ID.
	 *
	 * @return array Protection data after checked.
	 */
	public function ppwp_post_password_required( $protection_data, $post_id ) {
		if ( ! isset( $protection_data['is_post_protected'] ) || ! isset( $protection_data['is_content_unlocked'] ) ) {
			return $protection_data;
		}

		if ( true !== $protection_data['is_post_protected'] ) {
			return $protection_data;
		}

		if ( false === $protection_data['is_content_unlocked'] ) {
			$protection_data['is_content_unlocked'] = $this->free_services->check_master_password_is_valid( $post_id );
		}

		return $protection_data;
	}

	/**
	 * Update label and post types column for PPWP Pro.
	 */
	public function update_column_for_ppwp_pro() {
		PPW_Repository_Passwords::get_instance()->update_label_and_post_types_column();
	}

	/**
	 * Handle subscriber request
	 */
	public function handle_subscribe_request() {
		if ( ppw_free_is_setting_keys_and_nonce_invalid( $_REQUEST, PPW_Constants::SUBSCRIBE_FORM_NONCE ) || ! isset( $_REQUEST['settings']['ppw_email'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We already verify nonce in this function.
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);
			wp_die();
		}
		$request = wp_unslash( $_REQUEST ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We already verify nonce in above.
		$result  = $this->subscribe_services->handle_subscribe_request( $request['settings']['ppw_email'] );
		wp_send_json(
			array(
				'is_error' => isset( $result['error_message'] ) ? true : false,
				'message'  => isset( $result['error_message'] ) ? $result['error_message'] : '',
			),
			isset( $result['error_message'] ) ? 400 : 200
		);
		wp_die();
	}

	/*
	 * Handle plugin loaded
	 */
	public function handle_plugin_loaded() {
		if ( ! defined( 'PPW_PRO_VERSION' ) ) {
			return;
		}
		if ( version_compare( PPW_PRO_VERSION, '1.1.5.1', '>=' ) ) {
			add_action( 'ppwp_post_password_required', array( $this, 'ppwp_post_password_required' ), 5, 2 );
		}
	}

	/**
	 * Handle admin notices.
	 */
	public function handle_admin_notices() {
		if ( ! function_exists( 'get_current_screen' ) ) {
			return;
		}

		$screen_display = array(
			'post',
			'edit-post',
			'toplevel_page_wp_protect_password_options',
			'plugins',
		);
		if ( ! in_array( get_current_screen()->id, $screen_display, true ) ) {
			return;
		}
		$class   = 'notice notice-warning';
		$message = 'Please update Password Protect WordPress Pro to version 1.1.5.1 in order for Master Passwords to work properly.';
		if ( defined( 'PPW_PRO_VERSION' ) && version_compare( PPW_PRO_VERSION, '1.1.5.1', '<' ) ) {
			printf( '<div class="%1$s"><p><b>Password Protect WordPress: </b>%2$s</p></div>', esc_attr( $class ), esc_html( $message ) );
		}
	}

	public function add_custom_column( $columns ) {
		global $post_status;

		if ( 'trash' === $post_status ) {
			return $columns;
		}

		$columns[ PPW_Constants::CUSTOM_TABLE_COLUMN_NAME ] = PPW_Constants::CUSTOM_TABLE_COLUMN_TITLE;

		return $columns;
	}

	public function render_content_custom_column ( $column, $post_id ) {
		if ( PPW_Constants::CUSTOM_TABLE_COLUMN_NAME === $column ) {
			include PPW_DIR_PATH . 'includes/views/column/view-ppw-column.php';
		}
	}

	/**
	 * Restore WP Passwords.
	 */
	public function ppw_free_restore_wp_passwords() {
		if ( ! isset( $_POST['security_check'] ) ) {
			wp_send_json(
				array(
					'is_error' => true,
					'message'  => PPW_Constants::BAD_REQUEST_MESSAGE,
				),
				400
			);
		}
		check_ajax_referer( PPW_Constants::GENERAL_FORM_NONCE, 'security_check' );

		global $password_recovery_service;
		$password_recovery_service->start_run();

		wp_send_json(
			array(
				'is_error' => false,
				'message'  => 'Start restoring backup passwords successfully.',
			),
			200
		);
	}

	/**
	 * Filters the array of row meta for each plugin in the Plugins list table.
	 *
	 * @param array  $plugin_meta An array of the plugin's metadata, including the version, author, author URI, and plugin URI.
	 * @param string $plugin_file Path to the plugin file relative to the plugins directory.
	 *
	 * @return array
	 */
	public function register_plugins_links( $plugin_meta, $plugin_file ) {
		if ( PPW_PLUGIN_BASE_NAME === $plugin_file ) {
			$misc_setting = admin_url( 'admin.php?page=wp_protect_password_options&tab=misc' );
			$plugin_meta[] = '<a href="' . $misc_setting . '">' . __( 'Restore passwords', PPW_Constants::DOMAIN ) . '</span>';
		}

		return $plugin_meta;
	}


	/**
	 * Render custom description below password form
	 *
	 * @param $password_form
	 *
	 * @return string
	 */
	public function render_custom_below_description( $password_form ) {
		$below_desc = wp_kses_post( get_theme_mod( 'ppwp_form_instructions_below_text' ) );

		$password_form .= sprintf('<div class="ppw-ppf-desc-below">%s</div>', $below_desc);

		return $password_form;
	}

	public function handle_plugin_links( $links ) {
		$setting_url = esc_url( admin_url( 'admin.php?page=' . PPW_Constants::MENU_NAME ) );
		$plugin_link = '<a href="' . $setting_url . '">' . __( 'Settings', PPW_Constants::DOMAIN ) . '</a>';
		array_unshift( $links, $plugin_link );

		return $links;
	}

	public function ppw_sitewide_countdown() {
		$is_show_countdown   = get_theme_mod( 'ppwp_sitewide_is_shown_countdown', '' );
		if ( $is_show_countdown || $is_show_countdown === '' ) {
			include PPW_DIR_PATH . 'includes/views/entire-site/view-ppw-countdown.php';
		}
	}
	
	public function ppw_sitewide_hide_password_form () {
		$enable_form   		 = get_theme_mod( 'ppwp_hide_sitewide_password_form' );
		if ( $enable_form ) {
			?>
				.ppw-swp-form {
					display: none !important;
				}
				.pda-form-login form {
					display: none !important;
				}
			<?php
		}
	}

	public function ppw_customizer_custom_fields ($wp_customize) {
		if ( ! class_exists( 'PPW_Datetime_Control' ) ) {
			include PPW_DIR_PATH . 'includes/customizers/class-ppw-datetime.php';
		}

		$wp_customize->register_control_type( 'PPW_Datetime_Control' );

		/* hide password form */
		$wp_customize->add_setting( 'ppwp_hide_sitewide_password_form' );
		$wp_customize->add_control(
			new PPW_Toggle_Control(
				$wp_customize,
				'ppwp_hide_sitewide_password_form_control', array(
				'label'       => __( 'Disable Password Form', PPW_Constants::DOMAIN ),
				'section'     => 'ppwp_pro_form_instructions',
				'type'        => 'toggle',
				'settings'    => 'ppwp_hide_sitewide_password_form',
			) )
		);

		/* countdown section group */
		$wp_customize->add_setting( 'ppwp_sitewide_countdown' );
		$wp_customize->add_control(
			new PPW_Title_Group_Control(
				$wp_customize,
				'ppwp_sitewide_countdown', array(
				'label'			=> __( 'COUNTDOWN TIMER', PPW_Constants::DOMAIN ),
				'section'  		=> 'ppwp_sitewide_countdown',
				'settings' 		=> 'ppwp_sitewide_countdown',
				'type'     		=> 'control_title',
			) )
		);

		$wp_customize->add_section( 'ppwp_sitewide_countdown', array(
			'title'    => __( 'Countdown Timer', PPW_Constants::DOMAIN ),
			'panel'    => 'ppwp_sitewide',
			'priority' => 500,
		) );

		$wp_customize->add_setting( 'ppwp_sitewide_is_shown_countdown', array(
			'default' => 0,
		) );

		$wp_customize->add_control(
			new PPW_Toggle_Control(
				$wp_customize,
				'ppwp_sitewide_is_shown_countdown', array(
				'label'       => __( 'Enable Countdown Timer', PPW_Constants::DOMAIN ),
				'section'     => 'ppwp_sitewide_countdown',
				'type'        => 'toggle',
				'description'  => __( 'Time zone: '.ppw_get_utc(), PPW_Constants::DOMAIN ),
				'settings'    => 'ppwp_sitewide_is_shown_countdown',
			))
		);

		// $wp_customize->add_setting( 'ppwp_sitewide_is_show_day', array(
		// 	'default' => 0,
		// ) );

		// $wp_customize->add_control(
		// 	new PPW_Toggle_Control(
		// 		$wp_customize,
		// 		'ppwp_sitewide_is_show_day', array(
		// 		'label'       => __( 'Show Day in Countdown', PPW_Constants::DOMAIN ),
		// 		'section'     => 'ppwp_sitewide_countdown',
		// 		'type'        => 'toggle',
		// 		'settings'    => 'ppwp_sitewide_is_show_day',
		// 	))
		// );

		$date = current_time( 'timestamp' );
		$wp_customize->add_setting( 'ppwp_sitewide_start_time', array(
			'default' => '',
			'min'     => date('Y-m-d\TH:i', $date),
		) );

		$wp_customize->add_control(
			new PPW_Datetime_Control(
				$wp_customize,
				'ppwp_sitewide_start_time', array(
				'label'       => __( 'Start Time (Optional)', PPW_Constants::DOMAIN ),
				'section'     => 'ppwp_sitewide_countdown',
				'type'        => 'datetime',
				'settings'    => 'ppwp_sitewide_start_time',
			))
		);

		$start_date 		= get_theme_mod( 'ppwp_sitewide_start_time', '' ) ? get_theme_mod( 'ppwp_sitewide_start_time' ) : date('Y-m-d\TH:i', $date);

		$wp_customize->add_setting( 'ppwp_sitewide_end_time', array(
			'default' => $start_date,
			'min'     => $start_date,
		) );

		$wp_customize->add_control(
			new PPW_Datetime_Control(
				$wp_customize,
				'ppwp_sitewide_end_time', array(
				'label'       => __( 'End Time', PPW_Constants::DOMAIN ),
				'section'     => 'ppwp_sitewide_countdown',
				'type'        => 'datetime',
				'settings'    => 'ppwp_sitewide_end_time',
			))
		);

		/* time unit section group */
		$wp_customize->add_setting( 'ppwp_countdown_time_unit' );
		$wp_customize->add_control(
			new PPW_Title_Group_Control(
				$wp_customize,
				'ppwp_countdown_time_unit', array(
				'label'			=> __( 'COUNTDOWN TIMER STYLES', PPW_Constants::DOMAIN ),
				'section'  		=> 'ppwp_sitewide_countdown',
				'settings' 		=> 'ppwp_countdown_time_unit',
				'type'     		=> 'control_title',
			) )
		);

		$wp_customize->add_setting( 'ppwp_countdown_day_text', array(
			'default' => __( 'Days', PPW_Constants::DOMAIN ),
		) );
		$wp_customize->add_control( 'ppwp_countdown_day_text', array(
			'label'    => __( 'Days Label', PPW_Constants::DOMAIN ),
			'section'  => 'ppwp_sitewide_countdown',
			'settings' => 'ppwp_countdown_day_text',
			'type'     => 'text',
		) );

		$wp_customize->add_setting( 'ppwp_countdown_hour_text', array(
			'default' => __( 'Hours ', PPW_Constants::DOMAIN ),
		) );
		$wp_customize->add_control( 'ppwp_countdown_hour_text', array(
			'label'    => __( 'Hours Label', PPW_Constants::DOMAIN ),
			'section'  => 'ppwp_sitewide_countdown',
			'settings' => 'ppwp_countdown_hour_text',
			'type'     => 'text',
		) );

		$wp_customize->add_setting( 'ppwp_countdown_minute_text', array(
			'default' => __( 'Minutes', PPW_Constants::DOMAIN ),
		) );
		$wp_customize->add_control( 'ppwp_countdown_minute_text', array(
			'label'    => __( 'Minutes Label', PPW_Constants::DOMAIN ),
			'section'  => 'ppwp_sitewide_countdown',
			'settings' => 'ppwp_countdown_minute_text',
			'type'     => 'text',
		) );

		$wp_customize->add_setting( 'ppwp_countdown_second_text', array(
			'default' => __( 'Seconds', PPW_Constants::DOMAIN ),
		) );
		$wp_customize->add_control( 'ppwp_countdown_second_text', array(
			'label'    => __( 'Seconds Label', PPW_Constants::DOMAIN ),
			'section'  => 'ppwp_sitewide_countdown',
			'settings' => 'ppwp_countdown_second_text',
			'type'     => 'text',
		) );

		/* coutdown font size */
		$wp_customize->add_setting( 'ppwp_countdown_font_size' );
		$wp_customize->add_control( 'ppwp_countdown_font_size_control', array(
			'label'			=> __( 'Font Size', PPW_Constants::DOMAIN ),
			'section'  		=> 'ppwp_sitewide_countdown',
			'settings' 		=> 'ppwp_countdown_font_size',
			'description'	=> 'Font size in px',
			'type'     		=> 'number',
		) );

		/* password form background color */
		$wp_customize->add_setting( 'ppwp_countdown_text_color', array(
			'default' => '',
		) );

		$wp_customize->add_control(
			new WP_Customize_Color_Control(
				$wp_customize,
				'ppwp_countdown_text_color_control', array(
				'label'    => __( 'Text Color', PPW_Constants::DOMAIN ),
				'section'  => 'ppwp_sitewide_countdown',
				'settings' => 'ppwp_countdown_text_color',
			) )
		);

		/* descript section group */
		$wp_customize->add_setting( 'ppwp_sitewide_above_countdown_text' );
		$wp_customize->add_control(
			new PPW_Title_Group_Control(
				$wp_customize,
				'ppwp_sitewide_above_countdown_text', array(
				'label'			=> __( 'DESCRIPTION ABOVE TIMER', PPW_Constants::DOMAIN ),
				'section'  		=> 'ppwp_sitewide_countdown',
				'settings' 		=> 'ppwp_sitewide_above_countdown_text',
				'type'     		=> 'control_title',
			) )
		);

		/* Text above sitewide */
		$wp_customize->add_setting( 'ppwp_sitewide_above_countdown', array(
			'default' => __( '', PPW_Constants::DOMAIN ),
		) );
		$wp_customize->add_control(
			new PPW_Text_Editor_Custom_Control(
				$wp_customize,
				'ppwp_sitewide_above_countdown',
				array(
					'label'    => __( 'Description', PPW_Constants::DOMAIN ),
					'section'  => 'ppwp_sitewide_countdown',
					'settings' => 'ppwp_sitewide_above_countdown',
					'type'     => 'textarea',
				)
			)
		);

		/* Text below font size */
		$wp_customize->add_setting( 'ppwp_text_above_font_size' );
		$wp_customize->add_control( 'ppwp_text_above_font_size_control', array(
			'label'			=> __( 'Font Size', PPW_Constants::DOMAIN ),
			'section'  		=> 'ppwp_sitewide_countdown',
			'settings' 		=> 'ppwp_text_above_font_size',
			'description'	=> 'Font size in px',
			'type'     		=> 'number',
		) );

		/* Text above background color */
		$wp_customize->add_setting( 'ppwp_text_above_color', array(
			'default' => '',
		) );

		$wp_customize->add_control(
			new WP_Customize_Color_Control(
				$wp_customize,
				'ppwp_text_above_color_control', array(
				'label'    => __( 'Text Color', PPW_Constants::DOMAIN ),
				'section'  => 'ppwp_sitewide_countdown',
				'settings' => 'ppwp_text_above_color',
			) )
		);

		/* descript section group */
		$wp_customize->add_setting( 'ppwp_sitewide_below_countdown_text' );
		$wp_customize->add_control(
			new PPW_Title_Group_Control(
				$wp_customize,
				'ppwp_sitewide_below_countdown_text', array(
				'label'			=> __( 'DESCRIPTION BELOW TIMER', PPW_Constants::DOMAIN ),
				'section'  		=> 'ppwp_sitewide_countdown',
				'settings' 		=> 'ppwp_sitewide_below_countdown_text',
				'type'     		=> 'control_title',
			) )
		);

		/* Text below sitewide */
		$wp_customize->add_setting( 'ppwp_sitewide_below_countdown', array(
			'default' => __( '', PPW_Constants::DOMAIN ),
		) );
		$wp_customize->add_control(
			new PPW_Text_Editor_Custom_Control(
				$wp_customize,
				'ppwp_sitewide_below_countdown',
				array(
					'label'    => __( 'Description', PPW_Constants::DOMAIN ),
					'section'  => 'ppwp_sitewide_countdown',
					'settings' => 'ppwp_sitewide_below_countdown',
					'type'     => 'textarea',
				)
			)
		);

		/* Text below font size */
		$wp_customize->add_setting( 'ppwp_text_below_font_size' );
		$wp_customize->add_control( 'ppwp_text_below_font_size_control', array(
			'label'			=> __( 'Font Size', PPW_Constants::DOMAIN ),
			'section'  		=> 'ppwp_sitewide_countdown',
			'settings' 		=> 'ppwp_text_below_font_size',
			'description'	=> 'Font size in px',
			'type'     		=> 'number',
		) );

		/* Text below background color */
		$wp_customize->add_setting( 'ppwp_text_below_color', array(
			'default' => '',
		) );

		$wp_customize->add_control(
			new WP_Customize_Color_Control(
				$wp_customize,
				'ppwp_text_below_color_control', array(
				'label'    => __( 'Text Color', PPW_Constants::DOMAIN ),
				'section'  => 'ppwp_sitewide_countdown',
				'settings' => 'ppwp_text_below_color',
			) )
		);

		return $wp_customize;
	}

	public function register_countdown_timer_style() {
		$sw_custom_css = '
			.ppwp-sitewide-countdown {
				font-size: ' . esc_attr( get_theme_mod( 'ppwp_countdown_font_size' ) ) . 'px!important;
				color: ' . esc_attr( get_theme_mod( 'ppwp_countdown_text_color' ) ) . '!important;
				display: flex;
				justify-content: center;
			}

			#ppwp_desc_above_countdown {
				font-size: ' . esc_attr( get_theme_mod( 'ppwp_text_above_font_size' ) ) . 'px!important;
				color: ' . esc_attr( get_theme_mod( 'ppwp_text_above_color' ) ) . '!important;
			}

			#ppwp_desc_below_countdown {
				font-size: ' . esc_attr( get_theme_mod( 'ppwp_text_below_font_size' ) ) . 'px!important;
				color: ' . esc_attr(  get_theme_mod( 'ppwp_text_below_color' ) ) . '!important;
			}
			.ppwp-countdown-container {
				text-align: center;
			}
			#ppwp_desc_above_countdown,
			#ppwp_desc_below_countdown {
				display: none;
			}
			.ppwp_countdown_timer_day,
			.ppwp_countdown_timer_hour,
			.ppwp_countdown_timer_minute,
			.ppwp_countdown_timer_second {
				text-align: center;
				padding: 0px 10px;
			}
			.ppwp_coundown_colon_spacing {
				display: flex;
				align-items: center;
			}
		';
		echo $sw_custom_css; // phpcs:ignore -- we already escase inside the css
	}
}