![]() Server : Apache/2.4.52 (Ubuntu) System : Linux webserver 6.8.0-49-generic #49~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Nov 6 17:42:15 UTC 2 x86_64 User : www-data ( 33) PHP Version : 8.1.2-1ubuntu2.21 Disable Function : NONE Directory : /var/www/theprintave/wp-content/plugins/site-mailer/modules/settings/ |
<?php namespace SiteMailer\Modules\Settings; use Exception; use SiteMailer\Classes\Logger; use SiteMailer\Classes\Module_Base; use SiteMailer\Classes\Utils; use SiteMailer\Modules\Connect\Classes\Config; use SiteMailer\Modules\Connect\Classes\Data; use SiteMailer\Modules\Connect\Classes\Utils as Connect_Utils; use SiteMailer\Modules\Connect\Module as Connect; use SiteMailer\Modules\Logs\Components\Log_Pull; use SiteMailer\Modules\Settings\Banners\Sale_Banner; use SiteMailer\Modules\Settings\Classes\Settings; use Throwable; if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Class Module */ class Module extends Module_Base { const SETTING_PREFIX = 'site_mailer_'; const SETTING_GROUP = 'site_mailer_settings'; const SETTING_BASE_SLUG = 'site-mailer-settings'; const SETTING_CAPABILITY = 'manage_options'; /** * Get module name. * Retrieve the module name. * * @access public * @return string Module name. */ public function get_name(): string { return 'settings'; } public static function component_list(): array { return [ 'Settings_Pointer', ]; } public static function routes_list(): array { return [ 'Get_Settings', ]; } public function render_top_bar() { ?> <div id="site-mailer-app-top-bar"></div> <?php } public function render_app() { ?> <?php Sale_Banner::get_banner( 'https://go.elementor.com/sm-panel-wp-dash-upgrade-panel/' ); ?> <!-- The hack required to wrap WP notifications --> <div class="wrap"> <h1 style="display: none;" role="presentation"></h1> </div> <div id="site-mailer-app"></div> <?php } public function register_page() { add_submenu_page( 'options-general.php', __( 'Site Mailer', 'site-mailer' ), __( 'Site Mailer', 'site-mailer' ), self::SETTING_CAPABILITY, self::SETTING_BASE_SLUG, [ $this, 'render_app' ], 20 ); } /** * @throws Throwable */ public function maybe_add_url_mismatch_notice() { if ( ! Utils::is_plugin_page() || Connect_Utils::is_valid_home_url() ) { return; } ?> <div class="notice notice-error notice site-mailer__notice site-mailer__notice--error"> <p> <b> <?php esc_html_e( 'Your license key does not match your current domain, causing a mismatch.', 'site-mailer' ); ?> </b> <span> <?php esc_html_e( 'This is most likely due to a change in the domain URL of your site (including HTTP/SSL migration).', 'site-mailer' ); ?> <button type="button" onclick="document.dispatchEvent( new Event( 'site-mailer/auth/url-mismatch-modal/open' ) );"> <?php esc_html_e( 'Fix mismatched URL', 'site-mailer' ); ?> </button> </span> </p> </div> <?php } /** * Enqueue Scripts and Styles */ public function enqueue_scripts( $hook ) { if ( 'settings_page_site-mailer-settings' !== $hook ) { return; } wp_enqueue_style( 'site-mailer-admin-fonts', 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap', [], SITE_MAILER_VERSION ); Utils\Assets::enqueue_app_assets( 'admin' ); wp_localize_script( 'admin', 'siteMailerSettingsData', [ 'wpRestNonce' => wp_create_nonce( 'wp_rest' ) ] ); } /** * @throws Exception */ public function on_connect() { if ( ! Connect::is_connected() ) { return; } $register_response = Utils::get_api_client()->make_request( 'POST', 'site/register' ); if ( $register_response && ! is_wp_error( $register_response ) ) { Data::set_subscription_id( $register_response->id ); $response = Utils::get_api_client()->make_request( 'POST', 'site/info' ); if ( ! empty( $response->site_url ) && Data::get_home_url() !== $response->site_url ) { Data::set_home_url( $response->site_url ); } } if ( ! is_wp_error( $response ) ) { update_option( self::SETTING_PREFIX . 'plan_data', $response ); update_option( Settings::IS_VALID_PLAN_DATA, true ); } else { Logger::error( esc_html( $response->get_error_message() ) ); update_option( Settings::IS_VALID_PLAN_DATA, false ); } } /** * Register settings. * * Register settings for the plugin. * * @return void * @throws Throwable */ public function register_settings() { $settings = [ 'keep_log' => [ 'type' => 'boolean', ], 'unsubscribe' => [ 'type' => 'boolean', ], 'close_post_connect_modal' => [ 'type' => 'boolean', 'description' => __( 'Site Mailer Close Post Connect Modal', 'site-mailer' ), ], 'from_name' => [ 'type' => 'string', 'description' => __( 'Site Mailer From Email', 'site-mailer' ), ], 'reply_to_email' => [ 'type' => 'string', 'description' => __( 'Site Mailer Reply Email', 'site-mailer' ), ], 'sender_domain' => [ 'type' => 'string', 'description' => __( 'Site Mailer Sender Domain', 'site-mailer' ), ], 'sender_email_prefix' => [ 'type' => 'string', 'description' => __( 'Site Mailer Sender Mail Prefix', 'site-mailer' ), ], 'custom_domain_dns_records' => [ 'type' => 'string', 'description' => __( 'Site Mailer custom domain DNS records', 'site-mailer' ), ], 'verification_started' => [ 'type' => 'boolean', ], 'registration_started' => [ 'type' => 'boolean', ], 'confirm_domain_settings_opened' => [ 'type' => 'boolean', ], 'confirm_dns_settings_added' => [ 'type' => 'boolean', ], 'active_step' => [ 'type' => 'boolean', ], 'custom_domain_verified' => [ 'type' => 'boolean', ], 'custom_domain_verified_alert' => [ 'type' => 'boolean', ], 'custom_domain_verification_start_time' => [ 'type' => 'string', ], 'is_valid_plan_data' => [ 'type' => 'boolean', ], 'hide_logs_status_refresh_infotip' => [ 'type' => 'boolean', 'show_in_rest' => true, ], ]; foreach ( $settings as $setting => $args ) { if ( ! isset( $args['show_in_rest'] ) ) { $args['show_in_rest'] = true; } register_setting( 'options', self::SETTING_PREFIX . $setting, $args ); } } /** * Get sender email * * @return string */ public static function get_sender_email(): string { $settings = Settings::get( Settings::PLAN_DATA ); $sender_in_used = Settings::get( Settings::SENDER_EMAIL_PREFIX ); $sender_mail = ''; $domain_verified = 'verified' === Settings::get( Settings::CUSTOM_DOMAIN_VERIFICATION_STATUS ); if ( ! empty( $settings ) && ! is_wp_error( $settings ) ) { if ( ! empty( $settings->sender->sender_in_used ) ) { $sender_mail = $settings->sender->sender_in_used; $sender = explode( '@', $sender_mail ); if ( $domain_verified && ! empty( $sender_in_used ) && $sender[0] !== $sender_in_used ) { $sender_mail = $sender_in_used . '@' . $sender[1]; } } } return $sender_mail; } /** * Get sender from name * * @return string */ public static function get_sender_from_name(): string { return Settings::get( Settings::FROM_NAME ); } /** * Get sender reply to email * * @return string */ public static function get_sender_reply_email(): string { $email = Settings::get( Settings::REPLY_TO_EMAIL ); if ( ( ! empty( $email ) && ! is_email( $email ) ) || empty( $email ) ) { return get_bloginfo( 'admin_email' ); } return $email; } /** * Get unsubscribe encryption key * * @return array|bool */ public static function get_unsubscribe_encryption_data(): array { if ( ! function_exists( 'openssl_encrypt' ) ) { Logger::error( 'the openssl extension is not installed in the environment' ); return false; } $data = Settings::get( Settings::UNSUBSCRIBE_ENCRYPTION_DATA ); if ( ! $data ) { $cipher = 'aes128'; $iv_length = openssl_cipher_iv_length( $cipher ); $iv = openssl_random_pseudo_bytes( $iv_length ); $data = [ 'key' => wp_generate_uuid4(), 'cipher' => $cipher, 'iv' => base64_encode( $iv ), ]; update_option( Settings::UNSUBSCRIBE_ENCRYPTION_DATA, $data ); } return $data; } /** * Refresh plan data when the settings page is loaded. * * @return void * @throws Throwable */ public static function refresh_plan_data() { $response = Utils::get_api_client()->make_request( 'POST', 'site/info' ); if ( ! empty( $response->site_url ) && Data::get_home_url() !== $response->site_url ) { Data::set_home_url( $response->site_url ); } if ( ! is_wp_error( $response ) ) { update_option( self::SETTING_PREFIX . 'plan_data', $response ); update_option( Settings::IS_VALID_PLAN_DATA, true ); } else { Logger::error( esc_html( $response->get_error_message() ) ); update_option( Settings::IS_VALID_PLAN_DATA, false ); } } public static function clear_settings_cache() { wp_cache_delete( Settings::KEEP_LOG, 'option' ); wp_cache_delete( Settings::UNSUBSCRIBE, 'option' ); wp_cache_delete( Settings::CLOSE_POST_CONNECT_MODAL, 'option' ); wp_cache_delete( Settings::PLAN_DATA, 'option' ); wp_cache_delete( Settings::SENDER_EMAIL_PREFIX, 'option' ); wp_cache_delete( Settings::FROM_NAME, 'option' ); wp_cache_delete( Settings::REPLY_TO_EMAIL, 'option' ); wp_cache_delete( Settings::CUSTOM_DOMAIN_DNS_RECORDS, 'option' ); wp_cache_delete( Settings::CUSTOM_DOMAIN_VERIFICATION_STATUS, 'option' ); wp_cache_delete( Settings::CUSTOM_DOMAIN_VERIFICATION_RECORDS, 'option' ); wp_cache_delete( Settings::CUSTOM_DOMAIN_VERIFICATION_START_TIME, 'option' ); wp_cache_delete( Config::APP_PREFIX . Data::SUBSCRIPTION_ID, 'option' ); wp_cache_delete( Config::APP_PREFIX . Data::ACCESS_TOKEN, 'option' ); wp_cache_delete( Config::APP_PREFIX . Data::CLIENT_ID, 'option' ); wp_cache_delete( Config::APP_PREFIX . Data::HOME_URL, 'option' ); wp_cache_delete( Config::APP_PREFIX . Data::OPTION_OWNER_USER_ID, 'option' ); wp_cache_delete( Settings::IS_VALID_PLAN_DATA, 'option' ); } /** * Get all plugin settings data * @return array * @throws Throwable */ public static function get_plugin_settings(): array { self::refresh_plan_data(); self::clear_settings_cache(); return [ 'isConnected' => Connect::is_connected(), 'isUrlMismatch' => ! Connect_Utils::is_valid_home_url(), 'subscriptionId' => Data::get_subscription_id(), 'keepLog' => Settings::get( Settings::KEEP_LOG ), 'unsubscribe' => Settings::get( Settings::UNSUBSCRIBE ), 'isDevelopment' => defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG, 'siteUrl' => wp_parse_url( get_site_url(), PHP_URL_HOST ), 'closePostConnectModal' => Settings::get( Settings::CLOSE_POST_CONNECT_MODAL ), 'senderEmail' => self::get_sender_email() ?? '', 'fromName' => self::get_sender_from_name(), 'replyToEmail' => self::get_sender_reply_email(), 'settings' => Settings::get( Settings::PLAN_DATA ), 'customDomainDNSRecords' => Settings::get( Settings::CUSTOM_DOMAIN_DNS_RECORDS ), 'verificationStatus' => Settings::get( Settings::CUSTOM_DOMAIN_VERIFICATION_STATUS ), 'verificationRecords' => Settings::get( Settings::CUSTOM_DOMAIN_VERIFICATION_RECORDS ), 'verificationStartTime' => Settings::get( Settings::CUSTOM_DOMAIN_VERIFICATION_START_TIME ), //TODO: check use of this 'isValidPlanData' => Settings::get( Settings::IS_VALID_PLAN_DATA ), 'isRTL' => is_rtl(), 'lastLogRefresh' => Log_Pull::check_refresh_time(), ]; } public function __construct() { $this->register_routes(); $this->register_components( self::component_list() ); add_action( 'current_screen', function () { add_action( 'admin_notices', [ $this, 'maybe_add_url_mismatch_notice' ] ); } ); add_action( 'admin_menu', [ $this, 'register_page' ] ); add_action( 'in_admin_header', [ $this, 'render_top_bar' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); add_action( 'on_connect_' . Config::APP_PREFIX . '_connected', [ $this, 'on_connect' ] ); add_action( 'rest_api_init', [ $this, 'register_settings' ] ); } }