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

Give_License::__construct()   C

Complexity

Conditions 8
Paths 32

Size

Total Lines 28
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 72

Importance

Changes 0
Metric Value
cc 8
eloc 20
nc 32
nop 8
dl 0
loc 28
rs 5.3846
c 0
b 0
f 0
ccs 0
cts 7
cp 0
crap 72

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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