PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.2.1
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.2.1
4.0.8 4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 All 149 releases
← All changes | vendor/codeinwp/themeisle-sdk/src/Modules/Licenser.php +177 -737 4.0.73.2.1 View file →
@@ -12,9 +12,8 @@
12 12 namespace ThemeisleSDK\Modules;
13 13
14 14 // Exit if accessed directly.
15 15 use ThemeisleSDK\Common\Abstract_Module;
16 -use ThemeisleSDK\Loader;
17 16 use ThemeisleSDK\Product;
18 17
19 18 if ( ! defined( 'ABSPATH' ) ) {
20 19 exit;
@@ -23,33 +22,16 @@
23 22 /**
24 23 * Licenser module for ThemeIsle SDK.
25 24 */
26 25 class Licenser extends Abstract_Module {
26 +
27 27 /**
28 - * License VALID status string.
29 - */
30 - const STATUS_VALID = 'valid';
31 - /**
32 - * License NOT_ACTIVE status string.
33 - */
34 - const STATUS_NOT_ACTIVE = 'not_active';
35 - /**
36 - * License active expired status string.
37 - */
38 - const STATUS_ACTIVE_EXPIRED = 'active_expired';
39 - /**
40 28 * Number of max failed checks before showing the license message.
41 29 *
42 30 * @var int $max_failed Maximum failed checks allowed before show the notice
43 31 */
44 - private static $max_failed = 1;
32 + private static $max_failed = 5;
45 33 /**
46 - * Flag to check if the global actions were loaded.
47 - *
48 - * @var bool If the globals actions were loaded.
49 - */
50 - private static $globals_loaded = false;
51 - /**
52 34 * License key string.
53 35 *
54 36 * @var string $license_key The license key string
55 37 */
@@ -73,21 +55,8 @@
73 55 */
74 56 private $product_key;
75 57
76 58 /**
77 - * Holds local license object.
78 - *
79 - * @var null Local license object.
80 - */
81 - private $license_local = null;
82 - /**
83 - * Product namespace, used for fixed name filters/cli commands.
84 - *
85 - * @var string $namespace Product namespace.
86 - */
87 - private $namespace = null;
88 -
89 - /**
90 59 * Disable wporg updates for premium products.
91 60 *
92 61 * @param string $r Update payload.
93 62 * @param string $url The api url.
@@ -93,9 +62,9 @@
93 62 * @param string $url The api url.
94 63 *
95 64 * @return mixed List of themes to check for update.
96 65 */
97 - public function disable_wporg_update( $r, $url ) {
66 + function disable_wporg_update( $r, $url ) {
98 67
99 68 if ( 0 !== strpos( $url, 'https://api.wordpress.org/themes/update-check/' ) ) {
100 69 return $r;
101 70 }
@@ -105,9 +74,9 @@
105 74
106 75 unset( $themes->themes->{$this->product->get_slug()} );
107 76
108 77 // Encode the updated JSON response.
109 - $r['body']['themes'] = wp_json_encode( $themes );
78 + $r['body']['themes'] = json_encode( $themes );
110 79
111 80 return $r;
112 81 }
113 82
@@ -119,11 +88,8 @@
119 88 public function register_settings() {
120 89 if ( ! is_admin() ) {
121 90 return false;
122 91 }
123 - if ( apply_filters( $this->product->get_key() . '_hide_license_field', false ) ) {
124 - return;
125 - }
126 92 add_settings_field(
127 93 $this->product->get_key() . '_license',
128 94 $this->product->get_name() . ' license',
129 95 array( $this, 'license_view' ),
@@ -137,88 +103,24 @@
137 103 public function license_view() {
138 104 $status = $this->get_license_status();
139 105 $value = $this->license_key;
140 106
141 - $activate_string = apply_filters( $this->product->get_key() . '_lc_activate_string', Loader::$labels['licenser']['activate'] );
142 - $deactivate_string = apply_filters( $this->product->get_key() . '_lc_deactivate_string', Loader::$labels['licenser']['deactivate'] );
143 - $valid_string = apply_filters( $this->product->get_key() . '_lc_valid_string', Loader::$labels['licenser']['valid'] );
144 - $invalid_string = apply_filters( $this->product->get_key() . '_lc_invalid_string', Loader::$labels['licenser']['invalid'] );
145 - $license_message = apply_filters( $this->product->get_key() . '_lc_license_message', Loader::$labels['licenser']['notice'] );
146 - $error_message = $this->get_error();
147 - ?>
148 - <style type="text/css">
149 - input.themeisle-sdk-text-input-valid {
150 - border: 1px solid #7ad03a;
151 - }
107 + $activate_string = apply_filters( $this->product->get_key() . '_lc_activate_string', 'Activate' );
108 + $deactivate_string = apply_filters( $this->product->get_key() . '_lc_deactivate_string', 'Deactivate' );
109 + $valid_string = apply_filters( $this->product->get_key() . '_lc_valid_string', 'Valid' );
110 + $invalid_string = apply_filters( $this->product->get_key() . '_lc_invalid_string', 'Invalid' );
111 + $license_message = apply_filters( $this->product->get_key() . '_lc_license_message', 'Enter your license from %s purchase history in order to get %s updates' );
152 112
153 - input.themeisle-sdk-license-input {
154 - width: 300px;
155 - padding: 0 8px;
156 - line-height: 2;
157 - min-height: 30px;
158 - }
113 + echo '<p ><input ' . ( ( 'valid' === $status ) ? ( 'style="border:1px solid #7ad03a; "' ) : '' ) . ' type="text" id="' . $this->product->get_key() . '_license" name="' . $this->product->get_key() . '_license" value="' . $value . '" /><a ' . ( ( 'valid' === $status ) ? ( 'style="color:#fff;background: #7ad03a; display: inline-block;text-decoration: none;font-size: 13px;line-height: 26px;height: 26px; margin-left:5px; padding: 0 10px 1px; -webkit-border-radius: 3px;border-radius: 3px; ">' . $valid_string ) : ( 'style="color:#fff;background: #dd3d36; display: inline-block;text-decoration: none;font-size: 13px;line-height: 26px;height: 26px; margin-left:5px; padding: 0 10px 1px; -webkit-border-radius: 3px;border-radius: 3px; ">' . $invalid_string ) ) . ' </a>&nbsp;&nbsp;&nbsp;<button name="' . $this->product->get_key() . '_btn_trigger" ' . ( ( 'valid' === $status ) ? ( ' class="button button-primary">' . $deactivate_string ) : ( ' class="button button-primary" value="yes" type="submit" >' . $activate_string ) ) . ' </button></p><p class="description">' . sprintf( $license_message, '<a href="' . $this->get_api_url() . '">' . $this->get_distributor_name() . '</a> ', $this->product->get_type() ) . '</p>';
159 114
160 - .themeisle-sdk-license-deactivate-cta {
161 - color: #fff;
162 - background: #7ad03a;
163 - display: inline-block;
164 - text-decoration: none;
165 - font-size: 13px;
166 - line-height: 30px;
167 - height: 26px;
168 - margin-left: 5px;
169 - padding: 0 10px 3px;
170 - -webkit-border-radius: 3px;
171 - border-radius: 3px;
172 - }
173 -
174 - .themeisle-sdk-license-activate-cta {
175 - color: #fff;
176 - background: #dd3d36;
177 - display: inline-block;
178 - text-decoration: none;
179 - font-size: 13px;
180 - line-height: 30px;
181 - height: 26px;
182 - margin-left: 5px;
183 - padding: 0 10px 3px;
184 - -webkit-border-radius: 3px;
185 - border-radius: 3px;
186 - }
187 -
188 - button.button.themeisle-sdk-licenser-button-cta {
189 - line-height: 26px;
190 - height: 29px;
191 - vertical-align: top;
192 - }
193 -
194 - </style>
195 - <?php
196 - echo sprintf(
197 - '<p>%s<input class="themeisle-sdk-license-input %s" type="text" id="%s_license" name="%s_license" value="%s" /><a class="%s">%s</a>&nbsp;&nbsp;&nbsp;<button name="%s_btn_trigger" class="button button-primary themeisle-sdk-licenser-button-cta" value="yes" type="submit" >%s</button></p><p class="description">%s</p>%s',
198 - ( ( 'valid' === $status ) ? sprintf( '<input type="hidden" value="%s" name="%s_license" />', esc_attr( $value ), esc_attr( $this->product->get_key() ) ) : '' ),
199 - ( ( 'valid' === $status ) ? 'themeisle-sdk-text-input-valid' : '' ),
200 - esc_attr( $this->product->get_key() ),
201 - esc_attr( ( ( 'valid' === $status ) ? $this->product->get_key() . '_mask' : $this->product->get_key() ) ),
202 - esc_attr( ( ( 'valid' === $status ) ? ( str_repeat( '*', 30 ) . substr( $value, - 5 ) ) : $value ) ),
203 - esc_attr( ( 'valid' === $status ? 'themeisle-sdk-license-deactivate-cta' : 'themeisle-sdk-license-activate-cta' ) ),
204 - esc_attr( 'valid' === $status ? $valid_string : $invalid_string ),
205 - esc_attr( $this->product->get_key() ),
206 - esc_attr( 'valid' === $status ? $deactivate_string : $activate_string ),
207 - sprintf( wp_kses_data( $license_message ), '<a href="' . esc_url( $this->get_api_url() ) . '">' . esc_attr( $this->get_distributor_name() ) . '</a> ', esc_attr( $this->product->get_type() ) ),
208 - wp_kses_data( empty( $error_message ) ? '' : sprintf( '<p style="color:#dd3d36">%s</p>', ( $error_message ) ) )
209 - ) . wp_nonce_field( $this->product->get_key() . 'nonce', $this->product->get_key() . 'nonce_field', false, false );//phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
210 -
211 115 }
212 116
213 117 /**
214 118 * Return the license status.
215 119 *
216 - * @param bool $check_expiration Should check if license is valid, but expired.
217 - *
218 120 * @return string The License status.
219 121 */
220 - public function get_license_status( $check_expiration = false ) {
122 + public function get_license_status() {
221 123
222 124 $license_data = get_option( $this->product->get_key() . '_license_data', '' );
223 125
224 126 if ( '' === $license_data ) {
@@ -223,113 +125,14 @@
223 125
224 126 if ( '' === $license_data ) {
225 127 return get_option( $this->product->get_key() . '_license_status', 'not_active' );
226 128 }
227 - $status = isset( $license_data->license ) ? $license_data->license : get_option( $this->product->get_key() . '_license_status', 'not_active' );
228 - if ( false === $check_expiration ) {
229 - return $status;
230 - }
231 129
232 - return ( 'valid' === $status && isset( $license_data->is_expired ) && 'yes' === $license_data->is_expired ) ? 'active_expired' : $status;
233 - }
130 + return isset( $license_data->license ) ? $license_data->license : get_option( $this->product->get_key() . '_license_status', 'not_active' );
234 131
235 - /**
236 - * Check status.
237 - *
238 - * @param string $product_file Product basefile.
239 - *
240 - * @return string Status license.
241 - */
242 - public static function status( $product_file ) {
243 - $product = Product::get( $product_file );
244 - if ( ! $product->requires_license() ) {
245 - return self::STATUS_VALID;
246 - }
247 - $license_data = self::get_license_data( $product->get_key() );
248 -
249 - $status = isset( $license_data->license ) ? $license_data->license : self::STATUS_NOT_ACTIVE;
250 -
251 - return ( 'valid' === $status && isset( $license_data->is_expired ) && 'yes' === $license_data->is_expired ) ? 'active_expired' : $status;
252 132 }
253 133
254 134 /**
255 - * Product license data.
256 - *
257 - * @param string $key Product key.
258 - *
259 - * @return false|mixed|null
260 - */
261 - private static function get_license_data( $key ) {
262 - $license_data = get_option( $key . '_license_data', '' );
263 -
264 - return isset( $license_data->license ) ? $license_data : false;
265 - }
266 -
267 - /**
268 - * Get license hash.
269 - *
270 - * @param string $key Product key.
271 - *
272 - * @return bool|string
273 - */
274 - public static function create_license_hash( $key ) {
275 - $data = self::get_license_data( $key );
276 -
277 - if ( ! $data ) {
278 - return false;
279 - }
280 -
281 - return isset( $data->key ) ? wp_hash( $data->key ) : false;
282 - }
283 -
284 - /**
285 - * Check if license is valid.
286 - *
287 - * @param string $product_file Product basefile.
288 - *
289 - * @return bool Is valid?
290 - */
291 - public static function is_valid( $product_file ) {
292 - return self::status( $product_file ) === self::STATUS_VALID;
293 - }
294 -
295 - /**
296 - * Get product plan.
297 - *
298 - * @param string $product_file Product file.
299 - *
300 - * @return int Plan id.
301 - */
302 - public static function plan( $product_file ) {
303 - $product = Product::get( $product_file );
304 - $data = self::get_license_data( $product->get_key() );
305 -
306 - return isset( $data->price_id ) ? (int) $data->price_id : - 1;
307 - }
308 -
309 - /**
310 - * Get product license key.
311 - *
312 - * @param string $product_file Product file.
313 - *
314 - * @return string
315 - */
316 - public static function key( $product_file ) {
317 - $product = Product::get( $product_file );
318 -
319 - return $product->get_license();
320 - }
321 -
322 - /**
323 - * Return the last error message.
324 - *
325 - * @return mixed Error message.
326 - */
327 - public function get_error() {
328 - return get_transient( $this->product->get_key() . 'act_err' );
329 - }
330 -
331 - /**
332 135 * Get remote api url.
333 136 *
334 137 * @return string Remote api url.
335 138 */
@@ -347,9 +150,9 @@
347 150 * @return string Remote api url.
348 151 */
349 152 public function get_distributor_name() {
350 153 if ( $this->is_from_partner( $this->product ) ) {
351 - return 'Themeisle';
154 + return 'ThemeIsle';
352 155 }
353 156
354 157 return $this->product->get_store_name();
355 158 }
@@ -354,34 +157,21 @@
354 157 return $this->product->get_store_name();
355 158 }
356 159
357 160 /**
358 - * License price id.
359 - *
360 - * @return int License plan.
361 - */
362 - public function get_plan() {
363 - return self::plan( $this->product->get_basefile() );
364 - }
365 -
366 - /**
367 161 * Show the admin notice regarding the license status.
368 162 *
369 163 * @return bool Should we show the notice ?
370 164 */
371 - public function show_notice() {
165 + function show_notice() {
372 166 if ( ! is_admin() ) {
373 167 return false;
374 168 }
169 + $status = $this->get_license_status();
170 + $no_activations_string = apply_filters( $this->product->get_key() . '_lc_no_activations_string', 'No activations left for %s !!!. You need to upgrade your plan in order to use %s on more websites. Please ask the %s Staff for more details.' );
171 + $no_valid_string = apply_filters( $this->product->get_key() . '_lc_no_valid_string', 'In order to benefit from updates and support for %s, please add your license code from your <a href="%s" target="_blank">purchase history</a> and validate it <a href="%s">here</a>. ' );
172 + $expiration_string = apply_filters( $this->product->get_key() . '_lc_expiration_string', 'Your license is about to expire for %s. You can go to %s and renew it ' );
375 173
376 - if ( apply_filters( $this->product->get_key() . '_hide_license_notices', false ) ) {
377 - return false;
378 - }
379 -
380 - $status = $this->get_license_status( true );
381 - $no_activations_string = apply_filters( $this->product->get_key() . '_lc_no_activations_string', Loader::$labels['licenser']['no_activations'] );
382 - $no_valid_string = apply_filters( $this->product->get_key() . '_lc_no_valid_string', sprintf( Loader::$labels['licenser']['inactive'], '%s', '<a href="%s" target="_blank">', '</a>', '<a href="%s">', '</a>' ) );
383 - $expired_license_string = apply_filters( $this->product->get_key() . '_lc_expired_heading_string', Loader::$labels['licenser']['expired'] );
384 174 // No activations left for this license.
385 175 if ( 'valid' != $status && $this->check_activation() ) {
386 176 ?>
387 177 <div class="error">
@@ -387,12 +177,12 @@
387 177 <div class="error">
388 178 <p><strong>
389 179 <?php
390 180 echo sprintf(
391 - wp_kses_data( $no_activations_string ),
392 - esc_attr( $this->product->get_name() ),
393 - esc_attr( $this->product->get_name() ),
394 - '<a href="' . esc_url( $this->get_api_url() ) . '" target="_blank">' . esc_attr( $this->get_distributor_name() ) . '</a>'
181 + $no_activations_string,
182 + $this->product->get_name(),
183 + $this->product->get_name(),
184 + '<a href="' . $this->get_api_url() . '" target="_blank">' . $this->get_distributor_name() . '</a>'
395 185 );
396 186 ?>
397 187 </strong>
398 188 </p>
@@ -399,91 +189,38 @@
399 189 </div>
400 190 <?php
401 191 return false;
402 192 }
403 -
404 193 // Invalid license key.
405 - if ( 'active_expired' === $status ) {
406 - // Check if the notice was dismissed.
407 - $dismiss_option_key = $this->product->get_key() . '_expired_notice_dismissed';
408 - if ( get_option( $dismiss_option_key, false ) ) {
409 - return false;
410 - }
411 -
412 - $license_data = get_option( $this->product->get_key() . '_license_data', '' );
413 - $expiration_date = '';
414 - if ( is_object( $license_data ) && isset( $license_data->expires ) ) {
415 - $timestamp = strtotime( (string) $license_data->expires );
416 - if ( false !== $timestamp ) {
417 - $expiration_date = gmdate( 'F j, Y', $timestamp );
418 - }
419 - }
420 -
421 - $discount_config = apply_filters( $this->product->get_key() . '_lc_renew_discount', false );
422 -
423 - if ( is_array( $discount_config ) && isset( $discount_config['url'] ) && isset( $discount_config['renew_button'] ) ) {
424 - $renew_url = $discount_config['url'];
425 - $renew_button = $discount_config['renew_button'];
426 - } else {
427 - $renew_url = apply_filters( $this->product->get_key() . '_lc_renew_url', $this->renew_url() );
428 - $renew_button = apply_filters( $this->product->get_key() . '_lc_renew_button_string', Loader::$labels['licenser']['renew_license'] );
429 - }
430 -
431 - $learn_more_url = apply_filters( $this->product->get_key() . '_lc_learn_more_url', $this->get_api_url() );
432 - $learn_more_button = apply_filters( $this->product->get_key() . '_lc_learn_more_button_string', Loader::$labels['licenser']['learn_more'] );
433 - $notice_message = apply_filters( $this->product->get_key() . '_lc_expired_notice_message', Loader::$labels['licenser']['expired_notice'] );
434 -
435 - $expired_date_string = apply_filters( $this->product->get_key() . '_lc_expired_date_string', sprintf( Loader::$labels['licenser']['expired_date'], esc_html( $expiration_date ) ) );
436 - $heading = apply_filters( $this->product->get_key() . '_lc_expired_heading_string', sprintf( Loader::$labels['licenser']['expired'], $this->product->get_name() ) );
437 - $notice_id = $this->product->get_key() . '_expired_notice';
194 + if ( 'valid' != $status ) {
438 195 ?>
439 - <div class="notice notice-warning notice-alt is-dismissible themeisle-sdk-license-notice" id="<?php echo esc_attr( $notice_id ); ?>" data-notice-id="<?php echo esc_attr( $notice_id ); ?>" style="position: relative; border-left: 4px solid #d63638; padding: 12px; background-color: #fff;">
440 - <p style="margin: 0.5em 0; font-size: 13px;">
441 - <strong><?php echo wp_kses_post( $heading ); ?></strong>
442 - · <?php echo esc_html( $expired_date_string ); ?>
196 + <div class="error">
197 + <p>
198 + <strong><?php echo sprintf( $no_valid_string, $this->product->get_name() . ' ' . $this->product->get_type(), $this->get_api_url(), admin_url( 'options-general.php' ) . '#' . $this->product->get_key() ); ?> </strong>
443 199 </p>
444 - <p style="margin: 0.5em 0 1em 0; font-size: 13px;">
445 - <?php echo esc_html( $notice_message ); ?>
446 - </p>
447 - <p style="margin: 0.5em 0;">
448 - <a href="<?php echo esc_url( $renew_url ); ?>" class="button button-primary" target="_blank" rel="noopener noreferrer">
449 - <?php echo esc_html( $renew_button ); ?>
450 - </a>
451 - <a href="<?php echo esc_url( $learn_more_url ); ?>" class="button" target="_blank" rel="noopener noreferrer" style="border: none; background-color: transparent;">
452 - <?php echo esc_html( $learn_more_button ); ?>
453 - </a>
454 - </p>
455 200 </div>
456 - <script type="text/javascript">
457 - jQuery(document).ready(function($) {
458 - $('#<?php echo esc_js( $notice_id ); ?>').on('click', '.notice-dismiss', function(e) {
459 - const noticeId = '<?php echo esc_js( $notice_id ); ?>';
460 - $.ajax({
461 - url: ajaxurl,
462 - type: 'POST',
463 - data: {
464 - action: 'themeisle_sdk_dismiss_license_notice',
465 - notice_id: noticeId,
466 - nonce: '<?php echo esc_js( wp_create_nonce( 'themeisle_sdk_dismiss_license_notice' ) ); ?>'
467 - }
468 - });
469 - });
470 - });
471 - </script>
472 201 <?php
473 202
474 203 return false;
475 204 }
476 - // Invalid license key.
477 - if ( 'valid' != $status ) {
205 +
206 + // Expired and soon to expire license.
207 + if ( 'valid' == $status && $this->check_expiration() ) {
478 208 ?>
479 - <div class="error">
209 + <div class="update-nag">
480 210 <p>
481 - <strong><?php echo sprintf( wp_kses_data( $no_valid_string ), esc_attr( $this->product->get_name() . ' ' . $this->product->get_type() ), esc_url( $this->get_api_url() ), esc_url( admin_url( 'options-general.php' ) . '#' . $this->product->get_key() . '_license' ) ); ?> </strong>
211 + <strong>
212 + <?php
213 + echo sprintf(
214 + $expiration_string,
215 + $this->product->get_name() . ' ' . $this->product->get_type(),
216 + '<a href="' . $this->renew_url() . '" target="_blank">' . $this->get_distributor_name() . '</a>'
217 + );
218 + ?>
219 + </strong>
482 220 </p>
483 221 </div>
484 222 <?php
485 -
486 223 return false;
487 224 }
488 225
489 226 return true;
@@ -499,9 +236,9 @@
499 236 if ( '' === $license_data ) {
500 237 return false;
501 238 }
502 239
503 - return isset( $license_data->license ) ? ( 'no_activations_left' == $license_data->license ) : false;
240 + return isset( $license_data->error ) ? ( 'no_activations_left' == $license_data->error ) : false;
504 241
505 242 }
506 243
507 244 /**
@@ -508,9 +245,9 @@
508 245 * Check if the license is about to expire in the next month.
509 246 *
510 247 * @return bool
511 248 */
512 - public function check_expiration() {
249 + function check_expiration() {
513 250 $license_data = get_option( $this->product->get_key() . '_license_data', '' );
514 251 if ( '' === $license_data ) {
515 252 return false;
516 253 }
@@ -528,9 +265,9 @@
528 265 * Return the renew url from the store used.
529 266 *
530 267 * @return string The renew url.
531 268 */
532 - public function renew_url() {
269 + function renew_url() {
533 270 $license_data = get_option( $this->product->get_key() . '_license_data', '' );
534 271 if ( '' === $license_data ) {
535 272 return $this->get_api_url();
536 273 }
@@ -537,9 +274,9 @@
537 274 if ( ! isset( $license_data->download_id ) || ! isset( $license_data->key ) ) {
538 275 return $this->get_api_url();
539 276 }
540 277
541 - return trim( $this->get_api_url(), '/' ) . '/checkout/?edd_license_key=' . $license_data->key . '&download_id=' . $license_data->download_id;
278 + return $this->get_api_url() . '/checkout/?edd_license_key=' . $license_data->key . '&download_id=' . $license_data->download_id;
542 279 }
543 280
544 281 /**
545 282 * Run the license check call.
@@ -544,9 +281,9 @@
544 281 /**
545 282 * Run the license check call.
546 283 */
547 284 public function product_valid() {
548 - if ( false !== ( $license = get_transient( $this->product->get_key() . '_license_data' ) ) ) { //phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.FoundInControlStructure
285 + if ( false !== ( $license = get_transient( $this->product->get_key() . '_license_data' ) ) ) {
549 286 return;
550 287 }
551 288 $license = $this->check_license();
552 289 set_transient( $this->product->get_key() . '_license_data', $license, 12 * HOUR_IN_SECONDS );
@@ -559,149 +296,84 @@
559 296 * @return object The license data.
560 297 */
561 298 public function check_license() {
562 299 $status = $this->get_license_status();
563 - if ( 'not_active' === $status ) {
300 + if ( 'not_active' == $status ) {
564 301 $license_data = new \stdClass();
565 302 $license_data->license = 'not_active';
566 303
567 304 return $license_data;
568 305 }
569 - $license = trim( $this->license_key );
570 -
571 - $response = $this->do_license_process( $license, 'check' );
572 -
306 + $license = trim( $this->license_key );
307 + $api_params = array(
308 + 'edd_action' => 'check_license',
309 + 'license' => $license,
310 + 'item_name' => rawurlencode( $this->product->get_name() ),
311 + 'url' => rawurlencode( home_url() ),
312 + );
313 + // Call the custom API.
314 + $response = wp_remote_get(
315 + add_query_arg( $api_params, $this->get_api_url() ),
316 + array(
317 + 'timeout' => 15,
318 + 'sslverify' => false,
319 + )
320 + );
573 321 if ( is_wp_error( $response ) ) {
574 322 $license_data = new \stdClass();
575 - $license_data->license = 'invalid';
323 + $license_data->license = 'valid';
324 +
576 325 } else {
577 - $license_data = $response;
326 + $license_data = json_decode( wp_remote_retrieve_body( $response ) );
327 + if ( ! is_object( $license_data ) ) {
328 + $license_data = new \stdClass();
329 + $license_data->license = 'valid';
330 + }
578 331 }
579 -
580 332 $license_old = get_option( $this->product->get_key() . '_license_data', '' );
581 - if ( 'valid' === $license_old->license && ( $license_data->license !== $license_old->license ) && $this->failed_checks <= self::$max_failed ) {
333 + if ( 'valid' == $license_old->license && ( $license_data->license != $license_old->license ) ) {
582 334 $this->increment_failed_checks();
583 -
584 - return $license_old;
585 - }
586 -
587 - if ( ! isset( $license_data->key ) ) {
588 - $license_data->key = isset( $license_old->key ) ? $license_old->key : '';
589 - }
590 - $this->reset_failed_checks();
591 -
592 - return $license_data;
593 -
594 - }
595 -
596 - /**
597 - * Do license activation/deactivation.
598 - *
599 - * @param string $license License key.
600 - * @param string $action What do to.
601 - *
602 - * @return bool|\WP_Error
603 - */
604 - public function do_license_process( $license, $action = 'toggle' ) {
605 - if ( strlen( $license ) < 10 ) {
606 - return new \WP_Error( 'themeisle-license-invalid-format', Loader::$labels['licenser']['invalid_msg'] );
607 - }
608 - $status = $this->get_license_status();
609 -
610 - if ( 'valid' === $status && 'activate' === $action ) {
611 - return new \WP_Error( 'themeisle-license-already-active', Loader::$labels['licenser']['already_active'] );
612 - }
613 - if ( 'valid' !== $status && 'deactivate' === $action ) {
614 - return new \WP_Error( 'themeisle-license-already-deactivate', Loader::$labels['licenser']['not_active'] );
615 - }
616 -
617 - if ( 'toggle' === $action ) {
618 - $action = ( 'valid' !== $status ? ( 'activate' ) : ( 'deactivate' ) );
619 - }
620 -
621 - // Call the custom API.
622 - if ( 'check' === $action ) {
623 - $response = $this->safe_get( sprintf( '%slicense/check/%s/%s/%s/%s', Product::API_URL, rawurlencode( $this->product->get_name() ), $license, rawurlencode( home_url() ), Loader::get_cache_token() ) );
624 335 } else {
625 - $response = wp_remote_post(
626 - sprintf( '%slicense/%s/%s/%s', Product::API_URL, $action, rawurlencode( $this->product->get_name() ), $license ),
627 - array(
628 - 'body' => wp_json_encode(
629 - array(
630 - 'url' => rawurlencode( home_url() ),
631 - )
632 - ),
633 - 'headers' => array(
634 - 'Content-Type' => 'application/json',
635 - ),
636 - )
637 - );
336 + $this->reset_failed_checks();
638 337 }
639 338
640 - // make sure the response came back okay.
641 - if ( is_wp_error( $response ) ) {
642 - return new \WP_Error( 'themeisle-license-500', sprintf( Loader::$labels['licenser']['error_notice'], $response->get_error_message() ) );
339 + if ( $this->failed_checks <= self::$max_failed ) {
340 + return $license_old;
643 341 }
644 342
645 - $license_data = json_decode( wp_remote_retrieve_body( $response ) );
646 -
647 - if ( ! is_object( $license_data ) ) {
648 - return new \WP_Error( 'themeisle-license-404', Loader::$labels['licenser']['error_notice2'] );
343 + if ( isset( $license_old->hide_valid ) ) {
344 + $license_data->hide_valid = true;
649 345 }
650 - if ( 'check' === $action ) {
651 - return $license_data;
652 - }
653 346
654 - Loader::clear_cache_token();
655 -
656 - if ( ! isset( $license_data->license ) ) {
657 - $license_data->license = 'invalid';
347 + if ( ! isset( $license_data->key ) ) {
348 + $license_data->key = isset( $license_old->key ) ? $license_old->key : '';
658 349 }
659 350
660 - if ( ! isset( $license_data->key ) ) {
661 - $license_data->key = $license;
351 + if ( isset( $license_old->hide_expiration ) ) {
352 + $license_data->hide_expiration = true;
662 353 }
663 - if ( 'valid' === $license_data->license ) {
664 - $this->reset_failed_checks();
665 - }
666 354
667 - if ( 'deactivate' === $action ) {
668 -
669 - delete_option( $this->product->get_key() . '_license_data' );
670 - delete_option( $this->product->get_key() . '_license_plan' );
671 - delete_transient( $this->product->get_key() . '_license_data' );
672 -
673 - return true;
355 + if ( isset( $license_old->hide_activation ) ) {
356 + $license_data->hide_activation = true;
674 357 }
675 - if ( isset( $license_data->plan ) ) {
676 - update_option( $this->product->get_key() . '_license_plan', $license_data->plan );
677 - }
678 - update_option( $this->product->get_key() . '_license_data', $license_data );
679 - set_transient( $this->product->get_key() . '_license_data', $license_data, 12 * HOUR_IN_SECONDS );
680 - if ( 'activate' === $action && 'valid' !== $license_data->license ) {
681 - return new \WP_Error( 'themeisle-license-invalid', Loader::$labels['licenser']['error_invalid'] );
682 - }
683 358
684 - // Remove the versions transient upon activation so that newer version for rollback can be acquired.
685 - $versions_cache = $this->product->get_cache_key();
686 - delete_transient( $versions_cache );
359 + return $license_data;
687 360
688 - return true;
689 361 }
690 362
691 363 /**
692 - * Reset the failed checks
364 + * Increment the failed checks.
693 365 */
694 - private function reset_failed_checks() {
695 - $this->failed_checks = 1;
366 + private function increment_failed_checks() {
367 + $this->failed_checks ++;
696 368 update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
697 369 }
698 370
699 371 /**
700 - * Increment the failed checks.
372 + * Reset the failed checks
701 373 */
702 - private function increment_failed_checks() {
703 - $this->failed_checks ++;
374 + private function reset_failed_checks() {
375 + $this->failed_checks = 1;
704 376 update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
705 377 }
706 378
707 379 /**
@@ -706,50 +378,64 @@
706 378
707 379 /**
708 380 * Activate the license remotely.
709 381 */
710 - public function process_license() {
382 + function activate_license() {
711 383 // listen for our activate button to be clicked.
712 384 if ( ! isset( $_POST[ $this->product->get_key() . '_btn_trigger' ] ) ) {
713 385 return;
714 386 }
715 - if ( ! isset( $_POST[ $this->product->get_key() . 'nonce_field' ] )
716 - || ! wp_verify_nonce( $_POST[ $this->product->get_key() . 'nonce_field' ], $this->product->get_key() . 'nonce' ) //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
717 - ) {
718 - return;
387 + $status = $this->get_license_status();
388 + // retrieve the license from the database.
389 + $license = $_POST[ $this->product->get_key() . '_license' ];
390 + $api_params = array(
391 + 'license' => $license,
392 + 'item_name' => rawurlencode( $this->product->get_name() ),
393 + 'url' => rawurlencode( home_url() ),
394 + );
395 + if ( 'valid' != $status ) {
396 + // data to send in our API request.
397 + $api_params['edd_action'] = 'activate_license';
398 + } else {
399 + $api_params['edd_action'] = 'deactivate_license';
719 400 }
720 - if ( ! current_user_can( 'manage_options' ) ) {
721 - return;
722 - }
723 - $license = isset( $_POST[ $this->product->get_key() . '_license' ] )
724 - ? sanitize_text_field( $_POST[ $this->product->get_key() . '_license' ] )
725 - : '';
726 -
727 - $response = $this->do_license_process( $license, 'toggle' );
401 + // Call the custom API.
402 + $response = wp_remote_get( add_query_arg( $api_params, $this->get_api_url() ) );
403 + // make sure the response came back okay.
728 404 if ( is_wp_error( $response ) ) {
729 - $this->set_error( $response->get_error_message() );
405 + $license_data = new \stdClass();
406 + $license_data->license = ( 'valid' != $status ) ? 'valid' : 'invalid';
730 407
731 - return;
408 + } else {
409 + $license_data = json_decode( wp_remote_retrieve_body( $response ) );
410 + if ( ! is_object( $license_data ) ) {
411 + $license_data = new \stdClass();
412 + $license_data->license = ( 'valid' != $status ) ? 'valid' : 'invalid';
413 + }
414 + if ( ! isset( $license_data->license ) ) {
415 + $license_data->license = 'invalid';
416 + }
732 417 }
733 - if ( true === $response ) {
734 - $this->set_error( '' );
418 + if ( ! isset( $license_data->key ) ) {
419 + $license_data->key = $license;
735 420 }
736 - }
421 + if ( 'valid' == $license_data->license ) {
422 + $this->reset_failed_checks();
423 + }
737 424
738 - /**
739 - * Set license validation error message.
740 - *
741 - * @param string $message Error message.
742 - */
743 - public function set_error( $message = '' ) {
744 - set_transient( $this->product->get_key() . 'act_err', $message, MINUTE_IN_SECONDS );
425 + if ( isset( $license_data->plan ) ) {
426 + update_option( $this->product->get_key() . '_license_plan', $license_data->plan );
427 + }
745 428
429 + update_option( $this->product->get_key() . '_license_data', $license_data );
430 + set_transient( $this->product->get_key() . '_license_data', $license_data, 12 * HOUR_IN_SECONDS );
431 +
746 432 }
747 433
748 434 /**
749 435 * Load the Themes screen.
750 436 */
751 - public function load_themes_screen() {
437 + function load_themes_screen() {
752 438 add_thickbox();
753 439 add_action( 'admin_notices', array( &$this, 'update_nag' ) );
754 440 }
755 441
@@ -755,29 +441,31 @@
755 441
756 442 /**
757 443 * Alter the nag for themes update.
758 444 */
759 - public function update_nag() {
445 + function update_nag() {
760 446 $theme = wp_get_theme( $this->product->get_slug() );
761 447 $api_response = get_transient( $this->product_key );
762 - if ( false === $api_response || ! isset( $api_response->new_version ) ) {
448 + if ( false === $api_response ) {
763 449 return;
764 450 }
765 451 $update_url = wp_nonce_url( 'update.php?action=upgrade-theme&amp;theme=' . urlencode( $this->product->get_slug() ), 'upgrade-theme_' . $this->product->get_slug() );
766 - $update_message = apply_filters( 'themeisle_sdk_license_update_message', Loader::$labels['licenser']['update_license'] );
452 + $update_message = apply_filters( 'themeisle_sdk_license_update_message', 'Updating this theme will lose any customizations you have made. Cancel to stop, OK to update.' );
767 453 $update_onclick = ' onclick="if ( confirm(\'' . esc_js( $update_message ) . '\') ) {return true;}return false;"';
768 454 if ( version_compare( $this->product->get_version(), $api_response->new_version, '<' ) ) {
769 455 echo '<div id="update-nag">';
770 456 printf(
771 - esc_html( Loader::$labels['licenser']['notice_update'] ),
772 - '<strong>' . esc_attr( $theme->get( 'Name' ) ) . ' ' . esc_attr( $api_response->new_version ) . '</strong>',
773 - '<a href="' . esc_url( sprintf( '%s&TB_iframe=true&amp;width=1024&amp;height=800', $this->product->get_changelog() ) ) . '" class="thickbox" title="' . esc_attr( $theme->get( 'Name' ) ) . '">',
774 - '</a>',
775 - '<a href="' . esc_url( $update_url ) . '" ' . $update_onclick . '>' // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, Already escaped.
457 + '<strong>%1$s %2$s</strong> is available. <a href="%3$s" class="thickbox" title="%4s">Check out what\'s new</a> or <a href="%5$s"%6$s>update now</a>.',
458 + $theme->get( 'Name' ),
459 + $api_response->new_version,
460 + '#TB_inline?width=640&amp;inlineId=' . $this->product->get_version() . '_changelog',
461 + $theme->get( 'Name' ),
462 + $update_url,
463 + $update_onclick
776 464 );
777 465 echo '</div>';
778 - echo '<div id="' . esc_attr( $this->product->get_slug() ) . '_changelog" style="display:none;">';
779 - echo wp_kses_data( wpautop( $api_response->sections['changelog'] ) );
466 + echo '<div id="' . $this->product->get_slug() . '_' . 'changelog" style="display:none;">';
467 + echo wpautop( $api_response->sections['changelog'] );
780 468 echo '</div>';
781 469 }
782 470 }
783 471
@@ -787,24 +475,14 @@
787 475 * @param mixed $value The transient data.
788 476 *
789 477 * @return mixed
790 478 */
791 - public function theme_update_transient( $value ) {
479 + function theme_update_transient( $value ) {
792 480 $update_data = $this->check_for_update();
793 - if ( empty( $value ) ) {
794 - return $value;
481 + if ( $update_data ) {
482 + $value->response[ $this->product->get_slug() ] = $update_data;
795 483 }
796 484
797 - if ( ! isset( $value->response ) ) {
798 - return $value;
799 - }
800 -
801 - if ( ! $update_data ) {
802 - return $value;
803 - }
804 -
805 - $value->response[ $this->product->get_slug() ] = $update_data;
806 -
807 485 return $value;
808 486 }
809 487
810 488 /**
@@ -811,9 +489,9 @@
811 489 * Check for updates
812 490 *
813 491 * @return array|bool Either the update data or false in case of failure.
814 492 */
815 - public function check_for_update() {
493 + function check_for_update() {
816 494 $update_data = get_transient( $this->product_key );
817 495
818 496 if ( false === $update_data ) {
819 497 $failed = false;
@@ -828,9 +506,9 @@
828 506 set_transient( $this->product_key, $data, 30 * MINUTE_IN_SECONDS );
829 507
830 508 return false;
831 509 }
832 - $update_data->sections = isset( $update_data->sections ) ? maybe_unserialize( $update_data->sections ) : null;
510 + $update_data->sections = maybe_unserialize( $update_data->sections );
833 511
834 512 set_transient( $this->product_key, $update_data, 12 * HOUR_IN_SECONDS );
835 513 }
836 514 if ( ! isset( $update_data->new_version ) ) {
@@ -848,21 +526,23 @@
848 526 *
849 527 * @return bool|mixed Update api response.
850 528 */
851 529 private function get_version_data() {
852 -
853 - $response = $this->safe_get(
854 - sprintf(
855 - '%slicense/version/%s/%s/%s/%s',
856 - Product::API_URL,
857 - rawurlencode( $this->product->get_name() ),
858 - ( empty( $this->license_key ) ? 'free' : $this->license_key ),
859 - $this->product->get_version(),
860 - rawurlencode( home_url() )
861 - ),
530 + $api_params = array(
531 + 'edd_action' => 'get_version',
532 + 'version' => $this->product->get_version(),
533 + 'license' => $this->license_key,
534 + 'name' => $this->product->get_name(),
535 + 'slug' => $this->product->get_slug(),
536 + 'author' => $this->get_distributor_name(),
537 + 'url' => rawurlencode( home_url() ),
538 + );
539 + $response = wp_remote_get(
540 + $this->get_api_url(),
862 541 array(
863 - 'timeout' => 15, //phpcs:ignore WordPressVIPMinimum.Performance.RemoteRequestTimeout.timeout_timeout, Inherited by wp_remote_get only, for vip environment we use defaults.
542 + 'timeout' => 15,
864 543 'sslverify' => false,
544 + 'body' => $api_params,
865 545 )
866 546 );
867 547 if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) {
868 548 return false;
@@ -870,17 +550,8 @@
870 550 $update_data = json_decode( wp_remote_retrieve_body( $response ) );
871 551 if ( ! is_object( $update_data ) ) {
872 552 return false;
873 553 }
874 - if ( isset( $update_data->slug ) ) {
875 - $update_data->slug = $this->product->get_slug();
876 - }
877 - if ( isset( $update_data->icons ) ) {
878 - $update_data->icons = (array) $update_data->icons;
879 - }
880 - if ( isset( $update_data->banners ) ) {
881 - $update_data->banners = (array) $update_data->banners;
882 - }
883 554
884 555 return $update_data;
885 556 }
886 557
@@ -886,10 +557,10 @@
886 557
887 558 /**
888 559 * Delete the update transient
889 560 */
890 - public function delete_theme_update_transient() {
891 - return delete_transient( $this->product_key );
561 + function delete_theme_update_transient() {
562 + delete_transient( $this->product_key );
892 563 }
893 564
894 565 /**
895 566 * Check for Updates at the defined API endpoint and modify the update array.
@@ -905,15 +576,10 @@
905 576 return $_transient_data;
906 577 }
907 578 $api_response = $this->api_request();
908 579 if ( false !== $api_response && is_object( $api_response ) && isset( $api_response->new_version ) ) {
909 - if ( ! isset( $api_response->plugin ) ) {
910 - $api_response->plugin = $this->product->get_slug() . '/' . $this->product->get_file();
911 - }
912 580 if ( version_compare( $this->product->get_version(), $api_response->new_version, '<' ) ) {
913 581 $_transient_data->response[ $this->product->get_slug() . '/' . $this->product->get_file() ] = $api_response;
914 - } else {
915 - $_transient_data->no_update[ $this->product->get_slug() . '/' . $this->product->get_file() ] = $api_response;
916 582 }
917 583 }
918 584
919 585 return $_transient_data;
@@ -948,9 +614,9 @@
948 614 *
949 615 * @return object $_data
950 616 */
951 617 public function plugins_api_filter( $_data, $_action = '', $_args = null ) {
952 - if ( ( 'plugin_information' !== $_action ) || ! isset( $_args->slug ) || ( $_args->slug !== $this->product->get_slug() ) ) {
618 + if ( ( 'plugin_information' != $_action ) || ! isset( $_args->slug ) || ( $_args->slug != $this->product->get_slug() ) ) {
953 619 return $_data;
954 620 }
955 621 $api_response = $this->api_request();
956 622 if ( false !== $api_response ) {
@@ -967,9 +633,9 @@
967 633 * @param string $url Url to check.
968 634 *
969 635 * @return array $array
970 636 */
971 - public function http_request_args( $args, $url ) {
637 + function http_request_args( $args, $url ) {
972 638 // If it is an https request and we are performing a package download, disable ssl verification.
973 639 if ( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) {
974 640 $args['sslverify'] = false;
975 641 }
@@ -985,9 +651,9 @@
985 651 * @return bool Should we load the module?
986 652 */
987 653 public function can_load( $product ) {
988 654
989 - if ( ! $product->requires_license() ) {
655 + if ( $product->is_wordpress_available() ) {
990 656 return false;
991 657 }
992 658
993 659 return ( apply_filters( $product->get_key() . '_enable_licenser', true ) === true );
@@ -1010,85 +676,29 @@
1010 676 if ( $this->product->requires_license() ) {
1011 677 $this->failed_checks = intval( get_option( $this->product->get_key() . '_failed_checks', 0 ) );
1012 678 $this->register_license_hooks();
1013 679 }
1014 - if ( ! self::$globals_loaded ) {
1015 - add_filter( 'themeisle_sdk_license/status', [ __CLASS__, 'status' ], 999, 1 );
1016 - add_filter( 'themeisle_sdk_license/is-valid', [ __CLASS__, 'is_valid' ], 999, 1 );
1017 - add_filter( 'themeisle_sdk_license/plan', [ __CLASS__, 'plan' ], 999, 1 );
1018 - add_filter( 'themeisle_sdk_license/key', [ __CLASS__, 'key' ], 999, 1 );
1019 - $globals_loaded = true;
1020 - }
1021 - $namespace = apply_filters( 'themesle_sdk_namespace_' . md5( $product->get_basefile() ), false );
1022 680
1023 - if ( false !== $namespace ) {
1024 - $this->namespace = $namespace;
1025 - add_filter( 'themeisle_sdk_license_process_' . $namespace, [ $this, 'do_license_process' ], 10, 2 );
1026 - add_filter( 'product_' . $namespace . '_license_status', [ $this, 'get_license_status' ], PHP_INT_MAX );
1027 - add_filter( 'product_' . $namespace . '_license_key', [ $this->product, 'get_license' ] );
1028 - add_filter( 'product_' . $namespace . '_license_plan', [ $this, 'get_plan' ], PHP_INT_MAX );
1029 - if ( defined( 'WP_CLI' ) && WP_CLI ) {
1030 - \WP_CLI::add_command( $namespace . ' activate', [ $this, 'cli_activate' ] );
1031 - \WP_CLI::add_command( $namespace . ' deactivate', [ $this, 'cli_deactivate' ] );
1032 - \WP_CLI::add_command( $namespace . ' is-active', [ $this, 'cli_is_active' ] );
1033 - }
1034 - }
1035 -
1036 - add_action( 'admin_head', [ $this, 'auto_activate' ] );
1037 681 if ( $this->product->is_plugin() ) {
1038 - if ( ! $product->is_wordpress_available() ) {
1039 - add_filter(
1040 - 'pre_set_site_transient_update_plugins',
1041 - [
1042 - $this,
1043 - 'pre_set_site_transient_update_plugins_filter',
1044 - ]
1045 - );
1046 - add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
1047 - add_filter( //phpcs:ignore WordPressVIPMinimum.Hooks.RestrictedHooks.http_request_args
1048 - 'http_request_args',
1049 - array(
1050 - $this,
1051 - 'http_request_args',
1052 - ),
1053 - 10,
1054 - 2
1055 - );
1056 - if ( ! self::is_valid( $product->get_basefile() ) ) {
1057 - add_filter(
1058 - 'plugin_action_links_' . plugin_basename( $product->get_basefile() ),
1059 - function ( $actions ) {
1060 - if ( $this->get_license_status( true ) !== self::STATUS_ACTIVE_EXPIRED ) {
1061 - return $actions;
1062 - }
1063 - $new_actions['deactivate'] = $actions['deactivate'];
1064 - $new_actions['renew_link'] = '<a style="color:#d63638" href="' . esc_url( $this->renew_url() ) . '" target="_blank" rel="external noopener noreferrer">' . esc_html( Loader::$labels['licenser']['renew_cta'] ) . '</a>';
682 + add_filter(
683 + 'pre_set_site_transient_update_plugins',
684 + [
685 + $this,
686 + 'pre_set_site_transient_update_plugins_filter',
687 + ]
688 + );
689 + add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
690 + add_filter( 'http_request_args', array( $this, 'http_request_args' ), 10, 2 );
1065 691
1066 - return $new_actions;
1067 - }
1068 - );
1069 - }
1070 - }
1071 -
1072 692 return $this;
1073 693 }
1074 694 if ( $this->product->is_theme() ) {
1075 - if ( ! $product->is_wordpress_available() ) {
1076 - add_filter( 'site_transient_update_themes', array( &$this, 'theme_update_transient' ) );
1077 - add_action( 'delete_site_transient_update_themes', array( &$this, 'delete_theme_update_transient' ) );
1078 - add_action( 'load-update-core.php', array( &$this, 'delete_theme_update_transient' ) );
1079 - add_action( 'load-themes.php', array( &$this, 'delete_theme_update_transient' ) );
1080 - add_action( 'load-themes.php', array( &$this, 'load_themes_screen' ) );
1081 - add_filter( //phpcs:ignore WordPressVIPMinimum.Hooks.RestrictedHooks.http_request_args
1082 - 'http_request_args',
1083 - array(
1084 - $this,
1085 - 'disable_wporg_update',
1086 - ),
1087 - 5,
1088 - 2
1089 - );
1090 - }
695 + add_filter( 'site_transient_update_themes', array( &$this, 'theme_update_transient' ) );
696 + add_filter( 'delete_site_transient_update_themes', array( &$this, 'delete_theme_update_transient' ) );
697 + add_action( 'load-update-core.php', array( &$this, 'delete_theme_update_transient' ) );
698 + add_action( 'load-themes.php', array( &$this, 'delete_theme_update_transient' ) );
699 + add_action( 'load-themes.php', array( &$this, 'load_themes_screen' ) );
700 + add_filter( 'http_request_args', array( $this, 'disable_wporg_update' ), 5, 2 );
1091 701
1092 702 return $this;
1093 703
1094 704 }
@@ -1100,180 +710,10 @@
1100 710 * Register license fields for the products.
1101 711 */
1102 712 public function register_license_hooks() {
1103 713 add_action( 'admin_init', array( $this, 'register_settings' ) );
1104 - add_action( 'admin_init', array( $this, 'process_license' ) );
714 + add_action( 'admin_init', array( $this, 'activate_license' ) );
1105 715 add_action( 'admin_init', array( $this, 'product_valid' ), 99999999 );
1106 716 add_action( 'admin_notices', array( $this, 'show_notice' ) );
1107 717 add_filter( $this->product->get_key() . '_license_status', array( $this, 'get_license_status' ) );
1108 - add_action( 'wp_ajax_themeisle_sdk_dismiss_license_notice', array( $this, 'dismiss_license_notice' ) );
1109 - }
1110 -
1111 - /**
1112 - * Handle AJAX request to dismiss the license notice.
1113 - */
1114 - public function dismiss_license_notice() {
1115 - if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'themeisle_sdk_dismiss_license_notice' ) ) {
1116 - wp_send_json_error( 'Invalid nonce' );
1117 - }
1118 -
1119 - if ( ! current_user_can( 'manage_options' ) ) {
1120 - wp_send_json_error( 'Insufficient permissions' );
1121 - }
1122 -
1123 - $notice_id = isset( $_POST['notice_id'] ) ? sanitize_text_field( $_POST['notice_id'] ) : '';
1124 -
1125 - if ( empty( $notice_id ) ) {
1126 - wp_send_json_error( 'Missing notice ID' );
1127 - }
1128 -
1129 - // Save the dismissal option.
1130 - $dismiss_option_key = $notice_id . '_dismissed';
1131 - update_option( $dismiss_option_key, true );
1132 -
1133 - wp_send_json_success();
1134 - }
1135 -
1136 - /**
1137 - * Check license on filesystem.
1138 - *
1139 - * @return mixed License key.
1140 - */
1141 - public function get_file_license() {
1142 -
1143 - $license_file = dirname( $this->product->get_basefile() ) . '/license.json';
1144 -
1145 - global $wp_filesystem;
1146 - if ( ! is_file( $license_file ) ) {
1147 - return false;
1148 - }
1149 -
1150 - require_once ABSPATH . '/wp-admin/includes/file.php';
1151 - \WP_Filesystem();
1152 - $content = json_decode( $wp_filesystem->get_contents( $license_file ) );
1153 - if ( ! is_object( $content ) ) {
1154 - return false;
1155 - }
1156 - if ( ! isset( $content->key ) ) {
1157 - return false;
1158 - }
1159 -
1160 - return $content->key;
1161 - }
1162 -
1163 - /**
1164 - * Run license activation on plugin activate.
1165 - */
1166 - public function auto_activate() {
1167 - $status = $this->get_license_status();
1168 - if ( 'not_active' !== $status ) {
1169 - return false;
1170 - }
1171 -
1172 - if ( ! empty( $this->namespace ) ) {
1173 - $license_key = apply_filters( 'product_' . $this->namespace . '_license_key_constant', '' );
1174 - }
1175 -
1176 - if ( empty( $license_key ) ) {
1177 - $license_key = $this->get_file_license();
1178 - }
1179 - if ( empty( $license_key ) ) {
1180 - return;
1181 - }
1182 -
1183 -
1184 - $this->license_local = $license_key;
1185 - $lock_key = $this->product->get_key() . '_autoactivated';
1186 -
1187 - if ( 'yes' === get_option( $lock_key, '' ) ) {
1188 - return;
1189 - }
1190 - if ( 'yes' === get_transient( $lock_key ) ) {
1191 - return;
1192 - }
1193 - $response = $this->do_license_process( $license_key, 'activate' );
1194 -
1195 - set_transient( $lock_key, 'yes', 6 * HOUR_IN_SECONDS );
1196 -
1197 - if ( apply_filters( $this->product->get_key() . '_hide_license_notices', false ) ) {
1198 - return;
1199 - }
1200 -
1201 - if ( true === $response ) {
1202 - add_action( 'admin_notices', [ $this, 'autoactivate_notice' ] );
1203 - }
1204 - }
1205 -
1206 - /**
1207 - * Show auto-activate notice.
1208 - */
1209 - public function autoactivate_notice() {
1210 - ?>
1211 - <div class="notice notice-success is-dismissible">
1212 - <p><?php echo sprintf( esc_html( Loader::$labels['licenser']['autoactivate_notice'] ), '<strong>' . esc_attr( $this->product->get_name() ) . '</strong>', '<strong>' . esc_attr( str_repeat( '*', 20 ) . substr( $this->license_local, - 10 ) ) . '</strong>' ); ?></p>
1213 - </div>
1214 - <?php
1215 - }
1216 -
1217 - /**
1218 - * Activate product license on this site.
1219 - *
1220 - * ## OPTIONS
1221 - *
1222 - * @param array $args Command args.
1223 - *
1224 - * [<license-key>]
1225 - * : Product license key.
1226 - */
1227 - public function cli_activate( $args ) {
1228 - $license_key = isset( $args[0] ) ? trim( $args[0] ) : '';
1229 - $response = $this->do_license_process( $license_key, 'activate' );
1230 - if ( true !== $response ) {
1231 - \WP_CLI::error( $response->get_error_message() );
1232 -
1233 - return;
1234 - }
1235 -
1236 - \WP_CLI::success( 'Product successfully activated.' );
1237 - }
1238 -
1239 - /**
1240 - * Deactivate product license on this site.
1241 - *
1242 - * @param array $args Command args.
1243 - *
1244 - * ## OPTIONS
1245 - *
1246 - * [<license-key>]
1247 - * : Product license key.
1248 - */
1249 - public function cli_deactivate( $args ) {
1250 - $license_key = isset( $args[0] ) ? trim( $args[0] ) : '';
1251 - $response = $this->do_license_process( $license_key, 'deactivate' );
1252 - if ( true !== $response ) {
1253 - \WP_CLI::error( $response->get_error_message() );
1254 -
1255 - return;
1256 - }
1257 -
1258 - \WP_CLI::success( 'Product successfully deactivated.' );
1259 - }
1260 -
1261 - /**
1262 - * Checks if product has license activated.
1263 - *
1264 - * @param array $args Command args.
1265 - *
1266 - * @subcommand is-active
1267 - */
1268 - public function cli_is_active( $args ) {
1269 -
1270 - $status = $this->get_license_status();
1271 - if ( 'valid' === $status ) {
1272 - \WP_CLI::halt( 0 );
1273 -
1274 - return;
1275 - }
1276 -
1277 - \WP_CLI::halt( 1 );
1278 718 }
1279 719 }