PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.4.9
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.4.9
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 +147 -333 3.10.143.4.9 View file →
@@ -23,33 +23,16 @@
23 23 /**
24 24 * Licenser module for ThemeIsle SDK.
25 25 */
26 26 class Licenser extends Abstract_Module {
27 +
27 28 /**
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 29 * Number of max failed checks before showing the license message.
41 30 *
42 31 * @var int $max_failed Maximum failed checks allowed before show the notice
43 32 */
44 - private static $max_failed = 1;
33 + private static $max_failed = 5;
45 34 /**
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 35 * License key string.
53 36 *
54 37 * @var string $license_key The license key string
55 38 */
@@ -78,14 +61,8 @@
78 61 *
79 62 * @var null Local license object.
80 63 */
81 64 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 65
89 66 /**
90 67 * Disable wporg updates for premium products.
91 68 *
@@ -93,9 +70,9 @@
93 70 * @param string $url The api url.
94 71 *
95 72 * @return mixed List of themes to check for update.
96 73 */
97 - public function disable_wporg_update( $r, $url ) {
74 + function disable_wporg_update( $r, $url ) {
98 75
99 76 if ( 0 !== strpos( $url, 'https://api.wordpress.org/themes/update-check/' ) ) {
100 77 return $r;
101 78 }
@@ -105,9 +82,9 @@
105 82
106 83 unset( $themes->themes->{$this->product->get_slug()} );
107 84
108 85 // Encode the updated JSON response.
109 - $r['body']['themes'] = wp_json_encode( $themes );
86 + $r['body']['themes'] = json_encode( $themes );
110 87
111 88 return $r;
112 89 }
113 90
@@ -137,13 +114,13 @@
137 114 public function license_view() {
138 115 $status = $this->get_license_status();
139 116 $value = $this->license_key;
140 117
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']['deactivateactivate'] );
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'] );
118 + $activate_string = apply_filters( $this->product->get_key() . '_lc_activate_string', 'Activate' );
119 + $deactivate_string = apply_filters( $this->product->get_key() . '_lc_deactivate_string', 'Deactivate' );
120 + $valid_string = apply_filters( $this->product->get_key() . '_lc_valid_string', 'Valid' );
121 + $invalid_string = apply_filters( $this->product->get_key() . '_lc_invalid_string', 'Invalid' );
122 + $license_message = apply_filters( $this->product->get_key() . '_lc_license_message', 'Enter your license from %s purchase history in order to get %s updates' );
146 123 $error_message = $this->get_error();
147 124 ?>
148 125 <style type="text/css">
149 126 input.themeisle-sdk-text-input-valid {
@@ -194,20 +171,20 @@
194 171 </style>
195 172 <?php
196 173 echo sprintf(
197 174 '<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() ) ) : '' ),
175 + ( ( 'valid' === $status ) ? sprintf( '<input type="hidden" value="%s" name="%s_license" />', $value, $this->product->get_key() ) : '' ),
199 176 ( ( '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
177 + $this->product->get_key(),
178 + ( ( 'valid' === $status ) ? $this->product->get_key() . '_mask' : $this->product->get_key() ),
179 + ( ( 'valid' === $status ) ? ( str_repeat( '*', 30 ) . substr( $value, - 5 ) ) : $value ),
180 + ( 'valid' === $status ? 'themeisle-sdk-license-deactivate-cta' : 'themeisle-sdk-license-activate-cta' ),
181 + ( 'valid' === $status ? $valid_string : $invalid_string ),
182 + $this->product->get_key(),
183 + ( 'valid' === $status ? $deactivate_string : $activate_string ),
184 + sprintf( $license_message, '<a href="' . $this->get_api_url() . '">' . $this->get_distributor_name() . '</a> ', $this->product->get_type() ),
185 + empty( $error_message ) ? '' : sprintf( '<p style="color:#dd3d36">%s</p>', $error_message )
186 + );
210 187
211 188 }
212 189
213 190 /**
@@ -232,104 +209,22 @@
232 209 return ( 'valid' === $status && isset( $license_data->is_expired ) && 'yes' === $license_data->is_expired ) ? 'active_expired' : $status;
233 210 }
234 211
235 212 /**
236 - * Check status.
213 + * License price id.
237 214 *
238 - * @param string $product_file Product basefile.
239 - *
240 - * @return string Status license.
215 + * @return int License plan.
241 216 */
242 - public static function status( $product_file ) {
243 - $product = Product::get( $product_file );
244 - if ( ! $product->requires_license() ) {
245 - return self::STATUS_VALID;
217 + public function get_plan() {
218 + $license_data = get_option( $this->product->get_key() . '_license_data', '' );
219 + if ( ! isset( $license_data->price_id ) ) {
220 + return -1;
246 221 }
247 - $license_data = self::get_license_data( $product->get_key() );
248 222
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;
223 + return (int) $license_data->price_id;
252 224 }
253 225
254 226 /**
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 227 * Get remote api url.
333 228 *
334 229 * @return string Remote api url.
335 230 */
@@ -347,9 +242,9 @@
347 242 * @return string Remote api url.
348 243 */
349 244 public function get_distributor_name() {
350 245 if ( $this->is_from_partner( $this->product ) ) {
351 - return 'Themeisle';
246 + return 'ThemeIsle';
352 247 }
353 248
354 249 return $this->product->get_store_name();
355 250 }
@@ -354,22 +249,13 @@
354 249 return $this->product->get_store_name();
355 250 }
356 251
357 252 /**
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 253 * Show the admin notice regarding the license status.
368 254 *
369 255 * @return bool Should we show the notice ?
370 256 */
371 - public function show_notice() {
257 + function show_notice() {
372 258 if ( ! is_admin() ) {
373 259 return false;
374 260 }
375 261
@@ -377,11 +263,11 @@
377 263 return false;
378 264 }
379 265
380 266 $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_string', sprintf( Loader::$labels['licenser']['expired'], '%s', '<a href="%s" target="_blank">', '</a>' ) );
267 + $no_activations_string = apply_filters( $this->product->get_key() . '_lc_no_activations_string', 'No more activations left for %s. You need to upgrade your plan in order to use %s on more websites. If you need assistance, please get in touch with %s staff.' );
268 + $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>. ' );
269 + $expired_license_string = apply_filters( $this->product->get_key() . '_lc_expired_string', 'Your %s License Key has expired. In order to continue receiving support and software updates you must <a href="%s" target="_blank">renew</a> your license key.' );
384 270 // No activations left for this license.
385 271 if ( 'valid' != $status && $this->check_activation() ) {
386 272 ?>
387 273 <div class="error">
@@ -387,12 +273,12 @@
387 273 <div class="error">
388 274 <p><strong>
389 275 <?php
390 276 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>'
277 + $no_activations_string,
278 + $this->product->get_name(),
279 + $this->product->get_name(),
280 + '<a href="' . $this->get_api_url() . '" target="_blank">' . $this->get_distributor_name() . '</a>'
395 281 );
396 282 ?>
397 283 </strong>
398 284 </p>
@@ -405,9 +291,9 @@
405 291 if ( 'active_expired' === $status ) {
406 292 ?>
407 293 <div class="error">
408 294 <p>
409 - <strong><?php echo sprintf( wp_kses_data( $expired_license_string ), esc_attr( $this->product->get_name() . ' ' . $this->product->get_type() ), esc_url( $this->get_api_url() . '?license=' . $this->license_key ) ); ?> </strong>
295 + <strong><?php echo sprintf( $expired_license_string, $this->product->get_name() . ' ' . $this->product->get_type(), $this->get_api_url() . '?license=' . $this->license_key ); ?> </strong>
410 296 </p>
411 297 </div>
412 298 <?php
413 299
@@ -417,9 +303,9 @@
417 303 if ( 'valid' != $status ) {
418 304 ?>
419 305 <div class="error">
420 306 <p>
421 - <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>
307 + <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() . '_license' ); ?> </strong>
422 308 </p>
423 309 </div>
424 310 <?php
425 311
@@ -448,9 +334,9 @@
448 334 * Check if the license is about to expire in the next month.
449 335 *
450 336 * @return bool
451 337 */
452 - public function check_expiration() {
338 + function check_expiration() {
453 339 $license_data = get_option( $this->product->get_key() . '_license_data', '' );
454 340 if ( '' === $license_data ) {
455 341 return false;
456 342 }
@@ -468,9 +354,9 @@
468 354 * Return the renew url from the store used.
469 355 *
470 356 * @return string The renew url.
471 357 */
472 - public function renew_url() {
358 + function renew_url() {
473 359 $license_data = get_option( $this->product->get_key() . '_license_data', '' );
474 360 if ( '' === $license_data ) {
475 361 return $this->get_api_url();
476 362 }
@@ -477,9 +363,9 @@
477 363 if ( ! isset( $license_data->download_id ) || ! isset( $license_data->key ) ) {
478 364 return $this->get_api_url();
479 365 }
480 366
481 - return trim( $this->get_api_url(), '/' ) . '/checkout/?edd_license_key=' . $license_data->key . '&download_id=' . $license_data->download_id;
367 + return $this->get_api_url() . '/checkout/?edd_license_key=' . $license_data->key . '&download_id=' . $license_data->download_id;
482 368 }
483 369
484 370 /**
485 371 * Run the license check call.
@@ -484,9 +370,9 @@
484 370 /**
485 371 * Run the license check call.
486 372 */
487 373 public function product_valid() {
488 - if ( false !== ( $license = get_transient( $this->product->get_key() . '_license_data' ) ) ) { //phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.FoundInControlStructure
374 + if ( false !== ( $license = get_transient( $this->product->get_key() . '_license_data' ) ) ) {
489 375 return;
490 376 }
491 377 $license = $this->check_license();
492 378 set_transient( $this->product->get_key() . '_license_data', $license, 12 * HOUR_IN_SECONDS );
@@ -511,17 +397,22 @@
511 397 $response = $this->do_license_process( $license, 'check' );
512 398
513 399 if ( is_wp_error( $response ) ) {
514 400 $license_data = new \stdClass();
515 - $license_data->license = 'invalid';
401 + $license_data->license = 'valid';
516 402 } else {
517 403 $license_data = $response;
518 404 }
519 405
520 406 $license_old = get_option( $this->product->get_key() . '_license_data', '' );
521 - if ( 'valid' === $license_old->license && ( $license_data->license !== $license_old->license ) && $this->failed_checks <= self::$max_failed ) {
407 +
408 + if ( 'valid' === $license_old->license && ( $license_data->license !== $license_old->license ) ) {
522 409 $this->increment_failed_checks();
410 + } else {
411 + $this->reset_failed_checks();
412 + }
523 413
414 + if ( $this->failed_checks <= self::$max_failed ) {
524 415 return $license_old;
525 416 }
526 417
527 418 if ( ! isset( $license_data->key ) ) {
@@ -526,9 +417,8 @@
526 417
527 418 if ( ! isset( $license_data->key ) ) {
528 419 $license_data->key = isset( $license_old->key ) ? $license_old->key : '';
529 420 }
530 - $this->reset_failed_checks();
531 421
532 422 return $license_data;
533 423
534 424 }
@@ -533,8 +423,44 @@
533 423
534 424 }
535 425
536 426 /**
427 + * Increment the failed checks.
428 + */
429 + private function increment_failed_checks() {
430 + $this->failed_checks ++;
431 + update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
432 + }
433 +
434 + /**
435 + * Reset the failed checks
436 + */
437 + private function reset_failed_checks() {
438 + $this->failed_checks = 1;
439 + update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
440 + }
441 +
442 + /**
443 + * Set license validation error message.
444 + *
445 + * @param string $message Error message.
446 + */
447 + public function set_error( $message = '' ) {
448 + set_transient( $this->product->get_key() . 'act_err', $message, MINUTE_IN_SECONDS );
449 +
450 + return;
451 + }
452 +
453 + /**
454 + * Return the last error message.
455 + *
456 + * @return mixed Error message.
457 + */
458 + public function get_error() {
459 + return get_transient( $this->product->get_key() . 'act_err' );
460 + }
461 +
462 + /**
537 463 * Do license activation/deactivation.
538 464 *
539 465 * @param string $license License key.
540 466 * @param string $action What do to.
@@ -542,17 +468,17 @@
542 468 * @return bool|\WP_Error
543 469 */
544 470 public function do_license_process( $license, $action = 'toggle' ) {
545 471 if ( strlen( $license ) < 10 ) {
546 - return new \WP_Error( 'themeisle-license-invalid-format', Loader::$labels['licenser']['invalid_msg'] );
472 + return new \WP_Error( 'themeisle-license-invalid-format', 'Invalid license.' );
547 473 }
548 474 $status = $this->get_license_status();
549 475
550 476 if ( 'valid' === $status && 'activate' === $action ) {
551 - return new \WP_Error( 'themeisle-license-already-active', Loader::$labels['licenser']['already_active'] );
477 + return new \WP_Error( 'themeisle-license-already-active', 'License is already active.' );
552 478 }
553 479 if ( 'valid' !== $status && 'deactivate' === $action ) {
554 - return new \WP_Error( 'themeisle-license-already-deactivate', Loader::$labels['licenser']['not_active'] );
480 + return new \WP_Error( 'themeisle-license-already-deactivate', 'License not active.' );
555 481 }
556 482
557 483 if ( 'toggle' === $action ) {
558 484 $action = ( 'valid' !== $status ? ( 'activate' ) : ( 'deactivate' ) );
@@ -559,9 +485,9 @@
559 485 }
560 486
561 487 // Call the custom API.
562 488 if ( 'check' === $action ) {
563 - $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() ) );
489 + $response = wp_remote_get( sprintf( '%slicense/check/%s/%s/%s/%s', Product::API_URL, rawurlencode( $this->product->get_name() ), $license, rawurlencode( home_url() ), Loader::get_cache_token() ) );
564 490 } else {
565 491 $response = wp_remote_post(
566 492 sprintf( '%slicense/%s/%s/%s', Product::API_URL, $action, rawurlencode( $this->product->get_name() ), $license ),
567 493 array(
@@ -578,15 +504,15 @@
578 504 }
579 505
580 506 // make sure the response came back okay.
581 507 if ( is_wp_error( $response ) ) {
582 - return new \WP_Error( 'themeisle-license-500', sprintf( Loader::$labels['licenser']['error_notice'], $response->get_error_message() ) );
508 + return new \WP_Error( 'themeisle-license-500', sprintf( 'ERROR: Failed to connect to the license service. Please try again later. Reason: %s', $response->get_error_message() ) );
583 509 }
584 510
585 511 $license_data = json_decode( wp_remote_retrieve_body( $response ) );
586 512
587 513 if ( ! is_object( $license_data ) ) {
588 - return new \WP_Error( 'themeisle-license-404', Loader::$labels['licenser']['error_notice2'] );
514 + return new \WP_Error( 'themeisle-license-404', 'ERROR: Failed to validate license. Please try again in one minute.' );
589 515 }
590 516 if ( 'check' === $action ) {
591 517 return $license_data;
592 518 }
@@ -617,54 +543,23 @@
617 543 }
618 544 update_option( $this->product->get_key() . '_license_data', $license_data );
619 545 set_transient( $this->product->get_key() . '_license_data', $license_data, 12 * HOUR_IN_SECONDS );
620 546 if ( 'activate' === $action && 'valid' !== $license_data->license ) {
621 - return new \WP_Error( 'themeisle-license-invalid', Loader::$labels['licenser']['error_invalid'] );
547 + return new \WP_Error( 'themeisle-license-invalid', 'ERROR: Invalid license provided.' );
622 548 }
623 549
624 - // Remove the versions transient upon activation so that newer version for rollback can be acquired.
625 - $versions_cache = $this->product->get_cache_key();
626 - delete_transient( $versions_cache );
627 -
628 550 return true;
629 551 }
630 552
631 553 /**
632 - * Reset the failed checks
633 - */
634 - private function reset_failed_checks() {
635 - $this->failed_checks = 1;
636 - update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
637 - }
638 -
639 - /**
640 - * Increment the failed checks.
641 - */
642 - private function increment_failed_checks() {
643 - $this->failed_checks ++;
644 - update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
645 - }
646 -
647 - /**
648 554 * Activate the license remotely.
649 555 */
650 - public function process_license() {
556 + function process_license() {
651 557 // listen for our activate button to be clicked.
652 558 if ( ! isset( $_POST[ $this->product->get_key() . '_btn_trigger' ] ) ) {
653 559 return;
654 560 }
655 - if ( ! isset( $_POST[ $this->product->get_key() . 'nonce_field' ] )
656 - || ! wp_verify_nonce( $_POST[ $this->product->get_key() . 'nonce_field' ], $this->product->get_key() . 'nonce' ) //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
657 - ) {
658 - return;
659 - }
660 - if ( ! current_user_can( 'manage_options' ) ) {
661 - return;
662 - }
663 - $license = isset( $_POST[ $this->product->get_key() . '_license' ] )
664 - ? sanitize_text_field( $_POST[ $this->product->get_key() . '_license' ] )
665 - : '';
666 -
561 + $license = $_POST[ $this->product->get_key() . '_license' ];
667 562 $response = $this->do_license_process( $license, 'toggle' );
668 563 if ( is_wp_error( $response ) ) {
669 564 $this->set_error( $response->get_error_message() );
670 565
@@ -672,24 +567,16 @@
672 567 }
673 568 if ( true === $response ) {
674 569 $this->set_error( '' );
675 570 }
676 - }
677 571
678 - /**
679 - * Set license validation error message.
680 - *
681 - * @param string $message Error message.
682 - */
683 - public function set_error( $message = '' ) {
684 - set_transient( $this->product->get_key() . 'act_err', $message, MINUTE_IN_SECONDS );
685 -
572 + return;
686 573 }
687 574
688 575 /**
689 576 * Load the Themes screen.
690 577 */
691 - public function load_themes_screen() {
578 + function load_themes_screen() {
692 579 add_thickbox();
693 580 add_action( 'admin_notices', array( &$this, 'update_nag' ) );
694 581 }
695 582
@@ -695,9 +582,9 @@
695 582
696 583 /**
697 584 * Alter the nag for themes update.
698 585 */
699 - public function update_nag() {
586 + function update_nag() {
700 587 $theme = wp_get_theme( $this->product->get_slug() );
701 588 $api_response = get_transient( $this->product_key );
702 589 if ( false === $api_response || ! isset( $api_response->new_version ) ) {
703 590 return;
@@ -702,22 +589,24 @@
702 589 if ( false === $api_response || ! isset( $api_response->new_version ) ) {
703 590 return;
704 591 }
705 592 $update_url = wp_nonce_url( 'update.php?action=upgrade-theme&amp;theme=' . urlencode( $this->product->get_slug() ), 'upgrade-theme_' . $this->product->get_slug() );
706 - $update_message = apply_filters( 'themeisle_sdk_license_update_message', Loader::$labels['licenser']['update_license'] );
593 + $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.' );
707 594 $update_onclick = ' onclick="if ( confirm(\'' . esc_js( $update_message ) . '\') ) {return true;}return false;"';
708 595 if ( version_compare( $this->product->get_version(), $api_response->new_version, '<' ) ) {
709 596 echo '<div id="update-nag">';
710 597 printf(
711 - esc_html( Loader::$labels['licenser']['notice_update'] ),
712 - '<strong>' . esc_attr( $theme->get( 'Name' ) ) . ' ' . esc_attr( $api_response->new_version ) . '</strong>',
713 - '<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' ) ) . '">',
714 - '</a>',
715 - '<a href="' . esc_url( $update_url ) . '" ' . $update_onclick . '>' // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, Already escaped.
598 + '<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>.',
599 + $theme->get( 'Name' ),
600 + $api_response->new_version,
601 + sprintf( '%s&TB_iframe=true&amp;width=1024&amp;height=800', $this->product->get_changelog() ),
602 + $theme->get( 'Name' ),
603 + $update_url,
604 + $update_onclick
716 605 );
717 606 echo '</div>';
718 - echo '<div id="' . esc_attr( $this->product->get_slug() ) . '_changelog" style="display:none;">';
719 - echo wp_kses_data( wpautop( $api_response->sections['changelog'] ) );
607 + echo '<div id="' . $this->product->get_slug() . '_' . 'changelog" style="display:none;">';
608 + echo wpautop( $api_response->sections['changelog'] );
720 609 echo '</div>';
721 610 }
722 611 }
723 612
@@ -727,24 +616,14 @@
727 616 * @param mixed $value The transient data.
728 617 *
729 618 * @return mixed
730 619 */
731 - public function theme_update_transient( $value ) {
620 + function theme_update_transient( $value ) {
732 621 $update_data = $this->check_for_update();
733 - if ( empty( $value ) ) {
734 - return $value;
622 + if ( $update_data ) {
623 + $value->response[ $this->product->get_slug() ] = $update_data;
735 624 }
736 625
737 - if ( ! isset( $value->response ) ) {
738 - return $value;
739 - }
740 -
741 - if ( ! $update_data ) {
742 - return $value;
743 - }
744 -
745 - $value->response[ $this->product->get_slug() ] = $update_data;
746 -
747 626 return $value;
748 627 }
749 628
750 629 /**
@@ -751,9 +630,9 @@
751 630 * Check for updates
752 631 *
753 632 * @return array|bool Either the update data or false in case of failure.
754 633 */
755 - public function check_for_update() {
634 + function check_for_update() {
756 635 $update_data = get_transient( $this->product_key );
757 636
758 637 if ( false === $update_data ) {
759 638 $failed = false;
@@ -789,9 +668,9 @@
789 668 * @return bool|mixed Update api response.
790 669 */
791 670 private function get_version_data() {
792 671
793 - $response = $this->safe_get(
672 + $response = wp_remote_get(
794 673 sprintf(
795 674 '%slicense/version/%s/%s/%s/%s',
796 675 Product::API_URL,
797 676 rawurlencode( $this->product->get_name() ),
@@ -799,9 +678,9 @@
799 678 $this->product->get_version(),
800 679 rawurlencode( home_url() )
801 680 ),
802 681 array(
803 - 'timeout' => 15, //phpcs:ignore WordPressVIPMinimum.Performance.RemoteRequestTimeout.timeout_timeout, Inherited by wp_remote_get only, for vip environment we use defaults.
682 + 'timeout' => 15,
804 683 'sslverify' => false,
805 684 )
806 685 );
807 686 if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) {
@@ -826,10 +705,10 @@
826 705
827 706 /**
828 707 * Delete the update transient
829 708 */
830 - public function delete_theme_update_transient() {
831 - return delete_transient( $this->product_key );
709 + function delete_theme_update_transient() {
710 + delete_transient( $this->product_key );
832 711 }
833 712
834 713 /**
835 714 * Check for Updates at the defined API endpoint and modify the update array.
@@ -845,15 +724,10 @@
845 724 return $_transient_data;
846 725 }
847 726 $api_response = $this->api_request();
848 727 if ( false !== $api_response && is_object( $api_response ) && isset( $api_response->new_version ) ) {
849 - if ( ! isset( $api_response->plugin ) ) {
850 - $api_response->plugin = $this->product->get_slug() . '/' . $this->product->get_file();
851 - }
852 728 if ( version_compare( $this->product->get_version(), $api_response->new_version, '<' ) ) {
853 729 $_transient_data->response[ $this->product->get_slug() . '/' . $this->product->get_file() ] = $api_response;
854 - } else {
855 - $_transient_data->no_update[ $this->product->get_slug() . '/' . $this->product->get_file() ] = $api_response;
856 730 }
857 731 }
858 732
859 733 return $_transient_data;
@@ -907,9 +781,9 @@
907 781 * @param string $url Url to check.
908 782 *
909 783 * @return array $array
910 784 */
911 - public function http_request_args( $args, $url ) {
785 + function http_request_args( $args, $url ) {
912 786 // If it is an https request and we are performing a package download, disable ssl verification.
913 787 if ( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) {
914 788 $args['sslverify'] = false;
915 789 }
@@ -950,19 +824,12 @@
950 824 if ( $this->product->requires_license() ) {
951 825 $this->failed_checks = intval( get_option( $this->product->get_key() . '_failed_checks', 0 ) );
952 826 $this->register_license_hooks();
953 827 }
954 - if ( ! self::$globals_loaded ) {
955 - add_filter( 'themeisle_sdk_license/status', [ __CLASS__, 'status' ], 999, 1 );
956 - add_filter( 'themeisle_sdk_license/is-valid', [ __CLASS__, 'is_valid' ], 999, 1 );
957 - add_filter( 'themeisle_sdk_license/plan', [ __CLASS__, 'plan' ], 999, 1 );
958 - add_filter( 'themeisle_sdk_license/key', [ __CLASS__, 'key' ], 999, 1 );
959 - $globals_loaded = true;
960 - }
828 +
961 829 $namespace = apply_filters( 'themesle_sdk_namespace_' . md5( $product->get_basefile() ), false );
962 830
963 831 if ( false !== $namespace ) {
964 - $this->namespace = $namespace;
965 832 add_filter( 'themeisle_sdk_license_process_' . $namespace, [ $this, 'do_license_process' ], 10, 2 );
966 833 add_filter( 'product_' . $namespace . '_license_status', [ $this, 'get_license_status' ], PHP_INT_MAX );
967 834 add_filter( 'product_' . $namespace . '_license_key', [ $this->product, 'get_license' ] );
968 835 add_filter( 'product_' . $namespace . '_license_plan', [ $this, 'get_plan' ], PHP_INT_MAX );
@@ -982,49 +849,19 @@
982 849 'pre_set_site_transient_update_plugins_filter',
983 850 ]
984 851 );
985 852 add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
986 - add_filter( //phpcs:ignore WordPressVIPMinimum.Hooks.RestrictedHooks.http_request_args
987 - 'http_request_args',
988 - array(
989 - $this,
990 - 'http_request_args',
991 - ),
992 - 10,
993 - 2
994 - );
995 - if ( ! self::is_valid( $product->get_basefile() ) ) {
996 - add_filter(
997 - 'plugin_action_links_' . plugin_basename( $product->get_basefile() ),
998 - function ( $actions ) {
999 - if ( $this->get_license_status( true ) !== self::STATUS_ACTIVE_EXPIRED ) {
1000 - return $actions;
1001 - }
1002 - $new_actions['deactivate'] = $actions['deactivate'];
1003 - $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>';
853 + add_filter( 'http_request_args', array( $this, 'http_request_args' ), 10, 2 );
1004 854
1005 - return $new_actions;
1006 - }
1007 - );
1008 - }
1009 -
1010 855 return $this;
1011 856 }
1012 857 if ( $this->product->is_theme() ) {
1013 858 add_filter( 'site_transient_update_themes', array( &$this, 'theme_update_transient' ) );
1014 - add_action( 'delete_site_transient_update_themes', array( &$this, 'delete_theme_update_transient' ) );
859 + add_filter( 'delete_site_transient_update_themes', array( &$this, 'delete_theme_update_transient' ) );
1015 860 add_action( 'load-update-core.php', array( &$this, 'delete_theme_update_transient' ) );
1016 861 add_action( 'load-themes.php', array( &$this, 'delete_theme_update_transient' ) );
1017 862 add_action( 'load-themes.php', array( &$this, 'load_themes_screen' ) );
1018 - add_filter( //phpcs:ignore WordPressVIPMinimum.Hooks.RestrictedHooks.http_request_args
1019 - 'http_request_args',
1020 - array(
1021 - $this,
1022 - 'disable_wporg_update',
1023 - ),
1024 - 5,
1025 - 2
1026 - );
863 + add_filter( 'http_request_args', array( $this, 'disable_wporg_update' ), 5, 2 );
1027 864
1028 865 return $this;
1029 866
1030 867 }
@@ -1032,78 +869,44 @@
1032 869 return $this;
1033 870 }
1034 871
1035 872 /**
1036 - * Register license fields for the products.
873 + * Run license activation on plugin activate.
1037 874 */
1038 - public function register_license_hooks() {
1039 - add_action( 'admin_init', array( $this, 'register_settings' ) );
1040 - add_action( 'admin_init', array( $this, 'process_license' ) );
1041 - add_action( 'admin_init', array( $this, 'product_valid' ), 99999999 );
1042 - add_action( 'admin_notices', array( $this, 'show_notice' ) );
1043 - add_filter( $this->product->get_key() . '_license_status', array( $this, 'get_license_status' ) );
1044 - }
875 + public function auto_activate() {
876 + if ( ! current_user_can( 'switch_themes' ) ) {
877 + return;
878 + }
879 + $status = $this->get_license_status();
880 + if ( 'not_active' !== $status ) {
881 + return;
882 + }
1045 883
1046 - /**
1047 - * Check license on filesystem.
1048 - *
1049 - * @return mixed License key.
1050 - */
1051 - public function get_file_license() {
1052 -
1053 884 $license_file = dirname( $this->product->get_basefile() ) . '/license.json';
1054 885
1055 886 global $wp_filesystem;
1056 887 if ( ! is_file( $license_file ) ) {
1057 - return false;
888 + return;
1058 889 }
1059 890
1060 - require_once ABSPATH . '/wp-admin/includes/file.php';
891 + require_once( ABSPATH . '/wp-admin/includes/file.php' );
1061 892 \WP_Filesystem();
1062 893 $content = json_decode( $wp_filesystem->get_contents( $license_file ) );
1063 894 if ( ! is_object( $content ) ) {
1064 - return false;
895 + return;
1065 896 }
1066 897 if ( ! isset( $content->key ) ) {
1067 - return false;
1068 - }
1069 -
1070 - return $content->key;
1071 - }
1072 -
1073 - /**
1074 - * Run license activation on plugin activate.
1075 - */
1076 - public function auto_activate() {
1077 - $status = $this->get_license_status();
1078 - if ( 'not_active' !== $status ) {
1079 - return false;
1080 - }
1081 -
1082 - if ( ! empty( $this->namespace ) ) {
1083 - $license_key = apply_filters( 'product_' . $this->namespace . '_license_key_constant', '' );
1084 - }
1085 -
1086 - if ( empty( $license_key ) ) {
1087 - $license_key = $this->get_file_license();
1088 - }
1089 - if ( empty( $license_key ) ) {
1090 898 return;
1091 899 }
1092 -
1093 -
1094 - $this->license_local = $license_key;
900 + $this->license_local = $content;
1095 901 $lock_key = $this->product->get_key() . '_autoactivated';
1096 902
1097 903 if ( 'yes' === get_option( $lock_key, '' ) ) {
1098 904 return;
1099 905 }
1100 - if ( 'yes' === get_transient( $lock_key ) ) {
1101 - return;
1102 - }
1103 - $response = $this->do_license_process( $license_key, 'activate' );
906 + $response = $this->do_license_process( $content->key, 'activate' );
1104 907
1105 - set_transient( $lock_key, 'yes', 6 * HOUR_IN_SECONDS );
908 + update_option( $lock_key, 'yes' );
1106 909
1107 910 if ( apply_filters( $this->product->get_key() . '_hide_license_notices', false ) ) {
1108 911 return;
1109 912 }
@@ -1118,9 +921,9 @@
1118 921 */
1119 922 public function autoactivate_notice() {
1120 923 ?>
1121 924 <div class="notice notice-success is-dismissible">
1122 - <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>
925 + <p><?php echo sprintf( '<strong>%s</strong> has been successfully activated using <strong>%s</strong> license !', $this->product->get_name(), str_repeat( '*', 20 ) . substr( $this->license_local->key, - 10 ) ); ?></p>
1123 926 </div>
1124 927 <?php
1125 928 }
1126 929
@@ -1184,6 +987,17 @@
1184 987 return;
1185 988 }
1186 989
1187 990 \WP_CLI::halt( 1 );
991 + }
992 +
993 + /**
994 + * Register license fields for the products.
995 + */
996 + public function register_license_hooks() {
997 + add_action( 'admin_init', array( $this, 'register_settings' ) );
998 + add_action( 'admin_init', array( $this, 'process_license' ) );
999 + add_action( 'admin_init', array( $this, 'product_valid' ), 99999999 );
1000 + add_action( 'admin_notices', array( $this, 'show_notice' ) );
1001 + add_filter( $this->product->get_key() . '_license_status', array( $this, 'get_license_status' ) );
1188 1002 }
1189 1003 }