Completed
Push — feature/refactor-license-api ( 1eee8f )
by Ravinder
19:44
created

Give_License::plugin_page_notices()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 7
nc 3
nop 3
dl 0
loc 13
rs 9.4285
c 0
b 0
f 0
1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 26 and the first side effect is on line 14.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
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;
0 ignored issues
show
Bug introduced by
The property auto_updater_obj does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
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
			add_action( 'give_weekly_scheduled_events', 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
			add_action( 'give_weekly_scheduled_events', 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() ) {
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' ] ) ) {
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 ) {
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' ] );
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() ) {
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().
0 ignored issues
show
Unused Code Comprehensibility introduced by
43% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
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'] ) ||
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'] ) ||
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
			// Delete subscription notices show blocker.
488
			$this->__remove_license_notices_show_blocker();
489
490
			$this->__single_subscription_check();
491
		}
492
493
		/**
494
		 * Check if license key is part of subscription or not
495
		 *
496
		 * @access private
497
		 * @since  1.7
498
		 *
499
		 * @return void
500
		 */
501
		private function __single_subscription_check() {
502
			if ( empty( $this->license ) ) {
503
				return;
504
			}
505
506
			// Make sure there are no api errors
507
			// Do not get confused with edd_action check_subscription.
508
			// By default edd software licensing api does not have api to check subscription.
509
			// This is a custom feature to check subscriptions.
510
			if ( ! ( $subscription_data = $this->get_license_info( 'check_subscription' ) ) ) {
511
				return;
512
			}
513
514
			if ( ! empty( $subscription_data->success ) && absint( $subscription_data->success ) ) {
515
				$subscriptions = get_option( 'give_subscriptions', array() );
516
517
				// Update subscription data only if subscription does not exist already.
518
				if ( ! array_key_exists( $subscription_data->id, $subscriptions ) ) {
519
					$subscriptions[ $subscription_data->id ]             = $subscription_data;
520
					$subscriptions[ $subscription_data->id ]['licenses'] = array();
521
				}
522
523
				// Store licenses for subscription.
524
				if ( ! in_array( $this->license, $subscriptions[ $subscription_data->id ]['licenses'] ) ) {
525
					$subscriptions[ $subscription_data->id ]['licenses'][] = $this->license;
526
				}
527
528
				update_option( 'give_subscriptions', $subscriptions );
529
			}
530
		}
531
532
		/**
533
		 * Admin notices for errors
534
		 *
535
		 * @access public
536
		 * @since  1.0
537
		 *
538
		 * @return void
539
		 */
540
		public function notices() {
541
542
			if ( ! current_user_can( 'manage_give_settings' ) ) {
543
				return;
544
			}
545
546
			// Do not show licenses notices on license tab.
547
			if ( 'licenses' === give_get_current_setting_tab() ) {
548
				return;
549
			}
550
551
			static $showed_invalid_message;
552
			static $showed_subscriptions_message;
553
			static $addon_license_key_in_subscriptions;
554
555
			// Set default value.
556
			$addon_license_key_in_subscriptions = ! empty( $addon_license_key_in_subscriptions ) ? $addon_license_key_in_subscriptions : array();
557
			$messages                           = array();
558
559
			if (
560
				empty( $this->license )
561
				&& ! $this->__is_notice_dismissed( 'general' )
562
				&& empty( $showed_invalid_message )
563
			) {
564
				$messages['general']    = sprintf(
565
					__( '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' ),
566
					admin_url( 'edit.php?post_type=give_forms&page=give-settings&tab=licenses' )
567
				);
568
				$showed_invalid_message = true;
569
570
			}
571
572
			// Get subscriptions.
573
			$subscriptions = get_option( 'give_subscriptions' );
574
575
			// Show subscription messages.
576
			if ( ! empty( $subscriptions ) && ! $showed_subscriptions_message ) {
577
578
				foreach ( $subscriptions as $subscription ) {
579
					// Subscription expires timestamp.
580
					$subscription_expires = strtotime( $subscription['expires'] );
581
582
					// Start showing subscriptions message before one week of renewal date.
583
					if ( strtotime( '- 7 days', $subscription_expires ) > current_time( 'timestamp', 1 ) ) {
584
						continue;
585
					}
586
587
					// Check if subscription message already exist in messages.
588
					if ( array_key_exists( $subscription['id'], $messages ) ) {
589
						continue;
590
					}
591
592
					if ( ( ! $this->__is_notice_dismissed( $subscription['id'] ) && 'active' !== $subscription['status'] ) ) {
593
594
						if ( strtotime( $subscription['expires'] ) < current_time( 'timestamp', 1 ) ) {// Check if license already expired.
595
							$messages[ $subscription['id'] ] = sprintf(
596
								__( '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 <a href="%4$s">Click here if already renewed</a>.', 'give' ),
597
								urldecode( $subscription['invoice_url'] ),
598
								$subscription['payment_id'],
599
								"{$this->checkout_url}?edd_license_key={$subscription['license_key']}&utm_campaign=admin&utm_source=licenses&utm_medium=expired",
600
								esc_url( add_query_arg( '_give_hide_license_notices_permanently', $subscription['id'], $_SERVER['REQUEST_URI'] ) )
601
							);
602
						} else {
603
							$messages[ $subscription['id'] ] = sprintf(
604
								__( '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 <a href="%5$s">Click here if already renewed</a>.', 'give' ),
605
								human_time_diff( current_time( 'timestamp', 1 ), strtotime( $subscription['expires'] ) ),
606
								urldecode( $subscription['invoice_url'] ),
607
								$subscription['payment_id'],
608
								"{$this->checkout_url}?edd_license_key={$subscription['license_key']}&utm_campaign=admin&utm_source=licenses&utm_medium=expired",
609
								esc_url( add_query_arg( '_give_hide_license_notices_permanently', $subscription['id'], $_SERVER['REQUEST_URI'] ) )
610
							);
611
						}
612
					}
613
614
					// Stop validation for these license keys.
615
					$addon_license_key_in_subscriptions = array_merge( $addon_license_key_in_subscriptions, $subscription['licenses'] );
616
				}// End foreach().
0 ignored issues
show
Unused Code Comprehensibility introduced by
43% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
617
				$showed_subscriptions_message = true;
618
			}// End if().
0 ignored issues
show
Unused Code Comprehensibility introduced by
43% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
619
620
			// Show non subscription addon messages.
621
			if (
622
				! in_array( $this->license, $addon_license_key_in_subscriptions )
623
				&& ! $this->__is_notice_dismissed( 'general' )
624
				&& ! $this->is_valid_license()
625
				&& empty( $showed_invalid_message )
626
			) {
627
628
				$messages['general']    = sprintf(
629
					__( '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' ),
630
					admin_url( 'edit.php?post_type=give_forms&page=give-settings&tab=licenses' )
631
				);
632
				$showed_invalid_message = true;
633
634
			}
635
636
			// Print messages.
637
			if ( ! empty( $messages ) ) {
638
				foreach ( $messages as $notice_id => $message ) {
639
640
					echo sprintf(
641
						'<div class="notice notice-error is-dismissible give-license-notice" data-dismiss-notice-shortly="%1$s"><p>%2$s</p></div>',
642
						esc_url( add_query_arg( '_give_hide_license_notices_shortly', $notice_id, $_SERVER['REQUEST_URI'] ) ),
643
						$message
644
					);
645
				}
646
			}
647
		}
648
649
		/**
650
		 * Check if license is valid or not.
651
		 *
652
		 * @access public
653
		 * @since  1.7
654
		 *
655
		 * @return bool
656
		 */
657
		public function is_valid_license() {
658
			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 ) ) ) {
659
				return true;
660
			}
661
662
			return false;
663
		}
664
665
		/**
666
		 * Check if license is valid or not.
667
		 *
668
		 * @access private
669
		 * @since  1.7
670
		 *
671
		 * @return bool
672
		 */
673
		private function __is_third_party_addon() {
674
			return ( false === strpos( $this->api_url, 'givewp.com/' ) );
675
		}
676
677
		/**
678
		 * Remove license key from subscription.
679
		 *
680
		 * This function mainly uses when admin user deactivate license key,
681
		 * then we do not need subscription information for that license key.
682
		 *
683
		 * @access private
684
		 * @since  1.7
685
		 *
686
		 * @return bool
0 ignored issues
show
Documentation introduced by
Should the return type not be false|null?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
687
		 */
688
		private function __remove_license_key_from_subscriptions() {
689
			$subscriptions = get_option( 'give_subscriptions', array() );
690
691
			// Bailout.
692
			if ( empty( $this->license ) ) {
693
				return false;
694
			}
695
696
			if ( ! empty( $subscriptions ) ) {
697
				foreach ( $subscriptions as $subscription_id => $subscription ) {
698
					$license_index = array_search( $this->license, $subscription['licenses'] );
699
					if ( false !== $license_index ) {
700
						// Remove license key.
701
						unset( $subscriptions[ $subscription_id ]['licenses'][ $license_index ] );
702
703
						// Rearrange license keys.
704
						$subscriptions[ $subscription_id ]['licenses'] = array_values( $subscriptions[ $subscription_id ]['licenses'] );
705
706
						// Update subscription information.
707
						update_option( 'give_subscriptions', $subscriptions );
708
						break;
709
					}
710
				}
711
			}
712
		}
713
714
		/**
715
		 * Remove license notices show blocker.
716
		 *
717
		 * @access private
718
		 * @since  1.7
719
		 *
720
		 * @return void
721
		 */
722
		private function __remove_license_notices_show_blocker() {
723
			global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
724
725
			// Delete permanent notice blocker.
726
			$wpdb->query(
727
				$wpdb->prepare(
728
					"
729
					DELETE FROM $wpdb->usermeta
730
					WHERE meta_key
731
					LIKE '%%%s%%'
732
					",
733
					'_give_hide_license_notices_permanently'
734
				)
735
			);
736
737
			// Delete short notice blocker.
738
			$wpdb->query(
739
				$wpdb->prepare(
740
					"
741
					DELETE FROM $wpdb->options
742
					WHERE option_name
743
					LIKE '%%%s%%'
744
					",
745
					'__give_hide_license_notices_shortly_'
746
				)
747
			);
748
		}
749
750
		/**
751
		 * Check if notice dismissed by admin user or not.
752
		 *
753
		 * @access private
754
		 * @since  1.7
755
		 *
756
		 * @param  int $notice_id Notice ID.
757
		 *
758
		 * @return bool
759
		 */
760
		private function __is_notice_dismissed( $notice_id ) {
761
			$current_user        = wp_get_current_user();
762
			$is_notice_dismissed = false;
763
764
			// Ge is notice dismissed permanently.
765
			$already_dismiss_notices = ( $already_dismiss_notices = get_user_meta( $current_user->ID, '_give_hide_license_notices_permanently', true ) )
766
				? $already_dismiss_notices
767
				: array();
768
769
			if (
770
				in_array( $notice_id, $already_dismiss_notices )
771
				|| false !== Give_Cache::get( "_give_hide_license_notices_shortly_{$current_user->ID}_{$notice_id}", true )
772
			) {
773
				$is_notice_dismissed = true;
774
			}
775
776
			return $is_notice_dismissed;
777
		}
778
779
780
		/**
781
		 * @param $plugin_file
782
		 * @param $plugin_data
783
		 * @param $status
784
		 *
785
		 * @return bool
0 ignored issues
show
Documentation introduced by
Should the return type not be false|null?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
786
		 */
787
		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...
788
			// Bailout.
789
			if ( $this->is_valid_license() ) {
790
				return false;
791
			}
792
793
			$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>';
794
			$message            = $this->license_state_message();
795
796
			if ( ! empty( $message['message'] ) ) {
797
				echo sprintf( $update_notice_wrap, $message['message'] );
798
			}
799
		}
800
801
802
		/**
803
		 * Get message related to license state.
804
		 *
805
		 * @since  1.8.7
806
		 * @access public
807
		 * @return array
808
		 */
809
		public function license_state_message() {
810
			$message_data = array();
811
812
			if ( ! $this->is_valid_license() ) {
813
814
				$message_data['message'] = sprintf(
815
					'Please <a href="%1$s">activate your license</a> to receive updates and support for the %2$s add-on.',
816
					esc_url( admin_url( 'edit.php?post_type=give_forms&page=give-settings&tab=licenses' ) ),
817
					$this->item_name
818
				);
819
			}
820
821
			return $message_data;
822
		}
823
824
825
		/**
826
		 * Check if admin can edit license or not,
827
		 *
828
		 * @since 1.8.9
829
		 * @access private
830
		 */
831
		private function __is_user_can_edit_license(){
832
			// Bailout.
833
			if (
834
				empty( $_POST[ $this->item_shortname . '_license_key' ] ) ||
835
				! current_user_can( 'manage_give_settings' )
836
			) {
837
				return false;
838
			}
839
840
			// Security check.
841
			if ( ! wp_verify_nonce( $_REQUEST[ $this->item_shortname . '_license_key-nonce' ], $this->item_shortname . '_license_key-nonce' ) ) {
842
				wp_die( __( 'Nonce verification failed.', 'give' ), __( 'Error', 'give' ), array( 'response' => 403 ) );
843
			}
844
845
			return true;
846
		}
847
848
849
		/**
850
		 * Get license information.
851
		 *
852
		 * @since  1.8.9
853
		 * @access public
854
		 *
855
		 * @param string $edd_action
856
		 *
857
		 * @return mixed
858
		 */
859
		public function get_license_info( $edd_action = '' ) {
860
			if( empty( $edd_action ) ) {
861
				return false;
862
			}
863
864
			// Data to send to the API
865
			$api_params = array(
866
				'edd_action' => $edd_action, // never change from "edd_" to "give_"!
867
				'license'    => $this->license,
868
				'item_name'  => urlencode( $this->item_name ),
869
				'url'        => home_url(),
870
			);
871
872
			// Call the API
873
			$response = wp_remote_post(
874
				$this->api_url,
875
				array(
876
					'timeout'   => 15,
877
					'sslverify' => false,
878
					'body'      => $api_params,
879
				)
880
			);
881
882
			// Make sure there are no errors
883
			if ( is_wp_error( $response ) ) {
884
				return false;
885
			}
886
887
			return json_decode( wp_remote_retrieve_body( $response ) );
888
		}
889
	}
890
891
endif; // end class_exists check
892