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 ) { |
|
|
|
|
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
|
|
|
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(). |
|
|
|
|
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
|
|
|
$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() { |
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
|
|
|
|
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
|
|
|
|
518
|
|
|
|
519
|
|
|
// Initiate default set of license for subscription. |
520
|
|
|
if( ! isset( $subscriptions[ $subscription_data['id'] ]['licenses'] ) ) { |
521
|
|
|
$subscriptions[ $subscription_data['id']]['licenses'] = array(); |
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; |
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() { |
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() { |
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 ) { |
|
|
|
|
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'] ); |
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(){ |
786
|
|
|
// Bailout. |
787
|
|
|
if ( |
788
|
|
|
empty( $_POST[ $this->item_shortname . '_license_key' ] ) || |
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' ) ) { |
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 ) ) { |
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
|
|
|
|
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.