PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 4.2
MainWP Dashboard: Self-hosted WordPress Management for Agencies v4.2
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 | class/class-mainwp-system-handler.php +685 -959 5.24.2 View file →
@@ -11,1049 +11,775 @@
11 11 * Class MainWP_System_Handler
12 12 *
13 13 * @package MainWP\Dashboard
14 14 */
15 -class MainWP_System_Handler { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
15 +class MainWP_System_Handler {
16 16
17 - // phpcs:disable WordPress.WP.AlternativeFunctions -- use system functions
17 + // phpcs:disable WordPress.WP.AlternativeFunctions -- use system functions
18 18
19 - /**
20 - * Private static variable to hold the single instance of the class.
21 - *
22 - * @static
23 - *
24 - * @var mixed Default null
25 - */
26 - private static $instance = null;
19 + /**
20 + * Private static variable to hold the single instance of the class.
21 + *
22 + * @static
23 + *
24 + * @var mixed Default null
25 + */
26 + private static $instance = null;
27 27
28 - /**
29 - * Private variable to hold the upgrade version info.
30 - *
31 - * @var null Version info.
32 - */
33 - private $upgradeVersionInfo = null;
28 + /**
29 + * Private variable to hold the upgrade version info.
30 + *
31 + * @var null Version info.
32 + */
33 + private $upgradeVersionInfo = null;
34 34
35 - /**
36 - * Method instance()
37 - *
38 - * Create public static instance.
39 - *
40 - * @static
41 - * @return MainWP_System
42 - */
43 - public static function instance() {
44 - if ( null === static::$instance ) {
45 - static::$instance = new self();
46 - }
35 + /**
36 + * Method instance()
37 + *
38 + * Create public static instance.
39 + *
40 + * @static
41 + * @return MainWP_System
42 + */
43 + public static function instance() {
44 + if ( null == self::$instance ) {
45 + self::$instance = new self();
46 + }
47 47
48 - return static::$instance;
49 - }
48 + return self::$instance;
49 + }
50 50
51 - /**
52 - * MainWP_System_Handler constructor.
53 - *
54 - * Run each time the class is called.
55 - *
56 - * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_class_name()
57 - */
58 - public function __construct() {
59 - add_filter( 'mainwp-extension-enabled-check', array( MainWP_Extensions_Handler::get_class_name(), 'is_extension_enabled' ) ); // @deprecated Use 'mainwp_extension_enabled_check' instead.
60 - add_filter( 'mainwp_extension_enabled_check', array( MainWP_Extensions_Handler::get_class_name(), 'is_extension_enabled' ) );
51 + /**
52 + * MainWP_System_Handler constructor.
53 + *
54 + * Run each time the class is called.
55 + *
56 + * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_class_name()
57 + */
58 + public function __construct() {
59 + add_filter( 'mainwp-extension-enabled-check', array( MainWP_Extensions_Handler::get_class_name(), 'is_extension_enabled' ) ); // @deprecated Use 'mainwp_extension_enabled_check' instead.
60 + add_filter( 'mainwp_extension_enabled_check', array( MainWP_Extensions_Handler::get_class_name(), 'is_extension_enabled' ) );
61 61
62 - /**
63 - * This hook allows you to get a list of sites via the 'mainwp-getsites' filter.
64 - *
65 - * @link http://codex.mainwp.com/#mainwp-getsites
66 - *
67 - * @see \MainWP_Extensions::hook_get_sites
68 - */
69 - add_filter( 'mainwp-getsites', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_sites' ), 10, 5 ); // @deprecated Use 'mainwp_getsites' instead.
70 - add_filter( 'mainwp-getdbsites', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_db_sites' ), 10, 5 ); // @deprecated Use 'mainwp_getdbsites' instead.
62 + /**
63 + * This hook allows you to get a list of sites via the 'mainwp-getsites' filter.
64 + *
65 + * @link http://codex.mainwp.com/#mainwp-getsites
66 + *
67 + * @see \MainWP_Extensions::hook_get_sites
68 + */
69 + add_filter( 'mainwp-getsites', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_sites' ), 10, 5 ); // @deprecated Use 'mainwp_getsites' instead.
70 + add_filter( 'mainwp-getdbsites', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_db_sites' ), 10, 5 ); // @deprecated Use 'mainwp_getdbsites' instead.
71 71
72 - add_filter( 'mainwp_getsites', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_sites' ), 10, 5 );
73 - add_filter( 'mainwp_getdbsites', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_db_sites' ), 10, 5 );
74 - add_filter( 'mainwp_get_db_websites', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_db_websites' ), 10, 5 );
72 + add_filter( 'mainwp_getsites', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_sites' ), 10, 5 );
73 + add_filter( 'mainwp_getdbsites', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_db_sites' ), 10, 5 );
75 74
76 - /**
77 - * This hook allows you to get a information about groups via the 'mainwp-getgroups' filter.
78 - *
79 - * @link http://codex.mainwp.com/#mainwp-getgroups
80 - *
81 - * @see \MainWP_Extensions::hook_get_groups
82 - */
83 - add_filter( 'mainwp-getgroups', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_groups' ), 10, 4 ); // @deprecated Use 'mainwp_getgroups' instead.
84 - add_filter( 'mainwp_getgroups', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_groups' ), 10, 4 );
85 - add_action( 'mainwp_fetchurlsauthed', array( &$this, 'filter_fetch_urls_authed' ), 10, 7 );
86 - add_filter( 'mainwp_fetchurlauthed', array( &$this, 'filter_fetch_url_authed' ), 10, 6 );
87 - add_filter( 'mainwp_getsqlwebsites_for_current_user', array( static::class, 'hook_get_sql_websites_for_current_user' ), 10, 4 );
88 - add_filter( 'mainwp_fetchurlverifyaction', array( &$this, 'hook_fetch_url_verify_action' ), 10, 4 );
75 + /**
76 + * This hook allows you to get a information about groups via the 'mainwp-getgroups' filter.
77 + *
78 + * @link http://codex.mainwp.com/#mainwp-getgroups
79 + *
80 + * @see \MainWP_Extensions::hook_get_groups
81 + */
82 + add_filter( 'mainwp-getgroups', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_groups' ), 10, 4 ); // @deprecated Use 'mainwp_getgroups' instead.
83 + add_filter( 'mainwp_getgroups', array( MainWP_Extensions_Handler::get_class_name(), 'hook_get_groups' ), 10, 4 );
84 + add_action( 'mainwp_fetchurlsauthed', array( &$this, 'filter_fetch_urls_authed' ), 10, 7 );
85 + add_filter( 'mainwp_fetchurlauthed', array( &$this, 'filter_fetch_url_authed' ), 10, 6 );
86 + add_filter(
87 + 'mainwp_getdashboardsites',
88 + array(
89 + MainWP_Extensions_Handler::get_class_name(),
90 + 'hook_get_dashboard_sites',
91 + ),
92 + 10,
93 + 7
94 + );
89 95
90 - add_filter(
91 - 'mainwp_getdashboardsites',
92 - array(
93 - MainWP_Extensions_Handler::get_class_name(),
94 - 'hook_get_dashboard_sites',
95 - ),
96 - 10,
97 - 7
98 - );
96 + // @deprecated Use 'mainwp_manager_getextensions' instead.
97 + add_filter(
98 + 'mainwp-manager-getextensions',
99 + array(
100 + MainWP_Extensions_Handler::get_class_name(),
101 + 'hook_get_all_extensions',
102 + )
103 + );
99 104
100 - // @deprecated Use 'mainwp_manager_getextensions' instead.
101 - add_filter(
102 - 'mainwp-manager-getextensions',
103 - array(
104 - MainWP_Extensions_Handler::get_class_name(),
105 - 'hook_get_all_extensions',
106 - )
107 - );
105 + add_filter(
106 + 'mainwp_manager_getextensions',
107 + array(
108 + MainWP_Extensions_Handler::get_class_name(),
109 + 'hook_get_all_extensions',
110 + )
111 + );
108 112
109 - add_filter(
110 - 'mainwp_manager_getextensions',
111 - array(
112 - MainWP_Extensions_Handler::get_class_name(),
113 - 'hook_get_all_extensions',
114 - )
115 - );
113 + if ( '' != get_option( 'mainwp_upgradeVersionInfo' ) ) {
114 + $this->upgradeVersionInfo = get_option( 'mainwp_upgradeVersionInfo' );
115 + if ( ! is_object( $this->upgradeVersionInfo ) ) {
116 + $this->upgradeVersionInfo = new \stdClass();
117 + }
118 + }
119 + }
116 120
117 - add_action( 'admin_init', array( &$this, 'admin_init' ) );
121 + /**
122 + * Method filter_fetch_urls_authed()
123 + *
124 + * Filter fetch authorized urls.
125 + *
126 + * @param mixed $pluginFile MainWP extention.
127 + * @param string $key MainWP Licence Key.
128 + * @param object $dbwebsites Child Sites.
129 + * @param string $what Function to perform.
130 + * @param array $params Function paramerters.
131 + * @param mixed $handle Function handle.
132 + * @param mixed $output Function output.
133 + *
134 + * @return mixed MainWP_Extensions_Handler::hook_fetch_urls_authed() Hook fetch authorized URLs.
135 + *
136 + * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::hook_fetch_urls_authed()
137 + */
138 + public function filter_fetch_urls_authed( $pluginFile, $key, $dbwebsites, $what, $params, $handle, $output ) {
139 + return MainWP_Extensions_Handler::hook_fetch_urls_authed( $pluginFile, $key, $dbwebsites, $what, $params, $handle, $output, $is_external_hook = true );
140 + }
118 141
119 - if ( false !== get_option( 'mainwp_upgradeVersionInfo' ) && '' !== get_option( 'mainwp_upgradeVersionInfo' ) ) {
120 - $this->upgradeVersionInfo = get_option( 'mainwp_upgradeVersionInfo' );
121 - if ( ! is_object( $this->upgradeVersionInfo ) ) {
122 - $this->upgradeVersionInfo = new \stdClass();
123 - }
124 - }
125 - }
142 + /**
143 + * Method filter_fetch_url_authed()
144 + *
145 + * Filter fetch Authorized URL.
146 + *
147 + * @param mixed $pluginFile MainWP extention.
148 + * @param string $key MainWP licence key.
149 + * @param int $websiteId Website ID.
150 + * @param string $what Function to perform.
151 + * @param array $params Function paramerters.
152 + * @param null $raw_response Raw response.
153 + *
154 + * @return mixed MainWP_Extensions_Handler::hook_fetch_url_authed() Hook fetch authorized URL.
155 + *
156 + * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::hook_fetch_url_authed()
157 + */
158 + public function filter_fetch_url_authed( $pluginFile, $key, $websiteId, $what, $params, $raw_response = null ) {
159 + return MainWP_Extensions_Handler::hook_fetch_url_authed( $pluginFile, $key, $websiteId, $what, $params, $raw_response );
160 + }
126 161
127 - /**
128 - * Method filter_fetch_urls_authed()
129 - *
130 - * Filter fetch authorized urls.
131 - *
132 - * @param mixed $pluginFile MainWP extention.
133 - * @param string $key MainWP Licence Key.
134 - * @param object $dbwebsites Child Sites.
135 - * @param string $what Function to perform.
136 - * @param array $params Function paramerters.
137 - * @param mixed $handle Function handle.
138 - * @param mixed $output Function output.
139 - *
140 - * @return mixed MainWP_Extensions_Handler::hook_fetch_urls_authed() Hook fetch authorized URLs.
141 - *
142 - * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::hook_fetch_urls_authed()
143 - */
144 - public function filter_fetch_urls_authed( $pluginFile, $key, $dbwebsites, $what, $params, $handle, $output ) {
145 - return MainWP_Extensions_Handler::hook_fetch_urls_authed( $pluginFile, $key, $dbwebsites, $what, $params, $handle, $output );
146 - }
162 + /**
163 + * Method apply_filter()
164 + *
165 + * Apply filter
166 + *
167 + * @param string $filter The filter.
168 + * @param array $value Input value.
169 + *
170 + * @return array $output Output array.
171 + *
172 + * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::hook_verify()
173 + */
174 + public function apply_filters( $filter, $value = array() ) {
147 175
148 - /**
149 - * Method filter_fetch_url_authed()
150 - *
151 - * Filter fetch Authorized URL.
152 - *
153 - * @param mixed $pluginFile MainWP extention.
154 - * @param string $key MainWP licence key.
155 - * @param int $websiteId Website ID.
156 - * @param string $what Function to perform.
157 - * @param array $params Function paramerters.
158 - * @param null $raw_response Raw response.
159 - *
160 - * @return mixed MainWP_Extensions_Handler::hook_fetch_url_authed() Hook fetch authorized URL.
161 - *
162 - * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::hook_fetch_url_authed()
163 - */
164 - public function filter_fetch_url_authed( $pluginFile, $key, $websiteId, $what, $params, $raw_response = null ) {
165 - return MainWP_Extensions_Handler::hook_fetch_url_authed( $pluginFile, $key, $websiteId, $what, $params, $raw_response );
166 - }
176 + if ( 'mainwp-getmetaboxes' === $filter ) {
177 + $output = apply_filters_deprecated( 'mainwp-getmetaboxes', array( $value ), '4.0.7.2', 'mainwp_getmetaboxes' ); // @deprecated Use 'mainwp_getmetaboxes' instead.
178 + } else {
179 + $output = apply_filters( $filter, $value );
180 + }
167 181
168 - /**
169 - * Method hook_fetch_url_verify_action()
170 - *
171 - * Filter fetch Authorized URL.
172 - *
173 - * @param mixed $pluginFile MainWP extention.
174 - * @param string $childKey Extension child key.
175 - * @param int $websiteId Website ID.
176 - * @param array $params Function paramerters.
177 - *
178 - * @return mixed MainWP_Extensions_Handler::hook_fetch_url_authed() Hook fetch authorized URL.
179 - */
180 - public function hook_fetch_url_verify_action( $pluginFile, $childKey, $websiteId, $params ) {
181 - if ( ! is_array( $params ) || ! isset( $params['actionnonce'] ) ) {
182 - return false;
183 - }
184 - $what = 'verify_action';
185 - return MainWP_Extensions_Handler::hook_fetch_url_authed( $pluginFile, $childKey, $websiteId, $what, $params );
186 - }
182 + if ( ! is_array( $output ) ) {
183 + return array();
184 + }
185 + $count = count( $output );
186 + for ( $i = 0; $i < $count; $i ++ ) {
187 187
188 - /**
189 - * Method apply_filter()
190 - *
191 - * Apply filter
192 - *
193 - * @param string $filter The filter.
194 - * @param array $value Input value.
195 - *
196 - * @return array $output Output array.
197 - *
198 - * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::hook_verify()
199 - */
200 - public function apply_filters( $filter, $value = array() ) {
188 + if ( 'mainwp_getmetaboxes' === $filter ) {
189 + // pass custom widget.
190 + if ( isset( $output[ $i ]['custom'] ) && $output[ $i ]['custom'] && isset( $output[ $i ]['plugin'] ) ) {
191 + continue;
192 + }
193 + }
201 194
202 - if ( 'mainwp-getmetaboxes' === $filter ) {
203 - $output = apply_filters_deprecated( 'mainwp-getmetaboxes', array( $value ), '4.0.7.2', 'mainwp_getmetaboxes' ); // @deprecated Use 'mainwp_getmetaboxes' instead. NOSONAR - not IP.
204 - } else {
205 - $output = apply_filters( $filter, $value );
206 - }
195 + if ( ! isset( $output[ $i ]['plugin'] ) || ! isset( $output[ $i ]['key'] ) ) {
196 + unset( $output[ $i ] );
197 + continue;
198 + }
207 199
208 - if ( ! is_array( $output ) ) {
209 - return array();
210 - }
211 - return $output;
212 - }
200 + if ( ! MainWP_Extensions_Handler::hook_verify( $output[ $i ]['plugin'], $output[ $i ]['key'] ) ) {
201 + unset( $output[ $i ] );
202 + continue;
203 + }
204 + }
213 205
214 - /**
215 - * Method admin_init()
216 - *
217 - * Do nothing if current user is not an Admin.
218 - */
219 - public function admin_init() { // phpcs:ignore -- NOSONAR - complex function.
220 - if ( ! MainWP_System_Utility::is_admin() ) {
221 - return;
222 - }
206 + return $output;
207 + }
223 208
224 - global $pagenow;
209 + /**
210 + * Method handle_manage_sites_screen_settings()
211 + *
212 + * Handle manage sites screen settings
213 + */
214 + public function handle_manage_sites_screen_settings() {
215 + if ( isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'ManageSitesScrOptions' ) ) {
216 + $show_cols = array();
217 + foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST ) ) as $key => $val ) {
218 + if ( false !== strpos( $key, 'mainwp_show_column_' ) ) {
219 + $col = str_replace( 'mainwp_show_column_', '', $key );
220 + $show_cols[ $col ] = 1;
221 + }
222 + }
223 + if ( isset( $_POST['show_columns_name'] ) ) {
224 + foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST['show_columns_name'] ) ) as $col ) {
225 + if ( ! isset( $show_cols[ $col ] ) ) {
226 + $show_cols[ $col ] = 0; // uncheck, hide columns.
227 + }
228 + }
229 + }
230 + $user = wp_get_current_user();
231 + if ( $user ) {
232 + $val = ( isset( $_POST['mainwp_sitesviewmode'] ) ? sanitize_text_field( wp_unslash( $_POST['mainwp_sitesviewmode'] ) ) : 'table' );
233 + if ( 'grid' !== $val && 'table' !== $val ) {
234 + $val = 'table';
235 + }
236 + update_user_option( $user->ID, 'mainwp_sitesviewmode', $val, true );
237 + update_user_option( $user->ID, 'mainwp_settings_show_manage_sites_columns', $show_cols, true );
238 + update_option( 'mainwp_default_sites_per_page', ( isset( $_POST['mainwp_default_sites_per_page'] ) ? intval( $_POST['mainwp_default_sites_per_page'] ) : 25 ) );
239 + }
240 + } elseif ( isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'SreenshotsSitesScrOptions' ) ) {
241 + $user = wp_get_current_user();
242 + if ( $user ) {
243 + $val = ( isset( $_POST['mainwp_sitesviewmode'] ) ? sanitize_text_field( wp_unslash( $_POST['mainwp_sitesviewmode'] ) ) : 'table' );
244 + if ( 'grid' !== $val && 'table' !== $val ) {
245 + $val = 'table';
246 + }
247 + update_user_option( $user->ID, 'mainwp_sitesviewmode', $val, true );
248 + }
249 + }
250 + }
225 251
226 - if ( 'plugins.php' === $pagenow && isset( $_GET['do'] ) && 'checkUpgrade' === $_GET['do'] && ( ( time() - $this->upgradeVersionInfo->updated ) > 30 ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
227 - $this->check_upgrade();
228 - delete_site_transient( 'update_plugins' ); // to forced refresh 'update_plugins' transient.
229 - wp_safe_redirect( admin_url( 'plugins.php' ) );
230 - exit;
231 - }
232 - }
252 + /**
253 + * Method handle_monitoring_sites_screen_settings()
254 + *
255 + * Handle monitoring sites screen settings
256 + */
257 + public function handle_monitoring_sites_screen_settings() {
258 + if ( isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'MonitoringSitesScrOptions' ) ) {
259 + $show_cols = array();
260 + foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST ) ) as $key => $val ) {
261 + if ( false !== strpos( $key, 'mainwp_show_column_' ) ) {
262 + $col = str_replace( 'mainwp_show_column_', '', $key );
263 + $show_cols[ $col ] = 1;
264 + }
265 + }
266 + if ( isset( $_POST['show_columns_name'] ) ) {
267 + foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST['show_columns_name'] ) ) as $col ) {
268 + if ( ! isset( $show_cols[ $col ] ) ) {
269 + $show_cols[ $col ] = 0; // uncheck, hide columns.
270 + }
271 + }
272 + }
233 273
274 + $user = wp_get_current_user();
275 + if ( $user ) {
276 + update_user_option( $user->ID, 'mainwp_settings_show_monitoring_sites_columns', $show_cols, true );
277 + update_option( 'mainwp_default_monitoring_sites_per_page', ( isset( $_POST['mainwp_default_monitoring_sites_per_page'] ) ? intval( $_POST['mainwp_default_monitoring_sites_per_page'] ) : 25 ) );
278 + }
279 + }
280 + }
234 281
282 + /**
283 + * Method handle_mainwp_tools_settings()
284 + *
285 + * Handle mainwp tools settings.
286 + *
287 + * @uses \MainWP\Dashboard\MainWP_Twitter::clear_all_twitter_messages()
288 + * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
289 + */
290 + public function handle_mainwp_tools_settings() { // phpcs:ignore -- Current complexity is the only way to achieve desired results, pull request solutions appreciated.
235 291
236 - /**
237 - * Method hook_get_sql_websites_for_current_user()
238 - *
239 - * Get sql websites for current user.
240 - *
241 - * @param mixed $input_value First input filter value.
242 - * @param string $pluginFile Extension plugin file to verify.
243 - * @param string $key The child-key.
244 - * @param mixed $params Input params data.
245 - *
246 - * @return string sql.
247 - */
248 - public static function hook_get_sql_websites_for_current_user( $input_value, $pluginFile, $key, $params ) {
249 - unset( $input_value );
250 - if ( ! MainWP_Extensions_Handler::hook_verify( $pluginFile, $key ) ) {
251 - return false;
252 - }
253 - return MainWP_DB::instance()->get_sql_wp_for_current_user( $params );
254 - }
255 - /**
256 - * Method handle_manage_sites_screen_settings()
257 - *
258 - * Handle manage sites screen settings
259 - */
260 - public function handle_manage_sites_screen_settings() { // phpcs:ignore -- NOSONAR - required to achieve desired results, pull request solutions appreciated.
261 - if ( isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'ManageSitesScrOptions' ) ) {
262 - $show_cols = array();
263 - foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST ) ) as $key => $val ) {
264 - if ( false !== strpos( $key, 'mainwp_show_column_' ) ) {
265 - $col = str_replace( 'mainwp_show_column_', '', $key );
266 - $show_cols[ $col ] = 1;
267 - }
268 - }
269 - if ( isset( $_POST['show_columns_name'] ) ) {
270 - foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST['show_columns_name'] ) ) as $col ) {
271 - if ( ! isset( $show_cols[ $col ] ) ) {
272 - $show_cols[ $col ] = 0; // uncheck, hide columns.
273 - }
274 - }
275 - }
276 - MainWP_Utility::update_option( 'mainwp_use_favicon', 1 );
277 - MainWP_Utility::update_option( 'mainwp_optimize', ( ! isset( $_POST['mainwp_optimize'] ) ? 0 : 1 ) );
278 - $user = wp_get_current_user();
279 - if ( $user ) {
280 - $val = ( isset( $_POST['mainwp_sitesviewmode'] ) ? sanitize_text_field( wp_unslash( $_POST['mainwp_sitesviewmode'] ) ) : 'grid' );
281 - if ( 'grid' !== $val && 'table' !== $val ) {
282 - $val = 'grid';
283 - }
284 - update_user_option( $user->ID, 'mainwp_sitesviewmode', $val, true );
285 - update_user_option( $user->ID, 'mainwp_settings_show_manage_sites_columns', $show_cols, true );
286 - update_option( 'mainwp_default_sites_per_page', ( isset( $_POST['mainwp_default_sites_per_page'] ) ? intval( $_POST['mainwp_default_sites_per_page'] ) : 25 ) );
287 - }
288 - } elseif ( isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'SreenshotsSitesScrOptions' ) ) {
289 - $user = wp_get_current_user();
290 - if ( $user ) {
291 - $val = ( isset( $_POST['mainwp_sitesviewmode'] ) ? sanitize_text_field( wp_unslash( $_POST['mainwp_sitesviewmode'] ) ) : 'grid' );
292 - if ( 'grid' !== $val && 'table' !== $val ) {
293 - $val = 'grid';
294 - }
295 - update_user_option( $user->ID, 'mainwp_sitesviewmode', $val, true );
296 - }
297 - }
298 - }
292 + $user = wp_get_current_user();
293 + if ( isset( $_GET['page'] ) && 'MainWPTools' === $_GET['page'] ) {
294 + if ( isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'MainWPTools' ) ) {
295 + if ( isset( $_POST['mainwp_restore_info_messages'] ) && ! empty( $_POST['mainwp_restore_info_messages'] ) ) {
296 + delete_user_option( $user->ID, 'mainwp_notice_saved_status' );
297 + } else {
298 + MainWP_Utility::update_option( 'mainwp_enable_managed_cr_for_wc', ( ! isset( $_POST['enable_managed_cr_for_wc'] ) ? 0 : 1 ) );
299 + $enabled_twit = ! isset( $_POST['mainwp_hide_twitters_message'] ) ? 0 : 1;
300 + MainWP_Utility::update_option( 'mainwp_hide_twitters_message', $enabled_twit );
301 + if ( ! $enabled_twit ) {
302 + MainWP_Twitter::clear_all_twitter_messages();
303 + }
304 + }
305 + }
306 + }
299 307
300 - /**
301 - * Method handle_monitoring_sites_screen_settings()
302 - *
303 - * Handle monitoring sites screen settings
304 - */
305 - public function handle_monitoring_sites_screen_settings() { // phpcs:ignore -- NOSONAR - complex.
306 - if ( isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'MonitoringSitesScrOptions' ) ) {
307 - $show_cols = array();
308 - foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST ) ) as $key => $val ) {
309 - if ( false !== strpos( $key, 'mainwp_show_column_' ) ) {
310 - $col = str_replace( 'mainwp_show_column_', '', $key );
311 - $show_cols[ $col ] = 1;
312 - }
313 - }
314 - if ( isset( $_POST['show_columns_name'] ) ) {
315 - foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST['show_columns_name'] ) ) as $col ) {
316 - if ( ! isset( $show_cols[ $col ] ) ) {
317 - $show_cols[ $col ] = 0; // uncheck, hide columns.
318 - }
319 - }
320 - }
308 + $update_screen_options = false;
309 + if ( isset( $_POST['wp_nonce'] ) && ( wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'Settings' ) || wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'MainWPScrOptions' ) ) ) {
310 + $update_screen_options = true;
311 + }
321 312
322 - $user = wp_get_current_user();
323 - if ( $user ) {
324 - update_user_option( $user->ID, 'mainwp_settings_show_monitoring_sites_columns', $show_cols, true );
325 - update_option( 'mainwp_default_monitoring_sites_per_page', ( isset( $_POST['mainwp_default_monitoring_sites_per_page'] ) ? intval( $_POST['mainwp_default_monitoring_sites_per_page'] ) : 25 ) );
326 - }
313 + if ( $update_screen_options ) {
314 + $show_wids = array();
315 + if ( isset( $_POST['mainwp_show_widgets'] ) && is_array( $_POST['mainwp_show_widgets'] ) ) {
316 + $selected_wids = array_map( 'sanitize_text_field', wp_unslash( $_POST['mainwp_show_widgets'] ) );
317 + foreach ( $selected_wids as $name ) {
318 + $show_wids[ $name ] = 1;
319 + }
320 + }
327 321
328 - update_option( 'mainwp_disableSitesChecking', ( ! isset( $_POST['mainwp_disableSitesChecking'] ) ? 1 : 0 ) );
322 + if ( isset( $_POST['mainwp_widgets_name'] ) && is_array( $_POST['mainwp_widgets_name'] ) ) {
323 + $name_wids = array_map( 'sanitize_text_field', wp_unslash( $_POST['mainwp_widgets_name'] ) );
324 + foreach ( $name_wids as $name ) {
325 + if ( ! isset( $show_wids[ $name ] ) ) {
326 + $show_wids[ $name ] = 0;
327 + }
328 + }
329 + }
329 330
330 - $val = isset( $_POST['mainwp_frequency_sitesChecking'] ) ? intval( $_POST['mainwp_frequency_sitesChecking'] ) : 1440;
331 - update_option( 'mainwp_frequencySitesChecking', $val );
331 + $val = ( isset( $_POST['mainwp_sidebarPosition'] ) ? intval( $_POST['mainwp_sidebarPosition'] ) : 1 );
332 + if ( $user ) {
333 + update_user_option( $user->ID, 'mainwp_settings_show_widgets', $show_wids, true );
334 + update_user_option( $user->ID, 'mainwp_sidebarPosition', $val, true );
335 + }
332 336
333 - update_option( 'mainwp_disableSitesHealthMonitoring', ( ! isset( $_POST['mainwp_disable_sitesHealthMonitoring'] ) ? 1 : 0 ) );
337 + MainWP_Utility::update_option( 'mainwp_hide_update_everything', ( ! isset( $_POST['hide_update_everything'] ) ? 0 : 1 ) );
338 + MainWP_Utility::update_option( 'mainwp_number_overview_columns', ( isset( $_POST['number_overview_columns'] ) ? intval( $_POST['number_overview_columns'] ) : 2 ) );
334 339
335 - $val = isset( $_POST['mainwp_site_healthThreshold'] ) ? intval( $_POST['mainwp_site_healthThreshold'] ) : 80;
336 - update_option( 'mainwp_sitehealthThreshold', $val );
337 - }
338 - }
340 + if ( isset( $_POST['reset_overview_settings'] ) && ! empty( $_POST['reset_overview_settings'] ) && isset( $_POST['reset_overview_which_settings'] ) && 'overview_settings' == $_POST['reset_overview_which_settings'] ) {
341 + update_user_option( $user->ID, 'mainwp_widgets_sorted_toplevel_page_mainwp_tab', false, true );
342 + update_user_option( $user->ID, 'mainwp_widgets_sorted_mainwp_page_managesites', false, true );
343 + }
344 + }
345 + }
339 346
340 - /**
341 - * Method handle_clients_screen_settings()
342 - *
343 - * Handle manage clients screen settings
344 - */
345 - public function handle_clients_screen_settings() { // phpcs:ignore -- NOSONAR - complex.
346 - if ( isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'ManageClientsScrOptions' ) ) {
347 - $show_cols = array();
348 - foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST ) ) as $key => $val ) {
349 - if ( false !== strpos( $key, 'mainwp_show_column_' ) ) {
350 - $col = str_replace( 'mainwp_show_column_', '', $key );
351 - $show_cols[ $col ] = 1;
352 - }
353 - }
354 - if ( isset( $_POST['show_columns_name'] ) ) {
355 - foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST['show_columns_name'] ) ) as $col ) {
356 - if ( ! isset( $show_cols[ $col ] ) ) {
357 - $show_cols[ $col ] = 0; // uncheck, hide columns.
358 - }
359 - }
360 - }
361 347
362 - $user = wp_get_current_user();
363 - if ( $user ) {
364 - update_user_option( $user->ID, 'mainwp_settings_show_manage_clients_columns', $show_cols, true );
365 - update_option( 'mainwp_default_manage_clients_per_page', ( isset( $_POST['mainwp_default_manage_clients_per_page'] ) ? intval( $_POST['mainwp_default_manage_clients_per_page'] ) : 25 ) );
366 - }
367 - }
368 - }
348 + /**
349 + * Method handle_rest_api_settings()
350 + *
351 + * Handle rest api settings
352 + */
353 + public function handle_rest_api_settings() {
354 + $update_screen_options = false;
355 + if ( isset( $_POST['submit'] ) && isset( $_GET['page'] ) && 'RESTAPI' === $_GET['page'] ) {
356 + if ( isset( $_POST['submit'] ) && isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'RESTAPI' ) ) {
357 + MainWP_Utility::update_option( 'mainwp_enable_rest_api', ( ! isset( $_POST['mainwp_enable_rest_api'] ) ? 0 : 1 ) );
369 358
370 - /**
371 - * Method handle_clients_screen_settings()
372 - *
373 - * Handle manage clients screen settings
374 - */
375 - public function handle_updates_screen_settings() {
376 - if ( isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'UpdatesScrOptions' ) ) {
377 - $val = ( ! isset( $_POST['mainwp_pluginAutomaticDailyUpdate'] ) ? 0 : intval( $_POST['mainwp_pluginAutomaticDailyUpdate'] ) );
378 - MainWP_Utility::update_option( 'mainwp_pluginAutomaticDailyUpdate', $val );
379 - $val = ( ! isset( $_POST['mainwp_themeAutomaticDailyUpdate'] ) ? 0 : intval( $_POST['mainwp_themeAutomaticDailyUpdate'] ) );
380 - MainWP_Utility::update_option( 'mainwp_themeAutomaticDailyUpdate', $val );
381 - $val = ( ! isset( $_POST['mainwp_automaticDailyUpdate'] ) ? 0 : intval( $_POST['mainwp_automaticDailyUpdate'] ) );
382 - MainWP_Utility::update_option( 'mainwp_automaticDailyUpdate', $val );
383 - $val = ( isset( $_POST['mainwp_delay_autoupdate'] ) ? intval( $_POST['mainwp_delay_autoupdate'] ) : 1 );
384 - MainWP_Utility::update_option( 'mainwp_delay_autoupdate', $val );
385 - $val = ( ! isset( $_POST['mainwp_show_language_updates'] ) ? 0 : 1 );
386 - MainWP_Utility::update_option( 'mainwp_show_language_updates', $val );
387 - $val = ( ! isset( $_POST['mainwp_disable_update_confirmations'] ) ? 0 : intval( $_POST['mainwp_disable_update_confirmations'] ) );
388 - MainWP_Utility::update_option( 'mainwp_disable_update_confirmations', $val );
389 - }
390 - }
359 + }
360 + }
361 + }
391 362
363 + /**
364 + * Method handle_settings_post()
365 + *
366 + * Handle saving settings page.
367 + *
368 + * @uses \MainWP\Dashboard\MainWP_Backup_Handler::handle_settings_post()
369 + * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
370 + * @uses \MainWP\Dashboard\MainWP_DB_Common::update_user_extension()
371 + * @uses \MainWP\Dashboard\MainWP_Monitoring_Handler::handle_settings_post()
372 + * @uses \MainWP\Dashboard\MainWP_Settings::handle_settings_post()
373 + */
374 + public function handle_settings_post() {
375 + if ( isset( $_GET['page'] ) && isset( $_POST['wp_nonce'] ) ) {
376 + $this->include_pluggable();
377 + $this->handle_mainwp_tools_settings();
378 + $this->handle_rest_api_settings();
379 + $this->handle_manage_sites_screen_settings();
380 + $this->handle_monitoring_sites_screen_settings();
381 + }
392 382
393 - /**
394 - * Method handle_mainwp_tools_settings()
395 - *
396 - * Handle mainwp tools settings.
397 - *
398 - * @uses \MainWP\Dashboard\MainWP_Twitter::clear_all_twitter_messages()
399 - * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
400 - */
401 - public function handle_mainwp_tools_settings() { // phpcs:ignore -- NOSONAR -Current complexity is the only way to achieve desired results, pull request solutions appreciated.
383 + if ( isset( $_POST['select_mainwp_options_siteview'] ) ) {
384 + $this->include_pluggable();
385 + if ( check_admin_referer( 'mainwp-admin-nonce' ) ) {
386 + $userExtension = MainWP_DB_Common::instance()->get_user_extension();
387 + $userExtension->site_view = ( empty( $_POST['select_mainwp_options_siteview'] ) ? MAINWP_VIEW_PER_PLUGIN_THEME : intval( $_POST['select_mainwp_options_siteview'] ) );
388 + MainWP_DB_Common::instance()->update_user_extension( $userExtension );
389 + }
390 + }
402 391
403 - $user = wp_get_current_user();
392 + if ( isset( $_POST['submit'] ) && isset( $_POST['wp_nonce'] ) ) {
393 + $this->include_pluggable();
394 + if ( wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'Settings' ) ) {
395 + $updated = MainWP_Settings::handle_settings_post();
396 + $updated |= MainWP_Backup_Handler::handle_settings_post();
397 + $updated |= MainWP_Monitoring_Handler::handle_settings_post();
398 + $msg = '';
399 + if ( $updated ) {
400 + $msg = '&message=saved';
401 + }
402 + wp_safe_redirect( admin_url( 'admin.php?page=Settings' . $msg ) );
403 + exit();
404 + }
405 + }
404 406
405 - $update_selected_mainwp_themes = false;
407 + if ( isset( $_POST['mainwp_sidebar_position'] ) && isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'onchange_sidebarposition' ) ) {
408 + $val = isset( $_POST['mainwp_sidebar_position'] ) && $_POST['mainwp_sidebar_position'] ? 1 : 0;
409 + $user = wp_get_current_user();
410 + if ( $user ) {
411 + update_user_option( $user->ID, 'mainwp_sidebarPosition', $val, true );
412 + }
413 + return true;
414 + }
415 + }
406 416
407 - if ( isset( $_GET['page'] ) && 'MainWPTools' === $_GET['page'] && isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'MainWPTools' ) ) {
408 - if ( isset( $_POST['mainwp_restore_info_messages'] ) && ! empty( $_POST['mainwp_restore_info_messages'] ) ) {
409 - delete_user_option( $user->ID, 'mainwp_notice_saved_status' );
410 - }
411 - $enabled_tours = ! isset( $_POST['mainwp-guided-tours-option'] ) ? 0 : 1;
412 - MainWP_Utility::update_option( 'mainwp_enable_guided_tours', $enabled_tours );
417 + /**
418 + * Method include_pluggable()
419 + *
420 + * Include pluggable functions.
421 + */
422 + public function include_pluggable() {
423 + // may causing of conflict with Post S m t p plugin.
424 + if ( ! function_exists( 'wp_create_nonce' ) ) {
425 + include_once ABSPATH . WPINC . '/pluggable.php';
426 + }
427 + }
413 428
414 - if ( isset( $_POST['mainwp_settings_custom_theme'] ) ) {
415 - $update_selected_mainwp_themes = true;
416 - }
417 - }
429 + /**
430 + * Method plugins_api_info()
431 + *
432 + * Get MainWP Extension api information.
433 + *
434 + * @param mixed $false Return value.
435 + * @param mixed $action Action being performed.
436 + * @param mixed $arg Action arguments. Should be the plugin slug.
437 + *
438 + * @return mixed $info|$false
439 + *
440 + * @uses \MainWP\Dashboard\MainWP_API_Handler::get_update_information()
441 + * @uses \MainWP\Dashboard\MainWP_Extensions_View::get_available_extensions()
442 + * @uses \MainWP\Dashboard\MainWP_System::get_plugin_slug()
443 + * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_slugs()
444 + */
445 + public function plugins_api_info( $false, $action, $arg ) {
446 + if ( 'plugin_information' !== $action ) {
447 + return $false;
448 + }
418 449
419 - if ( isset( $_POST['wp_scr_options_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_scr_options_nonce'] ), 'MainWPSelectThemes' ) ) {
420 - $update_selected_mainwp_themes = true;
421 - }
450 + if ( is_array( $arg ) ) {
451 + $arg = (object) $arg;
452 + }
422 453
423 - if ( $update_selected_mainwp_themes && isset( $_POST['mainwp_settings_custom_theme'] ) ) {
424 - $custom_theme = sanitize_text_field( wp_unslash( $_POST['mainwp_settings_custom_theme'] ) );
425 - update_user_option( $user->ID, 'mainwp_selected_theme', $custom_theme );
426 - }
454 + if ( ! isset( $arg->slug ) || ( '' === $arg->slug ) ) {
455 + return $false;
456 + }
427 457
428 - $update_screen_options = false;
429 - if ( isset( $_POST['wp_nonce'] ) && ( wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'Settings' ) || wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'MainWPScrOptions' ) ) ) {
430 - $update_screen_options = true;
431 - }
458 + if ( dirname( MainWP_System::instance()->get_plugin_slug() ) === $arg->slug ) {
459 + return $false;
460 + }
432 461
433 - if ( $update_screen_options ) {
434 - $show_wids = array();
435 - if ( isset( $_POST['mainwp_show_widgets'] ) && is_array( $_POST['mainwp_show_widgets'] ) ) {
436 - $selected_wids = array_map( 'sanitize_text_field', wp_unslash( $_POST['mainwp_show_widgets'] ) );
437 - foreach ( $selected_wids as $name ) {
438 - $show_wids[ $name ] = 1;
439 - }
440 - }
462 + $result = MainWP_Extensions_Handler::get_slugs();
463 + $am_slugs = $result['am_slugs'];
441 464
442 - if ( isset( $_POST['mainwp_widgets_name'] ) && is_array( $_POST['mainwp_widgets_name'] ) ) {
443 - $name_wids = array_map( 'sanitize_text_field', wp_unslash( $_POST['mainwp_widgets_name'] ) );
444 - foreach ( $name_wids as $name ) {
445 - if ( ! isset( $show_wids[ $name ] ) ) {
446 - $show_wids[ $name ] = 0;
447 - }
448 - }
449 - }
465 + if ( '' !== $am_slugs ) {
466 + $am_slugs = explode( ',', $am_slugs );
467 + if ( false !== strpos( $arg->slug, '/' ) ) { // to fix.
468 + $dir_slug = dirname( $arg->slug );
469 + } else {
470 + $dir_slug = $arg->slug;
471 + }
472 + if ( in_array( $dir_slug, $am_slugs ) ) {
473 + $info = MainWP_API_Handler::get_update_information( $dir_slug );
474 + if ( is_object( $info ) && property_exists( $info, 'sections' ) ) {
475 + if ( ! is_array( $info->sections ) || ! isset( $info->sections['changelog'] ) || empty( $info->sections['changelog'] ) ) {
476 + $exts_data = MainWP_Extensions_View::get_available_extensions();
477 + if ( isset( $exts_data[ $arg->slug ] ) ) {
478 + $ext_info = $exts_data[ $arg->slug ];
479 + $changelog_link = rtrim( $ext_info['link'], '/' );
480 + $info->sections['changelog'] = '<a href="' . $changelog_link . '#tab-changelog" target="_blank">' . $changelog_link . '#tab-changelog</a>';
481 + }
482 + }
483 + return $info;
484 + }
485 + return $info;
486 + }
487 + }
450 488
451 - $show_cols = array();
452 - if ( isset( $_POST['mainwp_show_columns'] ) && is_array( $_POST['mainwp_show_columns'] ) ) {
453 - $selected_cols = array_map( 'sanitize_text_field', wp_unslash( $_POST['mainwp_show_columns'] ) );
454 - foreach ( $selected_cols as $name ) {
455 - $show_cols[ $name ] = 1;
456 - }
457 - }
489 + return $false;
490 + }
458 491
459 - if ( isset( $_POST['mainwp_columns_name'] ) && is_array( $_POST['mainwp_columns_name'] ) ) {
460 - $name_cols = array_map( 'sanitize_text_field', wp_unslash( $_POST['mainwp_columns_name'] ) );
461 - foreach ( $name_cols as $name ) {
462 - if ( ! isset( $show_cols[ $name ] ) ) {
463 - $show_cols[ $name ] = 0;
464 - }
465 - }
466 - }
492 + /**
493 + * Method check_update_custom()
494 + *
495 + * Check MainWP Extensions for updates.
496 + *
497 + * @param object $transient Transient information.
498 + *
499 + * @return object $transient Transient information.
500 + *
501 + * @uses \MainWP\Dashboard\MainWP_API_Handler::get_upgrade_information()
502 + * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_indexed_extensions_infor()
503 + * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_extension_slug()
504 + * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
505 + */
506 + public function check_update_custom( $transient ) { // phpcs:ignore -- Current complexity is the only way to achieve desired results, pull request solutions appreciated.
507 + if ( isset( $_POST['action'] ) && ( ( 'update-plugin' === $_POST['action'] ) || ( 'update-selected' === $_POST['action'] ) ) && is_object( $transient ) && property_exists( $transient, 'response' ) ) {
508 + $extensions = MainWP_Extensions_Handler::get_indexed_extensions_infor( array( 'activated' => true ) );
509 + if ( defined( 'DOING_AJAX' ) && isset( $_POST['plugin'] ) && 'update-plugin' == $_POST['action'] ) {
467 510
468 - $val = ( isset( $_POST['mainwp_sidebarPosition'] ) ? intval( $_POST['mainwp_sidebarPosition'] ) : 1 );
469 - if ( $user ) {
470 - update_user_option( $user->ID, 'mainwp_settings_show_widgets', $show_wids, true );
471 - update_user_option( $user->ID, 'mainwp_sidebarPosition', $val, true );
511 + if ( empty( $transient->response ) ) {
512 + $transient->response = array();
513 + }
472 514
473 - if ( isset( $_POST['mainwp_manageposts_show_columns_settings'] ) ) {
474 - update_user_option( $user->ID, 'mainwp_manageposts_show_columns', $show_cols, true );
475 - }
515 + $plugin_slug = sanitize_text_field( wp_unslash( $_POST['plugin'] ) );
516 + if ( isset( $extensions[ $plugin_slug ] ) ) {
476 517
477 - if ( isset( $_POST['mainwp_managepages_show_columns_settings'] ) ) {
478 - update_user_option( $user->ID, 'mainwp_managepages_show_columns', $show_cols, true );
479 - }
518 + if ( ! is_object( $transient->response[ $plugin_slug ] ) || ! property_exists( $transient->response[ $plugin_slug ], 'new_version' ) ) {
519 + return $transient;
520 + }
480 521
481 - if ( isset( $_POST['mainwp_manageusers_show_columns_settings'] ) ) {
482 - update_user_option( $user->ID, 'mainwp_manageusers_show_columns', $show_cols, true );
483 - }
484 - }
522 + if ( isset( $transient->response[ $plugin_slug ] ) && version_compare( $transient->response[ $plugin_slug ]->new_version, $extensions[ $plugin_slug ]['version'], '=' ) ) {
523 + return $transient;
524 + }
485 525
486 - MainWP_Utility::update_option( 'mainwp_hide_update_everything', ( ! isset( $_POST['hide_update_everything'] ) ? 0 : 1 ) );
526 + $api_slug = dirname( $plugin_slug );
527 + $rslt = MainWP_API_Handler::get_upgrade_information( $api_slug );
487 528
488 - if ( isset( $_POST['reset_overview_settings'] ) && ! empty( $_POST['reset_overview_settings'] ) && isset( $_POST['reset_overview_which_settings'] ) && 'overview_settings' === $_POST['reset_overview_which_settings'] ) {
489 - update_user_option( $user->ID, 'mainwp_widgets_sorted_toplevel_page_mainwp_tab', false, true );
490 - update_user_option( $user->ID, 'mainwp_widgets_sorted_mainwp_page_managesites', false, true );
491 - }
492 - }
529 + if ( ! empty( $rslt ) && is_object( $rslt ) && property_exists( $rslt, 'latest_version' ) && version_compare( $rslt->latest_version, $extensions[ $plugin_slug ]['version'], '>' ) ) {
530 + $transient->response[ $plugin_slug ] = self::map_rslt_obj( $rslt );
531 + }
493 532
494 - $update_clients_screen_options = false;
495 - if ( isset( $_POST['wp_scr_options_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_scr_options_nonce'] ), 'MainWPClientsScrOptions' ) ) {
496 - $update_clients_screen_options = true;
497 - }
498 - if ( $update_clients_screen_options ) {
533 + return $transient;
534 + }
535 + } elseif ( 'update-selected' === $_POST['action'] && isset( $_POST['checked'] ) && is_array( $_POST['checked'] ) ) {
499 536
500 - $show_wids = array();
501 - if ( isset( $_POST['mainwp_show_widgets'] ) && is_array( $_POST['mainwp_show_widgets'] ) ) {
502 - $selected_wids = array_map( 'sanitize_text_field', wp_unslash( $_POST['mainwp_show_widgets'] ) );
503 - foreach ( $selected_wids as $name ) {
504 - $show_wids[ $name ] = 1;
505 - }
506 - }
537 + if ( empty( $transient->response ) ) {
538 + $transient->response = array();
539 + }
507 540
508 - if ( isset( $_POST['mainwp_widgets_name'] ) && is_array( $_POST['mainwp_widgets_name'] ) ) {
509 - $name_wids = array_map( 'sanitize_text_field', wp_unslash( $_POST['mainwp_widgets_name'] ) );
510 - foreach ( $name_wids as $name ) {
511 - if ( ! isset( $show_wids[ $name ] ) ) {
512 - $show_wids[ $name ] = 0;
513 - }
514 - }
515 - }
541 + $updated = false;
542 + foreach ( wp_unslash( $_POST['checked'] ) as $plugin_slug ) {
543 + if ( isset( $extensions[ $plugin_slug ] ) ) {
516 544
517 - if ( $user ) {
518 - update_user_option( $user->ID, 'mainwp_clients_show_widgets', $show_wids, true );
519 - }
545 + if ( ! isset( $transient->response[ $plugin_slug ] ) ) {
546 + $transient->response[ $plugin_slug ] = new \stdClass();
547 + }
520 548
521 - if ( isset( $_POST['reset_client_overview_settings'] ) && ! empty( $_POST['reset_client_overview_settings'] ) ) {
522 - update_user_option( $user->ID, 'mainwp_widgets_sorted_mainwp_page_manageclients', false, true );
523 - }
524 - }
525 - }
549 + if ( isset( $transient->response[ $plugin_slug ] ) && version_compare( $transient->response[ $plugin_slug ]->new_version, $extensions[ $plugin_slug ]['version'], '=' ) ) {
550 + continue;
551 + }
552 + $api_slug = dirname( $plugin_slug );
553 + $rslt = MainWP_API_Handler::get_upgrade_information( $api_slug );
554 + if ( ! empty( $rslt ) && is_object( $rslt ) && property_exists( $rslt, 'latest_version' ) && version_compare( $rslt->latest_version, $extensions[ $plugin_slug ]['version'], '>' ) ) {
526 555
527 - /**
528 - * Method handle_settings_post()
529 - *
530 - * Handle saving settings page.
531 - *
532 - * @uses \MainWP\Dashboard\MainWP_Backup_Handler::handle_settings_post()
533 - * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
534 - * @uses \MainWP\Dashboard\MainWP_DB_Common::update_user_extension()
535 - * @uses \MainWP\Dashboard\MainWP_Monitoring_Handler::handle_settings_post()
536 - * @uses \MainWP\Dashboard\MainWP_Settings::handle_settings_post()
537 - */
538 - public function handle_settings_post() { // phpcs:ignore -- NOSONAR - complex method.
556 + $this->upgradeVersionInfo->result[ $api_slug ] = $rslt;
557 + $transient->response[ $plugin_slug ] = self::map_rslt_obj( $rslt );
558 + $updated = true;
559 + }
560 + }
561 + }
562 + if ( $updated ) {
563 + MainWP_Utility::update_option( 'mainwp_upgradeVersionInfo', $this->upgradeVersionInfo );
564 + }
539 565
540 - if ( isset( $_GET['page'] ) && ( isset( $_POST['wp_nonce'] ) || isset( $_POST['wp_scr_options_nonce'] ) ) ) {
541 - $this->include_pluggable();
542 - $this->handle_mainwp_tools_settings();
543 - $this->handle_manage_sites_screen_settings();
544 - $this->handle_monitoring_sites_screen_settings();
545 - $this->handle_clients_screen_settings();
546 - $this->handle_updates_screen_settings();
547 - }
566 + return $transient;
567 + }
568 + }
548 569
549 - if ( isset( $_POST['select_mainwp_options_siteview'] ) ) {
550 - $this->include_pluggable();
551 - if ( check_admin_referer( 'mainwp-admin-nonce' ) ) {
552 - $userExtension = MainWP_DB_Common::instance()->get_user_extension();
553 - $userExtension->site_view = ( empty( $_POST['select_mainwp_options_siteview'] ) ? MAINWP_VIEW_PER_PLUGIN_THEME : intval( $_POST['select_mainwp_options_siteview'] ) );
554 - MainWP_DB_Common::instance()->update_user_extension( $userExtension );
555 - }
556 - }
570 + if ( empty( $transient->checked ) ) {
571 + return $transient;
572 + }
557 573
558 - if ( isset( $_POST['select_mainwp_options_plugintheme_view'] ) ) {
559 - $this->include_pluggable();
560 - if ( check_admin_referer( 'mainwp-admin-nonce' ) ) {
561 - $view_per = ( empty( $_POST['select_mainwp_options_plugintheme_view'] ) ? MAINWP_VIEW_PER_PLUGIN_THEME : intval( $_POST['select_mainwp_options_plugintheme_view'] ) );
562 - $which = isset( $_POST['whichview'] ) ? sanitize_text_field( wp_unslash( $_POST['whichview'] ) ) : '';
563 - if ( 'plugin' === $which ) {
564 - MainWP_Utility::update_user_option( 'mainwp_manage_plugin_view', $view_per );
565 - } else {
566 - MainWP_Utility::update_user_option( 'mainwp_manage_theme_view', $view_per );
567 - }
568 - }
569 - }
574 + if ( isset( $_GET['do'] ) && 'checkUpgrade' === $_GET['do'] && ( ( time() - $this->upgradeVersionInfo->updated ) > 30 ) ) {
575 + $this->check_upgrade();
576 + }
570 577
571 - if ( isset( $_POST['submit'] ) && isset( $_POST['wp_nonce'] ) ) {
572 - $this->include_pluggable();
573 - if ( wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'Settings' ) ) {
574 - $updated = MainWP_Settings::handle_settings_post();
575 - $updated |= MainWP_Backup_Handler::handle_settings_post();
576 - $updated |= MainWP_Monitoring_Handler::handle_settings_post();
577 - $msg = '';
578 - if ( $updated ) {
579 - $msg = '&message=saved';
580 - }
581 - wp_safe_redirect( admin_url( 'admin.php?page=Settings' . $msg ) );
582 - exit();
583 - }
584 - }
578 + if ( null != $this->upgradeVersionInfo && property_exists( $this->upgradeVersionInfo, 'result' ) && is_array( $this->upgradeVersionInfo->result ) ) {
579 + foreach ( $this->upgradeVersionInfo->result as $rslt ) {
580 + if ( ! isset( $rslt->slug ) ) {
581 + continue;
582 + }
585 583
586 - if ( isset( $_POST['mainwp_sidebar_position'] ) && isset( $_POST['wp_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['wp_nonce'] ), 'onchange_sidebarposition' ) ) {
587 - $val = isset( $_POST['mainwp_sidebar_position'] ) && ! empty( $_POST['mainwp_sidebar_position'] ) ? 1 : 0;
588 - $user = wp_get_current_user();
589 - if ( $user ) {
590 - update_user_option( $user->ID, 'mainwp_sidebarPosition', $val, true );
591 - }
592 - return true;
593 - }
584 + $plugin_slug = MainWP_Extensions_Handler::get_extension_slug( $rslt->slug );
585 + if ( isset( $transient->checked[ $plugin_slug ] ) && version_compare( $rslt->latest_version, $transient->checked[ $plugin_slug ], '>' ) ) {
586 + $transient->response[ $plugin_slug ] = self::map_rslt_obj( $rslt );
587 + }
588 + }
589 + }
594 590
595 - if ( isset( $_GET['viewmode'] ) && isset( $_GET['modenonce'] ) ) {
596 - $viewmode = sanitize_text_field( wp_unslash( $_GET['viewmode'] ) );
597 - $nonce = sanitize_key( $_GET['modenonce'] );
598 - if ( ( 'table' === $viewmode || 'grid' === $viewmode ) && wp_verify_nonce( sanitize_key( $nonce ), 'viewmode' ) ) {
599 - $user = wp_get_current_user();
600 - if ( $user ) {
601 - update_user_option( $user->ID, 'mainwp_sitesviewmode', $viewmode, true );
602 - wp_safe_redirect( admin_url( 'admin.php?page=managesites' ) );
603 - exit;
604 - }
605 - }
606 - }
607 - }
591 + return $transient;
592 + }
608 593
609 - /**
610 - * Method include_pluggable()
611 - *
612 - * Include pluggable functions.
613 - */
614 - public function include_pluggable() {
615 - // may causing of conflict with Post S m t p plugin.
616 - if ( ! function_exists( 'wp_create_nonce' ) ) {
617 - include_once ABSPATH . WPINC . '/pluggable.php'; // NOSONAR - WP compatible.
618 - }
619 - }
620 594
621 - /**
622 - * Method plugins_api_extension_info()
623 - *
624 - * Get MainWP Extension api information.
625 - *
626 - * @param mixed $input_value Return value.
627 - * @param mixed $action Action being performed.
628 - * @param mixed $arg Action arguments. Should be the plugin slug.
629 - *
630 - * @return mixed $info|$input_value
631 - *
632 - * @uses \MainWP\Dashboard\MainWP_API_Handler::get_update_information()
633 - * @uses \MainWP\Dashboard\MainWP_Extensions_View::get_available_extensions()
634 - * @uses \MainWP\Dashboard\MainWP_System::get_plugin_slug()
635 - * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_slugs()
636 - */
637 - public function plugins_api_extension_info( $input_value, $action, $arg ) { // phpcs:ignore -- NOSONAR - complex.
638 - if ( 'plugin_information' !== $action ) {
639 - return $input_value;
640 - }
595 + /**
596 + * Method map_rslt_obj()
597 + *
598 + * Map resulting object.
599 + *
600 + * @param object $result Resulting information.
601 + *
602 + * @return object $obj Mapped resulting object.
603 + */
604 + public static function map_rslt_obj( $result ) {
605 + $obj = new \stdClass();
606 + $obj->slug = $result->slug;
607 + $obj->new_version = $result->latest_version;
608 + $obj->url = 'https://mainwp.com/';
609 + $obj->package = $result->download_url;
641 610
642 - if ( is_array( $arg ) ) {
643 - $arg = (object) $arg;
644 - }
611 + return $obj;
612 + }
645 613
646 - if ( ! isset( $arg->slug ) || ( '' === $arg->slug ) ) {
647 - return $input_value;
648 - }
614 + /**
615 + * Method check_upgrade()
616 + *
617 + * Check if Extension has an update.
618 + *
619 + * @uses \MainWP\Dashboard\MainWP_API_Handler::check_exts_upgrade()
620 + * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
621 + */
622 + private function check_upgrade() {
623 + $result = MainWP_API_Handler::check_exts_upgrade();
624 + if ( null == $this->upgradeVersionInfo ) {
625 + $this->upgradeVersionInfo = new \stdClass();
626 + }
627 + $this->upgradeVersionInfo->updated = time();
628 + if ( ! empty( $result ) ) {
629 + $this->upgradeVersionInfo->result = $result;
630 + }
631 + MainWP_Utility::update_option( 'mainwp_upgradeVersionInfo', $this->upgradeVersionInfo );
632 + }
649 633
650 - if ( dirname( MainWP_System::instance()->get_plugin_slug() ) === $arg->slug ) {
651 - return $input_value;
652 - }
634 + /**
635 + * Method pre_check_update_custom()
636 + *
637 + * Pre-check for extension updates.
638 + *
639 + * @param object $transient Transient information.
640 + *
641 + * @return object $transient Transient information.
642 + *
643 + * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_indexed_extensions_infor()
644 + * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_extension_slug()
645 + */
646 + public function pre_check_update_custom( $transient ) {
647 + if ( ! isset( $transient->checked ) ) {
648 + return $transient;
649 + }
653 650
654 - $result = MainWP_Extensions_Handler::get_slugs();
655 - $am_slugs = $result['am_slugs'];
651 + if ( ( null == $this->upgradeVersionInfo ) || ! property_exists( $this->upgradeVersionInfo, 'updated' ) || ( ( time() - $this->upgradeVersionInfo->updated ) > 60 ) ) {
652 + $this->check_upgrade();
653 + }
656 654
657 - if ( '' !== $am_slugs ) {
658 - $am_slugs = explode( ',', $am_slugs );
659 - if ( false !== strpos( $arg->slug, '/' ) ) { // to fix.
660 - $dir_slug = dirname( $arg->slug );
661 - } else {
662 - $dir_slug = $arg->slug;
663 - }
664 - if ( in_array( $dir_slug, $am_slugs ) ) {
665 - $info = MainWP_API_Handler::get_update_information( $dir_slug );
666 - if ( is_object( $info ) && property_exists( $info, 'sections' ) ) {
667 - if ( ! is_array( $info->sections ) || ! isset( $info->sections['changelog'] ) || empty( $info->sections['changelog'] ) ) {
668 - $exts_data = MainWP_Extensions_View::get_available_extensions();
669 - if ( isset( $exts_data[ $arg->slug ] ) ) {
670 - $ext_info = $exts_data[ $arg->slug ];
671 - $changelog_link = rtrim( $ext_info['changelog_url'], '/' );
672 - $info->sections['changelog'] = '<a href="' . $changelog_link . '" target="_blank">' . $changelog_link . '</a>';
673 - }
674 - }
675 - return $info;
676 - }
677 - return $info;
678 - }
679 - }
655 + if ( empty( $transient->response ) ) {
656 + $transient->response = array();
657 + }
680 658
681 - return $input_value;
682 - }
659 + if ( null != $this->upgradeVersionInfo && property_exists( $this->upgradeVersionInfo, 'result' ) && is_array( $this->upgradeVersionInfo->result ) ) {
660 + $extensions = MainWP_Extensions_Handler::get_indexed_extensions_infor( array( 'activated' => true ) );
661 + foreach ( $this->upgradeVersionInfo->result as $rslt ) {
662 + $plugin_slug = MainWP_Extensions_Handler::get_extension_slug( $rslt->slug );
663 + if ( isset( $extensions[ $plugin_slug ] ) && version_compare( $rslt->latest_version, $extensions[ $plugin_slug ]['version'], '>' ) ) {
664 + $transient->response[ $plugin_slug ] = self::map_rslt_obj( $rslt );
665 + }
666 + }
667 + }
683 668
684 - /**
685 - * Method plugins_api_wp_plugins_api_result()
686 - *
687 - * Hook after get plugins api information.
688 - *
689 - * @param mixed $res api information value.
690 - * @param mixed $action Action being performed.
691 - * @param mixed $arg Action arguments. Should be the plugin slug.
692 - *
693 - * @return mixed $res
694 - */
695 - public function plugins_api_wp_plugins_api_result( $res, $action, $arg ) { // phpcs:ignore -- NOSONAR - complex.
669 + return $transient;
670 + }
696 671
697 - if ( 'plugin_information' !== $action ) {
698 - return $res;
699 - }
672 + /**
673 + * Method upload_file()
674 + *
675 + * Upload a file.
676 + *
677 + * @param mixed $file File to upload.
678 + *
679 + * @return void
680 + *
681 + * @uses \MainWP\Dashboard\MainWP_Utility::ends_with()
682 + */
683 + public function upload_file( $file ) {
684 + header( 'Content-Description: File Transfer' );
685 + if ( MainWP_Utility::ends_with( $file, '.tar.gz' ) ) {
686 + header( 'Content-Type: application/x-gzip' );
687 + header( 'Content-Encoding: gzip' );
688 + } else {
689 + header( 'Content-Type: application/octet-stream' );
690 + }
691 + header( 'Content-Disposition: attachment; filename="' . basename( $file ) . '"' );
692 + header( 'Expires: 0' );
693 + header( 'Cache-Control: must-revalidate' );
694 + header( 'Pragma: public' );
695 + header( 'Content-Length: ' . filesize( $file ) );
696 + while ( ob_get_level() ) {
697 + ob_end_clean();
698 + }
699 + $this->readfile_chunked( $file );
700 + exit();
701 + }
700 702
701 - if ( is_object( $res ) && property_exists( $res, 'slug' ) && property_exists( $res, 'sections' ) ) {
702 - return $res;
703 - }
703 + /**
704 + * Method readfile_chunked()
705 + *
706 + * Read Chunked File.
707 + *
708 + * @param mixed $filename Name of file.
709 + *
710 + * @return mixed echo $buffer|false|$handle.
711 + */
712 + public function readfile_chunked( $filename ) {
713 + $chunksize = 1024;
714 + $handle = fopen( $filename, 'rb' );
715 + if ( false === $handle ) {
716 + return false;
717 + }
704 718
705 - if ( ! isset( $_GET['wpplugin'] ) || ! is_numeric( $_GET['wpplugin'] ) || empty( $_GET['wpplugin'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
706 - return $res;
707 - }
719 + while ( ! feof( $handle ) ) {
720 + $buffer = fread( $handle, $chunksize );
721 + echo $buffer;
722 + if ( ob_get_length() ) {
723 + ob_flush();
724 + flush();
725 + }
726 + $buffer = null;
727 + }
708 728
709 - if ( is_array( $arg ) ) {
710 - $arg = (object) $arg;
711 - }
729 + return fclose( $handle );
730 + }
712 731
713 - if ( ! isset( $arg->slug ) || ( '' === $arg->slug ) ) {
714 - return $res;
715 - }
732 + /**
733 + * Method activate_redirection()
734 + *
735 + * Redirect after activating MainWP Extension.
736 + *
737 + * @param mixed $location Location to redirect to.
738 + *
739 + * @return $location Admin URL + the page to redirect to.
740 + */
741 + public function activate_redirect( $location ) {
742 + $location = admin_url( 'admin.php?page=Extensions' );
743 + return $location;
744 + }
716 745
717 - $site_id = intval( $_GET['wpplugin'] ); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
746 + /**
747 + * Method activate_extension()
748 + *
749 + * Activate MainWP Extension.
750 + *
751 + * @param mixed $ext_key Extension API Key.
752 + * @param array $info Extension Info.
753 + *
754 + * @uses \MainWP\Dashboard\MainWP_Api_Manager::set_activation_info()
755 + * @uses \MainWP\Dashboard\MainWP_Api_Manager_Password_Management::generate_password()
756 + */
757 + public function activate_extension( $ext_key, $info = array() ) {
718 758
719 - if ( $site_id ) {
720 - $website = MainWP_DB::instance()->get_website_by_id( $site_id );
721 - if ( $website && ! empty( $website->plugin_upgrades ) ) {
722 - $plugin_upgrades = json_decode( $website->plugin_upgrades, true );
759 + add_filter( 'wp_redirect', array( $this, 'activate_redirect' ) );
723 760
724 - if ( is_array( $plugin_upgrades ) ) {
725 - $found_update = false;
726 - $empty_sections = false;
727 - foreach ( $plugin_upgrades as $plugin_slug => $info ) {
728 - if ( false !== strpos( $plugin_slug, $arg->slug ) && isset( $info['update'] ) ) {
729 - $found_update = true;
730 - if ( isset( $info['update']['slug'] ) && $arg->slug === $info['update']['slug'] && isset( $info['update']['new_version'] ) && ! empty( $info['update']['new_version'] ) && isset( $info['update']['sections'] ) && ! empty( $info['update']['sections'] ) ) {
731 - $info_update = (object) $info['update'];
732 - $info_update->external = false;
733 - return $info_update;
734 - }
735 - $empty_sections = true;
736 - break;
737 - }
738 - }
761 + if ( is_array( $info ) && isset( $info['product_id'] ) && isset( $info['software_version'] ) ) {
762 + $act_info = array(
763 + 'product_id' => $info['product_id'],
764 + 'software_version' => $info['software_version'],
765 + 'activated_key' => 'Deactivated',
766 + 'instance_id' => MainWP_Api_Manager_Password_Management::generate_password( 12, false ),
767 + );
768 + MainWP_Api_Manager::instance()->set_activation_info( $ext_key, $act_info );
769 + }
770 + }
739 771
740 - if ( $found_update && $empty_sections ) {
741 - try {
742 - $info = MainWP_Connect::fetch_url_authed(
743 - $website,
744 - 'plugin_action',
745 - array(
746 - 'action' => 'changelog_info', // try to get changelog from the child site.
747 - 'slug' => $arg->slug,
748 - )
749 - );
750 - if ( is_array( $info ) && isset( $info['update'] ) && ! empty( $info['update']['sections'] ) ) {
751 - $info_update = (object) $info['update'];
752 - $info_update->external = true;
753 - return $info_update;
754 - }
755 - } catch ( \Exception $e ) {
756 - // error happen.
757 - }
758 - }
759 - }
760 - }
761 - }
772 + /**
773 + * Method deactivate_extension()
774 + *
775 + * Deactivate MaiNWP Extension.
776 + *
777 + * @param mixed $ext_key Exnension API Key.
778 + *
779 + * @uses \MainWP\Dashboard\MainWP_Api_Manager::set_activation_info()
780 + */
781 + public function deactivate_extension( $ext_key ) {
782 + MainWP_Api_Manager::instance()->set_activation_info( $ext_key, '' );
783 + }
762 784
763 - return $res;
764 - }
765 -
766 - /**
767 - * Method check_update_custom()
768 - *
769 - * Check MainWP Extensions for updates.
770 - *
771 - * @param object $transient Transient information.
772 - *
773 - * @return object $transient Transient information.
774 - *
775 - * @uses \MainWP\Dashboard\MainWP_API_Handler::get_upgrade_information()
776 - * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_indexed_extensions_infor()
777 - * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_extension_slug()
778 - * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
779 - */
780 - public function check_update_custom( $transient ) { // phpcs:ignore -- NOSONAR -Current complexity is the only way to achieve desired results, pull request solutions appreciated.
781 - if ( isset( $_POST['action'] ) && ( ( 'update-plugin' === $_POST['action'] ) || ( 'update-selected' === $_POST['action'] ) ) && is_object( $transient ) && property_exists( $transient, 'response' ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
782 - $extensions = MainWP_Extensions_Handler::get_indexed_extensions_infor( array( 'activated' => true ) );
783 - if ( defined( 'DOING_AJAX' ) && isset( $_POST['plugin'] ) && 'update-plugin' === $_POST['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
784 -
785 - if ( empty( $transient->response ) ) {
786 - $transient->response = array();
787 - }
788 -
789 - $plugin_slug = sanitize_text_field( wp_unslash( $_POST['plugin'] ) ); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
790 - if ( isset( $extensions[ $plugin_slug ] ) ) {
791 -
792 - if ( ! isset( $transient->response[ $plugin_slug ] ) || ! is_object( $transient->response[ $plugin_slug ] ) || ! property_exists( $transient->response[ $plugin_slug ], 'new_version' ) ) {
793 - return $transient;
794 - }
795 -
796 - if ( isset( $transient->response[ $plugin_slug ] ) && version_compare( $transient->response[ $plugin_slug ]->new_version, $extensions[ $plugin_slug ]['version'], '=' ) ) {
797 - return $transient;
798 - }
799 -
800 - $api_slug = dirname( $plugin_slug );
801 - $rslt = MainWP_API_Handler::get_upgrade_information( $api_slug );
802 -
803 - if ( ! empty( $rslt ) && is_object( $rslt ) && property_exists( $rslt, 'new_version' ) && ! empty( $rslt->new_version ) && version_compare( $rslt->new_version, $extensions[ $plugin_slug ]['version'], '>' ) ) {
804 - $transient->response[ $plugin_slug ] = static::map_rslt_obj( $rslt );
805 - }
806 -
807 - return $transient;
808 - }
809 - } elseif ( 'update-selected' === $_POST['action'] && isset( $_POST['checked'] ) && is_array( $_POST['checked'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
810 -
811 - if ( empty( $transient->response ) ) {
812 - $transient->response = array();
813 - }
814 -
815 - $updated = false;
816 - foreach ( wp_unslash( $_POST['checked'] ) as $plugin_slug ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
817 - if ( isset( $extensions[ $plugin_slug ] ) ) {
818 -
819 - if ( ! isset( $transient->response[ $plugin_slug ] ) ) {
820 - $transient->response[ $plugin_slug ] = new \stdClass();
821 - }
822 -
823 - if ( isset( $transient->response[ $plugin_slug ] ) && version_compare( $transient->response[ $plugin_slug ]->new_version, $extensions[ $plugin_slug ]['version'], '=' ) ) {
824 - continue;
825 - }
826 - $api_slug = dirname( $plugin_slug );
827 - $rslt = MainWP_API_Handler::get_upgrade_information( $api_slug );
828 - if ( ! empty( $rslt ) && is_object( $rslt ) && property_exists( $rslt, 'new_version' ) && ! empty( $rslt->new_version ) && version_compare( $rslt->new_version, $extensions[ $plugin_slug ]['version'], '>' ) ) {
829 - $this->upgradeVersionInfo->result[ $api_slug ] = $rslt;
830 - $transient->response[ $plugin_slug ] = static::map_rslt_obj( $rslt );
831 - $updated = true;
832 - }
833 - }
834 - }
835 - if ( $updated ) {
836 - MainWP_Utility::update_option( 'mainwp_upgradeVersionInfo', $this->upgradeVersionInfo );
837 - }
838 -
839 - return $transient;
840 - }
841 - }
842 -
843 - if ( empty( $transient->checked ) ) {
844 - return $transient;
845 - }
846 -
847 - if ( ! empty( $this->upgradeVersionInfo ) && property_exists( $this->upgradeVersionInfo, 'result' ) && is_array( $this->upgradeVersionInfo->result ) ) {
848 - foreach ( $this->upgradeVersionInfo->result as $rslt ) {
849 - if ( ! isset( $rslt->slug ) ) {
850 - continue;
851 - }
852 -
853 - $plugin_slug = MainWP_Extensions_Handler::get_extension_slug( $rslt->slug );
854 - if ( isset( $transient->checked[ $plugin_slug ] ) && property_exists( $rslt, 'new_version' ) && ! empty( $rslt->new_version ) && version_compare( $rslt->new_version, $transient->checked[ $plugin_slug ], '>' ) ) {
855 - $transient->response[ $plugin_slug ] = static::map_rslt_obj( $rslt );
856 - }
857 - }
858 - }
859 -
860 - return $transient;
861 - }
862 -
863 -
864 - /**
865 - * Method map_rslt_obj()
866 - *
867 - * Map resulting object.
868 - *
869 - * @param object $result Resulting information.
870 - *
871 - * @return object $obj Mapped resulting object.
872 - */
873 - public static function map_rslt_obj( $result ) {
874 - $obj = new \stdClass();
875 - $obj->slug = $result->slug;
876 - $obj->new_version = $result->new_version;
877 - $obj->url = 'https://mainwp.com/';
878 - $obj->package = $result->package;
879 -
880 - return $obj;
881 - }
882 -
883 - /**
884 - * Method check_upgrade()
885 - *
886 - * Check if Extension has an update.
887 - *
888 - * @uses \MainWP\Dashboard\MainWP_API_Handler::check_exts_upgrade()
889 - * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
890 - */
891 - private function check_upgrade() {
892 - $result = MainWP_API_Handler::check_exts_upgrade();
893 - if ( null === $this->upgradeVersionInfo ) {
894 - $this->upgradeVersionInfo = new \stdClass();
895 - }
896 - $this->upgradeVersionInfo->updated = time();
897 - if ( ! empty( $result ) ) {
898 - $this->upgradeVersionInfo->result = $result;
899 - }
900 - MainWP_Utility::update_option( 'mainwp_upgradeVersionInfo', $this->upgradeVersionInfo );
901 - }
902 -
903 - /**
904 - * Method pre_check_update_custom()
905 - *
906 - * Pre-check for extension updates.
907 - *
908 - * @param object $transient Transient information.
909 - *
910 - * @return object $transient Transient information.
911 - *
912 - * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_indexed_extensions_infor()
913 - * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_extension_slug()
914 - */
915 - public function pre_check_update_custom( $transient ) {
916 - if ( ! isset( $transient->checked ) ) {
917 - return $transient;
918 - }
919 -
920 - if ( ( null === $this->upgradeVersionInfo ) || ! property_exists( $this->upgradeVersionInfo, 'updated' ) || ( ( time() - $this->upgradeVersionInfo->updated ) > 60 ) ) {
921 - $this->check_upgrade();
922 - }
923 -
924 - if ( empty( $transient->response ) ) {
925 - $transient->response = array();
926 - }
927 -
928 - if ( ! empty( $this->upgradeVersionInfo ) && property_exists( $this->upgradeVersionInfo, 'result' ) && is_array( $this->upgradeVersionInfo->result ) ) {
929 - $extensions = MainWP_Extensions_Handler::get_indexed_extensions_infor( array( 'activated' => true ) );
930 - foreach ( $this->upgradeVersionInfo->result as $rslt ) {
931 - $plugin_slug = MainWP_Extensions_Handler::get_extension_slug( $rslt->slug );
932 - if ( isset( $extensions[ $plugin_slug ] ) && property_exists( $rslt, 'new_version' ) && ! empty( $rslt->new_version ) && version_compare( $rslt->new_version, $extensions[ $plugin_slug ]['version'], '>' ) ) {
933 - $transient->response[ $plugin_slug ] = static::map_rslt_obj( $rslt );
934 - }
935 - }
936 - }
937 -
938 - return $transient;
939 - }
940 -
941 - /**
942 - * Method upload_file()
943 - *
944 - * Upload a file.
945 - *
946 - * @param mixed $file File to upload.
947 - *
948 - * @return void
949 - *
950 - * @uses \MainWP\Dashboard\MainWP_Utility::ends_with()
951 - */
952 - public function upload_file( $file ) {
953 - header( 'Content-Description: File Transfer' );
954 - $dwl_fname = basename( $file );
955 - if ( 'tar.gz' === $dwl_fname || '.tar.gz' === $dwl_fname ) {
956 - $dwl_fname = 'noname.tar.gz'; // to fix name of zip file.
957 - }
958 - header( 'Content-Type: application/octet-stream' );
959 - header( 'Content-Disposition: attachment; filename="' . $dwl_fname . '"' );
960 - header( 'Expires: 0' );
961 - header( 'Cache-Control: must-revalidate' );
962 - header( 'Pragma: public' );
963 - header( 'Content-Length: ' . filesize( $file ) );
964 - while ( ob_get_level() ) {
965 - ob_end_clean();
966 - }
967 - $this->readfile_chunked( $file );
968 - exit();
969 - }
970 -
971 - /**
972 - * Method readfile_chunked()
973 - *
974 - * Read Chunked File.
975 - *
976 - * @param mixed $filename Name of file.
977 - *
978 - * @return mixed echo $buffer|false|$handle.
979 - */
980 - public function readfile_chunked( $filename ) {
981 - $chunksize = 1024;
982 - $handle = fopen( $filename, 'rb' );
983 - if ( false === $handle ) {
984 - return false;
985 - }
986 -
987 - while ( ! feof( $handle ) ) {
988 - $buffer = fread( $handle, $chunksize );
989 - echo $buffer; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
990 - if ( ob_get_length() ) {
991 - ob_flush();
992 - flush();
993 - }
994 - $buffer = null;
995 - }
996 -
997 - return fclose( $handle );
998 - }
999 -
1000 - /**
1001 - * Method activate_redirection()
1002 - *
1003 - * Redirect after activating MainWP Extension.
1004 - *
1005 - * @param mixed $location Location to redirect to.
1006 - *
1007 - * @return $location Admin URL + the page to redirect to.
1008 - */
1009 - public function activate_redirect( $location ) {
1010 - unset( $location );
1011 - return admin_url( 'admin.php?page=Extensions' );
1012 - }
1013 -
1014 - /**
1015 - * Method activate_extension()
1016 - *
1017 - * Activate MainWP Extension.
1018 - *
1019 - * @param mixed $ext_key Extension API Key.
1020 - * @param array $info Extension Info.
1021 - *
1022 - * @uses \MainWP\Dashboard\MainWP_Api_Manager::set_activation_info()
1023 - * @uses \MainWP\Dashboard\MainWP_Api_Manager_Password_Management::generate_password()
1024 - */
1025 - public function activate_extension( $ext_key, $info = array() ) {
1026 -
1027 - add_filter( 'wp_redirect', array( $this, 'activate_redirect' ) );
1028 -
1029 - if ( is_array( $info ) && isset( $info['product_id'] ) && isset( $info['software_version'] ) ) {
1030 - $act_info = array(
1031 - 'product_id' => $info['product_id'],
1032 - 'software_version' => $info['software_version'],
1033 - 'activated_key' => 'Deactivated',
1034 - 'instance_id' => MainWP_Api_Manager_Password_Management::generate_password( 12, false ),
1035 - );
1036 - MainWP_Api_Manager::instance()->set_activation_info( $ext_key, $act_info );
1037 - }
1038 - }
1039 -
1040 - /**
1041 - * Method deactivate_extension()
1042 - *
1043 - * Deactivate MaiNWP Extension.
1044 - *
1045 - * @param mixed $ext_key Exnension API Key.
1046 - * @param bool $dashboard_only Deactive API Key on dashboard only.
1047 - *
1048 - * @uses \MainWP\Dashboard\MainWP_Api_Manager::set_activation_info()
1049 - */
1050 - public function deactivate_extension( $ext_key, $dashboard_only = false ) {
1051 - // try to deactivate license.
1052 - if ( ! $dashboard_only ) {
1053 - $mainwp_api_key = MainWP_Api_Manager_Key::instance()->get_decrypt_master_api_key();
1054 - MainWP_Api_Manager::instance()->license_key_deactivation( $ext_key, $mainwp_api_key );
1055 - }
1056 -
1057 - MainWP_Api_Manager::instance()->remove_activation_info( $ext_key );
1058 - }
1059 785 }