PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 4.0.5
MainWP Dashboard: Self-hosted WordPress Management for Agencies v4.0.5
6.2 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1 6.0.12 6.0.11 4.6.0.1 5.0 5.0.1 5.0.2 5.0.3 5.0.3.1 5.0.3.2 5.1 5.1.1 5.2 5.2.1 5.2.2 5.3 All 153 releases
← All changes | mainwp.php +55 -153 6.24.0.5 View file →
@@ -1,186 +1,88 @@
1 1 <?php
2 -/**
3 - * Plugin Name: MainWP Dashboard
4 - *
5 - * Description: Manage all of your WP sites, even those on different servers, from one central dashboard that runs off of your own self-hosted WordPress install.
6 - *
7 - * Author: MainWP
8 - * Author URI: https://mainwp.com
9 - * Plugin URI: https://mainwp.com/
10 - * Text Domain: mainwp
11 - * Version: 6.2
12 - * License: GPLv3 or later
13 - * License URI: https://www.gnu.org/licenses/gpl-3.0.html
14 - *
15 - * @package MainWP/Dashboard
16 - *
17 - * @uses \MainWP\Dashboard\MainWP_System
18 - */
19 2
20 -// Exit if accessed directly.
21 -if ( ! defined( 'ABSPATH' ) ) {
22 - exit;
23 -}
24 -
25 -/**
26 - * Ignore cron/bootstrap.php from Plugin Check direct file access protection.
27 - * This file must execute before WordPress loads to locate wp-load.php,
28 - * so the standard ABSPATH check would break functionality.
3 +/*
4 + Plugin Name: MainWP Dashboard
5 + Plugin URI: https://mainwp.com/
6 + Description: Manage all of your WP sites, even those on different servers, from one central dashboard that runs off of your own self-hosted WordPress install.
7 + Author: MainWP
8 + Author URI: https://mainwp.com
9 + Text Domain: mainwp
10 + Version: 4.0.5
29 11 */
30 -add_filter(
31 - 'wp_plugin_check_ignore_files',
32 - function ( $ignored_files ) {
33 - $ignored_files[] = 'cron/bootstrap.php';
34 - return $ignored_files;
35 - }
36 -);
37 12
38 -if ( ! defined( 'MAINWP_PLUGIN_FILE' ) ) {
39 -
40 - /**
41 - * Define MainWP Dashboard Plugin absolute full path and filename of this file.
42 - *
43 - * @const ( string ) Defined MainWP dashboard file path.
44 - * @source https://github.com/mainwp/mainwp/blob/master/mainwp.php
45 - */
46 - define( 'MAINWP_PLUGIN_FILE', __FILE__ );
13 +if ( !defined( 'MAINWP_PLUGIN_FILE' ) ) {
14 + define( 'MAINWP_PLUGIN_FILE', __FILE__ );
47 15 }
48 16
49 -if ( ! defined( 'MAINWP_PLUGIN_DIR' ) ) {
50 - /**
51 - * Define MainWP Dashboard Plugin Directory.
52 - *
53 - * @const ( string ) Defined MainWP Dashboard Plugin Directory.
54 - * @source https://github.com/mainwp/mainwp/blob/master/mainwp.php
55 - */
56 - define( 'MAINWP_PLUGIN_DIR', plugin_dir_path( MAINWP_PLUGIN_FILE ) );
17 +if ( !defined( 'MAINWP_PLUGIN_DIR' ) ) {
18 + define( 'MAINWP_PLUGIN_DIR', plugin_dir_path( MAINWP_PLUGIN_FILE ) );
57 19 }
58 20
59 -if ( ! defined( 'MAINWP_PLUGIN_URL' ) ) {
60 - /**
61 - * Define MainWP Child Dashboard URL.
62 - *
63 - * @const ( string ) Defined MainWP Dashboard Plugin URL.
64 - * @source https://github.com/mainwp/mainwp/blob/master/mainwp.php
65 - */
66 - define( 'MAINWP_PLUGIN_URL', plugin_dir_url( MAINWP_PLUGIN_FILE ) );
21 +if ( !defined( 'MAINWP_PLUGIN_URL' ) ) {
22 + define( 'MAINWP_PLUGIN_URL', plugin_dir_url( MAINWP_PLUGIN_FILE ) );
67 23 }
68 24
25 +include_once( ABSPATH . 'wp-includes' . DIRECTORY_SEPARATOR . 'version.php' ); //Version information from wordpress
69 26
70 -if ( ! defined( 'MAINWP_MODULES_DIR' ) ) {
71 - define( 'MAINWP_MODULES_DIR', MAINWP_PLUGIN_DIR . 'modules' . DIRECTORY_SEPARATOR );
72 -}
27 +if ( !function_exists( 'mainwp_autoload' ) ) {
73 28
74 -if ( ! defined( 'MAINWP_MODULES_URL' ) ) {
75 - define( 'MAINWP_MODULES_URL', MAINWP_PLUGIN_URL . 'modules/' );
76 -}
29 + function mainwp_autoload( $class_name ) {
30 + if ( 0 !== strpos( $class_name, 'MainWP_' ) )
31 + return;
77 32
33 + $autoload_types = array( 'class' => 'class', 'pages' => 'page', 'widgets' => 'widget' );
78 34
79 -/**
80 - * Define enable Log Module.
81 - */
82 -if ( ! defined( 'MAINWP_MODULE_LOG_ENABLED' ) ) {
83 - define( 'MAINWP_MODULE_LOG_ENABLED', true );
84 -}
35 + foreach ( $autoload_types as $type => $prefix ) {
36 + $autoload_dir = \trailingslashit( dirname( __FILE__ ) . DIRECTORY_SEPARATOR . $type );
37 + $autoload_path = sprintf( '%s%s-%s.php', $autoload_dir, $prefix, strtolower( str_replace( '_', '-', $class_name ) ) );
85 38
86 -if ( ! defined( 'MAINWP_MODULE_COST_TRACKER_ENABLED' ) ) {
87 - define( 'MAINWP_MODULE_COST_TRACKER_ENABLED', true );
88 -}
39 + if ( file_exists( $autoload_path ) ) {
40 + require_once( $autoload_path );
41 + break;
42 + }
43 + }
44 + }
89 45
90 -if ( ! defined( 'MAINWP_MODULE_API_BACKUPS_ENABLED' ) ) {
91 - define( 'MAINWP_MODULE_API_BACKUPS_ENABLED', true );
92 46 }
93 47
48 +spl_autoload_register( 'mainwp_autoload' );
94 49
95 -// Version information from WordPress.
96 -require_once ABSPATH . 'wp-includes' . DIRECTORY_SEPARATOR . 'version.php'; // NOSONAR - WP compatible.
50 +if ( !function_exists( 'mainwpdir' ) ) {
97 51
98 -if ( ! function_exists( 'mainwp_autoload' ) ) {
52 + function mainwpdir() {
53 + return WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . dirname( plugin_basename( __FILE__ ) ) . DIRECTORY_SEPARATOR . 'libs' . DIRECTORY_SEPARATOR;
54 + }
99 55
100 - /**
101 - * Autoloader for all classes, pages & widgets
102 - *
103 - * @param string $class_name Folder name class|pages|widgets.
104 - * @return require_once $autoload_path;
105 - */
106 - function mainwp_autoload( $class_name ) {
56 +}
107 57
108 - if ( 0 === strpos( $class_name, 'MainWP\Dashboard' ) ) {
109 - // trip the namespace prefix: MainWP\Dashboard\ .
110 - $class_name = substr( $class_name, 17 );
111 - }
112 -
113 - if ( 0 !== strpos( $class_name, 'MainWP_' ) ) {
114 - return;
115 - }
116 -
117 - $autoload_types = array(
118 - 'class' => 'class',
119 - 'pages' => 'page',
120 - 'widgets' => 'widget',
121 - );
122 -
123 - foreach ( $autoload_types as $type => $prefix ) {
124 - $autoload_dir = \trailingslashit( __DIR__ . DIRECTORY_SEPARATOR . $type );
125 - $autoload_path = sprintf( '%s%s-%s.php', $autoload_dir, $prefix, strtolower( str_replace( '_', '-', $class_name ) ) );
126 -
127 - if ( file_exists( $autoload_path ) ) {
128 - require_once $autoload_path; // NOSONAR - WP compatible.
129 - break;
130 - }
131 - }
132 - }
58 +if ( file_exists( WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . plugin_basename( __DIR__ ) . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . 'class-mainwp-creport.php' ) ) {
59 + include_once WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . plugin_basename( __DIR__ ) . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . 'class-mainwp-creport.php';
133 60 }
134 61
135 -spl_autoload_register( 'mainwp_autoload' );
62 +if ( !function_exists( 'mainwp_do_not_have_permissions' ) ) {
136 63
137 -require_once MAINWP_PLUGIN_DIR . 'includes' . DIRECTORY_SEPARATOR . 'functions.php'; // NOSONAR -- WP compatible.
138 -require_once MAINWP_PLUGIN_DIR . 'includes' . DIRECTORY_SEPARATOR . 'core-functions.php'; // NOSONAR -- WP compatible.
139 -require_once MAINWP_PLUGIN_DIR . 'includes' . DIRECTORY_SEPARATOR . 'compatible.php'; // NOSONAR -- WP compatible.
140 -require_once MAINWP_PLUGIN_DIR . 'includes' . DIRECTORY_SEPARATOR . 'class-mainwp-includes.php'; // NOSONAR -- WP compatible.
64 + function mainwp_do_not_have_permissions( $where = '', $echo = true ) {
65 + $msg = sprintf( __( 'You do not have sufficient permissions to access this page (%s).', 'mainwp' ), ucwords( $where ) );
66 + if ( $echo ) {
67 + echo '<div class="mainwp-permission-error"><p>' . esc_html( $msg ) . '</p>If you need access to this page please contact the dashboard administrator.</div>';
68 + } else {
69 + return $msg;
70 + }
141 71
142 -// Load Abilities API integration (feature-gated).
143 -require_once MAINWP_PLUGIN_DIR . 'includes' . DIRECTORY_SEPARATOR . 'abilities' . DIRECTORY_SEPARATOR . 'class-mainwp-abilities-util.php'; // NOSONAR -- WP compatible.
144 -require_once MAINWP_PLUGIN_DIR . 'includes' . DIRECTORY_SEPARATOR . 'abilities' . DIRECTORY_SEPARATOR . 'class-mainwp-abilities-sites.php'; // NOSONAR -- WP compatible.
145 -require_once MAINWP_PLUGIN_DIR . 'includes' . DIRECTORY_SEPARATOR . 'abilities' . DIRECTORY_SEPARATOR . 'class-mainwp-abilities-updates.php'; // NOSONAR -- WP compatible.
146 -require_once MAINWP_PLUGIN_DIR . 'includes' . DIRECTORY_SEPARATOR . 'abilities' . DIRECTORY_SEPARATOR . 'class-mainwp-abilities-clients.php'; // NOSONAR -- WP compatible.
147 -require_once MAINWP_PLUGIN_DIR . 'includes' . DIRECTORY_SEPARATOR . 'abilities' . DIRECTORY_SEPARATOR . 'class-mainwp-abilities-tags.php'; // NOSONAR -- WP compatible.
148 -require_once MAINWP_PLUGIN_DIR . 'includes' . DIRECTORY_SEPARATOR . 'abilities' . DIRECTORY_SEPARATOR . 'class-mainwp-abilities-batch.php'; // NOSONAR -- WP compatible.
149 -require_once MAINWP_PLUGIN_DIR . 'includes' . DIRECTORY_SEPARATOR . 'abilities' . DIRECTORY_SEPARATOR . 'class-mainwp-abilities-cron.php'; // NOSONAR -- WP compatible.
150 -require_once MAINWP_PLUGIN_DIR . 'includes' . DIRECTORY_SEPARATOR . 'abilities' . DIRECTORY_SEPARATOR . 'class-mainwp-abilities.php'; // NOSONAR -- WP compatible.
72 + return false;
73 + }
151 74
152 -// Initialize Abilities API integration (does nothing if Abilities API not available).
153 -if ( class_exists( '\MainWP\Dashboard\MainWP_Abilities' ) ) {
154 - \MainWP\Dashboard\MainWP_Abilities::init();
155 75 }
156 76
157 -if ( file_exists( MAINWP_PLUGIN_DIR . 'modules/system-monitor/bootstrap.php' ) ) {
158 - define( 'MAINWP_SYSTEM_MONITOR_FILE', __FILE__ );
159 - require_once MAINWP_PLUGIN_DIR . 'modules/system-monitor/bootstrap.php'; // NOSONAR - WP compatible.
160 - register_activation_hook(
161 - MAINWP_SYSTEM_MONITOR_FILE,
162 - array( MainWP\Dashboard\SystemMonitor\MainWP_System_Monitor::class, 'activate' )
163 - );
164 - register_deactivation_hook(
165 - MAINWP_SYSTEM_MONITOR_FILE,
166 - array( MainWP\Dashboard\SystemMonitor\MainWP_System_Monitor::class, 'deactivate' )
167 - );
168 -}
169 -
170 -// Detect if secupress_scanner is running.
171 77 $mainwp_is_secupress_scanning = false;
172 -if ( ! empty( $_GET ) && isset( $_GET['test'] ) && isset( $_GET['action'] ) && 'secupress_scanner' === $_GET['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized.Recommended
173 - $mainwp_is_secupress_scanning = true;
78 +if ( !empty( $_GET ) && isset( $_GET[ 'test' ] ) && isset( $_GET[ 'action' ] ) && $_GET[ 'action' ] == 'secupress_scanner' ) {
79 + $mainwp_is_secupress_scanning = true;
174 80 }
175 81
176 -// Fix a conflict with SecuPress plugin.
177 -if ( ! $mainwp_is_secupress_scanning ) {
178 - $mainWP = new MainWP\Dashboard\MainWP_System( WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . plugin_basename( __FILE__ ) );
179 - register_activation_hook( __FILE__, array( $mainWP, 'activation' ) );
180 - register_deactivation_hook( __FILE__, array( $mainWP, 'deactivation' ) );
181 - add_action( 'plugins_loaded', array( $mainWP, 'update_install' ) );
182 - // Register the post-upgrade hook for MWP-1557/1558 pk/ filename migration.
183 - // Must be registered before plugins_loaded fires so MainWP_Install::install()
184 - // sees a subscriber when it does_action('mainwp_db_after_update').
185 - add_action( 'plugins_loaded', array( 'MainWP\\Dashboard\\MainWP_Keys_Manager', 'register_migration_hooks' ), 5 );
82 +//to fix conflict with SecuPress plugin
83 +if ( !$mainwp_is_secupress_scanning ) {
84 + $mainWP = new MainWP_System( WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . plugin_basename( __FILE__ ) );
85 + register_activation_hook( __FILE__, array( $mainWP, 'activation' ) );
86 + register_deactivation_hook( __FILE__, array( $mainWP, 'deactivation' ) );
87 + add_action( 'plugins_loaded', array( $mainWP, 'update' ) );
186 88 }