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

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