PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 5.3
MainWP Dashboard: Self-hosted WordPress Management for Agencies v5.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 / class / class-mainwp-post-extension-handler.php

class-mainwp-post-extension-handler.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies 5.3, at class/class-mainwp-post-extension-handler.php

434 lines 18.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * This class extends the MainWP Post Base Handler class
4 * to add support for MainWP Extensions.
5 *
6 * @package MainWP/Dashboard
7 */
8
9 namespace MainWP\Dashboard;
10
11 /**
12 * Class MainWP_Post_Extension_Handler
13 *
14 * @package MainWP\Dashboard
15 *
16 * @uses \MainWP\Dashboard\MainWP_Post_Base_Handler
17 */
18 class MainWP_Post_Extension_Handler extends MainWP_Post_Base_Handler { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
19
20 /**
21 * Public static varibale to hold the instance.
22 *
23 * @var null Default value.
24 */
25 private static $instance = null;
26
27 /**
28 * Method instance()
29 *
30 * Create public static instance.
31 *
32 * @return self $instance.
33 */
34 public static function instance() {
35 if ( null === static::$instance ) {
36 static::$instance = new self();
37 }
38 return static::$instance;
39 }
40
41 /**
42 * Init extensions actions
43 *
44 * @uses \MainWP\Dashboard\MainWP_Extensions::get_class_name()
45 */
46 public function init() {
47
48 $this->add_action( 'mainwp_extension_add_menu', array( &$this, 'add_extension_menu' ) );
49 $this->add_action( 'mainwp_extension_remove_menu', array( &$this, 'remove_extension_menu_from_mainwp_menu' ) );
50
51 $this->add_action( 'mainwp_extension_api_activate', array( &$this, 'activate_api_extension' ) );
52 $this->add_action( 'mainwp_extension_deactivate', array( &$this, 'deactivate_extension' ) );
53 $this->add_action( 'mainwp_extension_testextensionapilogin', array( &$this, 'test_extensions_api_login' ) );
54
55 $this->add_action( 'mainwp_extension_plugin_action', array( &$this, 'ajax_extension_plugin_action' ) );
56
57 if ( \mainwp_current_user_can( 'dashboard', 'bulk_install_and_activate_extensions' ) ) {
58 $this->add_action( 'mainwp_extension_grabapikey', array( &$this, 'grab_extension_api_key' ) );
59 $this->add_action( 'mainwp_extension_saveextensionapilogin', array( &$this, 'save_extensions_api_login' ) );
60 $this->add_action( 'mainwp_extension_getpurchased', array( MainWP_Extensions::get_class_name(), 'ajax_get_purchased_extensions' ) );
61 $this->add_action( 'mainwp_extension_downloadandinstall', array( &$this, 'download_and_install' ) );
62 $this->add_action( 'mainwp_extension_bulk_activate', array( &$this, 'bulk_activate' ) );
63 $this->add_action( 'mainwp_extension_apisslverifycertificate', array( &$this, 'save_api_ssl_verify' ) );
64 }
65
66 // Page: ManageSites.
67 $this->add_action( 'mainwp_ext_applypluginsettings', array( &$this, 'mainwp_ext_applypluginsettings' ) );
68 }
69
70 /**
71 * Apply plugin settings.
72 *
73 * @return mixed success|error.
74 *
75 * @uses \MainWP\Dashboard\MainWP_Manage_Sites_Handler::apply_plugin_settings()
76 */
77 public function mainwp_ext_applypluginsettings() {
78 $this->check_security( 'mainwp_ext_applypluginsettings' );
79 MainWP_Manage_Sites_Handler::apply_plugin_settings();
80 }
81
82 /**
83 * Ajax add extension menu.
84 *
85 * @return void
86 *
87 * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::add_extension_menu()
88 */
89 public function add_extension_menu() {
90 $this->check_security( 'mainwp_extension_add_menu' );
91 $slug = isset( $_POST['slug'] ) ? wp_unslash( $_POST['slug'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
92 MainWP_Extensions_Handler::add_extension_menu( $slug );
93 die( wp_json_encode( array( 'result' => 'SUCCESS' ) ) );
94 }
95
96 /**
97 * Activate MainWP Extension.
98 *
99 * @return void
100 *
101 * @uses \MainWP\Dashboard\MainWP_Api_Manager::license_key_activation()
102 * @uses \MainWP\Dashboard\MainWP_Deprecated_Hooks::maybe_handle_deprecated_hook()
103 */
104 public function activate_api_extension() {
105 $this->check_security( 'mainwp_extension_api_activate' );
106 MainWP_Deprecated_Hooks::maybe_handle_deprecated_hook();
107 $api_slug = isset( $_POST['slug'] ) ? dirname( wp_unslash( $_POST['slug'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
108 $api_key = isset( $_POST['key'] ) ? sanitize_text_field( wp_unslash( $_POST['key'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
109 $result = MainWP_Api_Manager::instance()->license_key_activation( $api_slug, $api_key );
110 wp_send_json( $result );
111 }
112
113
114 /**
115 * Handle MainWP Extension plugin actions.
116 *
117 * @return void
118 */
119 public function ajax_extension_plugin_action() {
120 $this->check_security( 'mainwp_extension_plugin_action' );
121 $plugin_slug = isset( $_POST['slug'] ) ? sanitize_text_field( wp_unslash( $_POST['slug'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
122 $action = isset( $_POST['what'] ) ? sanitize_text_field( wp_unslash( $_POST['what'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
123 if ( ! empty( $plugin_slug ) && in_array( $action, array( 'active', 'disable', 'remove' ) ) ) {
124 if ( 'disable' === $action ) {
125 if ( is_plugin_active( $plugin_slug ) ) {
126 deactivate_plugins( $plugin_slug, false );
127 }
128 wp_send_json( array( 'result' => 'SUCCESS' ) );
129 } elseif ( 'active' === $action ) {
130 if ( ! is_plugin_active( $plugin_slug ) ) {
131 activate_plugin( $plugin_slug, '', false, false );
132 }
133 wp_send_json( array( 'result' => 'SUCCESS' ) );
134
135 } elseif ( 'remove' === $action ) {
136 $status = $this->delete_extension_plugin( $plugin_slug );
137 wp_send_json( $status );
138 }
139 }
140 wp_send_json( array( 'error' => esc_html__( 'Invalid data provided.', 'mainwp' ) ) );
141 }
142
143 /**
144 * Delete MainWP Extension plugin.
145 *
146 * @param string $plugin_slug plugin slug.
147 *
148 * @return array $status Status result.
149 */
150 public function delete_extension_plugin( $plugin_slug ) {
151
152 $status = array();
153 if ( ! empty( $plugin_slug ) ) {
154 // Check filesystem credentials.
155 $url = wp_nonce_url( 'plugins.php?action=delete-selected&verify-delete=1&checked[]=' . $plugin_slug, 'bulk-plugins' );
156 ob_start();
157 $credentials = request_filesystem_credentials( $url );
158 ob_end_clean();
159
160 if ( false === $credentials || ! WP_Filesystem( $credentials ) ) {
161 global $wp_filesystem;
162 $status['error'] = esc_html__( 'Unable to connect to the filesystem. Please confirm your credentials.', 'mainwp' );
163 // Pass through the error from WP_Filesystem if one was raised.
164 if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) {
165 $status['error'] = esc_html( $wp_filesystem->errors->get_error_message() );
166 }
167 return $status;
168 }
169
170 $result = delete_plugins( array( $plugin_slug ) );
171
172 if ( is_wp_error( $result ) ) {
173 $status['error'] = $result->get_error_message();
174 return $status;
175 } elseif ( false === $result ) {
176 $status['error'] = esc_html__( 'Plugin could not be deleted.', 'mainwp' );
177 return $status;
178 }
179 $status['result'] = 'SUCCESS';
180
181 return $status;
182 }
183 return $status;
184 }
185
186
187 /**
188 * Deactivate MainWP Extension.
189 *
190 * @return void
191 *
192 * @uses \MainWP\Dashboard\MainWP_Api_Manager::license_key_deactivation()
193 * @uses \MainWP\Dashboard\MainWP_Deprecated_Hooks::maybe_handle_deprecated_hook()
194 */
195 public function deactivate_extension() {
196 $this->check_security( 'mainwp_extension_deactivate' );
197 $api_slug = isset( $_POST['slug'] ) ? dirname( wp_unslash( $_POST['slug'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
198 $api_key = isset( $_POST['api_key'] ) ? wp_unslash( $_POST['api_key'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
199 $result = MainWP_Api_Manager::instance()->license_key_deactivation( $api_slug, $api_key );
200 wp_send_json( $result );
201 }
202
203 /**
204 * Grab MainWP Extension API Key.
205 *
206 * @return void
207 *
208 * @uses \MainWP\Dashboard\MainWP_Api_Manager::grab_license_key()
209 */
210 public function grab_extension_api_key() {
211 $this->check_security( 'mainwp_extension_grabapikey' );
212 $api_slug = isset( $_POST['slug'] ) ? dirname( wp_unslash( $_POST['slug'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
213 $master_api_key = isset( $_POST['master_api_key'] ) ? wp_unslash( $_POST['master_api_key'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
214 $result = MainWP_Api_Manager::instance()->grab_license_key( $api_slug, $master_api_key );
215 wp_send_json( $result );
216 }
217
218 /**
219 * Save MainWP Extensions API Login details for future logins.
220 *
221 * @return void
222 *
223 * @uses \MainWP\Dashboard\MainWP_Api_Manager::verify_mainwp_api()
224 * @uses \MainWP\Dashboard\MainWP_Api_Manager_Password_Management::encrypt_string()
225 * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
226 */
227 public function save_extensions_api_login() { // phpcs:ignore -- NOSONAR -Current complexity is the only way to achieve desired results, pull request solutions appreciated.
228 $this->check_security( 'mainwp_extension_saveextensionapilogin' );
229 $api_login_history = isset( $_SESSION['api_login_history'] ) ? $_SESSION['api_login_history'] : array(); //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- ok.
230
231 $new_api_login_history = array();
232 $requests = 0;
233
234 foreach ( $api_login_history as $api_login ) {
235 if ( $api_login['time'] > ( time() - 1 * 60 ) ) {
236 $new_api_login_history[] = $api_login;
237 ++$requests;
238 }
239 }
240
241 if ( 4 < $requests ) {
242 $_SESSION['api_login_history'] = $new_api_login_history;
243 die( wp_json_encode( array( 'error' => esc_html__( 'Too many requests', 'mainwp' ) ) ) );
244 } else {
245 $new_api_login_history[] = array( 'time' => time() );
246 $_SESSION['api_login_history'] = $new_api_login_history;
247 }
248
249 $api_key = isset( $_POST['api_key'] ) ? trim( wp_unslash( $_POST['api_key'] ) ) : false; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
250
251 if ( '' === $api_key && false !== $api_key ) {
252 MainWP_Keys_Manager::instance()->update_key_value( 'mainwp_extensions_master_api_key', false );
253 }
254
255 if ( empty( $api_key ) ) {
256 die( wp_json_encode( array( 'saved' => 1 ) ) );
257 }
258
259 $result = array();
260 try {
261 $test = MainWP_Api_Manager::instance()->verify_mainwp_api( $api_key );
262 } catch ( \Exception $e ) {
263 $return['error'] = $e->getMessage();
264 die( wp_json_encode( $return ) );
265 }
266
267 if ( is_array( $test ) && isset( $test['retry_action'] ) ) {
268 wp_send_json( $test );
269 }
270
271 $result = json_decode( $test, true );
272 $save_login = ( isset( $_POST['saveLogin'] ) && ( 1 === (int) $_POST['saveLogin'] ) ) ? true : false; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
273 $return = array();
274 if ( is_array( $result ) ) {
275 if ( isset( $result['success'] ) && $result['success'] ) {
276 if ( $save_login ) {
277 if ( empty( $api_key ) && isset( $result['master_api_key'] ) ) {
278 $api_key = $result['master_api_key'];
279 }
280 MainWP_Keys_Manager::instance()->update_key_value( 'mainwp_extensions_master_api_key', $api_key );
281 MainWP_Utility::update_option( 'mainwp_extensions_api_save_login', true );
282 $plan_info = isset( $result['plan_info'] ) ? wp_json_encode( $result['plan_info'] ) : '';
283 MainWP_Utility::update_option( 'mainwp_extensions_plan_info', $plan_info );
284 }
285 $return['result'] = 'SUCCESS';
286 } elseif ( isset( $result['error'] ) ) {
287 $return['error'] = $result['error'];
288 }
289 }
290
291 if ( ! $save_login ) {
292 MainWP_Utility::update_option( 'mainwp_extensions_api_save_login', '' );
293 MainWP_Utility::update_option( 'mainwp_extensions_plan_info', '' );
294 }
295
296 die( wp_json_encode( $return ) );
297 }
298
299 /**
300 * Save whenther or not to verify MainWP API SSL certificate.
301 *
302 * @return void
303 *
304 * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
305 */
306 public function save_api_ssl_verify() {
307 $this->check_security( 'mainwp_extension_apisslverifycertificate' );
308 MainWP_Utility::update_option( 'mainwp_api_sslVerifyCertificate', isset( $_POST['api_sslverify'] ) ? intval( $_POST['api_sslverify'] ) : 0 ); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
309 die( wp_json_encode( array( 'saved' => 1 ) ) );
310 }
311
312 /**
313 * Test Extension page MainWP.com login details.
314 *
315 * @return void
316 *
317 * @uses \MainWP\Dashboard\MainWP_Api_Manager::verify_mainwp_api()
318 * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
319 */
320 public function test_extensions_api_login() {
321 $this->check_security( 'mainwp_extension_testextensionapilogin' );
322 $api_key = MainWP_Api_Manager_Key::instance()->get_decrypt_master_api_key();
323 $result = array();
324 try {
325 $test = MainWP_Api_Manager::instance()->verify_mainwp_api( $api_key );
326 } catch ( \Exception $e ) {
327 $return['error'] = $e->getMessage();
328 die( wp_json_encode( $return ) );
329 }
330
331 if ( is_array( $test ) && isset( $test['retry_action'] ) ) {
332 wp_send_json( $test );
333 }
334
335 $result = json_decode( $test, true );
336 $return = array();
337 if ( is_array( $result ) ) {
338 if ( isset( $result['success'] ) && $result['success'] ) {
339 $return['result'] = 'SUCCESS';
340 } elseif ( isset( $result['error'] ) ) {
341 $return['error'] = $result['error'];
342 }
343 } else {
344 $apisslverify = get_option( 'mainwp_api_sslVerifyCertificate' );
345 if ( 1 === (int) $apisslverify ) {
346 MainWP_Utility::update_option( 'mainwp_api_sslVerifyCertificate', 0 );
347 $return['retry_action'] = 1;
348 }
349 }
350 wp_send_json( $return );
351 }
352
353 /**
354 * Download & Install MainWP Extension.
355 *
356 * @return void
357 *
358 * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::install_plugin()
359 */
360 public function download_and_install() {
361 $this->check_security( 'mainwp_extension_downloadandinstall' );
362 // phpcs:ignore -- custom setting to install plugin.
363 ini_set( 'zlib.output_compression', 'Off' );
364 $download_link = isset( $_POST['download_link'] ) ? wp_unslash( $_POST['download_link'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
365 $plugin_slug = isset( $_POST['plugin_slug'] ) ? wp_unslash( $_POST['plugin_slug'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
366
367 $return = array( 'error' => esc_html__( 'Empty or Invalid request data, please try again.', 'mainwp' ) );
368
369 if ( ! empty( $download_link ) ) {
370 $return = MainWP_Extensions_Handler::install_plugin( $download_link );
371 } elseif ( ! empty( $plugin_slug ) ) {
372 include_once ABSPATH . '/wp-admin/includes/plugin-install.php'; // NOSONAR - WP compatible.
373 $api = MainWP_System_Utility::get_plugin_theme_info(
374 'plugin',
375 array(
376 'slug' => dirname( $plugin_slug ),
377 'fields' => array( 'sections' => false ),
378 'timeout' => 60,
379 )
380 );
381
382 if ( is_object( $api ) && property_exists( $api, 'download_link' ) ) {
383 $download_link = $api->download_link;
384 $return = MainWP_Extensions_Handler::install_plugin( $download_link );
385 } else {
386 $return = array( 'error' => esc_html__( 'No response from the WordPress update server.', 'mainwp' ) );
387 }
388 }
389
390 die( '<mainwp>' . wp_json_encode( $return ) . '</mainwp>' );
391 }
392
393 /**
394 * MainWP Extension Bulck Activation.
395 *
396 * @return void
397 */
398 public function bulk_activate() {
399 $this->check_security( 'mainwp_extension_bulk_activate' );
400 $plugins = isset( $_POST['plugins'] ) ? wp_unslash( $_POST['plugins'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
401 if ( is_array( $plugins ) && ! empty( $plugins ) && current_user_can( 'activate_plugins' ) ) {
402 activate_plugins( $plugins );
403 die( 'SUCCESS' );
404 }
405 die( 'FAILED' );
406 }
407
408 /**
409 * Remove Extensions menu from MainWP Menu.
410 *
411 * @return void
412 *
413 * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
414 */
415 public function remove_extension_menu_from_mainwp_menu() {
416 $this->check_security( 'mainwp_extension_remove_menu' );
417 $snMenuExtensions = get_option( 'mainwp_extmenu' );
418 if ( ! is_array( $snMenuExtensions ) ) {
419 $snMenuExtensions = array();
420 }
421
422 $key = isset( $_POST['slug'] ) ? sanitize_text_field( wp_unslash( $_POST['slug'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
423
424 if ( ! empty( $key ) && isset( $snMenuExtensions[ $key ] ) ) {
425 unset( $snMenuExtensions[ $key ] );
426 MainWP_Utility::update_option( 'mainwp_extmenu', $snMenuExtensions );
427 do_action( 'mainwp_removed_extension_menu', $key );
428 die( wp_json_encode( array( 'result' => 'SUCCESS' ) ) );
429 }
430
431 die( - 1 );
432 }
433 }
434