PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.1.3
Adminify – White Label, Admin Menu Editor, Login Customizer v4.1.3
4.3.1 4.3.0 4.2.26 4.2.25 4.2.24 4.2.23 4.2.22 4.2.21 4.2.20 4.2.19 4.2.18 4.2.17 4.2.16 4.2.15 4.2.14 4.2.13 4.2.12 4.2.11 4.2.10 4.2.9 4.2.8 4.2.7 4.2.6 4.2.5 4.1.17 All 164 releases
← All changes | Libs/Addons.php +188 -195 4.2.254.1.3 View file →
@@ -1,7 +1,7 @@
1 1 <?php
2 2
3 -namespace PXLBSAdminify\Libs;
3 +namespace WPAdminify\Libs;
4 4
5 5 // No, Direct access Sir !!!
6 6 if (!defined('ABSPATH')) {
7 7 exit;
@@ -24,9 +24,11 @@
24 24 public $plugins_list = [];
25 25 public $sub_menu;
26 26 public $menu_order;
27 27
28 + public $server_url = 'https://coupon.wpadminify.com/';
28 29
30 +
29 31 /**
30 32 * Constructor method
31 33 *
32 34 * @param integer $menu_order .
@@ -45,76 +47,53 @@
45 47 add_action('network_admin_menu', array($this, 'admin_menu'), 1000);
46 48 } else {
47 49 add_action('admin_menu', array($this, 'admin_menu'), 1000);
48 50 }
49 - add_action('wp_ajax_pxlbsadminify_addons_upgrade_plugin', array($this, 'pxlbsadminify_addons_upgrade_plugin'));
50 - add_action('wp_ajax_pxlbsadminify_addons_activate_plugin', array($this, 'pxlbsadminify_addons_activate_plugin'));
51 - // Notify the site admin when a renamed legacy addon is detected
52 - // alongside its replacement. Per WordPress.org plugin guidelines,
53 - // we must not deactivate or activate plugins automatically; the
54 - // user has to perform the swap themselves from the Plugins screen.
55 - add_action('admin_notices', array($this, 'maybe_renamed_addon_notice'));
56 - add_action( 'rest_api_init', array( $this , 'addons_rest_routes') );
51 + add_action('wp_ajax_jltwp_adminify_addons_upgrade_plugin', array($this, 'jltwp_adminify_addons_upgrade_plugin'));
52 + add_action('wp_ajax_jltwp_adminify_addons_activate_plugin', array($this, 'jltwp_adminify_addons_activate_plugin'));
53 + add_action('plugins_loaded', array($this, 'maybe_replace_addons_path'), 1000); // 1000 is important
54 + add_action( 'rest_api_init', array( $this , 'jltwp_adminify_addons_rest_routes') );
57 55 }
58 56
59 - public function addons_rest_routes() {
57 + public function jltwp_adminify_addons_rest_routes() {
60 58 register_rest_route('adminify/v1', '/get-addons-list', array(
61 59 'methods' => 'GET',
62 - 'callback' => [$this, 'get_addons_plugins_list'],
63 - 'permission_callback' => [$this, 'check_is_admin_user'],
60 + 'callback' => [$this, 'jltwp_adminify_get_addons_plugins_list'],
61 + 'permission_callback' => [$this, 'adminify_is_admin_user'],
64 62 ));
65 63
66 64 register_rest_route('adminify/v1', '/install-addons', array(
67 65 'methods' => 'POST',
68 - 'callback' => [$this, 'install_addons'],
69 - 'permission_callback' => [$this, 'check_verify_nonce_and_permissions'],
66 + 'callback' => [$this, 'jltwp_adminify_install_addons'],
67 + 'permission_callback' => [$this, 'adminify_verify_nonce_and_permissions'],
70 68 ));
71 69 }
72 70
73 - public function check_is_admin_user() {
74 - if ( is_multisite() && ! is_super_admin() ) {
75 - return new \WP_Error('rest_forbidden', __('You are not allowed to access this resource.', 'adminify'), array('status' => 403));
76 - }
71 + public function adminify_is_admin_user() {
72 + return current_user_can('manage_options');
73 + }
74 +
75 + public function adminify_verify_nonce_and_permissions() {
76 + // Check user
77 77 if ( ! current_user_can('manage_options') ) {
78 - return new \WP_Error('rest_forbidden', __('You are not allowed to access this resource.', 'adminify'), array('status' => 403));
78 + return new WP_Error('forbidden', 'You are not allowed to do this.', array('status' => 403));
79 79 }
80 - return true;
81 - }
82 80
83 - public function check_verify_nonce_and_permissions() {
84 - // The install-addons endpoint may both install AND activate
85 - // addons depending on each addon's current status, so the
86 - // caller must hold BOTH capabilities. On multisite this also
87 - // requires super admin.
81 + // Check nonce from header
82 + $nonce = $_SERVER['HTTP_X_WP_NONCE'] ?? '';
83 + if ( ! wp_verify_nonce($nonce, 'wp_rest') ) {
84 + return new WP_Error('rest_cookie_invalid_nonce', __('Invalid nonce.'), array('status' => 403));
85 + }
88 86 if ( is_multisite() && ! is_super_admin() ) {
89 - return new \WP_Error('rest_forbidden', __('Super admin required.', 'adminify'), array('status' => 403));
87 + return new WP_Error('not_allowed', 'Super admin only on multisite.', array('status' => 403));
90 88 }
91 - if ( ! current_user_can('install_plugins') ) {
92 - return new \WP_Error('rest_forbidden', __('You are not allowed to install plugins.', 'adminify'), array('status' => 403));
93 - }
94 - if ( ! current_user_can('activate_plugins') ) {
95 - return new \WP_Error('rest_forbidden', __('You are not allowed to activate plugins.', 'adminify'), array('status' => 403));
96 - }
97 89
98 - // Nonce check from header. Sanitize and unslash before verifying.
99 - $nonce = isset($_SERVER['HTTP_X_WP_NONCE'])
100 - ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_WP_NONCE'] ) )
101 - : '';
102 - if ( ! wp_verify_nonce( $nonce, 'wp_rest' ) ) {
103 - return new \WP_Error('rest_cookie_invalid_nonce', __('Invalid nonce.', 'adminify'), array('status' => 403));
104 - }
105 -
106 90 return true;
107 91 }
108 92
109 93
110 - public function get_addons_plugins_list() {
111 - // Fetch the catalogue on demand. This callback only runs on the
112 - // Add-ons page (a user action), so the remote request is not made on
113 - // routine admin page loads.
114 - $plugins = ( method_exists( $this, 'get_adminify_plugins_lists' ) )
115 - ? (array) $this->get_adminify_plugins_lists()
116 - : (array) $this->plugins_list;
94 + public function jltwp_adminify_get_addons_plugins_list() {
95 + $plugins = $this->plugins_list;
117 96 unset($plugins['master-addons']);
118 97 $all_plugins = get_plugins();
119 98 $active_plugins = get_option('active_plugins');
120 99 foreach( $plugins as $slug => $plugin){
@@ -136,123 +115,101 @@
136 115
137 116 }
138 117
139 118
140 - public function install_addons( $request ) {
141 - $addons = $request->get_param('addons');
142 - if ( empty($addons) || ! is_array($addons) ) {
143 - return new \WP_Error('no_addons', __('No addons were selected.', 'adminify'), array('status' => 400));
119 + public function jltwp_adminify_install_addons( $request ) {
120 + $addons = $request->get_param('addons');
121 + if ( empty($addons) || !is_array($addons) ) {
122 + return new WP_Error('no_addons', 'No addons were selected.', array('status' => 400));
144 123 }
145 124
146 - $plugins_list = $this->get_addons_plugins_list()->data;
147 - foreach( $addons as $key => $plugin ) {
148 - $plugin = sanitize_key( $plugin );
149 - if ( ! isset( $plugins_list[ $plugin ] ) ) {
125 + $plugins_list = $this->jltwp_adminify_get_addons_plugins_list()->data;
126 + foreach( $addons as $key => $plugin ){
127 + if($plugins_list[$plugin]['status'] == "activated") continue;
128 + if($plugins_list[$plugin]['status'] == "installed") {
129 + $this->jltwp_adminify_activate_plugin_by_slug($plugin);
150 130 continue;
151 131 }
152 - if ( $plugins_list[ $plugin ]['status'] === 'activated' ) {
153 - continue;
154 - }
155 - if ( $plugins_list[ $plugin ]['status'] === 'installed' ) {
156 - $this->activate_plugin_by_slug( $plugin );
157 - continue;
158 - }
159 132 $params = [
160 133 'request_type' => 'rest',
161 - 'plugin' => $plugins_list[ $plugin ]['download_link'],
134 + 'plugin' => $plugins_list[$plugin]['download_link'],
162 135 ];
163 136
164 - $this->pxlbsadminify_addons_upgrade_plugin( $params );
137 + $this->jltwp_adminify_addons_upgrade_plugin($params);
165 138 }
166 -
167 - return rest_ensure_response(['message' => __('Addons processed.', 'adminify'), 'addons' => $addons]);
139 +
140 + return rest_ensure_response(['message' => 'Addons installed', 'addons' => $addons]);
168 141 }
169 142
170 - function activate_plugin_by_slug($slug) {
171 - // Activation requires the activate_plugins capability in
172 - // addition to whatever capability gated the calling endpoint.
173 - // On multisite, activation must be performed by a super admin.
174 - if ( is_multisite() && ! is_super_admin() ) {
175 - return new \WP_Error( 'rest_forbidden', __( 'Super admin required to activate plugins.', 'adminify' ), array( 'status' => 403 ) );
176 - }
177 - if ( ! current_user_can( 'activate_plugins' ) ) {
178 - return new \WP_Error( 'rest_forbidden', __( 'You are not allowed to activate plugins.', 'adminify' ), array( 'status' => 403 ) );
179 - }
180 -
181 - // Reject any slug containing path separators / traversal so
182 - // $slug cannot escape WP_PLUGIN_DIR.
183 - if ( ! is_string( $slug ) || $slug === '' || strpbrk( $slug, "/\\" ) !== false || strpos( $slug, '..' ) !== false ) {
184 - return new \WP_Error( 'invalid_slug', __( 'Invalid plugin slug.', 'adminify' ), array( 'status' => 400 ) );
185 - }
186 -
187 - // Slug must be present in the trusted addons list.
188 - if ( ! array_key_exists( $slug, (array) $this->plugins_list ) ) {
189 - return new \WP_Error( 'invalid_slug', __( 'Invalid plugin slug.', 'adminify' ), array( 'status' => 400 ) );
190 - }
191 -
143 + function jltwp_adminify_activate_plugin_by_slug($slug) {
192 144 $plugin_path = WP_PLUGIN_DIR . '/' . $slug;
193 145
194 - if ( ! is_dir( $plugin_path ) ) {
146 + if (!is_dir($plugin_path)) {
195 147 return;
196 148 }
197 149
198 - $installed_plugins = get_plugins( '/' . $slug );
199 - if ( empty( $installed_plugins ) ) {
150 + $plugin_files = glob("$plugin_path/*.php");
151 + if (!$plugin_files || empty($plugin_files)) {
200 152 return;
201 153 }
202 154
203 - $plugin_relative_path = $slug . '/' . key( $installed_plugins );
155 + $main_plugin_file = basename($plugin_files[0]);
156 + $plugin_relative_path = $slug . '/' . $main_plugin_file;
204 157
205 - if ( is_plugin_active( $plugin_relative_path ) ) {
158 + if (is_plugin_active($plugin_relative_path)) {
206 159 return;
207 160 }
208 161
209 - activate_plugin( $plugin_relative_path );
162 + activate_plugin($plugin_relative_path);
210 163 }
211 164
212 - /**
213 - * Map of legacy addon slugs that have been renamed to a new slug.
214 - *
215 - * @return array<string,string>
216 - */
217 - protected function renamed_addons_map() {
218 - return [
219 - 'sidebar-generator/adminify-sidebar-generator.php' => 'adminify-sidebar-generator/adminify-sidebar-generator.php',
165 + public function maybe_replace_addons_path() {
166 +
167 + $addons = [
168 + 'sidebar-generator/adminify-sidebar-generator.php' => 'adminify-sidebar-generator/adminify-sidebar-generator.php'
220 169 ];
221 - }
222 170
223 - /**
224 - * Show a non-blocking admin notice if a legacy (renamed) addon is
225 - * still installed. We never deactivate or activate plugins on the
226 - * user's behalf; the notice points them to the Plugins screen so
227 - * they can perform the swap themselves.
228 - */
229 - public function maybe_renamed_addon_notice() {
230 - if ( ! current_user_can('activate_plugins') ) {
231 - return;
232 - }
171 + foreach ($addons as $old_plugin => $new_plugin) {
233 172
234 - $messages = [];
173 + $old_plugin_path = WP_PLUGIN_DIR . '/' . $old_plugin;
174 + $new_plugin_path = WP_PLUGIN_DIR . '/' . $new_plugin;
235 175
236 - foreach ($this->renamed_addons_map() as $old_plugin => $new_plugin) {
237 - $old_exists = file_exists(WP_PLUGIN_DIR . '/' . $old_plugin);
238 - if ( ! $old_exists ) {
176 + // Both files exist, delete the old one
177 + if ( file_exists($old_plugin_path) && file_exists($new_plugin_path) ) {
178 + unlink(dirname($old_plugin_path));
239 179 continue;
240 180 }
241 181
242 - $messages[] = sprintf(
243 - /* translators: 1: old plugin slug, 2: new plugin slug */
244 - esc_html__('"%1$s" has been renamed to "%2$s". Please deactivate and remove the old version, then install the new one from the Adminify Addons screen.', 'adminify'),
245 - esc_html(dirname($old_plugin)),
246 - esc_html(dirname($new_plugin))
247 - );
248 - }
182 + // If the old file exists and the new file doesn't exist, rename the old file to the new file
183 + if ( file_exists($old_plugin_path) && !file_exists($new_plugin_path) ) {
249 184
250 - if ( empty($messages) ) {
251 - return;
185 + // check if the old plugin is active
186 + include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
187 +
188 + $is_active = is_plugin_active( $old_plugin );
189 +
190 + if ( $is_active ) {
191 + // Deactivate the old plugin
192 + deactivate_plugins( $old_plugin );
193 + // Rename the old plugin to the new plugin
194 + rename( dirname($old_plugin_path), dirname($new_plugin_path) );
195 +
196 + if ( file_exists($new_plugin_path) ) {
197 + // Clear the plugin cache
198 + wp_cache_delete( 'plugins', 'plugins' );
199 +
200 + // Activate the new plugin
201 + activate_plugin( $new_plugin );
202 + }
203 +
204 + } else {
205 + // Rename the old plugin to the new plugin
206 + rename( dirname($old_plugin_path), dirname($new_plugin_path) );
207 + }
208 + }
209 +
252 210 }
253 211
254 - echo '<div class="notice notice-warning"><p><strong>' . esc_html__('Adminify', 'adminify') . ':</strong> ' . esc_html(implode('<br>', $messages)) . '</p></div>';
255 212 }
256 213
257 214 /**
258 215 * Includes
@@ -260,18 +217,17 @@
260 217 * @author Jewel Theme <support@jeweltheme.com>
261 218 */
262 219 public function includes()
263 220 {
264 - // wp-load.php must never be required from within a plugin: the
265 - // plugin already runs inside WordPress. The wp-admin includes
266 - // below are required for plugin install/upgrade APIs used by
267 - // this class and are loaded with require_once immediately
268 - // before the functions from each file are called.
269 - require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
270 - require_once ABSPATH . 'wp-admin/includes/file.php';
271 - require_once ABSPATH . 'wp-admin/includes/misc.php';
272 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
273 - require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
221 + // if (!function_exists('install_plugin_install_status')) {
222 + // require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
223 + require_once(ABSPATH . '/wp-load.php');
224 + require_once(ABSPATH . 'wp-admin/includes/plugin-install.php');
225 + require_once(ABSPATH . 'wp-admin/includes/file.php');
226 + require_once(ABSPATH . 'wp-admin/includes/misc.php');
227 + require_once(ABSPATH . 'wp-admin/includes/plugin.php');
228 + require_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php');
229 + // }
274 230 }
275 231
276 232 /**
277 233 * Menu Items
@@ -319,10 +275,26 @@
319 275 *
320 276 * @return void
321 277 */
322 278
323 - public function addons_check()
279 + public function jltwp_adminify_addons_check()
324 280 {
281 +
282 + $license = jltwp_adminify()->_get_license();
283 +
284 + if (!is_object($license) || !$license->is_valid() || !$license->is_active()) return;
285 +
286 + if ( $this->is_eligible_for_coupon() ) {
287 + // Get the coupon
288 + $coupon = $this->maybe_create_and_get_coupon();
289 + if (!empty($coupon) && !empty($coupon['code'])) {
290 + echo sprintf(
291 + __('<h3>Coupon Code: <strong style="color: red">%s</strong> Redeem this coupon code to get free access to all our premium addons (Except Admin Bar Editor, RoleMaster Suite and Master Addons). Learn how to <a href="https://wpadminify.com/redeem-addons-using-coupon-code/" target="_blank">redeem coupon code?</a></h3> ', 'adminify'),
292 + esc_attr($coupon['code'])
293 + );
294 + }
295 + }
296 +
325 297 echo '<style>
326 298 #fs_addons .fs-cards-list{ display: flex; }
327 299 #fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button{
328 300 top: 112px;
@@ -331,10 +303,73 @@
331 303 border-radius: 3px !important;
332 304 }</style>';
333 305 }
334 306
307 + public function is_eligible_for_coupon() {
335 308
309 + $is_eligible = get_option('wp_adminify_addon__is_eligible_for_coupon', null);
336 310
311 + if ( $is_eligible !== null ) return wp_validate_boolean($is_eligible);
312 + $args = [
313 + 'license' => base64_encode(json_encode(jltwp_adminify()->_get_license())),
314 + 'action' => 'check_eligibility'
315 + ];
316 +
317 + $request_uri = add_query_arg($args, $this->server_url);
318 +
319 + $response = wp_remote_get($request_uri);
320 +
321 + if (!is_wp_error($response) && $response['response']['code'] === 200) {
322 + $file_contents = wp_remote_retrieve_body($response);
323 + $is_eligible = json_decode($file_contents, true);
324 + update_option('wp_adminify_addon__is_eligible_for_coupon', wp_validate_boolean($is_eligible));
325 + return $is_eligible;
326 + }
327 +
328 + return false;
329 + }
330 +
331 + public function maybe_delete_corrupted_coupon(){
332 + $coupon_delete_check = get_option('wp_adminify_addon__coupon_is_deleted', false);
333 + if($coupon_delete_check != true){
334 + delete_option('wp_adminify_addon__coupon');
335 + update_option('wp_adminify_addon__coupon_is_deleted', true);
336 + }
337 + }
338 +
339 + public function maybe_create_and_get_coupon()
340 + {
341 + $this->maybe_delete_corrupted_coupon();
342 + $coupon = get_option('wp_adminify_addon__coupon');
343 +
344 + if (!empty($coupon)) return $coupon;
345 +
346 + // communicate hit hserver get coupon
347 + $args = [
348 + 'license' => base64_encode(json_encode(jltwp_adminify()->_get_license())),
349 + 'action' => 'get_coupon'
350 + ];
351 +
352 + $response = wp_remote_get(add_query_arg($args, $this->server_url));
353 +
354 + if (!is_wp_error($response) && $response['response']['code'] === 200) {
355 +
356 + $file_contents = wp_remote_retrieve_body($response);
357 + $response_data = json_decode($file_contents, true);
358 +
359 + if (!empty($response_data) && is_array($response_data) && !empty($response_data['id']) && !empty($response_data['code']) ) {
360 + $coupon = [
361 + 'id' => $response_data['id'],
362 + 'code' => $response_data['code']
363 + ];
364 + update_option('wp_adminify_addon__coupon', $coupon);
365 + }
366 + }
367 +
368 + return $coupon;
369 + }
370 +
371 +
337 372 /**
338 373 * Header
339 374 */
340 375 public function header()
@@ -342,11 +377,11 @@
342 377 ?>
343 378 <div class='wp-adminify-addons-header'>
344 379 <div class='wp-adminify-addons-title'>
345 380 <h2>
346 - <?php echo esc_html__('Add Ons for Adminify', 'adminify'); ?>
381 + <?php echo esc_html__('Add Ons for WP Adminify', 'adminify'); ?>
347 382 </h2>
348 - <?php $this->addons_check(); ?>
383 + <?php $this->jltwp_adminify_addons_check(); ?>
349 384 </div>
350 385 <div class='wp-adminify-addons-menu'>
351 386 <div class="wp-filter">
352 387 <ul class="filter-links">
@@ -399,19 +434,10 @@
399 434 * Body
400 435 */
401 436 public function plugins()
402 437 {
403 - // $this->plugins_list is populated at construction only from the
404 - // cached catalogue, which is empty until a live fetch runs. The
405 - // Add-ons page render is itself an explicit user action, so fall
406 - // back to the bundled catalogue here so the cards always show.
407 - $plugins_list = $this->plugins_list;
408 438
409 - if ( empty( $plugins_list ) && method_exists( $this, 'get_adminify_plugins_lists' ) ) {
410 - $plugins_list = (array) $this->get_adminify_plugins_lists();
411 - }
412 -
413 - foreach ($plugins_list as $key => $plugin) {
439 + foreach ($this->plugins_list as $key => $plugin) {
414 440 $install_status = \install_plugin_install_status($plugin);
415 441 $classes = implode(' ', $plugin['type']);
416 442
417 443 $more_details = self_admin_url(
@@ -551,9 +577,9 @@
551 577 * Activate Plugins
552 578 *
553 579 * @author Jewel Theme <support@jeweltheme.com>
554 580 */
555 - public function pxlbsadminify_addons_activate_plugin()
581 + public function jltwp_adminify_addons_activate_plugin()
556 582 {
557 583 if (empty($_POST['plugin'])) {
558 584 return;
559 585 }
@@ -559,9 +585,9 @@
559 585 }
560 586 try {
561 587 $nonce = isset($_POST['nonce']) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : '';
562 588
563 - if (!wp_verify_nonce($nonce, 'pxlbsadminify_addons_nonce')) {
589 + if (!wp_verify_nonce($nonce, 'jltwp_adminify_addons_nonce')) {
564 590 wp_send_json_error(array('mess' => __('Nonce is invalid', 'adminify')));
565 591 }
566 592
567 593 // Security check - only administrators can activate plugins
@@ -571,23 +597,12 @@
571 597
572 598 $plugin = sanitize_text_field(wp_unslash($_POST['plugin']));
573 599 $plugin_links = array_values(wp_list_pluck($this->plugins_list, 'slug'));
574 600
575 - if (!in_array(dirname($plugin), $plugin_links, true)) {
601 + if (!in_array(dirname($plugin), $plugin_links)) {
576 602 wp_send_json_error(array('mess' => __('Invalid plugin', 'adminify')));
577 603 }
578 604
579 - // Resolve against the list of actually installed plugins so that
580 - // only a known plugin file is ever passed to activate_plugin().
581 - if (!function_exists('get_plugins')) {
582 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
583 - }
584 - $installed_plugins = array_keys(get_plugins());
585 -
586 - if (!in_array($plugin, $installed_plugins, true)) {
587 - wp_send_json_error(array('mess' => __('Invalid plugin', 'adminify')));
588 - }
589 -
590 605 $result = activate_plugin($plugin);
591 606
592 607 if (is_wp_error($result)) {
593 608 wp_send_json_error(
@@ -645,9 +660,9 @@
645 660 * Upgrade Plugins required Libraries
646 661 *
647 662 * @author Jewel Theme <support@jeweltheme.com>
648 663 */
649 - public function pxlbsadminify_addons_upgrade_plugin( $params = null )
664 + public function jltwp_adminify_addons_upgrade_plugin( $params = null )
650 665 {
651 666 if ($params == null && empty($_POST['plugin'])) {
652 667 return;
653 668 }
@@ -660,9 +675,9 @@
660 675
661 676 if($params == null){
662 677 $nonce = isset($_POST['nonce']) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : '';
663 678
664 - if (!wp_verify_nonce($nonce, 'pxlbsadminify_addons_nonce')) {
679 + if (!wp_verify_nonce($nonce, 'jltwp_adminify_addons_nonce')) {
665 680 wp_send_json_error(array('mess' => __('Nonce is invalid', 'adminify')));
666 681 }
667 682 $plugin = sanitize_text_field(wp_unslash($_POST['plugin']));
668 683 }else{
@@ -675,20 +690,12 @@
675 690 }
676 691
677 692 $plugin_slug = $this->get_the_plugin_slug( $plugin );
678 693
679 - if ( ! array_key_exists( $plugin_slug, $this->plugins_list ) ) {
694 + if ( ! array_key_exists( $plugin_slug, $this->plugins_list) ) {
680 695 wp_send_json_error(array('mess' => __('Invalid plugin', 'adminify')));
681 696 }
682 -
683 - // Replace the user-supplied $plugin value with values derived
684 - // from our trusted internal addons list, so that arbitrary
685 - // input never reaches Plugin_Upgrader::install()/upgrade() or
686 - // activate_plugin().
687 - $trusted_install_source = isset($this->plugins_list[$plugin_slug]['download_link'])
688 - ? $this->plugins_list[$plugin_slug]['download_link']
689 - : '';
690 -
697 +
691 698 if($params == null){
692 699 $type = isset($_POST['type']) ? sanitize_text_field(wp_unslash($_POST['type'])) : 'install';
693 700 }else{
694 701 $type = 'install';
@@ -697,13 +704,9 @@
697 704 $upgrader = new \Plugin_Upgrader($skin);
698 705
699 706 if ('install' === $type) {
700 707
701 - if ( empty( $trusted_install_source ) ) {
702 - wp_send_json_error(array('mess' => __('Invalid plugin', 'adminify')));
703 - }
704 -
705 - $result = $upgrader->install( $trusted_install_source );
708 + $result = $upgrader->install($plugin);
706 709 if ($params == null){
707 710 if (empty($result) || empty($upgrader->result)) {
708 711 wp_send_json_error(
709 712 array(
@@ -762,21 +765,11 @@
762 765 }
763 766 }
764 767 } else {
765 768
766 - // Resolve the trusted plugin file path from the validated
767 - // slug instead of trusting the raw $_POST value, so that
768 - // is_plugin_active(), Plugin_Upgrader::upgrade() and
769 - // activate_plugin() never receive attacker-supplied paths.
770 - $installed_plugins = get_plugins( '/' . $plugin_slug );
771 - if ( empty( $installed_plugins ) ) {
772 - wp_send_json_error(array('mess' => __('Plugin not installed.', 'adminify')));
773 - }
774 - $trusted_plugin_file = $plugin_slug . '/' . key( $installed_plugins );
769 + $is_active = is_plugin_active($plugin);
770 + $result = $upgrader->upgrade($plugin);
775 771
776 - $is_active = is_plugin_active( $trusted_plugin_file );
777 - $result = $upgrader->upgrade( $trusted_plugin_file );
778 -
779 772 if ($params == null){
780 773 if ( empty($result) || is_wp_error($result) ) {
781 774 wp_send_json_error(
782 775 array(
@@ -785,9 +778,9 @@
785 778 );
786 779 }
787 780 }
788 781
789 - $active_status = activate_plugin( $trusted_plugin_file );
782 + $active_status = activate_plugin($plugin);
790 783
791 784 if ($params == null){
792 785 if ( empty($active_status) || is_wp_error($active_status) ) {
793 786 wp_send_json_error(