Test Failed
Push — feature/background-processing ( ddf6d7 )
by Ravinder
06:04
created

Give_License::weekly_subscription_check()   B

Complexity

Conditions 5
Paths 5

Size

Total Lines 24
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

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