Test Failed
Push — master ( 6a4da5...c6306d )
by Devin
04:22
created

Give_License::html_by_license()   B

Complexity

Conditions 6
Paths 18

Size

Total Lines 50

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
nc 18
nop 1
dl 0
loc 50
rs 8.4686
c 0
b 0
f 0
1
<?php
2
/**
3
 * Give License handler
4
 *
5
 * @package     Give
6
 * @subpackage  Admin/License
7
 * @copyright   Copyright (c) 2016, GiveWP
8
 * @license     https://opensource.org/licenses/gpl-license GNU Public License
9
 * @since       1.0
10
 */
11
12
// Exit if accessed directly.
13
if ( ! defined( 'ABSPATH' ) ) {
14
	exit;
15
}
16
17
if ( ! class_exists( 'Give_License' ) ) :
18
19
	/**
20
	 * Give_License Class
21
	 *
22
	 * This class simplifies the process of adding license information
23
	 * to new Give add-ons.
24
	 *
25
	 * @since 1.0
26
	 */
27
	class Give_License {
28
29
		/**
30
		 * File
31
		 *
32
		 * @access private
33
		 * @since  1.0
34
		 *
35
		 * @var    string
36
		 */
37
		private $file;
38
39
		/**
40
		 * License
41
		 *
42
		 * @access private
43
		 * @since  1.0
44
		 *
45
		 * @var    string
46
		 */
47
		private $license;
48
49
		/**
50
		 * Item name
51
		 *
52
		 * @access private
53
		 * @since  1.0
54
		 *
55
		 * @var    string
56
		 */
57
		private $item_name;
58
59
		/**
60
		 * Item ID
61
		 *
62
		 * @access private
63
		 * @since  2.2.4
64
		 *
65
		 * @var    int
66
		 */
67
		private $item_id;
68
69
		/**
70
		 * License Information object.
71
		 *
72
		 * @access private
73
		 * @since  1.7
74
		 *
75
		 * @var    object
76
		 */
77
		private $license_data;
78
79
		/**
80
		 * Item shortname
81
		 *
82
		 * @access private
83
		 * @since  1.0
84
		 *
85
		 * @var    string
86
		 */
87
		private $item_shortname;
88
89
		/**
90
		 * Version
91
		 *
92
		 * @access private
93
		 * @since  1.0
94
		 *
95
		 * @var    string
96
		 */
97
		private $version;
98
99
		/**
100
		 * Author
101
		 *
102
		 * @access private
103
		 * @since  1.0
104
		 *
105
		 * @var    string
106
		 */
107
		private $author;
108
109
		/**
110
		 * Plugin directory name
111
		 *
112
		 * @access private
113
		 * @since  2.5.0
114
		 *
115
		 * @var    string
116
		 */
117
		private $plugin_dirname;
118
119
		/**
120
		 * Website URL
121
		 *
122
		 * @access private
123
		 * @since  1.0
124
		 *
125
		 * @var    string
126
		 */
127
		private static $site_url = 'https://givewp.com/';
128
129
		/**
130
		 * API URL
131
		 *
132
		 * @access private
133
		 * @since  1.0
134
		 *
135
		 * @var    string
136
		 */
137
		private $api_url = 'https://givewp.com/edd-sl-api/';
138
139
		/**
140
		 * array of licensed addons
141
		 *
142
		 * @since  2.1.4
143
		 * @access private
144
		 *
145
		 * @var    array
146
		 */
147
		private static $licensed_addons = array();
148
149
		/**
150
		 * Account URL
151
		 *
152
		 * @access private
153
		 * @since  1.7
154
		 *
155
		 * @var null|string
156
		 */
157
		private static $account_url = 'https://givewp.com/my-account/';
158
159
		/**
160
		 * Downloads URL
161
		 *
162
		 * @access private
163
		 * @since  2.5.0
164
		 *
165
		 * @var null|string
166
		 */
167
		private static $downloads_url = 'https://givewp.com/my-downloads/';
168
169
		/**
170
		 * Checkout URL
171
		 *
172
		 * @access private
173
		 * @since  1.7
174
		 *
175
		 * @var null|string
176
		 */
177
		private static $checkout_url = 'https://givewp.com/checkout/';
178
179
		/**
180
		 * Class Constructor
181
		 *
182
		 * Set up the Give License Class.
183
		 *
184
		 * @access public
185
		 *
186
		 * @param string $_file
187
		 * @param string $_item_name
188
		 * @param string $_version
189
		 * @param string $_author
190
		 * @param string $_optname
191
		 * @param string $_api_url
192
		 * @param string $_checkout_url
193
		 * @param string $_account_url
194
		 * @param int    $_item_id
195
		 *
196
		 * @since  1.0
197
		 */
198
		public function __construct(
199
			$_file,
200
			$_item_name,
201
			$_version,
202
			$_author,
203
			$_optname = null,
0 ignored issues
show
Unused Code introduced by
The parameter $_optname is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
204
			$_api_url = null,
205
			$_checkout_url = null,
206
			$_account_url = null,
207
			$_item_id = null
208
		) {
209
210
			// Only load in wp-admin.
211
			if ( ! is_admin() ) {
212
				return;
213
			}
214
215
			if ( is_numeric( $_item_id ) ) {
216
				$this->item_id = absint( $_item_id );
217
			}
218
219
			$this->file             = $_file;
220
			$this->item_name        = $_item_name;
221
			$this->plugin_dirname   = dirname( plugin_basename( $this->file ) );
222
			$this->item_shortname   = self::get_short_name( $this->item_name );
223
			$this->license_data     = self::get_license_by_plugin_dirname( $this->plugin_dirname );
0 ignored issues
show
Documentation Bug introduced by
It seems like self::get_license_by_plu...($this->plugin_dirname) of type array is incompatible with the declared type object of property $license_data.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
224
			$this->version          = $_version;
225
			$this->license          = ! empty( $this->license_data['license_key'] ) ? $this->license_data['license_key'] : '';
226
			$this->author           = $_author;
227
			$this->api_url          = is_null( $_api_url ) ? $this->api_url : $_api_url;
228
			self::$checkout_url     = is_null( $_checkout_url ) ? self::$checkout_url : $_checkout_url;
229
			self::$account_url      = is_null( $_account_url ) ? self::$account_url : $_account_url;
230
			$this->auto_updater_obj = null;
231
232
			// Add plugin to registered licenses list.
233
			array_push( self::$licensed_addons, plugin_basename( $this->file ) );
234
		}
235
236
237
		/**
238
		 * Get plugin shortname
239
		 *
240
		 * @param $plugin_name
241
		 *
242
		 * @return string
243
		 * @since  2.1.0
244
		 * @access public
245
		 */
246
		public static function get_short_name( $plugin_name ) {
247
			$plugin_name = trim( str_replace( 'Give - ', '', $plugin_name ) );
248
			$plugin_name = 'give_' . preg_replace( '/[^a-zA-Z0-9_\s]/', '', str_replace( ' ', '_', strtolower( $plugin_name ) ) );
249
250
			return $plugin_name;
251
		}
252
253
		/**
254
		 * Activate License
255
		 *
256
		 * Activate the license key.
257
		 *
258
		 * @access public
259
		 * @return void
260
		 * @since  1.0
261
		 */
262
		public function activate_license() {
263
		}
264
265
		/**
266
		 * Deactivate License
267
		 *
268
		 * Deactivate the license key.
269
		 *
270
		 * @access public
271
		 * @return void
272
		 * @since  1.0
273
		 */
274
		public function deactivate_license() {
275
		}
276
277
278
		/**
279
		 * Get license information.
280
		 *
281
		 * @param string $edd_action
282
		 * @param bool   $response_in_array
283
		 *
284
		 * @return mixed
285
		 * @deprecated 2.5.0 Use self::request_license_api instead.
286
		 *
287
		 * @since      1.8.9
288
		 * @access     public
289
		 */
290
		public function get_license_info( $edd_action = '', $response_in_array = false ) {
291
292
			if ( empty( $edd_action ) ) {
293
				return false;
294
			}
295
296
			give_doing_it_wrong( __FUNCTION__, 'Use self::request_license_api instead', '2.5.0' );
297
298
			// Data to send to the API.
299
			$api_params = array(
300
				'edd_action' => $edd_action, // never change from "edd_" to "give_"!
301
				'license'    => $this->license,
302
				'item_name'  => urlencode( $this->item_name ),
303
			);
304
305
			return self::request_license_api( $api_params, $response_in_array );
306
		}
307
308
		/**
309
		 * Return licensed addons info
310
		 *
311
		 * Note: note only for internal logic
312
		 *
313
		 * @return array
314
		 * @since 2.1.4
315
		 */
316
		static function get_licensed_addons() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
317
			return self::$licensed_addons;
318
		}
319
320
321
		/**
322
		 * Check if license key attached to subscription
323
		 *
324
		 * @param string $license_key
325
		 *
326
		 * @return array
327
		 * @since 2.5.0
328
		 */
329
		static function is_subscription( $license_key = '' ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
330
			// Check if current license is part of subscription or not.
331
			$subscriptions = get_option( 'give_subscriptions' );
332
			$subscription  = array();
333
334
			if ( $subscriptions ) {
335
				foreach ( $subscriptions as $subs ) {
336
					if ( in_array( $license_key, $subs['licenses'] ) ) {
337
						$subscription = $subs;
338
						break;
339
					}
340
				}
341
			}
342
343
			return $subscription;
344
		}
345
346
		/**
347
		 * Get license information.
348
		 *
349
		 * @param array $api_params
350
		 * @param bool  $response_in_array
351
		 *
352
		 * @return array|WP_Error
353
		 * @since  1.8.9
354
		 * @access public
355
		 */
356
		public static function request_license_api( $api_params = array(), $response_in_array = false ) {
357
			// Bailout.
358
			if ( empty( $api_params['edd_action'] ) ) {
359
				return new WP_Error( 'give-invalid-edd-action', __( 'Valid edd_action not defined', 'give' ) );
360
			}
361
362
			// Data to send to the API.
363
			$default_api_params = array(
364
				// 'edd_action' => $edd_action, never change from "edd_" to "give_"!
365
				// 'license'    => $this->license,
366
				// 'item_name'  => urlencode( $this->item_name ),
367
				'url' => home_url(),
368
			);
369
370
			$api_params = wp_parse_args( $api_params, $default_api_params );
371
372
			// Call the API.
373
			$response = wp_remote_post(
374
				self::$checkout_url,
375
				apply_filters(
376
					'give_request_license_api_args',
377
					array(
378
						'timeout'   => 15,
379
						'sslverify' => false,
380
						'body'      => $api_params,
381
					)
382
				)
383
			);
384
385
			// Make sure there are no errors.
386
			if ( is_wp_error( $response ) ) {
387
				return $response;
388
			}
389
390
			return json_decode( wp_remote_retrieve_body( $response ), $response_in_array );
391
		}
392
393
		/**
394
		 * Get license by plugin dirname
395
		 *
396
		 * @param string $plugin_dirname
397
		 *
398
		 * @return array
399
		 *
400
		 * @since  2.5.0
401
		 * @access public
402
		 */
403
		public static function get_license_by_plugin_dirname( $plugin_dirname ) {
404
			$license       = array();
405
			$give_licenses = get_option( 'give_licenses', array() );
406
407
			if ( ! empty( $give_licenses ) ) {
408
				foreach ( $give_licenses as $give_license ) {
409
410
					// Logic to match all access pass license to add-on.
411
					$compares = $give_license['is_all_access_pass']
412
						? $give_license['download']
413
414
						// Prevent PHP notice if somehow automatic update does not run properly.
415
						// Because plugin_slug will only define in updated license rest api response.
416
						: array( array( 'plugin_slug' => ! empty( $give_license['plugin_slug'] ) ? $give_license['plugin_slug'] : '' ) );
417
418
					foreach ( $compares as $compare ) {
419
						if ( ! empty( $compare['plugin_slug'] ) && $plugin_dirname === $compare['plugin_slug'] ) {
420
							$license = $give_license;
421
							break;
422
						}
423
					}
424
				}
425
			}
426
427
			return $license;
428
		}
429
430
431
		/**
432
		 * Get checkout url
433
		 *
434
		 * @return string|null
435
		 * @since 2.5.0
436
		 */
437
		public static function get_checkout_url() {
438
			return self::$checkout_url;
439
		}
440
441
		/**
442
		 * Get account url
443
		 *
444
		 * @return string|null
445
		 * @since 2.5.0
446
		 */
447
		public static function get_account_url() {
448
			return self::$account_url;
449
		}
450
451
		/**
452
		 * Get downloads url
453
		 *
454
		 * @return string|null
455
		 * @since 2.5.0
456
		 */
457
		public static function get_downloads_url() {
458
			return self::$downloads_url;
459
		}
460
461
		/**
462
		 * Get account url
463
		 *
464
		 * @return string|null
465
		 * @since 2.5.0
466
		 */
467
		public static function get_website_url() {
468
			return self::$site_url;
469
		}
470
471
472
		/**
473
		 * Get plugin information by id.
474
		 * Note: only for internal use
475
		 *
476
		 * @param string $plugin_slug
477
		 *
478
		 * @return array
479
		 * @since 2.5.0
480
		 */
481
		public static function get_plugin_by_slug( $plugin_slug ) {
482
			$give_plugins   = give_get_plugins();
483
			$matching_list  = wp_list_pluck( $give_plugins, 'Dir', 'Path' );
484
			$is_match_found = array_search( $plugin_slug, $matching_list, true );
485
486
			return $is_match_found ? $give_plugins[ $is_match_found ] : array();
487
		}
488
489
		/**
490
		 * Get plugin information by id.
491
		 * Note: only for internal use
492
		 *
493
		 * @param string $plugin_slug
494
		 *
495
		 * @return string
496
		 * @since 2.5.0
497
		 */
498
		public static function build_plugin_name_from_slug( $plugin_slug ) {
499
			$plugin_name = str_replace( array( '-', 'give ' ), array( ' ', 'Give - ' ), $plugin_slug );
500
501
			return ucwords( $plugin_name );
502
		}
503
504
		/**
505
		 * Render license section
506
		 *
507
		 * @return string
508
		 * @since 2.5.0
509
		 */
510
		public static function render_licenses_list() {
511
			$give_plugins           = give_get_plugins( array( 'only_premium_add_ons' => true ) );
512
			$give_licenses          = get_option( 'give_licenses', array() );
513
			$licenses_without_addon = $give_licenses;
514
515
516
			// Get all access pass licenses
517
			$all_access_pass_licenses   = array();
518
			$all_access_pass_addon_list = array();
519
			foreach ( $give_licenses as $key => $give_license ) {
520
				if ( $give_license['is_all_access_pass'] ) {
521
					$all_access_pass_licenses[ $key ] = $give_license;
522
523
					unset( $licenses_without_addon[$key] );
524
525
					foreach ( $give_license['download'] as $download ) {
526
						$all_access_pass_addon_list[] = $download['plugin_slug'];
527
					}
528
				}
529
			}
530
531
			$html = array(
532
				'unlicensed'             => '',
533
				'licensed'               => '',
534
				'licenses_without_addon' => '',
535
				'all_access_licensed'    => '',
536
			);
537
538
			if( ! empty( $give_plugins ) ) {
539
				foreach ( $give_plugins as $give_plugin ) {
540
					if ( in_array( $give_plugin['Dir'], $all_access_pass_addon_list ) ) {
541
						continue;
542
					}
543
544
					$addon_license = self::get_license_by_plugin_dirname( $give_plugin['Dir'] );
545
					$html_arr_key  = 'unlicensed';
546
547
					if ( $addon_license ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $addon_license of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
548
						$html_arr_key = 'licensed';
549
						unset( $licenses_without_addon[$addon_license['license_key']] );
550
					}
551
552
					$html["{$html_arr_key}"] .= self::html_by_plugin( $give_plugin );
553
				}
554
			}
555
556
			if ( ! empty( $all_access_pass_licenses ) ) {
557
				foreach ( $all_access_pass_licenses as $key => $all_access_pass_license ) {
558
					$html['all_access_licensed'] .= self::html_by_license( $all_access_pass_license );
559
				}
560
			}
561
562
			if ( ! empty( $licenses_without_addon ) ) {
563
				foreach ( $licenses_without_addon as $key => $license ) {
564
					if ( in_array( $license['plugin_slug'], $all_access_pass_addon_list ) ) {
565
						continue;
566
					}
567
					$html['licenses_without_addon'] .= self::html_by_license( $license );
568
				}
569
			}
570
571
			ksort( $html );
572
573
			// After sorting order will be all_access_licensed -> licensed ->  unlicensed
574
575
			return implode( '', $html );
576
		}
577
578
		/**
579
		 * Get add-on item html
580
		 * Note: only for internal use
581
		 *
582
		 * @param $plugin
583
		 *
584
		 * @return string
585
		 * @since 2.5.0
586
		 */
587
		public static function html_by_plugin( $plugin ) {
588
			// Bailout.
589
			if ( empty( $plugin ) ) {
590
				return '';
591
			}
592
593
			ob_start();
594
			$license = self::get_license_by_plugin_dirname( $plugin['Dir'] );
595
596
			$default_plugin = array(
597
				'ChangeLogSlug' => $plugin['Dir'],
598
				'DownloadURL'   => '',
599
			);
600
601
			if ( false !== strpos( $default_plugin['ChangeLogSlug'], '-gateway' ) ) {
602
				// We found that each gateway addon does not have `-gateway` in changelog file slug
603
				$default_plugin['ChangeLogSlug'] = str_replace( '-gateway', '', $default_plugin['ChangeLogSlug'] );
604
			}
605
606
			if ( $license ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $license of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
607
				$license['renew_url']            = self::$checkout_url . "?edd_license_key={$license['license_key']}";
608
				$default_plugin['ChangeLogSlug'] = $license['readme'];
609
				$default_plugin['DownloadURL']   = $license['download'];
610
			}
611
612
			$plugin['License'] = $license = wp_parse_args(
613
				$license, array(
614
					'item_name'     => str_replace( 'give-', '', $plugin['Dir'] ),
615
					'purchase_link' => $plugin['PluginURI'],
616
				)
617
			);
618
619
			$plugin = wp_parse_args( $plugin, $default_plugin );
620
			?>
621
			<div class="give-addon-wrap">
622
				<div class="give-addon-inner">
623
					<?php echo self::html_license_row( $license, $plugin ); ?>
624
					<?php echo self::html_plugin_row( $plugin ); ?>
625
				</div>
626
			</div>
627
			<?php
628
629
			return ob_get_clean();
630
		}
631
632
		/**
633
		 * Get add-on item html
634
		 * Note: only for internal use
635
		 *
636
		 * @param array $license
637
		 *
638
		 * @return string
639
		 * @since 2.5.0
640
		 */
641
		private static function html_by_license( $license ) {
642
			ob_start();
643
644
			$license['renew_url'] = self::$checkout_url . "?edd_license_key={$license['license_key']}";
645
			?>
646
			<div class="give-addon-wrap">
647
				<div class="give-addon-inner">
648
					<?php
649
					echo self::html_license_row( $license );
650
651
					$addons = $license['download'];
652
653
					if( empty( $license['is_all_access_pass'] ) ) {
654
						$addons = array( $license );
655
					}
656
657
					foreach ( $addons as $addon ) {
658
						$default_plugin = array(
659
							// In single license key we will get item_name instead of name.
660
							'Name'          => ! empty( $addon['item_name'] ) ? $addon['item_name'] : $addon['name'],
661
662
							'ChangeLogSlug' => $addon['readme'],
663
							'Version'       => $addon['current_version'],
664
							'Status'        => 'not installed',
665
666
							// In single license key we will get download instead of file.
667
							'DownloadURL'   => ! empty( $addon['download'] ) ? $addon['download'] : $addon['file'],
668
669
						);
670
671
						$plugin = wp_parse_args(
672
							self::get_plugin_by_slug( $addon['plugin_slug'] ),
673
							$default_plugin
674
						);
675
676
						$plugin['Name'] = false !== strpos( $plugin['Name'], 'Give' )
677
							? $plugin['Name']
678
							: self::build_plugin_name_from_slug( $addon['plugin_slug'] );
679
680
						$plugin['License'] = $license;
681
682
						echo self::html_plugin_row( $plugin );
683
					}
684
					?>
685
				</div>
686
			</div>
687
			<?php
688
689
			return ob_get_clean();
690
		}
691
692
693
		/**
694
		 * license row html
695
		 *
696
		 * @param array $license
697
		 * @param array $plugin
698
		 *
699
		 * @return string
700
		 * @since 2.5.0
701
		 */
702
		private static function html_license_row( $license, $plugin = array() ) {
703
			ob_start();
704
705
			$is_license          = $license && ! empty( $license['license_key'] );
0 ignored issues
show
Bug Best Practice introduced by
The expression $license of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
706
			$license_key         = $is_license ? $license['license_key'] : '';
707
			$license_is_inactive = $license_key && ! in_array( $license['license'], array( 'valid', 'expired' ) );
708
			$expires_timestamp   = $is_license ? strtotime( $license['expires'] ) : '';
709
			$is_license_expired  = $is_license && ( 'expired' === $license['license'] || $expires_timestamp < current_time( 'timestamp', 1 ) );
710
			$addon_dir           = ! empty( $plugin['Dir'] ) ? $plugin['Dir'] : ( ! empty( $license['plugin_slug'] ) ? $license['plugin_slug'] : '' );
711
			?>
712
			<div class="give-license-row give-clearfix">
713
				<div class="give-license-notice-container"></div>
714
				<div class="give-license-top give-clearfix">
715
716
					<div class="give-license-top-column give-license-key-field-wrap">
717
718
						<div class="give-license__key<?php echo $license_key ? ' give-has-license-key' : ''; ?>">
719
							<?php $value = $license_key ? give_hide_char( $license['license_key'], 5 ) : ''; ?>
720
							<label for="give-license-addon-key-field" class="give-license-top-header"><?php _e( 'License Key', 'give' ); ?></label>
721
							<input id="give-license-addon-key-field" type="text" autocomplete="off" value="<?php echo $value; ?>"<?php echo $value ? ' readonly' : ''; ?>>
722
							<?php if ( ! $license_key ) : ?>
723
								<button class="give-button__license-activate button-primary" data-addon="<?php echo $addon_dir; ?>">
724
									<?php _e( 'Activate', 'give' ); ?>
725
								</button>
726
							<?php elseif ( $license_is_inactive ): ?>
727
								<button class="give-button__license-reactivate button-primary" data-addon="<?php echo $addon_dir; ?>" data-license="<?php echo $license['license_key'] ?>">
728
									<?php _e( 'Reactivate', 'give' ); ?>
729
								</button>
730
							<?php else : ?>
731
732
								<?php
733
								echo sprintf(
734
									'<button class="give-license__deactivate button button-secondary" data-license-key="%2$s" data-item-name="%3$s"  data-plugin-dirname="%5$s" data-nonce="%4$s">%1$s</button>',
735
									__( 'Deactivate', 'give' ),
736
									$license['license_key'],
737
									$license['item_name'],
738
									wp_create_nonce( "give-deactivate-license-{$license['item_name']}" ),
739
									! empty( $license['plugin_slug'] ) ? $license['plugin_slug'] : ''
740
								); ?>
741
742
							<?php endif; ?>
743
744
							<div class="give-license__status">
745
								<?php
746
								echo $license_key && ! $license_is_inactive
747
									? sprintf(
748
										'<span class="dashicons dashicons-%2$s"></span>&nbsp;%1$s',
749
										$is_license_expired
750
											? __( 'License is expired. Please activate your license key.', 'give' )
751
											: __( 'License is active and you are receiving updates and support.', 'give' ),
752
										$is_license_expired
753
											? 'no'
754
											: 'yes'
755
									)
756
									: sprintf(
757
										'<span class="dashicons dashicons-no"></span> %1$s %2$s',
758
										__( 'License is inactive.', 'give' ),
759
										$license_is_inactive
760
											? sprintf(
761
												__( 'Please <a href="%1$s" target="_blank">Visit your dashboard</a> to check this license details and activate this license to receive updates and support.', 'give' ),
762
												self::get_account_url()
763
											)
764
											: __( 'Please activate your license key.', 'give' )
765
									);
766
								?>
767
							</div>
768
						</div>
769
					</div>
770
771
					<div class="give-license-top-column give-license-info-field-wrap">
772
						<h3 class="give-license-top-header"><?php _e( 'License Information', 'give' ); ?></h3>
773
						<?php
774
						// @todo: handle all license status;
775
						if ( $license_key ) : ?>
776
777
							<?php if ( $license_key ) : ?>
778
								<?php
779
								echo sprintf(
780
									'<p class="give-license-renewal-date"><span class="dashicons dashicons-calendar-alt"></span> <strong>%1$s</strong> %2$s</p>',
781
									$is_license_expired ? __( 'Expired:' ) : __( 'Renews:' ),
782
									date( give_date_format(), $expires_timestamp )
783
								);
784
								?>
785
							<?php endif; ?>
786
787
							<?php if ( $is_license_expired ) {
788
								// @todo: need to test renew license link
789
								echo sprintf(
790
									'<a href="%1$s" target="_blank">%2$s</a>',
791
									$license['renew_url'],
792
									__( 'Renew to manage sites', 'give' )
793
								);
794
							} elseif ( $license_key ) {
795
								if ( ! $license['activations_left'] ) {
796
									echo sprintf(
797
										'<span class="give-license-activations-left">%1$s</span>',
798
										__( 'No activation remaining', 'give' )
799
									);
800
								} else {
801
									echo sprintf(
802
										'<span class="give-license-activations-left"><span class="give-license-activations-remaining-icon wp-ui-highlight">%1$s</span> %2$s</span>',
803
										$license['activations_left'],
804
										_n( 'Activation Remaining', 'Activations Remaining', $license['activations_left'], 'give' )
805
									);
806
								}
807
							} ?>
808
						<?php else : ?>
809
810
							<p class="give-field-description"><?php _e( 'This is an unlicensed add-on and is not receiving updates or support. Please activate your license key to fix the issue.', 'give' ); ?></p>
811
812
						<?php endif; ?>
813
					</div>
814
815
					<div class="give-license-top-column">
816
						<h3 class="give-license-top-header"><?php _e( 'License Actions', 'give' ); ?></h3>
817
818
						<?php
819
						// Purchase license link.
820
						if ( ! $license_key ) : ?>
821
							<?php
822
							echo sprintf(
823
								'<a class="give-button button-secondary" href="%1$s" target="_blank">%2$s</a>',
824
								$license['purchase_link'],
825
								__( 'Purchase License', 'give' )
826
							);
827
							?>
828
						<?php endif; ?>
829
830
						<?php
831
						// Manage license link on GiveWP.com
832
						if ( ! $is_license_expired && $license_key ) {
833
							echo sprintf(
834
								'<a href="%1$spurchase-history/?license_id=%2$s&action=manage_licenses&payment_id=%3$s" target="_blank" class="give-license-action-link">%4$s</a>',
835
								trailingslashit( Give_License::get_website_url() ),
836
								$license['license_id'],
837
								$license['payment_id'],
838
								__( 'Manage License', 'give' )
839
							);
840
							echo sprintf(
841
								'<a href="%1$spriority-support/" target="_blank" class="give-license-action-link">%2$s</a>',
842
								trailingslashit( Give_License::get_website_url() ),
843
								__( 'Access Support', 'give' )
844
							);
845
						}
846
						?>
847
848
					</div>
849
				</div>
850
			</div>
851
			<?php
852
			return ob_get_clean();
853
		}
854
855
856
		/**
857
		 * Plugin row html
858
		 *
859
		 * @param array $plugin
860
		 *
861
		 * @return string
862
		 * @since 2.5.0
863
		 */
864
		public static function html_plugin_row( $plugin ) {
865
			// Bailout.
866
			if ( ! $plugin ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $plugin of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
867
				return '';
868
			}
869
870
			$is_license         = $plugin['License'] && ! empty( $plugin['License']['license_key'] );
871
			$expires_timestamp  = $is_license ? strtotime( $plugin['License']['expires'] ) : '';
872
			$is_license_expired = $is_license && ( 'expired' === $plugin['License']['license'] || $expires_timestamp < current_time( 'timestamp', 1 ) );
873
			ob_start();
874
			?>
875
			<div class="give-addon-info-wrap give-clearfix">
876
877
				<div class="give-addon-info-left">
878
					<span class="give-addon-name">
879
						<?php echo $plugin['Name']; ?>
880
					</span>
881
					<span class="give-addon-version">
882
						<?php echo sprintf( '%1$s %2$s', __( 'Version' ), $plugin['Version'] ); ?>
883
					</span>
884
				</div>
885
886
				<div class="give-addon-info-right">
887
					<?php
888
					echo sprintf(
889
						'<a href="%1$s" class="give-ajax-modal give-addon-view-changelog" title="%3$s">%2$s</a>',
890
						give_modal_ajax_url(
891
							array(
892
								'url'            => filter_var( $plugin['ChangeLogSlug'], FILTER_VALIDATE_URL )
893
									? urldecode_deep( $plugin['ChangeLogSlug'] )
894
									: urlencode_deep( give_get_addon_readme_url( $plugin['ChangeLogSlug'] ) ),
895
								'show_changelog' => 1,
896
							)
897
						),
898
						__( 'View Changelog', 'give' ),
899
						__( 'Changelog of' ) . " {$plugin['Name']}"
900
					);
901
					?>
902
903
					<?php
904
					// Activation status.
905
					if ( in_array( $plugin['Status'], array( 'active', 'inactive' ) ) ) {
906
						echo sprintf(
907
							'<span class="give-addon-activation-status give-addon-activation-status__%1$s">%1$s</span>',
908
							'active' === $plugin['Status'] ? __( 'activated', 'give' ) : __( 'installed', 'give' )
909
						);
910
					}
911
912
					printf(
913
						'<%3$s class="give-button button button-secondary button-small" href="%1$s"%4$s><span class="dashicons dashicons-download"></span>%2$s</%3$s>',
914
						$plugin['DownloadURL'],
915
						__( 'Download', 'give' ),
916
						$is_license_expired || ! $plugin['DownloadURL'] ? 'button' : 'a',
917
						$is_license_expired || ! $plugin['DownloadURL'] ? ' disabled' : ''
918
					);
919
					?>
920
				</div>
921
			</div>
922
			<?php
923
924
			return ob_get_clean();
925
		}
926
927
928
		/**
929
		 * Get refresh license status
930
		 *
931
		 * @return mixed|void
932
		 * @since 2.5.0
933
		 */
934
		public static function refresh_license_status() {
935
			return get_option(
936
				'give_licenses_refreshed_last_checked',
937
				array(
938
					'compare' => date( 'Ymd' ),
939
					'time'    => current_time( 'timestamp', 1 ),
940
					'count'   => 0,
941
				)
942
			);
943
		}
944
	}
945
946
endif; // end class_exists check.
947