PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 6.1.1
MainWP Dashboard: Self-hosted WordPress Management for Agencies v6.1.1
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
mainwp / pages / page-mainwp-plugins-handler.php

page-mainwp-plugins-handler.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies 6.1.1, at pages/page-mainwp-plugins-handler.php

372 lines 14.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * MainWP Plugins Page Handler.
4 *
5 * @package MainWP/Dashboard
6 */
7
8 namespace MainWP\Dashboard;
9
10 // Exit if accessed directly.
11 if ( ! defined( 'ABSPATH' ) ) {
12 exit;
13 }
14
15 /**
16 * Class MainWP MainWP_Plugins_Handler
17 *
18 * @uses MainWP_Install_Bulk()
19 */
20 class MainWP_Plugins_Handler { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
21 // phpcs:disable Generic.Metrics.CyclomaticComplexity -- This is the only way to achieve desired results, pull request solutions appreciated.
22
23 /**
24 * Get Class Name.
25 *
26 * @return string __CLASS__
27 */
28 public static function get_class_name() {
29 return __CLASS__;
30 }
31
32 /**
33 * Plugins Search Handler.
34 *
35 * @param mixed $data Search Data.
36 * @param object $website Child Sites.
37 * @param mixed $output Output.
38 *
39 * @return mixed error|array.
40 *
41 * @uses \MainWP\Dashboard\MainWP_Error_Helper::get_error_message()
42 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_child_response()
43 * @uses \MainWP\Dashboard\MainWP_Exception
44 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_child_response()
45 */
46 public static function plugins_search_handler( $data, $website, &$output ) { // phpcs:ignore -- NOSONAR - complex.
47 if ( MainWP_Demo_Handle::get_instance()->is_demo_website( $website ) ) {
48 return;
49 }
50 if ( 0 < preg_match( '/<mainwp>(.*)<\/mainwp>/', $data, $results ) ) {
51 $result = $results[1];
52 $result_data = MainWP_System_Utility::get_child_response( base64_decode( $result ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode used for http encoding compatible.
53 unset( $results );
54 if ( isset( $result_data['error'] ) ) {
55 $output->errors[ $website->id ] = MainWP_Error_Helper::get_error_message( new MainWP_Exception( $result_data['error'], $website->url ) ); //phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped
56 return;
57 }
58
59 $plugins = isset( $result_data['data'] ) && is_array( $result_data['data'] ) ? $result_data['data'] : array();
60
61 $not_found = true;
62
63 foreach ( $plugins as $plugin ) {
64 if ( ! isset( $plugin['name'] ) ) {
65 continue;
66 }
67 $plugin['websiteid'] = $website->id;
68 $plugin['websiteurl'] = $website->url;
69 $plugin['websitename'] = $website->name;
70 $plugin['site_info'] = $website->site_info;
71
72 $output->plugins[] = $plugin;
73 $not_found = false;
74 }
75
76 if ( 'not_installed' === $output->status && $not_found ) {
77 $installed = isset( $result_data['installed_plugins'] ) && is_array( $result_data['installed_plugins'] ) ? $result_data['installed_plugins'] : array();
78 foreach ( $installed as $plugin ) {
79 if ( ! isset( $plugin['name'] ) ) {
80 continue;
81 }
82 $plugin['websiteid'] = $website->id;
83 $plugin['websiteurl'] = $website->url;
84 $plugin['websitename'] = $website->name;
85 $plugin['site_info'] = $website->site_info;
86 $output->plugins_installed[] = $plugin;
87 }
88 }
89
90 if ( ! empty( $website->rollback_updates_data ) ) {
91 $output->roll_items[ $website->id ] = MainWP_Updates_Helper::get_roll_update_plugintheme_items( 'plugin', $website->rollback_updates_data );
92 }
93
94 unset( $plugins );
95 } else {
96 $output->errors[ $website->id ] = MainWP_Error_Helper::get_error_message( new MainWP_Exception( 'NOMAINWP', $website->url ) );
97 }
98 }
99
100 /** Activate Plugin. */
101 public static function activate_plugins() {
102 static::action( 'activate' );
103 }
104
105 /** Deactivate Plugin */
106 public static function deactivate_plugins() {
107 static::action( 'deactivate' );
108 }
109
110 /** Delete Plugin. */
111 public static function delete_plugins() {
112 static::action( 'delete' );
113 }
114
115 /**
116 * Ignore Plugin.
117 *
118 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
119 * @uses \MainWP\Dashboard\MainWP_DB::update_website_values()
120 * @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
121 */
122 public static function ignore_updates() {
123 // phpcs:disable WordPress.Security.NonceVerification
124 $websiteId = isset( $_POST['websiteId'] ) ? intval( $_POST['websiteId'] ) : false;
125
126 if ( empty( $websiteId ) ) {
127 die( wp_json_encode( array( 'error' => esc_html__( 'Site ID not found. Please reload the page and try again.', 'mainwp' ) ) ) );
128 }
129
130 $website = MainWP_DB::instance()->get_website_by_id( $websiteId );
131
132 if ( ! MainWP_System_Utility::can_edit_website( $website ) ) {
133 die( wp_json_encode( array( 'error' => esc_html__( 'You are not allowed to edit this website.', 'mainwp' ) ) ) );
134 }
135
136 $plugins = isset( $_POST['plugins'] ) ? wp_unslash( $_POST['plugins'] ) : false; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
137 $names = isset( $_POST['names'] ) ? wp_unslash( $_POST['names'] ) : array(); //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
138 // phpcs:enable
139
140 $decodedIgnoredPlugins = json_decode( $website->ignored_plugins, true );
141
142 if ( ! is_array( $decodedIgnoredPlugins ) ) {
143 $decodedIgnoredPlugins = array();
144 }
145
146 if ( is_array( $plugins ) ) {
147 $_count = count( $plugins );
148 for ( $i = 0; $i < $_count; $i++ ) {
149 $slug = $plugins[ $i ];
150 $name = $names[ $i ];
151 if ( ! isset( $decodedIgnoredPlugins[ $slug ] ) ) {
152 $decodedIgnoredPlugins[ $slug ] = array( 'name' => urldecode( $name ) );
153 }
154 }
155
156 /**
157 * Action: mainwp_before_plugin_ignore
158 *
159 * Fires before plugin ignore.
160 *
161 * @since 4.1
162 */
163 do_action( 'mainwp_before_plugin_ignore', $decodedIgnoredPlugins, $website );
164
165 MainWP_DB::instance()->update_website_values( $website->id, array( 'ignored_plugins' => wp_json_encode( $decodedIgnoredPlugins ) ) );
166
167 /**
168 * Action: mainwp_after_plugin_ignore
169 *
170 * Fires after plugin ignore.
171 *
172 * @since 4.1
173 */
174 do_action( 'mainwp_after_plugin_ignore', $decodedIgnoredPlugins, $website );
175
176 }
177
178 die( wp_json_encode( array( 'result' => true ) ) );
179 }
180
181 /**
182 * Plugin Action handler.
183 *
184 * @param mixed $pAction activate|deactivate|delete.
185 *
186 * @return mixed error|true
187 *
188 * @uses \MainWP\Dashboard\MainWP_Connect::fetch_url_authed()
189 * @uses \MainWP\Dashboard\MainWP_Error_Helper::get_error_message()
190 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
191 * @uses \MainWP\Dashboard\MainWP_Exception
192 * @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
193 */
194 public static function action( $pAction ) {
195 // phpcs:disable WordPress.Security.NonceVerification
196 $websiteId = isset( $_POST['websiteId'] ) ? intval( $_POST['websiteId'] ) : false;
197
198 if ( empty( $websiteId ) ) {
199 die( wp_json_encode( array( 'error' => esc_html__( 'Site ID not found. Please reload the page and try again.', 'mainwp' ) ) ) );
200 }
201
202 $website = MainWP_DB::instance()->get_website_by_id( $websiteId );
203
204 if ( ! MainWP_System_Utility::can_edit_website( $website ) ) {
205 die( wp_json_encode( array( 'error' => esc_html__( 'You are not allowed to edit this website.', 'mainwp' ) ) ) );
206 }
207
208 if ( MainWP_System_Utility::is_suspended_site( $website ) ) {
209 die(
210 wp_json_encode(
211 array(
212 'error' => esc_html__( 'Suspended site.', 'mainwp' ),
213 'errorCode' => 'SUSPENDED_SITE',
214 )
215 )
216 );
217 }
218
219 try {
220 $plugins = isset( $_POST['plugins'] ) ? wp_unslash( $_POST['plugins'] ) : array(); //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
221 $plugin = implode( '||', $plugins );
222 $plugin = urldecode( $plugin );
223
224 /**
225 * Action: mainwp_before_plugin_action
226 *
227 * Fires before plugin activate/deactivate/delete actions.
228 *
229 * @since 4.1
230 */
231 do_action( 'mainwp_before_plugin_action', $pAction, $plugin, $website );
232
233 $information = MainWP_Connect::fetch_url_authed(
234 $website,
235 'plugin_action',
236 array(
237 'action' => $pAction,
238 'plugin' => $plugin,
239 )
240 );
241
242 /**
243 * Action: mainwp_after_plugin_action
244 *
245 * Fires after plugin activate/deactivate/delete actions.
246 *
247 * @since 4.1
248 */
249 do_action( 'mainwp_after_plugin_action', $information, $pAction, $plugin, $website );
250
251 } catch ( MainWP_Exception $e ) {
252 die( wp_json_encode( array( 'error' => MainWP_Error_Helper::get_error_message( $e ) ) ) );
253 }
254
255 // phpcs:enable
256
257 if ( ! isset( $information['status'] ) || ( 'SUCCESS' !== $information['status'] ) ) {
258 die( wp_json_encode( array( 'error' => esc_html__( 'Unexpected error. Please try again.', 'mainwp' ) ) ) );
259 }
260
261 die( wp_json_encode( array( 'result' => true ) ) );
262 }
263
264 /**
265 * Trust Plugin $_POST.
266 *
267 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
268 * @uses \MainWP\Dashboard\MainWP_DB_Common::update_user_extension()
269 */
270 public static function trust_post() { // phpcs:ignore -- NOSONAR - complex.
271 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
272 $trustedPlugins = json_decode( $userExtension->trusted_plugins, true );
273 if ( ! is_array( $trustedPlugins ) ) {
274 $trustedPlugins = array();
275 }
276 // phpcs:disable WordPress.Security.NonceVerification
277 $action = isset( $_POST['do'] ) ? sanitize_text_field( wp_unslash( $_POST['do'] ) ) : '';
278 $slugs = isset( $_POST['slugs'] ) && is_array( $_POST['slugs'] ) ? wp_unslash( $_POST['slugs'] ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
279 // phpcs:enable
280 if ( ! is_array( $slugs ) ) {
281 return;
282 }
283 if ( 'trust' !== $action && 'untrust' !== $action ) {
284 return;
285 }
286 if ( 'trust' === $action ) {
287 foreach ( $slugs as $slug ) {
288 $idx = array_search( urldecode( $slug ), $trustedPlugins );
289 if ( false === $idx ) {
290 $trustedPlugins[] = urldecode( $slug );
291 }
292 }
293 } elseif ( 'untrust' === $action ) {
294 foreach ( $slugs as $slug ) {
295 if ( in_array( urldecode( $slug ), $trustedPlugins ) ) {
296 $trustedPlugins = array_diff( $trustedPlugins, array( urldecode( $slug ) ) );
297 }
298 }
299 }
300 $userExtension->trusted_plugins = wp_json_encode( $trustedPlugins );
301 MainWP_DB_Common::instance()->update_user_extension( $userExtension );
302 }
303
304 /**
305 * Update Trusted Plugin list.
306 *
307 * @param mixed $slug Plugin Slug.
308 *
309 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
310 * @uses \MainWP\Dashboard\MainWP_DB_Common::update_user_extension()
311 */
312 public static function trust_plugin( $slug ) {
313 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
314 $trustedPlugins = json_decode( $userExtension->trusted_plugins, true );
315 if ( ! is_array( $trustedPlugins ) ) {
316 $trustedPlugins = array();
317 }
318 $idx = array_search( urldecode( $slug ), $trustedPlugins );
319 if ( false === $idx ) {
320 $trustedPlugins[] = urldecode( $slug );
321 }
322 $userExtension->trusted_plugins = wp_json_encode( $trustedPlugins );
323 MainWP_DB_Common::instance()->update_user_extension( $userExtension );
324 }
325
326 /**
327 * Check if automatic daily updates is on and
328 * the plugin is on the trusted list.
329 *
330 * @param mixed $slug Plugin Slug.
331 *
332 * @return boolean true|false.
333 *
334 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
335 * @uses \MainWP\Dashboard\MainWP_DB_Common::update_user_extension()
336 */
337 public static function check_auto_update_plugin( $slug ) {
338 if ( 1 !== (int) get_option( 'mainwp_pluginAutomaticDailyUpdate' ) ) {
339 return false;
340 }
341 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
342 $trustedPlugins = json_decode( $userExtension->trusted_plugins, true );
343 if ( is_array( $trustedPlugins ) && in_array( $slug, $trustedPlugins ) ) {
344 return true;
345 }
346 return false;
347 }
348
349 /**
350 *
351 * Save the trusted plugin note.
352 *
353 * @return string Escaped note.
354 */
355 public static function save_trusted_plugin_note() {
356 // phpcs:disable WordPress.Security.NonceVerification
357 $slug = isset( $_POST['slug'] ) ? urldecode( wp_unslash( $_POST['slug'] ) ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
358 $note = isset( $_POST['note'] ) ? wp_unslash( $_POST['note'] ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
359 // phpcs:enable
360 $esc_note = MainWP_Utility::esc_content( $note );
361 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
362 $trustedPluginsNotes = json_decode( $userExtension->trusted_plugins_notes, true );
363 if ( ! is_array( $trustedPluginsNotes ) ) {
364 $trustedPluginsNotes = array();
365 }
366 $trustedPluginsNotes[ $slug ] = $esc_note;
367 $userExtension->trusted_plugins_notes = wp_json_encode( $trustedPluginsNotes );
368 MainWP_DB_Common::instance()->update_user_extension( $userExtension );
369 return $esc_note;
370 }
371 }
372