| @@ -72,9 +72,12 @@ | ||
| 72 | 72 | * |
| 73 | 73 | * @param Metasync_Admin $admin The admin instance (needed for header/nav rendering). |
| 74 | 74 | */ |
| 75 | 75 | public function metasync_display_error_log($admin) { |
| 76 | - $log_file = WP_CONTENT_DIR . '/metasync_data/plugin_errors.log'; | |
| 76 | + $log_file = Metasync_Data_Store::file_path('plugin_errors.log'); | |
| 77 | + if (false === $log_file) { | |
| 78 | + $log_file = ''; | |
| 79 | + } | |
| 77 | 80 | if (!Metasync::current_user_has_plugin_access()) { |
| 78 | 81 | return; |
| 79 | 82 | } |
| 80 | 83 | |
| @@ -234,9 +237,9 @@ | ||
| 234 | 237 | * Update wp-config.php debug constants. |
| 235 | 238 | */ |
| 236 | 239 | public function metasync_update_wp_config() { |
| 237 | 240 | $wp_config_path = ABSPATH . 'wp-config.php'; |
| 238 | - if (file_exists($wp_config_path) && is_writable($wp_config_path)) { | |
| 241 | + if (file_exists($wp_config_path) && wp_is_writable($wp_config_path)) { | |
| 239 | 242 | $config_file = file_get_contents($wp_config_path); |
| 240 | 243 | |
| 241 | 244 | $wp_debug_enabled = get_option('wp_debug_enabled', 'false') === 'true' ? 'true' : 'false'; |
| 242 | 245 | if (preg_match("/define\s*\(\s*['\"]WP_DEBUG['\"]\s*,\s*.*?\s*\)\s*;/", $config_file)) { |
| @@ -258,8 +261,14 @@ | ||
| 258 | 261 | } else { |
| 259 | 262 | $config_file = str_replace("/* That's all, stop editing! Happy publishing. */", "define('WP_DEBUG_DISPLAY', $wp_debug_display_enabled);\n\n/* That's all, stop editing! Happy publishing. */", $config_file); |
| 260 | 263 | } |
| 261 | 264 | |
| 265 | + // ABSPATH is intentional and verified: the Debug Mode feature | |
| 266 | + // toggles WP_DEBUG constants in wp-config.php itself, the one | |
| 267 | + // file whose location ABSPATH exists to describe. It is not a | |
| 268 | + // plugin-directory or generated-content write, so it stays here | |
| 269 | + // (Plugin Check's ABSPATHDetected warning is a false positive — | |
| 270 | + // wp-config.php cannot live in the uploads directory). | |
| 262 | 271 | file_put_contents($wp_config_path, $config_file); |
| 263 | 272 | } else { |
| 264 | 273 | wp_die('The wp-config.php file is not writable. Please check the file permissions.'); |
| 265 | 274 | } |
| @@ -751,9 +760,9 @@ | ||
| 751 | 760 | { |
| 752 | 761 | if (isset($_POST['metasync_debug_mode_action_advanced'])) { |
| 753 | 762 | if (!wp_verify_nonce($_POST['metasync_debug_mode_nonce_advanced'], 'metasync_debug_mode_action_advanced')) { |
| 754 | 763 | $redirect_url = admin_url('admin.php?page=' . $this->get_page_slug() . '&tab=advanced&debug_error=1'); |
| 755 | - wp_redirect($redirect_url); | |
| 764 | + wp_safe_redirect($redirect_url); | |
| 756 | 765 | exit; |
| 757 | 766 | } |
| 758 | 767 | |
| 759 | 768 | if (!current_user_can('manage_options')) { |
| @@ -761,9 +770,9 @@ | ||
| 761 | 770 | } |
| 762 | 771 | |
| 763 | 772 | if (!class_exists('Metasync_Debug_Mode_Manager')) { |
| 764 | 773 | $redirect_url = admin_url('admin.php?page=' . $this->get_page_slug() . '&tab=advanced&debug_error=1&msg=manager_not_available'); |
| 765 | - wp_redirect($redirect_url); | |
| 774 | + wp_safe_redirect($redirect_url); | |
| 766 | 775 | exit; |
| 767 | 776 | } |
| 768 | 777 | |
| 769 | 778 | $debug_manager = Metasync_Debug_Mode_Manager::get_instance(); |
| @@ -800,9 +809,9 @@ | ||
| 800 | 809 | $redirect_url = add_query_arg('debug_error', '1', $redirect_url); |
| 801 | 810 | break; |
| 802 | 811 | } |
| 803 | 812 | |
| 804 | - wp_redirect($redirect_url); | |
| 813 | + wp_safe_redirect($redirect_url); | |
| 805 | 814 | exit; |
| 806 | 815 | } |
| 807 | 816 | } |
| 808 | 817 | |
| @@ -816,27 +825,30 @@ | ||
| 816 | 825 | } |
| 817 | 826 | |
| 818 | 827 | if (isset($_POST['clear_log'])) { |
| 819 | 828 | if (wp_verify_nonce($_POST['clear_log_nonce'], 'metasync_clear_log_nonce')) { |
| 820 | - $log_file = WP_CONTENT_DIR . '/metasync_data/plugin_errors.log'; | |
| 829 | + $data_dir = Metasync_Data_Store::base_dir(); | |
| 830 | + $log_file = Metasync_Data_Store::file_path('plugin_errors.log'); | |
| 821 | 831 | |
| 822 | - if (file_exists($log_file)) { | |
| 832 | + if (false !== $log_file && file_exists($log_file)) { | |
| 823 | 833 | file_put_contents($log_file, ''); |
| 824 | 834 | |
| 825 | - $backup_files = glob(WP_CONTENT_DIR . '/metasync_data/plugin_errors.log.old.*'); | |
| 826 | - if ($backup_files) { | |
| 827 | - foreach ($backup_files as $backup_file) { | |
| 828 | - @unlink($backup_file); | |
| 835 | + if (false !== $data_dir) { | |
| 836 | + $backup_files = glob($data_dir . '/plugin_errors.log.old.*'); | |
| 837 | + if ($backup_files) { | |
| 838 | + foreach ($backup_files as $backup_file) { | |
| 839 | + @wp_delete_file($backup_file); | |
| 840 | + } | |
| 829 | 841 | } |
| 830 | 842 | } |
| 831 | 843 | } |
| 832 | 844 | |
| 833 | 845 | $redirect_url = admin_url('admin.php?page=' . $this->get_page_slug() . '&tab=advanced&log_cleared=1'); |
| 834 | - wp_redirect($redirect_url); | |
| 846 | + wp_safe_redirect($redirect_url); | |
| 835 | 847 | exit; |
| 836 | 848 | } else { |
| 837 | 849 | $redirect_url = admin_url('admin.php?page=' . $this->get_page_slug() . '&tab=advanced&clear_error=1'); |
| 838 | - wp_redirect($redirect_url); | |
| 850 | + wp_safe_redirect($redirect_url); | |
| 839 | 851 | exit; |
| 840 | 852 | } |
| 841 | 853 | } |
| 842 | 854 | |
| @@ -844,18 +856,18 @@ | ||
| 844 | 856 | if (wp_verify_nonce($_POST['clear_error_summary_nonce'], 'metasync_clear_error_summary_nonce')) { |
| 845 | 857 | if (class_exists('Metasync_Error_Logger')) { |
| 846 | 858 | Metasync_Error_Logger::clear_error_summary(); |
| 847 | 859 | $redirect_url = admin_url('admin.php?page=' . $this->get_page_slug() . '&tab=advanced&error_summary_cleared=1'); |
| 848 | - wp_redirect($redirect_url); | |
| 860 | + wp_safe_redirect($redirect_url); | |
| 849 | 861 | exit; |
| 850 | 862 | } else { |
| 851 | 863 | $redirect_url = admin_url('admin.php?page=' . $this->get_page_slug() . '&tab=advanced&error_summary_error=1'); |
| 852 | - wp_redirect($redirect_url); | |
| 864 | + wp_safe_redirect($redirect_url); | |
| 853 | 865 | exit; |
| 854 | 866 | } |
| 855 | 867 | } else { |
| 856 | 868 | $redirect_url = admin_url('admin.php?page=' . $this->get_page_slug() . '&tab=advanced&error_summary_error=1'); |
| 857 | - wp_redirect($redirect_url); | |
| 869 | + wp_safe_redirect($redirect_url); | |
| 858 | 870 | exit; |
| 859 | 871 | } |
| 860 | 872 | } |
| 861 | 873 | } |
| @@ -935,13 +947,13 @@ | ||
| 935 | 947 | 'triggered_by' => 'settings_reset_action' |
| 936 | 948 | ), 'info'); |
| 937 | 949 | |
| 938 | 950 | $redirect_url = admin_url('admin.php?page=' . $this->get_page_slug() . '&tab=advanced&settings_cleared=1'); |
| 939 | - wp_redirect($redirect_url); | |
| 951 | + wp_safe_redirect($redirect_url); | |
| 940 | 952 | exit; |
| 941 | 953 | } else { |
| 942 | 954 | $redirect_url = admin_url('admin.php?page=' . $this->get_page_slug() . '&tab=advanced&clear_settings_error=1'); |
| 943 | - wp_redirect($redirect_url); | |
| 955 | + wp_safe_redirect($redirect_url); | |
| 944 | 956 | exit; |
| 945 | 957 | } |
| 946 | 958 | } |
| 947 | 959 | } |
| @@ -956,9 +968,9 @@ | ||
| 956 | 968 | public function get_error_log_content() |
| 957 | 969 | { |
| 958 | 970 | $execution_time = $this->get_execution_setting('max_execution_time'); |
| 959 | 971 | if (function_exists('set_time_limit')) { |
| 960 | - @set_time_limit($execution_time); | |
| 972 | + @set_time_limit($execution_time); // phpcs:ignore Squiz.PHP.DiscouragedFunctions.Discouraged -- runtime PHP setting with no WordPress API | |
| 961 | 973 | } |
| 962 | 974 | |
| 963 | 975 | $log_file = WP_CONTENT_DIR . '/debug.log'; |
| 964 | 976 | |
| @@ -990,9 +1002,9 @@ | ||
| 990 | 1002 | public function get_log_tail($file_path, $lines = null) |
| 991 | 1003 | { |
| 992 | 1004 | $execution_time = $this->get_execution_setting('max_execution_time'); |
| 993 | 1005 | if (function_exists('set_time_limit')) { |
| 994 | - @set_time_limit($execution_time); | |
| 1006 | + @set_time_limit($execution_time); // phpcs:ignore Squiz.PHP.DiscouragedFunctions.Discouraged -- runtime PHP setting with no WordPress API | |
| 995 | 1007 | } |
| 996 | 1008 | |
| 997 | 1009 | if ($lines === null) { |
| 998 | 1010 | $lines = $this->get_execution_setting('log_batch_size'); |
| @@ -997,9 +1009,9 @@ | ||
| 997 | 1009 | if ($lines === null) { |
| 998 | 1010 | $lines = $this->get_execution_setting('log_batch_size'); |
| 999 | 1011 | } |
| 1000 | 1012 | |
| 1001 | - $handle = fopen($file_path, 'r'); | |
| 1013 | + $handle = fopen($file_path, 'r'); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fopen -- streaming file I/O; WP_Filesystem cannot return a raw stream handle | |
| 1002 | 1014 | if (!$handle) { |
| 1003 | 1015 | return false; |
| 1004 | 1016 | } |
| 1005 | 1017 | |
| @@ -1028,9 +1040,9 @@ | ||
| 1028 | 1040 | if (!empty($line) && $line_count < $lines) { |
| 1029 | 1041 | array_unshift($result_lines, strrev($line)); |
| 1030 | 1042 | } |
| 1031 | 1043 | |
| 1032 | - fclose($handle); | |
| 1044 | + fclose($handle); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fclose -- operates on a native stream handle | |
| 1033 | 1045 | |
| 1034 | 1046 | return implode("\n", $result_lines); |
| 1035 | 1047 | } |
| 1036 | 1048 | } |