Server IP : 104.21.38.3 / Your IP : 172.70.143.69 Web Server : Apache System : Linux krdc-ubuntu-s-2vcpu-4gb-amd-blr1-01.localdomain 5.15.0-142-generic #152-Ubuntu SMP Mon May 19 10:54:31 UTC 2025 x86_64 User : www ( 1000) PHP Version : 7.4.33 Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /www/wwwroot/coircraft.com/wp-content/plugins/wp-mail-logging/src/ |
Upload File : |
<?php namespace No3x\WPML; use No3x\WPML\Admin\EmailLogsTab; use No3x\WPML\Admin\SettingsTab; use No3x\WPML\Admin\SMTPTab; use No3x\WPML\Migration\Migration; use No3x\WPML\Model\WPML_Mail as Mail; use No3x\WPML\Renderer\WPML_MailRenderer_AJAX_Handler; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) exit; class WPML_Plugin extends WPML_LifeCycle implements IHooks { const HOOK_LOGGING_MAIL = 'log_email'; const HOOK_LOGGING_MAIL_PRIORITY = PHP_INT_MAX; const HOOK_LOGGING_SUPPORTED_FORMATS = 'wpml_hook_supported_formats'; /** * WPML_Plugin constructor. * @param $supportedMailRendererFormats * @param WPML_MailRenderer_AJAX_Handler $mailRendererAJAXHandler */ public function __construct($supportedMailRendererFormats, $mailRendererAJAXHandler) { $this->supportedMailRendererFormats = $supportedMailRendererFormats; $this->mailRendererAJAXHandler = $mailRendererAJAXHandler; } public static function getTablename( $name ) { global $wpdb; return $wpdb->prefix . 'wpml_' . $name; } public function getPluginDisplayName() { return 'WP Mail Logging'; } public function getMainPluginFileName() { return 'wp-mail-logging.php'; } public function getVersionSaved() { return parent::getVersionSaved(); } /** * See: http://plugin.michael-simpson.com/?page_id=101 * Called by install() to create any database tables if needed. * Best Practice: * (1) Prefix all table names with $wpdb->prefix * (2) make table names lower case only * @return void */ protected function installDatabaseTables() { global $wpdb; $collate = ! empty( $wpdb->collate ) ? "COLLATE='{$wpdb->collate}'" : ''; $tableName = WPML_Plugin::getTablename('mails'); $result = $wpdb->query(" CREATE TABLE IF NOT EXISTS `$tableName` ( `mail_id` INT NOT NULL AUTO_INCREMENT, `timestamp` TIMESTAMP NOT NULL, `host` VARCHAR(200) NOT NULL DEFAULT '0', `receiver` VARCHAR(200) NOT NULL DEFAULT '0', `subject` VARCHAR(200) NOT NULL DEFAULT '0', `message` TEXT NULL, `headers` TEXT NULL, `attachments` VARCHAR(800) NOT NULL DEFAULT '0', `error` VARCHAR(400) NULL DEFAULT '', `plugin_version` VARCHAR(200) NOT NULL DEFAULT '0', PRIMARY KEY (`mail_id`), FULLTEXT INDEX `idx_message` (`message`) ) ENGINE='InnoDB' {$collate};"); if ( $result !== false ) { /* * Set the option to `2` to indicate that previous migrations are no longer needed. */ update_option( Migration::OPTION_NAME, 2, false ); } } /** * See: http://plugin.michael-simpson.com/?page_id=101 * Drop plugin-created tables on uninstall. * @return void */ protected function unInstallDatabaseTables() { global $wpdb; $tableName = WPML_Plugin::getTablename('mails'); $wpdb->query("DROP TABLE IF EXISTS `$tableName`"); // Remove the cache option indicating tables are installed wp_cache_delete(parent::CACHE_INSTALLED_KEY, parent::CACHE_GROUP); } /** * Perform actions when upgrading from version X to version Y * See: http://plugin.michael-simpson.com/?page_id=35 * @return void */ public function upgrade() { global $wpdb; $savedVersion = $this->getVersionSaved(); if(! $this->isInstalled() || empty( $savedVersion ) ) { // The plugin must be installed before any upgrades return; } $upgradeOk = true; $savedVersion = $this->getVersionSaved(); $codeVersion = $this->getVersion(); $tableName = $this->getTablename('mails'); /* check for downgrade or beta if( $this->isVersionLessThan($codeVersion, $savedVersion) || false !== strpos($savedVersion, 'beta') ) { $upgradeOk = false; // This is only be the case if the user had a beta version installed if ( is_admin() ) { wp_die( "[{$this->getPluginDisplayName()}] You have installed version {$savedVersion} but try to install {$codeVersion}! This would require a database downgrade which is not supported! You need to install {$savedVersion} again, enable \"Cleanup\" in the settings and disable the plugin."); } }*/ if ($this->isVersionLessThan($savedVersion, '2.0')) { if ($this->isVersionLessThan($savedVersion, '1.2')) { $wpdb->query("ALTER TABLE `$tableName` CHANGE COLUMN `to` `receiver` VARCHAR(200)"); } if ($this->isVersionLessThan($savedVersion, '1.3')) { $wpdb->query("ALTER TABLE `$tableName` MODIFY COLUMN `attachments` VARCHAR(800) NOT NULL DEFAULT '0'"); } if ($this->isVersionLessThan($savedVersion, '1.4')) { $wpdb->query("ALTER TABLE `$tableName` CHARACTER SET utf8 COLLATE utf8_general_ci;"); } if ($this->isVersionLessThan($savedVersion, '1.7')) { $wpdb->query("ALTER TABLE `$tableName` ADD COLUMN `host` VARCHAR(200) NOT NULL DEFAULT '0' AFTER `timestamp`;"); } if ($this->isVersionLessThan($savedVersion, '1.8')) { // Due to upgrade bug upgrades from 1.6.2 to 1.7.0 failed. Redo the schema change if required $results = $wpdb->get_results( $wpdb->prepare( "SHOW COLUMNS FROM `$tableName` LIKE %s", 'host' ) ); $column_exists = ( count( $results ) > 0 ) ? true : false; if ( false === $column_exists && is_array( $results ) ) { $wpdb->query("ALTER TABLE `$tableName` ADD COLUMN `host` VARCHAR(200) NOT NULL DEFAULT '0' AFTER `timestamp`;"); } $wpdb->query("ALTER TABLE `$tableName` ADD COLUMN `error` VARCHAR(400) NULL DEFAULT '' AFTER `attachments`;"); } } if ( !empty( $wpdb->last_error ) ) { $upgradeOk = false; if ( is_admin() ) { echo "There was at least one error while upgrading the database schema. Please report the following error: {$wpdb->last_error}"; } } // Post-upgrade, set the current version in the options if ($upgradeOk && $savedVersion != $codeVersion) { $this->saveInstalledVersion(); } } public function addActionsAndFilters() { EmailLogsTab::get_instance()->hooks(); SettingsTab::get_instance()->hooks(); SMTPTab::get_instance()->hooks(); add_action( 'current_screen', [ $this, 'create_screens' ], 90 ); // Add options administration page // http://plugin.michael-simpson.com/?page_id=47 add_action( 'admin_menu', array(&$this, 'createSettingsMenu'), 9 ); // Example adding a script & style just for the options administration page // http://plugin.michael-simpson.com/?page_id=47 // if (strpos($_SERVER['REQUEST_URI'], $this->getSettingsSlug()) !== false) { // wp_enqueue_script('my-script', plugins_url('/js/my-script.js', __FILE__)); // wp_enqueue_style('my-style', plugins_url('/css/my-style.css', __FILE__)); // } // Add Actions & Filters // http://plugin.michael-simpson.com/?page_id=37 add_filter( 'plugin_action_links', array( &$this, 'registerPluginActionLinks'), 10, 5 ); add_filter( 'wp_mail', array( $this, self::HOOK_LOGGING_MAIL ), self::HOOK_LOGGING_MAIL_PRIORITY ); add_action( 'wp_mail_failed', array( &$this, 'log_email_failed' ) ); add_filter( 'set-screen-option', array( &$this, 'save_screen_options' ), 10, 3); add_filter( 'wpml_get_plugin_version', array( &$this, 'getVersion' ) ); add_filter( 'wpml_get_plugin_name', array( &$this, 'getPluginDisplayName' ) ); add_filter( 'wpml_get_date_time_format', array( &$this, 'getDateTimeFormatString' ) ); // Adding scripts & styles to all pages // Examples: // wp_enqueue_script('jquery'); // wp_enqueue_style('my-style', plugins_url('/css/my-style.css', __FILE__)); // wp_enqueue_script('my-script', plugins_url('/js/my-script.js', __FILE__)); // Register short codes // http://plugin.michael-simpson.com/?page_id=39 // Register AJAX hooks // http://plugin.michael-simpson.com/?page_id=41 // Admin footer text. add_filter( 'admin_footer_text', [ $this, 'admin_footer' ], 1, 2 ); add_filter( 'in_admin_header', [ $this, 'admin_header' ] ); add_filter( 'admin_body_class', [ $this, 'add_admin_body_class' ] ); } /** * Add admin body class for WP Mail Logging admin pages. * * @since 1.12.0 * * @param string $classes Space-separated list of CSS classes. * * @return string */ public function add_admin_body_class( $classes ) { global $wp_logging_list_page; $current_screen = get_current_screen(); if ( empty( $current_screen ) || ! is_a( $current_screen, 'WP_Screen' ) || $current_screen->id !== $wp_logging_list_page ) { return $classes; } return $classes . ' wp-mail-logging-admin-page'; } /** * Header for WP Mail Logging admin pages. * * @since 1.11.0 * * @return void * * @throws \Exception */ public function admin_header() { global $wp_logging_list_page; $current_screen = get_current_screen(); if ( $current_screen->id !== $wp_logging_list_page ) { return; } $assets_url = WPML_Init::getInstance()->getService( 'plugin' )->get_assets_url(); $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : null; ?> <div id="wp-mail-logging-page-header-temp"></div> <div id="wp-mail-logging-page-header"> <div class="wp-mail-logging-page-title"> <div class="wp-mail-logging-logo-image"> <?php printf( '<img src="%1$s" srcset="%2$s 2x" alt="%3$s"/>', esc_url( $assets_url . '/images/logo.png' ), esc_url( $assets_url . '/images/[email protected]' ), esc_html__( 'WP Mail Logging logo') ) ?> </div> <div class="wp-mail-logging-logo-sep"> <img src="<?php echo esc_url( $assets_url . '/images/sep.png' ); ?>" /> </div> <?php $admin_page_url = WPML_Utils::get_admin_page_url(); $menu_tabs = [ [ 'slug' => '', 'label' => __( 'Email Log', 'wp-mail-logging' ), ], ]; if ( current_user_can( self::get_view_settings_capability() ) ) { $menu_tabs = array_merge( $menu_tabs, [ [ 'slug' => 'settings', 'label' => __( 'Settings', 'wp-mail-logging' ), ], [ 'slug' => 'smtp', 'label' => __( 'SMTP', 'wp-mail-logging' ), ], ] ); } foreach ( $menu_tabs as $menu_tab ) { ?> <a href="<?php echo esc_url( add_query_arg( 'tab', $menu_tab['slug'], $admin_page_url ) ) ?>" class="tab <?php echo $tab == $menu_tab['slug'] ? 'active' : null ?>" aria-current="page"> <?php echo esc_html( $menu_tab['label'] ) ?> </a> <?php } ?> </div> </div> <?php } /** * Get the user capability that is required to view the settings page. * * @since 1.12.0 * * @return string */ public static function get_view_settings_capability() { return apply_filters( 'wp_mail_logging_view_settings_capability', 'manage_options' ); } /** * Create WP Mail Logging screens. * * @since 1.11.0 * * @param \WP_Screen $current_screen * * @return void */ public function create_screens( $current_screen ) { global $wp_logging_list_page; if ( $current_screen->id !== $wp_logging_list_page ) { return; } // Hide all unrelated to the plugin notices on the plugin admin pages. add_action( 'admin_print_scripts', [ $this, 'hide_unrelated_notices' ] ); if ( current_user_can( self::get_view_settings_capability() ) ) { $allowed_screens = [ 'settings' => SettingsTab::get_instance(), 'smtp' => SMTPTab::get_instance(), ]; } $tab = ! empty( $_GET['tab'] ) ? sanitize_text_field( $_GET['tab'] ): 'logs'; if ( ! isset( $allowed_screens[ $tab ] ) ) { EmailLogsTab::get_instance()->screen_hooks(); } else { $allowed_screens[ $tab ]->screen_hooks(); } if ( $tab === 'logs' || $tab === 'settings' ) { add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_jquery_confirm' ] ); } } /** * Enqueue the jQuery confirm library. * * @since 1.12.0 * * @return void * * @throws \Exception */ public function enqueue_jquery_confirm() { $plugin_meta = WPML_Init::getInstance()->getService( 'plugin-meta' ); wp_enqueue_script( 'wp-mail-logging-jquery-confirm', $plugin_meta['uri'] . "lib/jquery-confirm/jquery-confirm.min.js", [ 'jquery' ], '3.3.4', true ); wp_enqueue_style( 'wp-mail-logging-jquery-confirm', $plugin_meta['uri'] . "lib/jquery-confirm/jquery-confirm.min.css", [], '3.3.4' ); $assets_url = WPML_Init::getInstance()->getService( 'plugin' )->get_assets_url(); wp_localize_script( 'wp-mail-logging-jquery-confirm', 'WPMailLoggingJqueryConfirm', /** * Filter the jQuery Confirm localized strings. * * @since 1.12.0 */ apply_filters( 'wp_mail_logging_jquery_confirm_localized_strings', [ 'headsup' => esc_html__( 'Heads up!', 'wp-mail-logging' ), 'yes' => esc_html__( 'Yes', 'wp-mail-logging' ), 'cancel' => esc_html__( 'Cancel', 'wp-mail-logging' ), 'icon' => esc_url( $assets_url . '/images/font-awesome/exclamation-circle-solid-orange.svg' ), 'warning' => esc_html__( 'Warning!', 'wp-mail-logging' ), ] ) ); } /** * Remove all non-WP Mail Logging plugin notices from our plugin pages. * * @since 1.12.0 */ public function hide_unrelated_notices() { $this->remove_unrelated_actions( 'user_admin_notices' ); $this->remove_unrelated_actions( 'admin_notices' ); $this->remove_unrelated_actions( 'all_admin_notices' ); $this->remove_unrelated_actions( 'network_admin_notices' ); } /** * Remove all non-WP Mail Logging notices from the our plugin pages based on the provided action hook. * * @since 1.12.0 * * @param string $action The name of the action. */ private function remove_unrelated_actions( $action ) { global $wp_filter; if ( empty( $wp_filter[ $action ]->callbacks ) || ! is_array( $wp_filter[ $action ]->callbacks ) ) { return; } foreach ( $wp_filter[ $action ]->callbacks as $priority => $hooks ) { foreach ( $hooks as $name => $arr ) { if ( strpos( strtolower( $name ), 'no3x\wpml' ) !== false ) { continue; } // Handle the case when the callback is an array. if ( is_array( $arr ) && ! empty( $arr['function'] ) && is_array( $arr['function'] ) && ! empty( $arr['function'][0] ) && is_object( $arr['function'][0] ) && ( strpos( strtolower( get_class( $arr['function'][0] ) ), 'no3x\wpml' ) !== false ) ) { continue; } unset( $wp_filter[ $action ]->callbacks[ $priority ][ $name ] ); } } } /** * Action to log errors for mails failed to send. * * @since 1.8.0 * @global $wpml_current_mail_id * @param \WP_Error $wperror */ public function log_email_failed( $wperror ) { global $wpml_current_mail_id; if(!isset($wpml_current_mail_id)) return; $failed_mail = Mail::find_one($wpml_current_mail_id); if( !$failed_mail ) return; $failed_mail->set_error($wperror->get_error_message())->save(); } /** * Logs mail to database. * * @global $wpml_current_mail_id * * @param array $mailArray * * @since 1.0 * @since 1.12.0 Short-circuit if $mailArray is not an array. * * @return array $mailOriginal */ public function log_email( $mailArray ) { /** * Filters mail data before it is logged. * * @since 1.12.0 * * @param array $mailArray Array containing the mail data to be logged. */ $mailArray = apply_filters( 'wp_mail_logging_before_log_email', $mailArray ); if ( ! is_array( $mailArray ) ) { return $mailArray; } global $wpml_current_mail_id; $mail = (new WPML_MailExtractor())->extract($mailArray); $mail->set_plugin_version($this->getVersionSaved()); $mail->set_timestamp(current_time( 'mysql' )); $mail->set_host( isset( $_SERVER['SERVER_ADDR'] ) ? $_SERVER['SERVER_ADDR'] : ''); $wpml_current_mail_id = $mail->save(); return $mailArray; } public static function getClass() { return __CLASS__; } /** * When user is on a WP Mail Logging related admin page, display footer text * that graciously asks them to rate us. * * @since 1.11.0 * * @param string $text Footer text. * * @return string */ public function admin_footer( $text ) { global $current_screen, $wp_logging_list_page; if ( empty( $current_screen->id ) || $current_screen->id !== $wp_logging_list_page ) { return $text; } $url = 'https://wordpress.org/support/plugin/wp-mail-logging/reviews/?filter=5#new-post'; return sprintf( wp_kses( /* translators: $1$s - WP Mail Logging plugin name; $2$s - WP.org review link; $3$s - WP.org review link. */ __( 'Please rate %1$s <a href="%2$s" target="_blank" rel="noopener noreferrer">★★★★★</a> on <a href="%3$s" target="_blank" rel="noopener">WordPress.org</a> to help us spread the word.', 'wp-mail-logging' ), [ 'a' => [ 'href' => [], 'target' => [], 'rel' => [], ], ] ), '<strong>WP Mail Logging</strong>', $url, $url ); } /** * Plugin activation hook. * * @since 1.11.0 * * @return void */ public function activate() {} /** * Get the assets URL. * * @since 1.11.0 * * @return string */ public function get_assets_url() { return untrailingslashit( WP_MAIL_LOGGING_PLUGIN_URL ) . '/assets'; } }