Server IP : 172.24.0.40 / Your IP : 216.73.216.10 Web Server : Apache System : Linux dbweb26.ust.edu.ph 4.18.0-513.5.1.el8_9.x86_64 #1 SMP Fri Sep 29 05:21:10 EDT 2023 x86_64 User : apache ( 48) PHP Version : 8.2.18 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/medicine.dbweb26.goldcopy/public_html/wp-content/plugins/newsletter/includes/ |
Upload File : |
<?php /** * User by add-ons as base-class. */ class NewsletterAddon { var $logger; var $admin_logger; var $name; var $options; var $version; var $labels; var $menu_priority = 100; var $weekly_check = true; public function __construct($name, $version = '0.0.0', $dir = '') { $this->name = $name; $this->version = $version; if (is_admin()) { $old_version = get_option('newsletter_' . $name . '_version'); if ($version !== $old_version) { $this->upgrade($old_version === false); update_option('newsletter_' . $name . '_version', $version, false); } } add_action('newsletter_init', [$this, 'init']); //Load translations from specific addon /languages/ directory load_plugin_textdomain('newsletter-' . $this->name, false, 'newsletter-' . $this->name . '/languages/'); if ($this->weekly_check && is_admin() && !wp_next_scheduled('newsletter_addon_' . $this->name)) { wp_schedule_event(time() + HOUR_IN_SECONDS, 'weekly', 'newsletter_addon_' . $this->name); } add_action('newsletter_addon_' . $this->name, [$this, 'weekly_check']); if ($dir) { register_deactivation_hook($dir . '/' . $this->name . '.php', [$this, 'deactivate']); } } /** * Method to be overridden and invoked on version change or on first install. * * @param bool $first_install */ function upgrade($first_install = false) { } /** * Method to be overridden to initialize the add-on. It is invoked when Newsletter * fires the <code>newsletter_init</code> event. */ function init() { if (is_admin()) { if ($this->is_allowed()) { add_action('admin_menu', [$this, 'admin_menu'], $this->menu_priority); // Should be registered only on our admin page, need to fix the $is_admin_page evaluation moment on // NewsletterAdmin class. add_action('newsletter_menu', [$this, 'newsletter_menu']); // TODO: remove when all addon has been updated if (method_exists($this, 'settings_menu')) { add_filter('newsletter_menu_settings', [$this, 'settings_menu']); } if (method_exists($this, 'subscribers_menu')) { add_filter('newsletter_menu_subscribers', [$this, 'subscribers_menu']); } } add_filter('newsletter_support_data', [$this, 'support_data'], 10, 1); } } /** * To be overridden by the single addon. */ function weekly_check() { // To be implemented by the single addon } /** * To be overridden by the single addon. * * @return array */ function get_support_data() { return []; } function support_data($data = []) { $d = $this->get_support_data(); $d = array_merge($d, ['version' => $this->version]); $data[$this->name] = $d; return $data; } function deactivate() { $logger = $this->get_logger(); $logger->info($this->name . ' deactivated'); // The periodic check wp_unschedule_hook('newsletter_addon_' . $this->name); } function admin_menu() { } function newsletter_menu() { } function add_settings_menu_page($title, $url) { NewsletterAdmin::$menu['settings'][] = ['label' => $title, 'url' => $url]; } function add_subscription_menu_page($title, $url) { NewsletterAdmin::$menu['subscription'][] = ['label' => $title, 'url' => $url]; } function add_newsletters_menu_page($title, $url) { NewsletterAdmin::$menu['newsletters'][] = ['label' => $title, 'url' => $url]; } function add_subscribers_menu_page($title, $url) { NewsletterAdmin::$menu['subscribers'][] = ['label' => $title, 'url' => $url]; } function add_forms_menu_page($title, $url) { NewsletterAdmin::$menu['forms'][] = ['label' => $title, 'url' => $url]; } function get_current_language() { return Newsletter::instance()->get_current_language(); } function is_all_languages() { return empty(NewsletterAdmin::instance()->language()); } function is_allowed() { return Newsletter::instance()->is_allowed(); } function is_admin_page() { return NewsletterAdmin::instance()->is_admin_page(); } function get_languages() { return Newsletter::instance()->get_languages(); } function is_multilanguage() { return Newsletter::instance()->is_multilanguage(); } /** * General logger for this add-on. * * @return NewsletterLogger */ function get_logger() { if (!$this->logger) { $this->logger = new NewsletterLogger($this->name); } // $this->setup_options(); // if (!empty($this->options['log_level'])) { // if ($this->options['log_level'] > $logger->level) { // $logger->level = $this->options['log_level']; // } // } return $this->logger; } /** * Specific logger for administrator actions. * * @return NewsletterLogger */ function get_admin_logger() { if (!$this->admin_logger) { $this->admin_logger = new NewsletterLogger($this->name . '-admin'); } return $this->admin_logger; } /** * Loads and prepares the options. It can be used to late initialize the options to save some resources on * add-ons which do not need to do something on each page load. */ function setup_options() { if ($this->options) { return; } $this->options = $this->get_option_array('newsletter_' . $this->name, []); } function get_option_array($name) { $opt = get_option($name, []); if (!is_array($opt)) { return []; } return $opt; } /** * Retrieve the stored options, merged with the specified language set. * * @param string $language * @return array */ function get_options($language = '') { if ($language) { return array_merge($this->get_option_array('newsletter_' . $this->name), $this->get_option_array('newsletter_' . $this->name . '_' . $language)); } else { return $this->get_option_array('newsletter_' . $this->name); } } /** * Saved the options under the correct keys and update the internal $options * property. * @param array $options */ function save_options($options, $language = '') { if ($language) { update_option('newsletter_' . $this->name . '_' . $language, $options); } else { update_option('newsletter_' . $this->name, $options); $this->options = $options; } } function merge_defaults($defaults) { $options = $this->get_option_array('newsletter_' . $this->name, []); $options = array_merge($defaults, $options); $this->save_options($options); } /** * */ function setup_labels() { if (!$this->labels) { $labels = []; } } function get_label($key) { if (!$this->options) $this->setup_options(); if (!empty($this->options[$key])) { return $this->options[$key]; } if (!$this->labels) $this->setup_labels(); // We assume the required key is defined. If not there is an error elsewhere. return $this->labels[$key]; } /** * Equivalent to $wpdb->query() but logs the event in case of error. * * @global wpdb $wpdb * @param string $query */ function query($query) { global $wpdb; $r = $wpdb->query($query); if ($r === false) { $logger = $this->get_logger(); $logger->fatal($query); $logger->fatal($wpdb->last_error); } return $r; } function get_results($query) { global $wpdb; $r = $wpdb->get_results($query); if ($r === false) { $this->logger->fatal($query); $this->logger->fatal($wpdb->last_error); } return $r; } function get_row($query) { global $wpdb; $r = $wpdb->get_row($query); if ($r === false) { $this->logger->fatal($query); $this->logger->fatal($wpdb->last_error); } return $r; } function get_user($id_or_email) { return Newsletter::instance()->get_user($id_or_email); } function show_email_status_label($email) { return NewsletterAdmin::instance()->show_email_status_label($email); } function send_test_email($email, $controls) { NewsletterEmailsAdmin::instance()->send_test_email($email, $controls); } } /** * Used by mailer add-ons as base-class. Some specific options collected by the mailer * are interpreted automatically. * * They are: * * `enabled` if not empty it means the mailer is active and should be registered * * The options are set up in the constructor, there is no need to setup them later. */ class NewsletterMailerAddon extends NewsletterAddon { var $enabled = false; var $menu_title = null; var $menu_description = null; var $menu_slug = null; var $dir = ''; var $index_page = null; var $logs_page = null; var $webhook_logger = null; function __construct($name, $version = '0.0.0', $dir = '') { parent::__construct($name, $version, $dir); $this->dir = $dir; $this->setup_options(); $this->enabled = !empty($this->options['enabled']); $this->menu_slug = $this->name; } /** * This method must be called as `parent::init()` is overridden. */ function init() { parent::init(); add_action('newsletter_register_mailer', function () { if ($this->enabled) { Newsletter::instance()->register_mailer($this->get_mailer()); } }); if (is_admin()) { $this->index_page = 'newsletter_' . $this->menu_slug . '_index'; $this->logs_page = 'newsletter_' . $this->menu_slug . '_logs'; } } function upgrade($first_install = false) { parent::upgrade($first_install); $this->merge_defaults(['turbo' => 0, 'enabled' => 0]); } function deactivate() { parent::deactivate(); // For delivery services without webkooks wp_clear_scheduled_hook('newsletter_' . $this->name . '_bounce'); } function admin_menu() { if (!current_user_can('administrator')) { return; } add_submenu_page('newsletter_main_index', $this->menu_title, '<span class="tnp-side-menu">' . esc_html($this->menu_title) . '</span>', 'manage_options', $this->index_page, function () { /** @since 8.4.0 */ require_once NEWSLETTER_INCLUDES_DIR . '/controls.php'; $controls = new NewsletterControls(); if (file_exists($this->dir . '/admin/index.php')) { require $this->dir . '/admin/index.php'; } else { require $this->dir . '/index.php'; } } ); if (file_exists($this->dir . '/admin/logs.php')) { add_submenu_page('admin.php', __('Logs', 'newsletter'), __('Logs', 'newsletter'), 'manage_options', $this->logs_page, function () { /** @since 8.4.0 */ require_once NEWSLETTER_INCLUDES_DIR . '/controls.php'; $controls = new NewsletterControls(); require $this->dir . '/admin/logs.php'; } ); } } function newsletter_menu() { if (!current_user_can('administrator')) { return; } $this->add_settings_menu_page($this->menu_title, '?page=' . $this->index_page); } function set_warnings($controls) { // if (!$this->enabled) { // $controls->warnings[] = 'Enable to send with this service.'; // } $current_mailer = Newsletter::instance()->get_mailer(); if ($current_mailer && $this->enabled && get_class($current_mailer) != get_class($this->get_mailer())) { $controls->warnings[] = 'Another delivery addon is active: ' . esc_html($current_mailer->get_description()); } if ($this->enabled && class_exists('NewsletterBounce')) { $controls->warnings[] = 'The Bounce addon is active and should be disabled on the <a href="plugins.php">plugins page</a> (bounces are managed by this addon)'; } } function get_status_badge() { if ($this->enabled) { return '<span class="tnp-badge-green">' . esc_html__('Enabled', 'newsletter') . '</span>'; } else { return '<span class="tnp-badge-orange">' . esc_html__('Disabled', 'newsletter') . '</span>'; } } /** @since 8.4.0 */ function echo_status_badge() { if ($this->enabled) { echo '<span class="tnp-badge-green">', esc_html__('Enabled', 'newsletter'), '</span>'; } else { echo '<span class="tnp-badge-orange">', esc_html__('Disabled', 'newsletter'), '</span>'; } } function get_title() { return esc_html($this->menu_title) . $this->get_status_badge(); } /** * @since 8.4.0 */ function echo_title() { echo esc_html($this->menu_title); $this->echo_status_badge(); } /** * @since 8.5.9 */ function set_bounced($email, $type = 'permanent', $data = '') { global $wpdb; $logger = $this->get_logger(); $logger->info($email . ' bounced'); $user = Newsletter::instance()->get_user($email); if (!$user) { Newsletter\Logs::add($this->name, $email . ' - ' . $type . ' bounce - no subscriber found', 0, $data); $logger->info($email . ' not found'); return; } Newsletter::instance()->set_user_status($user, TNP_User::STATUS_BOUNCED); Newsletter::instance()->add_user_log($user, $this->name); Newsletter\Logs::add($this->name, $email . ' - ' . $type . ' bounce', 0, $data); do_action('newsletter_user_bounced', $user); } function set_bounced_hard($email, $data = '') { $this->set_bounced($email, 'permanent', $data); } function set_bounced_soft($email, $data = '') { $this->set_bounced($email, 'transient', $data); } /** * @since 8.5.9 */ function set_complained($email, $data = '') { global $wpdb; $logger = $this->get_logger(); $logger->info($email . ' complained'); $user = Newsletter::instance()->get_user($email); if (!$user) { Newsletter\Logs::add($this->name, $email . ' - complaint - no subscriber found', 0, $data); $logger->info($email . ' not found'); return; } Newsletter::instance()->set_user_status($user, TNP_User::STATUS_COMPLAINED); Newsletter::instance()->add_user_log($user, $this->name); Newsletter\Logs::add($this->name, $email . ' - ' . $type . ' complaint', 0, $data); do_action('newsletter_user_complained', $user); } /** * @since 8.5.9 */ function set_unsubscribed($email, $data = '') { global $wpdb; $logger = $this->get_logger(); $logger->info($email . ' unsubscribed'); $user = Newsletter::instance()->get_user($email); if (!$user) { Newsletter\Logs::add($this->name, $email . ' - unsubscribe - no subscriber found', 0, $data); $logger->info($email . ' not found'); return; } Newsletter::instance()->set_user_status($user, TNP_User::STATUS_UNSUBSCRIBED); Newsletter::instance()->add_user_log($user, $this->name); Newsletter\Logs::add($this->name, $email . ' - ' . $type . ' unsubscribe', 0, $data); do_action('newsletter_user_unsubscribed', $user); } /** * Must return an implementation of NewsletterMailer. * @return NewsletterMailer */ function get_mailer() { return null; } function get_last_run() { return get_option('newsletter_' . $this->name . '_last_run', 0); } function save_last_run($time) { update_option('newsletter_' . $this->name . '_last_run', $time); } function save_options($options, $language = '') { parent::save_options($options, $language); $this->enabled = !empty($options['enabled']); } /** * @since 8.5.2 */ function get_webhook_url() { return admin_url('admin-ajax.php') . '?action=newsletter-' . $this->name; } /** * The logger (on file) for tracking the webhook activity. * @return NewsletterLogger * @since 8.5.2 */ function get_webhook_logger() { if (!$this->webhook_logger) { $this->webhook_logger = new NewsletterLogger($this->name . '-webhook'); } return $this->webhook_logger; } /** * Add a log for a received webhook event then shown on the addon's log page. * * @since 8.5.2 */ function webhook_log($description, $data = null) { Newsletter\Logs::add($this->name, $description, 0, $data); } /** * The function to be implemented to managed the webhook event. * * @since 8.5.2 */ function webhook_callback() { $logger = $this->get_webhook_logger(); // ... } /** * Return the webhooks in the delivery service custom format. * * @return array|WP_Error */ function get_webhooks() { return []; } /** * Returns a TNP_Mailer_Message built to send a test message to the <code>$to</code> * email address. * * @param string $to * @param string $subject * @return TNP_Mailer_Message */ static function get_test_message($to, $subject = '', $type = '') { $message = new TNP_Mailer_Message(); $message->to = $to; $message->to_name = ''; if (empty($type) || $type == 'html') { $message->body = file_get_contents(NEWSLETTER_DIR . '/includes/test-message.html'); $message->body = str_replace('{plugin_url}', Newsletter::plugin_url(), $message->body); } if (empty($type) || $type == 'text') { $message->body_text = 'This is the TEXT version of a test message. You should see this message only if you email client does not support the rich text (HTML) version.'; } //$message->headers['X-Newsletter-Email-Id'] = '0'; if (empty($subject)) { $message->subject = '[' . get_option('blogname') . '] Test message from Newsletter (' . date(DATE_ISO8601) . ')'; } else { $message->subject = $subject; } if ($type) { $message->subject .= ' - ' . $type . ' only'; } $message->from = Newsletter::instance()->get_sender_email(); $message->from_name = Newsletter::instance()->get_sender_name(); $message->headers['X-Newsletter'] = 'test'; return $message; } /** * Returns a set of test messages to be sent to the specified email address. Used for * turbo mode tests. Each message has a different generated subject. * * @param string $to The destination mailbox * @param int $count Number of message objects to create * @return TNP_Mailer_Message[] */ function get_test_messages($to, $count, $type = '') { $messages = array(); for ($i = 0; $i < $count; $i++) { $messages[] = self::get_test_message($to, '[' . get_option('blogname') . '] Test message ' . ($i + 1) . ' from Newsletter (' . date(DATE_ISO8601) . ')', $type); } return $messages; } } class NewsletterFormManagerAddon extends NewsletterAddon { var $menu_title = null; var $menu_description = null; var $menu_slug = null; var $index_page = null; var $edit_page = null; var $welcome_page = null; var $confirmation_page = null; var $logs_page = null; var $dir = ''; var $forms = null; // For caching function __construct($name, $version, $dir, $menu_slug = null) { parent::__construct($name, $version, $dir); $this->dir = $dir; $this->menu_slug = $menu_slug; if (empty($this->menu_slug)) { $this->menu_slug = $this->name; } $this->setup_options(); } function init() { parent::init(); if (is_admin() && $this->is_allowed()) { $this->index_page = 'newsletter_' . $this->menu_slug . '_index'; $this->edit_page = 'newsletter_' . $this->menu_slug . '_edit'; $this->welcome_page = 'newsletter_' . $this->menu_slug . '_welcome'; $this->confirmation_page = 'newsletter_' . $this->menu_slug . '_confirmation'; $this->logs_page = 'newsletter_' . $this->menu_slug . '_logs'; add_filter('newsletter_lists_notes', [$this, 'hook_newsletter_lists_notes'], 10, 2); } } function hook_newsletter_lists_notes($notes, $list_id) { if (!$this->forms) { $this->forms = $this->get_forms(); } foreach ($this->forms as $form) { $ok = false; $form_options = $this->get_form_options($form->id); // Too many years of development if (!empty($form_options['lists']) && is_array($form_options['lists']) && in_array($list_id, $form_options['lists'])) { $ok = true; } elseif (!empty($form_options['preferences_' . $list_id])) { $ok = true; } elseif (!empty($form_options['preferences']) && is_array($form_options['preferences']) && in_array($list_id, $form_options['preferences'])) { $ok = true; } if ($ok) { $notes[] = 'Linked to form "' . $form->title . '"'; } } return $notes; } function hook_newsletter_autoresponder_sources($list, $id) { $forms = $this->get_forms(); foreach ($forms as $form) { $settings = $this->get_form_options($form->id); if (empty($settings['autoresponders'])) { continue; } if (in_array('' . $id, $settings['autoresponders'])) { $s = new Newsletter\Source($form->title, $this->menu_title); $s->action = 'on'; $list[] = $s; } elseif (in_array('-' . $id, $settings['autoresponders'])) { $s = new Newsletter\Source($form->title, $this->menu_title); $s->action = 'off'; $list[] = $s; } } return $list; } /** * Basic subscription object to collect the data and option of a 3rd party form * integration. * * @param type $form_options * @return type */ function get_default_subscription($form_options, $form_id = null) { $subscription = NewsletterSubscription::instance()->get_default_subscription(); $subscription->floodcheck = false; if ($form_id) { $subscription->data->referrer = sanitize_key($this->name . '-' . $form_id); } // 'welcome_email' is a flag indicating what to use for that email (0- default, 1 - custom, 2 - don't send) if (!empty($form_options['welcome_email'])) { if ($form_options['welcome_email'] == '1') { $subscription->welcome_email_id = (int) $form_options['welcome_email_id']; } else { $subscription->welcome_email_id = -1; } } // Not for 3rd party form integration if (!empty($form_options['welcome_page_id'])) { $subscription->welcome_page_id = (int) $form_options['welcome_page_id']; } if (!empty($form_options['confirmation_email'])) { if ($form_options['confirmation_email'] == '1') { $subscription->confirmation_email_id = (int) $form_options['confirmation_email_id']; } else { $subscription->confirmation_email_id = -1; } } // Not for 3rd party form integration if (!empty($form_options['confirmation_page_id'])) { $subscription->confirmation_page_id = (int) $form_options['confirmation_page_id']; } if (!empty($form_options['status'])) { $subscription->optin = $form_options['status']; } $subscription->data->add_lists($form_options['lists'] ?? []); // The parser already removes the empty/non scalar values $subscription->autoresponders = wp_parse_list($form_options['autoresponders'] ?? []); return $subscription; } function newsletter_menu() { $this->add_subscription_menu_page($this->menu_title, '?page=' . $this->index_page); } function admin_menu() { add_submenu_page('newsletter_main_index', $this->menu_title, '<span class="tnp-side-menu">' . $this->menu_title . '</span>', 'exist', $this->index_page, function () { require_once NEWSLETTER_INCLUDES_DIR . '/controls.php'; $controls = new NewsletterControls(); require $this->dir . '/admin/index.php'; } ); add_submenu_page('admin.php', $this->menu_title, '<span class="tnp-side-menu">' . $this->menu_title . '</span>', 'exist', $this->edit_page, function () { require_once NEWSLETTER_INCLUDES_DIR . '/controls.php'; $controls = new NewsletterControls(); $form = $this->get_form(sanitize_key($_GET['id'] ?? '')); if (!$form) { echo 'Form not found'; return; } require $this->dir . '/admin/edit.php'; } ); if (file_exists($this->dir . '/admin/welcome.php')) { add_submenu_page('admin.php', $this->menu_title, '<span class="tnp-side-menu">' . $this->menu_title . '</span>', 'exist', $this->welcome_page, function () { /** @since 8.3.9 */ require_once NEWSLETTER_INCLUDES_DIR . '/controls.php'; $controls = new NewsletterControls(); /** @since 8.3.9 */ $form = $this->get_form(sanitize_key($_GET['id'] ?? '')); if (!$form) { echo 'Form not found'; return; } require $this->dir . '/admin/welcome.php'; } ); } /** @since 8.7.5 */ if (file_exists($this->dir . '/admin/confirmation.php')) { add_submenu_page('admin.php', $this->menu_title, '<span class="tnp-side-menu">' . $this->menu_title . '</span>', 'exist', $this->confirmation_page, function () { require_once NEWSLETTER_INCLUDES_DIR . '/controls.php'; $controls = new NewsletterControls(); $form = $this->get_form(sanitize_key($_GET['id'] ?? '')); if (!$form) { echo 'Form not found'; return; } require $this->dir . '/admin/confirmation.php'; } ); } if (file_exists($this->dir . '/admin/logs.php')) { add_submenu_page('admin.php', $this->menu_title, $this->menu_title, 'exist', $this->logs_page, function () { require_once NEWSLETTER_INCLUDES_DIR . '/controls.php'; $controls = new NewsletterControls(); $form = $this->get_form(sanitize_key($_GET['id'] ?? '')); if (!$form) { echo 'Form not found'; return; } require $this->dir . '/admin/logs.php'; } ); } } /** * Processes the subscription, logs errors and returns the subscriber. * * @param TNP_Subscription $subscription * @param mixed $form_id * @return TNP_User|WP_Error */ function subscribe($subscription, $form_id) { $logger = $this->get_logger(); if ($logger->is_debug) { $logger->debug($subscription); } $user = NewsletterSubscription::instance()->subscribe2($subscription); if (is_wp_error($user)) { Newsletter\Logs::add($this->name . '-' . $form_id, 'Subcription for ' . $subscription->data->email . ' failed: ' . $user->get_error_message()); } else { Newsletter\Logs::add($this->name . '-' . $form_id, 'Subcription for ' . $subscription->data->email); } return $user; } /** * Adds a log visible on the "logs" page for the specific form. * * @param string $form_id * @param string $text */ function log($form_id, $text) { Newsletter\Logs::add($this->name . '-' . $form_id, $text); } /** * Returns a lists of representations of forms available in the plugin subject of integration. * Usually the $fields is not set up on returned objects. * Must be implemented. * * @return TNP_FormManager_Form[] List of forms by 3rd party plugin */ function get_forms() { return []; } /** * Build a form general representation of a real form from a form manager plugin extracting * only the data required to integrate. The form id is domain of the form manager plugin, so it can be * anything. * Must be implemented. * * @param mixed $form_id * @return TNP_FormManager_Form */ function get_form($form_id) { return null; } /** * Saves the form mapping and integration settings. * @param mixed $form_id * @param array $data */ public function save_form_options($form_id, $data) { $data['autoresponders'] = array_values(array_filter($data['autoresponders'] ?? [])); update_option('newsletter_' . $this->name . '_' . $form_id, $data, false); return $data; } /** * Gets the form mapping and integration settings. Returns an empty array if the dataset is missing. * @param mixed $form_id * @return array */ public function get_form_options($form_id) { return Newsletter::get_option_array('newsletter_' . $this->name . '_' . $form_id); } } class TNP_FormManager_Form { var $id = null; var $title = ''; var $fields = []; var $connected = false; }