PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 5.1
MainWP Dashboard: Self-hosted WordPress Management for Agencies v5.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 5.1, at pages/page-mainwp-plugins-handler.php

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