JezK
Edit File: Router.php
<?php namespace AcyMailing\WpInit; defined('ABSPATH') || die('Restricted Access'); use AcyMailing\Classes\PluginClass; class Router { public function __construct() { // Back router add_action('wp_ajax_acymailing_router', [$this, 'router']); // Front router if (!acym_isAdmin()) { add_action('wp_loaded', [$this, 'frontRouter']); } // Make sure we can redirect / download / modify headers if needed after some checks $pages = [ 'automation', 'bounces', 'campaigns', 'configuration', 'dashboard', 'dynamics', 'fields', 'file', 'followups', 'forms', 'language', 'lists', 'mails', 'override', 'queue', 'segments', 'stats', 'users', ]; $headerPages = [ 'automation', 'bounces', 'campaigns', 'configuration', 'dashboard', 'fields', 'followups', 'forms', 'lists', 'mails', 'override', 'queue', 'segments', 'stats', 'users', ]; foreach ($pages as $page) { if (in_array($page, $headerPages)) { // Ensure we can set headers in the plugin add_action('load-acymailing_page_acymailing_'.$page, [$this, 'waitHeaders']); } // Disable WP emojis in AcyMailing only add_action('admin_print_scripts-acymailing_page_acymailing_'.$page, [$this, 'disableJsBreakingPages']); add_action('admin_print_styles-acymailing_page_acymailing_'.$page, [$this, 'removeCssBreakingPages']); } add_action('admin_print_scripts-toplevel_page_acymailing_dashboard', [$this, 'disableJsBreakingPages']); add_action('admin_print_styles-toplevel_page_acymailing_dashboard', [$this, 'removeCssBreakingPages']); add_action('wp_enqueue_media', [$this, 'protectAcyMailingPages'], 100); add_action('init', [$this, 'autologin']); } public function protectAcyMailingPages() { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Make sure we're on an AcyMailing page. $page = isset($_REQUEST['page']) ? sanitize_text_field(wp_unslash($_REQUEST['page'])) : ''; if (empty($page) || strpos($page, 'acymailing_') === false) { return; } wp_dequeue_script('responsive-lightbox-admin-select2'); wp_dequeue_style('responsive-lightbox-admin-select2'); // Remove theme loading select2 from Supreme module pro for divi wp_dequeue_script('dsm-select-two'); wp_dequeue_style('dsm-select-two'); } public function waitHeaders() { ob_start(); } public function disableJsBreakingPages() { // Show normal emojis on AcyMailing pages remove_action('admin_print_scripts', 'print_emoji_detection_script'); // Slideshow ck breaks the editor remove_action('wp_enqueue_media', '\\Slideshowck\\Tinymce\\register_scripts_styles'); // Skaut Google Drive gallery breaks the editor remove_action('wp_enqueue_media', '\\Sgdg\\Admin\\TinyMCE\\register_scripts_styles'); // Remove theme loading select2 which breaks select2 in vueJS wp_dequeue_script('select2.js'); // The "Checkout Field Manager for WooCommerce" plugin breaks the js on every pages wp_dequeue_script('checkout_fields_js'); // Fixed editor incompatibility wp_dequeue_script('wp-optimize-minify-admin-purge'); // Remove Happy Elementor Addons select2 which breaks our select2 wp_dequeue_script('happy-elementor-addons-select2'); wp_dequeue_script('select2'); } public function removeCssBreakingPages() { wp_dequeue_style('saswp-main-css'); wp_dequeue_style('WP REST API Controller'); wp_dequeue_style('wpml-select-2'); wp_dequeue_style('swcfpc_admin_css'); // Remove Happy Elementor Addons select2 which breaks our select2 wp_dequeue_style('happy-elementor-addons-select2'); wp_dequeue_style('select2'); // Messes with the tooltips, the schedule date in emails for example wp_dequeue_style('qlwapp-admin-menu'); } public function frontRouter() { $page = acym_getVar('string', 'page'); if (empty($page) || $page !== ACYM_COMPONENT.'_front') return; $this->router(true); } public function router(bool $front = false): void { acym_displayFreeTrialMessage(); if (!$front) { auth_redirect(); // The router only enforces auth_redirect() and the 'dashboard' controller is exempt from call()'s ACL, so mirror Menu.php's back-office access gate (wp_access groups) to keep arbitrary logged-in users out. if (!acym_hasBackofficeAccess()) { wp_die(esc_html(acym_translation('ACYM_ACCESS_DENIED')), '', ['response' => 403]); } } if (file_exists(ACYM_FOLDER.'update.php')) { $acyActivation = new Activation(); if (is_multisite()) { $currentBlog = get_current_blog_id(); $sites = get_sites(); foreach ($sites as $site) { if (is_object($site)) { $site = get_object_vars($site); } switch_to_blog($site['blog_id']); acym_config(true); $acyActivation->updateAcym(); } switch_to_blog($currentBlog); } else { $acyActivation->updateAcym(); } acym_deleteFile(ACYM_FOLDER.'update.php'); } $config = acym_config(true); // Get controller. If not found, take it from the page $ctrl = acym_getVar('cmd', 'ctrl', ''); $task = acym_getVar('cmd', 'task', ''); if (!$front && acym_isAdmin() && file_exists(ACYM_NEW_FEATURES_SPLASHSCREEN_JSON) && acym_isWritable(ACYM_NEW_FEATURES_SPLASHSCREEN_JSON)) { $ctrl = 'dashboard'; $task = 'features'; acym_setVar('ctrl', $ctrl); acym_setVar('task', $task); } $needToMigrate = $config->get('migration') == 0 && acym_existsAcyMailing59() && acym_getVar('string', 'task') !== 'migrationDone'; $forceDashboard = !$front && ($needToMigrate || $config->get('walk_through', 0) == 1) && !(defined('DOING_AJAX') && DOING_AJAX) && 'dynamics' !== $ctrl; if ($forceDashboard) { $ctrl = 'dashboard'; acym_setVar('ctrl', $ctrl); } if (empty($ctrl)) { $ctrl = str_replace(ACYM_COMPONENT.'_', '', acym_getVar('cmd', 'page', '')); if (empty($ctrl)) { echo esc_html(acym_translation('ACYM_PAGE_NOT_FOUND')); // For Google search console in the frontend to prevent from doing 404 errors $noCache = acym_getVar('int', 'nocache', 0); if (!empty($noCache)) { acym_redirect(acym_rootURI()); } return; } acym_setVar('ctrl', $ctrl); } $this->deactivateHookAdminFooter(); $subNamespace = $front ? 'Front' : ''; $controllerNamespace = 'AcyMailing\\'.$subNamespace.'Controllers\\'.ucfirst($ctrl).'Controller'; if (!class_exists($controllerNamespace)) { echo esc_html(acym_translation('ACYM_PAGE_NOT_FOUND').': '.$ctrl); return; } if (!$front && acym_isAdmin() && $task != 'edit' && !(defined('DOING_AJAX') && DOING_AJAX)) { $pluginClass = new PluginClass(); $installedPlugins = $pluginClass->getAll('title'); foreach (ACYM_AVAILABLE_PLUGINS as $onePlugin) { if (empty($installedPlugins[$onePlugin['name']])) continue; if ($installedPlugins[$onePlugin['name']]->type !== 'ADDON') continue; acym_enqueueMessage( acym_translationSprintf( 'ACYM_NEW_PLUGIN_FORMAT', $onePlugin['name'], '<a target="_blank" style="color: #00a5ff;" href="'.$onePlugin['downloadlink'].'">'.acym_translation('ACYM_CLICK_HERE').'</a>' ), 'error' ); } } $controller = new $controllerNamespace(); if (empty($task)) { $task = acym_getVar('cmd', 'defaulttask', $controller->defaulttask); } if ($forceDashboard && !method_exists($controller, $task)) { $task = 'listing'; acym_setVar('task', $task); } $controller->call($task, $front); } public function autologin() { $subId = acym_getVar('int', 'autoSubId'); $subToken = acym_getVar('string', 'subKey'); if (empty($subId) || empty($subToken)) { return; } $currentUrl = acym_currentURL(); $cleanedUrl = acym_cleanUrl($currentUrl, ['autoSubId', 'subKey']); $config = acym_config(); if ($config->get('autologin_urls', 0) == 0) { acym_redirect($cleanedUrl); } $subscriber = acym_loadObject('SELECT `cms_id`, `key` FROM #__acym_user WHERE `id` = '.intval($subId)); if (empty($subscriber->cms_id) || $subscriber->cms_id === acym_currentUserId()) { acym_redirect($cleanedUrl); } if (!acym_verifyAutologinToken($subId, $subToken, $subscriber->key)) { acym_redirect($cleanedUrl); } $user = get_user_by('id', $subscriber->cms_id); if (is_wp_error($user) || !$user) { acym_redirect($cleanedUrl); } // Never allow autologin for administrator accounts if ($user->has_cap('manage_options')) { acym_redirect($cleanedUrl); } wp_clear_auth_cookie(); wp_set_current_user($user->ID); wp_set_auth_cookie($user->ID); acym_redirect($cleanedUrl); } private function deactivateHookAdminFooter() { //Remove hook function which break AcyMailing pages remove_action('admin_footer', 'Freemius::_enrich_ajax_url'); remove_action('admin_footer', 'Freemius::_open_support_forum_in_new_page'); } }