Test Failed
Pull Request — master (#2199)
by Ravinder
04:54
created

Give_License::__single_subscription_check()   C

Complexity

Conditions 7
Paths 7

Size

Total Lines 34
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 56

Importance

Changes 0
Metric Value
cc 7
eloc 13
nc 7
nop 0
dl 0
loc 34
ccs 0
cts 0
cp 0
crap 56
rs 6.7272
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, WordImpress
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
		 * License Information object.
61
		 *
62
		 * @access private
63
		 * @since  1.7
64
		 *
65
		 * @var    object
66
		 */
67
		private $license_data;
68
69
		/**
70
		 * Item shortname
71
		 *
72
		 * @access private
73
		 * @since  1.0
74
		 *
75
		 * @var    string
76
		 */
77
		private $item_shortname;
78
79
		/**
80
		 * Version
81
		 *
82
		 * @access private
83
		 * @since  1.0
84
		 *
85
		 * @var    string
86
		 */
87
		private $version;
88
89
		/**
90
		 * Author
91
		 *
92
		 * @access private
93
		 * @since  1.0
94
		 *
95
		 * @var    string
96
		 */
97
		private $author;
98
99
		/**
100
		 * API URL
101
		 *
102
		 * @access private
103
		 * @since  1.0
104
		 *
105
		 * @var    string
106
		 */
107
		private $api_url = 'https://givewp.com/edd-sl-api/';
108
109
		/**
110
		 * Account URL
111
		 *
112
		 * @access private
113
		 * @since  1.7
114
		 *
115
		 * @var null|string
116
		 */
117
		private $account_url = 'https://givewp.com/my-account/';
118
119
		/**
120
		 * Checkout URL
121
		 *
122
		 * @access private
123
		 * @since  1.7
124
		 *
125
		 * @var null|string
126
		 */
127
		private $checkout_url = 'https://givewp.com/checkout/';
128
129
		/**
130
		 * Class Constructor
131
		 *
132
		 * Set up the Give License Class.
133
		 *
134
		 * @access public
135
		 * @since  1.0
136
		 *
137
		 * @param string $_file
138
		 * @param string $_item_name
139
		 * @param string $_version
140
		 * @param string $_author
141
		 * @param string $_optname
142
		 * @param string $_api_url
143
		 * @param string $_checkout_url
144
		 * @param string $_account_url
145
		 */
146
		public function __construct( $_file, $_item_name, $_version, $_author, $_optname = null, $_api_url = null, $_checkout_url = null, $_account_url = 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...
147
148
			$give_options = give_get_settings();
149
150
			$this->file             = $_file;
151
			$this->item_name        = $_item_name;
152
			$this->item_shortname   = 'give_' . preg_replace( '/[^a-zA-Z0-9_\s]/', '', str_replace( ' ', '_', strtolower( $this->item_name ) ) );
153
			$this->version          = $_version;
154
			$this->license          = isset( $give_options[ $this->item_shortname . '_license_key' ] ) ? trim( $give_options[ $this->item_shortname . '_license_key' ] ) : '';
155
			$this->license_data     = get_option( $this->item_shortname . '_license_active' );
156
			$this->author           = $_author;
157
			$this->api_url          = is_null( $_api_url ) ? $this->api_url : $_api_url;
158
			$this->checkout_url     = is_null( $_checkout_url ) ? $this->checkout_url : $_checkout_url;
159
			$this->account_url      = is_null( $_account_url ) ? $this->account_url : $_account_url;
160
			$this->auto_updater_obj = null;
161
162
			// Add Setting for Give Add-on activation status.
163
			$is_addon_activated = get_option( 'give_is_addon_activated' );
164
			if( ! $is_addon_activated && is_object( $this ) && sizeof( $this ) > 0 ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
165
				update_option( 'give_is_addon_activated', true );
166
				Give_Cache::set( 'give_cache_hide_license_notice_after_activation', true, DAY_IN_SECONDS );
167
			}
168
169
			// Setup hooks
170
			$this->includes();
171
			$this->hooks();
172
			$this->auto_updater();
173
		}
174
175
		/**
176
		 * Includes
177
		 *
178
		 * Include the updater class.
179
		 *
180
		 * @access private
181
		 * @since  1.0
182
		 *
183
		 * @return void
184
		 */
185
		private function includes() {
186
187
			if ( ! class_exists( 'EDD_SL_Plugin_Updater' ) ) {
188
				require_once 'admin/EDD_SL_Plugin_Updater.php';
189
			}
190
		}
191
192
		/**
193
		 * Hooks
194
		 *
195
		 * Setup license hooks.
196
		 *
197
		 * @access private
198
		 * @since  1.0
199
		 *
200
		 * @return void
201
		 */
202
		private function hooks() {
203
204
			// Register settings.
205
			add_filter( 'give_settings_licenses', array( $this, 'settings' ), 1 );
206
207
			// Activate license key on settings save.
208
			add_action( 'admin_init', array( $this, 'activate_license' ) );
209
210
			// Deactivate license key.
211
			add_action( 'admin_init', array( $this, 'deactivate_license' ) );
212
213
			// Updater.
214
			add_action( 'admin_init', array( $this, 'auto_updater' ), 0 );
215
			add_action( 'admin_notices', array( $this, 'notices' ) );
216
217
			// Check license weekly.
218
			Give_Cron::add_weekly_event( array( $this, 'weekly_license_check' ) );
219
			add_action( 'give_validate_license_when_site_migrated', array( $this, 'weekly_license_check' ) );
220
221
			// Check subscription weekly.
222
			Give_Cron::add_weekly_event( array( $this, 'weekly_subscription_check' ) );
223
			add_action( 'give_validate_license_when_site_migrated', array( $this, 'weekly_subscription_check' ) );
224
225
			// Show addon notice on plugin page.
226
			$plugin_name = explode( 'plugins/', $this->file );
227
			$plugin_name = end( $plugin_name );
228
			add_action( "after_plugin_row_{$plugin_name}", array( $this, 'plugin_page_notices' ), 10, 3 );
229
230
		}
231
232
233
		/**
234
		 * Auto Updater
235
		 *
236
		 * @access private
237
		 * @since  1.0
238
		 *
239
		 * @return void
240
		 */
241
		public function auto_updater() {
242
243
			// Setup the updater.
244
			$this->auto_updater_obj = new EDD_SL_Plugin_Updater(
245
				$this->api_url,
246
				$this->file,
247
				array(
248
					'version'   => $this->version,
249
					'license'   => $this->license,
250
					'item_name' => $this->item_name,
251
					'author'    => $this->author,
252
				)
253
			);
254
		}
255
256
		/**
257
		 * License Settings
258
		 *
259
		 * Add license field to settings.
260
		 *
261
		 * @access public
262
		 * @since  1.0
263
		 *
264
		 * @param  array $settings License settings.
265
		 *
266
		 * @return array           License settings.
267
		 */
268
		public function settings( $settings ) {
269
270
			$give_license_settings = array(
271
				array(
272
					'name'    => $this->item_name,
273
					'id'      => $this->item_shortname . '_license_key',
274
					'desc'    => '',
275
					'type'    => 'license_key',
276
					'options' => array(
277
						'license'      => get_option( $this->item_shortname . '_license_active' ),
278
						'shortname'    => $this->item_shortname,
279
						'item_name'    => $this->item_name,
280
						'api_url'      => $this->api_url,
281
						'checkout_url' => $this->checkout_url,
282
						'account_url'  => $this->account_url,
283
					),
284
					'size'    => 'regular',
285
				),
286
			);
287
288
			return array_merge( $settings, $give_license_settings );
289
		}
290
291
		/**
292
		 * License Settings Content
293
		 *
294
		 * Add Some Content to the Licensing Settings.
295
		 *
296
		 * @access public
297
		 * @since  1.0
298
		 *
299
		 * @param  array $settings License settings content.
300
		 *
301
		 * @return array           License settings content.
302
		 */
303
		public function license_settings_content( $settings ) {
304
305
			$give_license_settings = array(
306
				array(
307
					'name' => __( 'Add-on Licenses', 'give' ),
308
					'desc' => '<hr>',
309
					'type' => 'give_title',
310
					'id'   => 'give_title',
311
				),
312
			);
313
314
			return array_merge( $settings, $give_license_settings );
315
		}
316
317
		/**
318
		 * Activate License
319
		 *
320
		 * Activate the license key.
321
		 *
322
		 * @access public
323
		 * @since  1.0
324
		 *
325
		 * @return void
326
		 */
327
		public function activate_license() {
328
			// Bailout.
329
			if( ! $this->__is_user_can_edit_license() ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
330
				return;
331
			}
332
333
			// Allow third party addon developers to handle license activation.
334
			if ( $this->__is_third_party_addon() ) {
335
				do_action( 'give_activate_license', $this );
336
337
				return;
338
			}
339
340
			// Do not simultaneously activate add-ons if the user want to deactivate a specific add-on.
341
			foreach ( $_POST as $key => $value ) {
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
342
				if ( false !== strpos( $key, 'license_key_deactivate' ) ) {
343
					// Don't activate a key when deactivating a different key
344
					return;
345
				}
346
			}
347
348
			// Delete previous license setting if a empty license key submitted.
349
			if ( empty( $_POST["{$this->item_shortname}_license_key"] ) ) {
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
350
				$this->unset_license();
351
352
				return;
353
			}
354
355
			// Check if plugin previously installed.
356
			if ( $this->is_valid_license() ) {
357
				return;
358
			}
359
360
			// Get license key.
361
			$this->license = sanitize_text_field( $_POST[ $this->item_shortname . '_license_key' ] );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_POST
Loading history...
362
363
			// Delete previous license key from subscription if previously added.
364
			$this->__remove_license_key_from_subscriptions();
365
366
			// Make sure there are no api errors.
367
			if ( ! ( $license_data = $this->get_license_info( 'activate_license' ) ) ) {
368
				return;
369
			}
370
371
			// Make sure license is valid.
372
			// return because admin will want to activate license again.
373
			if ( ! $this->is_license( $license_data ) ) {
374
				// Add license key.
375
				give_update_option( "{$this->item_shortname}_license_key", $this->license );
376
377
				return;
378
			}
379
380
			// Tell WordPress to look for updates.
381
			set_site_transient( 'update_plugins', null );
382
383
			// Add license data.
384
			update_option(  "{$this->item_shortname}_license_active", $license_data );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 2 found
Loading history...
385
386
			// Add license key.
387
			give_update_option( "{$this->item_shortname}_license_key", $this->license );
388
389
			// Check subscription for license key and store this to db (if any).
390
			$this->__single_subscription_check();
391
		}
392
393
		/**
394
		 * Deactivate License
395
		 *
396
		 * Deactivate the license key.
397
		 *
398
		 * @access public
399
		 * @since  1.0
400
		 *
401
		 * @return void
402
		 */
403
		public function deactivate_license() {
404
			// Bailout.
405
			if( ! $this->__is_user_can_edit_license() ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
406
				return;
407
			}
408
409
			// Allow third party add-on developers to handle license deactivation.
410
			if ( $this->__is_third_party_addon() ) {
411
				do_action( 'give_deactivate_license', $this );
412
413
				return;
414
			}
415
416
			// Run on deactivate button press.
417
			if ( isset( $_POST[ $this->item_shortname . '_license_key_deactivate' ] ) ) {
418
419
				// Make sure there are no api errors.
420
				if ( ! ( $license_data = $this->get_license_info( 'deactivate_license' ) ) ) {
421
					return;
422
				}
423
424
				// Ensure deactivated successfully.
425
				if ( isset( $license_data->success ) ) {
426
					$this->unset_license();
427
				}
428
			}// End if().
429
		}
430
431
		/**
432
		 * Check if license key is valid once per week.
433
		 *
434
		 * @access public
435
		 * @since  1.7
436
		 *
437
		 * @return void
438
		 */
439
		public function weekly_license_check() {
440
441
			if (
442
				! empty( $_POST['give_settings'] ) ||
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
443
				empty( $this->license )
444
			) {
445
				return;
446
			}
447
448
			// Allow third party add-on developers to handle their license check.
449
			if ( $this->__is_third_party_addon() ) {
450
				do_action( 'give_weekly_license_check', $this );
451
452
				return;
453
			}
454
455
			// Make sure there are no api errors.
456
			if ( ! ( $license_data = $this->get_license_info( 'check_license' ) ) ) {
457
				return;
458
			}
459
460
			// Bailout.
461
			if( ! $this->is_license( $license_data ) ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
462
				return;
463
			}
464
465
			update_option( $this->item_shortname . '_license_active', $license_data );
466
467
			return;
468
		}
469
470
		/**
471
		 * Check subscription validation once per week
472
		 *
473
		 * @access public
474
		 * @since  1.7
475
		 *
476
		 * @return void
477
		 */
478
		public function weekly_subscription_check() {
479
			// Bailout.
480
			if (
481
				! empty( $_POST['give_settings'] ) ||
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
482
				empty( $this->license )
483
			) {
484
				return;
485
			}
486
487
			// Remove old subscription data.
488
			if ( absint( get_option( '_give_subscriptions_edit_last', true ) ) < current_time( 'timestamp', 1 ) ) {
489
				delete_option( 'give_subscriptions' );
490
				update_option( '_give_subscriptions_edit_last', strtotime( '+ 1 day', current_time( 'timestamp', 1 ) ) );
491
			}
492
493
			// Allow third party add-on developers to handle their subscription check.
494
			if ( $this->__is_third_party_addon() ) {
495
				do_action( 'give_weekly_subscription_check', $this );
496
497
				return;
498
			}
499
500
			$this->__single_subscription_check();
501
		}
502
503
		/**
504
		 * Check if license key is part of subscription or not
505
		 *
506
		 * @access private
507
		 * @since  1.7
508
		 *
509
		 * @return void
510
		 */
511
		private function __single_subscription_check() {
0 ignored issues
show
Coding Style introduced by
Method name "Give_License::__single_subscription_check" is invalid; only PHP magic methods should be prefixed with a double underscore
Loading history...
512
			if ( empty( $this->license ) ) {
513
				return;
514
			}
515
516
			// Make sure there are no api errors.
517
			// Do not get confused with edd_action check_subscription.
518
			// By default edd software licensing api does not have api to check subscription.
519
			// This is a custom feature to check subscriptions.
520
			if ( ! ( $subscription_data = $this->get_license_info( 'check_subscription', true ) ) ) {
521
				return;
522
			}
523
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
524
525
			if ( ! empty( $subscription_data['success'] ) && absint( $subscription_data['success'] ) ) {
526
				$subscriptions = get_option( 'give_subscriptions', array() );
527
528
				// Update subscription data only if subscription does not exist already.
529
				$subscriptions[ $subscription_data['id'] ]            = $subscription_data;
530
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
531
532
				// Initiate default set of license for subscription.
533
				if( ! isset( $subscriptions[ $subscription_data['id'] ]['licenses'] ) ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
534
					$subscriptions[ $subscription_data['id']]['licenses'] = array();
0 ignored issues
show
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
535
				}
536
537
				// Store licenses for subscription.
538
				if ( ! in_array( $this->license, $subscriptions[ $subscription_data['id'] ]['licenses'] ) ) {
539
					$subscriptions[ $subscription_data['id']]['licenses'][] = $this->license;
0 ignored issues
show
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
540
				}
541
542
				update_option( 'give_subscriptions', $subscriptions );
543
			}
544
		}
545
546
		/**
547
		 * Admin notices for errors
548
		 *
549
		 * @access public
550
		 * @since  1.0
551
		 *
552
		 * @return void
553
		 */
554
		public function notices() {
555
556
			if ( ! current_user_can( 'manage_give_settings' ) ) {
557
				return;
558
			}
559
560
			// Do not show licenses notices on license tab.
561
			if ( 'licenses' === give_get_current_setting_tab() ) {
562
				return;
563
			}
564
565
			static $showed_invalid_message;
566
			static $showed_subscriptions_message;
567
			static $addon_license_key_in_subscriptions;
568
569
			// Set default value.
570
			$addon_license_key_in_subscriptions = ! empty( $addon_license_key_in_subscriptions ) ? $addon_license_key_in_subscriptions : array();
571
			$messages                           = array();
572
573
			// Check whether admin has Give Add-on activated since 24 hours?
574
			$is_license_notice_hidden = Give_Cache::get( 'give_cache_hide_license_notice_after_activation' );
575
576
			// Display Invalid License notice, if its more than 24 hours since first Give Add-on activation.
577
			if (
578
				empty( $this->license )
579
				&& empty( $showed_invalid_message )
580
				&& ( false === $is_license_notice_hidden )
581
			) {
582
583
				Give()->notices->register_notice( array(
584
					'id'               => 'give-invalid-license',
585
					'type'             => 'error',
586
					'description'      => sprintf(
587
						__( 'You have invalid or expired license keys for one or more Give Add-ons. Please go to the <a href="%s">licenses page</a> to correct this issue.', 'give' ),
588
						admin_url( 'edit.php?post_type=give_forms&page=give-settings&tab=licenses' )
589
					),
590
					'dismissible_type' => 'user',
591
					'dismiss_interval' => 'shortly',
592
				) );
593
594
				$showed_invalid_message = true;
595
596
			}
597
598
			// Get subscriptions.
599
			$subscriptions = get_option( 'give_subscriptions' );
600
601
			// Show subscription messages.
602
			if ( ! empty( $subscriptions ) && ! $showed_subscriptions_message ) {
603
604
				foreach ( $subscriptions as $subscription ) {
605
					// Subscription expires timestamp.
606
					$subscription_expires = strtotime( $subscription['expires'] );
607
608
					// Start showing subscriptions message before one week of renewal date.
609
					if ( strtotime( '- 7 days', $subscription_expires ) > current_time( 'timestamp', 1 ) ) {
610
						continue;
611
					}
612
613
					// Check if subscription message already exist in messages.
614
					if ( array_key_exists( $subscription['id'], $messages ) ) {
615
						continue;
616
					}
617
618
					// Check if license already expired.
619
					if ( strtotime( $subscription['expires'] ) < current_time( 'timestamp', 1 ) ) {
620
						Give()->notices->register_notice( array(
621
							'id'               => "give-expired-subscription-{$subscription['id']}",
622
							'type'             => 'error',
623
							'description'      => sprintf(
624
								__( 'Your Give add-on license expired for payment <a href="%1$s" target="_blank">#%2$d</a>. <a href="%3$s" target="_blank">Click to renew an existing license</a> or %4$s.', 'give' ),
625
								urldecode( $subscription['invoice_url'] ),
626
								$subscription['payment_id'],
627
								"{$this->checkout_url}?edd_license_key={$subscription['license_key']}&utm_campaign=admin&utm_source=licenses&utm_medium=expired",
628
								Give()->notices->get_dismiss_link(array(
629
									'title' => __( 'Click here if already renewed', 'give' ),
630
									'dismissible_type'      => 'user',
631
									'dismiss_interval'      => 'permanent',
632
								))
633
							),
634
							'dismissible_type' => 'user',
635
							'dismiss_interval' => 'shortly',
636
						) );
637
					} else {
638
						Give()->notices->register_notice( array(
639
							'id'               => "give-expires-subscription-{$subscription['id']}",
640
							'type'             => 'error',
641
							'description'      => sprintf(
642
								__( 'Your Give add-on license will expire in %1$s for payment <a href="%2$s" target="_blank">#%3$d</a>. <a href="%4$s" target="_blank">Click to renew an existing license</a> or %5$s.', 'give' ),
643
								human_time_diff( current_time( 'timestamp', 1 ), strtotime( $subscription['expires'] ) ),
644
								urldecode( $subscription['invoice_url'] ),
645
								$subscription['payment_id'],
646
								"{$this->checkout_url}?edd_license_key={$subscription['license_key']}&utm_campaign=admin&utm_source=licenses&utm_medium=expired",
647
								Give()->notices->get_dismiss_link(array(
648
									'title' => __( 'Click here if already renewed', 'give' ),
649
									'dismissible_type'      => 'user',
650
									'dismiss_interval'      => 'permanent',
651
								))
652
							),
653
							'dismissible_type' => 'user',
654
							'dismiss_interval' => 'shortly',
655
						) );
656
					}
657
658
					// Stop validation for these license keys.
659
					$addon_license_key_in_subscriptions = array_merge( $addon_license_key_in_subscriptions, $subscription['licenses'] );
660
				}// End foreach().
661
				$showed_subscriptions_message = true;
662
			}// End if().
663
664
			// Show Non Subscription Give Add-on messages.
665
			if (
666
				! in_array( $this->license, $addon_license_key_in_subscriptions )
667
				&& ! empty( $this->license )
668
				&& empty( $showed_invalid_message )
669
				&& ! $this->is_valid_license()
670
			) {
671
672
				Give()->notices->register_notice( array(
673
					'id'               => 'give-invalid-license',
674
					'type'             => 'error',
675
					'description'      => sprintf(
676
						__( 'You have invalid or expired license keys for one or more Give Add-ons. Please go to the <a href="%s">licenses page</a> to correct this issue.', 'give' ),
677
						admin_url( 'edit.php?post_type=give_forms&page=give-settings&tab=licenses' )
678
					),
679
					'dismissible_type' => 'user',
680
					'dismiss_interval' => 'shortly',
681
				) );
682
683
				$showed_invalid_message = true;
684
685
			}
686
		}
687
688
		/**
689
		 * Check if license is valid or not.
690
		 *
691
		 * @since  1.7
692
		 * @access public
693
		 *
694
		 * @param null|object $licence_data
695
		 *
696
		 * @return bool
697
		 */
698
		public function is_valid_license( $licence_data = null ) {
699
			$license_data = empty( $licence_data ) ? $this->license_data : $licence_data;
700
701
			if ( apply_filters( 'give_is_valid_license', ( $this->is_license( $license_data ) && 'valid' === $license_data->license ) ) ) {
702
				return true;
703
			}
704
705
			return false;
706
		}
707
708
709
		/**
710
		 * Check if license is license object of no.
711
		 *
712
		 * @since  1.7
713
		 * @access public
714
		 *
715
		 * @param null|object $licence_data
716
		 *
717
		 * @return bool
718
		 */
719
		public function is_license( $licence_data = null ){
720
			$license_data = empty( $licence_data ) ? $this->license_data : $licence_data;
721
722
			if ( apply_filters( 'give_is_license', ( is_object( $license_data ) && ! empty( $license_data ) && property_exists( $license_data, 'license' ) ) ) ) {
723
				return true;
724
			}
725
726
			return false;
727
		}
728
729
		/**
730
		 * Check if license is valid or not.
731
		 *
732
		 * @access private
733
		 * @since  1.7
734
		 *
735
		 * @return bool
736
		 */
737
		private function __is_third_party_addon() {
0 ignored issues
show
Coding Style introduced by
Method name "Give_License::__is_third_party_addon" is invalid; only PHP magic methods should be prefixed with a double underscore
Loading history...
738
			return ( false === strpos( $this->api_url, 'givewp.com/' ) );
739
		}
740
741
		/**
742
		 * Remove license key from subscription.
743
		 *
744
		 * This function mainly uses when admin user deactivate license key,
745
		 * then we do not need subscription information for that license key.
746
		 *
747
		 * @access private
748
		 * @since  1.7
749
		 *
750
		 * @return bool
751
		 */
752
		private function __remove_license_key_from_subscriptions() {
0 ignored issues
show
Coding Style introduced by
Method name "Give_License::__remove_license_key_from_subscriptions" is invalid; only PHP magic methods should be prefixed with a double underscore
Loading history...
753
			$subscriptions = get_option( 'give_subscriptions', array() );
754
755
			// Bailout.
756
			if ( empty( $this->license ) ) {
757
				return false;
758
			}
759
760
			if ( ! empty( $subscriptions ) ) {
761
				foreach ( $subscriptions as $subscription_id => $subscription ) {
762
					$license_index = array_search( $this->license, $subscription['licenses'] );
763
					if ( false !== $license_index ) {
764
						// Remove license key.
765
						unset( $subscriptions[ $subscription_id ]['licenses'][ $license_index ] );
766
767
						// Rearrange license keys.
768
						$subscriptions[ $subscription_id ]['licenses'] = array_values( $subscriptions[ $subscription_id ]['licenses'] );
769
770
						// Update subscription information.
771
						update_option( 'give_subscriptions', $subscriptions );
772
						break;
773
					}
774
				}
775
			}
776
		}
777
778
		/**
779
		 * @param $plugin_file
780
		 * @param $plugin_data
781
		 * @param $status
782
		 *
783
		 * @return bool
784
		 */
785
		public function plugin_page_notices( $plugin_file, $plugin_data, $status ) {
0 ignored issues
show
Unused Code introduced by
The parameter $plugin_file 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...
Unused Code introduced by
The parameter $plugin_data 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...
Unused Code introduced by
The parameter $status 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...
786
			// Bailout.
787
			if ( $this->is_valid_license() ) {
788
				return false;
789
			}
790
791
			$update_notice_wrap = '<tr class="give-addon-notice-tr active"><td colspan="3" class="colspanchange"><div class="notice inline notice-warning notice-alt give-invalid-license"><p><span class="dashicons dashicons-info"></span> %s</p></div></td></tr>';
792
			$message            = $this->license_state_message();
793
794
			if ( ! empty( $message['message'] ) ) {
795
				echo sprintf( $update_notice_wrap, $message['message'] );
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'sprintf'
Loading history...
796
			}
797
		}
798
799
800
		/**
801
		 * Get message related to license state.
802
		 *
803
		 * @since  1.8.7
804
		 * @access public
805
		 * @return array
806
		 */
807
		public function license_state_message() {
808
			$message_data = array();
809
810
			if ( ! $this->is_valid_license() ) {
811
812
				$message_data['message'] = sprintf(
813
					'Please <a href="%1$s">activate your license</a> to receive updates and support for the %2$s add-on.',
814
					esc_url( admin_url( 'edit.php?post_type=give_forms&page=give-settings&tab=licenses' ) ),
815
					$this->item_name
816
				);
817
			}
818
819
			return $message_data;
820
		}
821
822
823
		/**
824
		 * Check if admin can edit license or not,
825
		 *
826
		 * @since  1.8.9
827
		 * @access private
828
		 */
829
		private function __is_user_can_edit_license() {
0 ignored issues
show
Coding Style introduced by
Method name "Give_License::__is_user_can_edit_license" is invalid; only PHP magic methods should be prefixed with a double underscore
Loading history...
830
			// Bailout.
831
			if (
832
				! Give_Admin_Settings::verify_nonce() ||
833
				! current_user_can( 'manage_give_settings' ) ||
834
				'licenses' !== give_get_current_setting_tab()
835
			) {
836
				return false;
837
			}
838
839
			// Security check.
840
			if (
841
				isset( $_POST[ $this->item_shortname . '_license_key-nonce'] ) &&
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
842
				! wp_verify_nonce( $_REQUEST[ $this->item_shortname . '_license_key-nonce' ], $this->item_shortname . '_license_key-nonce' )
0 ignored issues
show
introduced by
Detected access of super global var $_REQUEST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_REQUEST
Loading history...
843
			) {
844
				wp_die( __( 'Nonce verification failed.', 'give' ), __( 'Error', 'give' ), array( 'response' => 403 ) );
845
			}
846
847
			return true;
848
		}
849
850
851
		/**
852
		 * Get license information.
853
		 *
854
		 * @since  1.8.9
855
		 * @access public
856
		 *
857
		 * @param string $edd_action
858
		 * @param bool   $response_in_array
859
		 *
860
		 * @return mixed
861
		 */
862
		public function get_license_info( $edd_action = '', $response_in_array = false ) {
863
			if( empty( $edd_action ) ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
864
				return false;
865
			}
866
867
			// Data to send to the API.
868
			$api_params = array(
869
				'edd_action' => $edd_action, // never change from "edd_" to "give_"!
870
				'license'    => $this->license,
871
				'item_name'  => urlencode( $this->item_name ),
872
				'url'        => home_url(),
873
			);
874
875
			// Call the API.
876
			$response = wp_remote_post(
877
				$this->api_url,
878
				array(
879
					'timeout'   => 15,
880
					'sslverify' => false,
881
					'body'      => $api_params,
882
				)
883
			);
884
885
			// Make sure there are no errors.
886
			if ( is_wp_error( $response ) ) {
887
				return false;
888
			}
889
890
			return json_decode( wp_remote_retrieve_body( $response ), $response_in_array );
891
		}
892
893
894
		/**
895
		 * Unset license
896
		 *
897
		 * @since  1.8.14
898
		 * @access private
899
		 */
900
		private function unset_license() {
901
			// Remove license key from subscriptions if exist.
902
			$this->__remove_license_key_from_subscriptions();
903
904
			// Remove license from database.
905
			delete_option( "{$this->item_shortname}_license_active" );
906
			give_delete_option( "{$this->item_shortname}_license_key" );
907
908
			// Unset license param.
909
			$this->license = '';
910
		}
911
	}
912
913
endif; // end class_exists check.
914