PluginProbe ʕ •ᴥ•ʔ
Photo Gallery by FooGallery : Responsive Image Gallery, Masonry Gallery & Carousel / trunk
Photo Gallery by FooGallery : Responsive Image Gallery, Masonry Gallery & Carousel vtrunk
trunk 1.10.3 2.0.24 2.1.34 2.2.44 2.3.3 2.4.32 3.0.6 3.1.11 3.1.12 3.1.13 3.1.20 3.1.25 3.1.26 3.1.26.1 3.1.26.2
foogallery / freemius / includes / entities / class-fs-plugin-license.php
foogallery / freemius / includes / entities Last commit date
class-fs-affiliate-terms.php 3 years ago class-fs-affiliate.php 3 years ago class-fs-billing.php 3 years ago class-fs-entity.php 3 years ago class-fs-payment.php 8 months ago class-fs-plugin-info.php 3 years ago class-fs-plugin-license.php 8 months ago class-fs-plugin-plan.php 8 months ago class-fs-plugin-tag.php 8 months ago class-fs-plugin.php 3 years ago class-fs-pricing.php 3 years ago class-fs-scope-entity.php 3 years ago class-fs-site.php 8 months ago class-fs-subscription.php 3 years ago class-fs-user.php 8 months ago index.php 3 years ago
class-fs-plugin-license.php
335 lines
1 <?php
2 /**
3 * @package Freemius
4 * @copyright Copyright (c) 2015, Freemius, Inc.
5 * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
6 * @since 1.0.5
7 */
8
9 if ( ! defined( 'ABSPATH' ) ) {
10 exit;
11 }
12
13 /**
14 * Class FS_Plugin_License
15 */
16 class FS_Plugin_License extends FS_Entity {
17
18 #region Properties
19
20 /**
21 * @var number
22 */
23 public $plugin_id;
24 /**
25 * @var number
26 */
27 public $user_id;
28 /**
29 * @var number
30 */
31 public $plan_id;
32 /**
33 * @author Leo Fajardo (@leorw)
34 * @since 2.3.0
35 *
36 * @var string
37 */
38 public $parent_plan_name;
39 /**
40 * @author Leo Fajardo (@leorw)
41 * @since 2.3.0
42 *
43 * @var string
44 */
45 public $parent_plan_title;
46 /**
47 * @author Leo Fajardo (@leorw)
48 * @since 2.3.0
49 *
50 * @var number
51 */
52 public $parent_license_id;
53 /**
54 * @author Leo Fajardo (@leorw)
55 * @since 2.4.0
56 *
57 * @var array
58 */
59 public $products;
60 /**
61 * @var number
62 */
63 public $pricing_id;
64 /**
65 * @var int|null
66 */
67 public $quota;
68 /**
69 * @var int
70 */
71 public $activated;
72 /**
73 * @var int
74 */
75 public $activated_local;
76 /**
77 * @var string
78 */
79 public $expiration;
80 /**
81 * @var string
82 */
83 public $secret_key;
84 /**
85 * @var bool
86 */
87 public $is_whitelabeled;
88 /**
89 * @var bool $is_free_localhost Defaults to true. If true, allow unlimited localhost installs with the same
90 * license.
91 */
92 public $is_free_localhost;
93 /**
94 * @var bool $is_block_features Defaults to true. If false, don't block features after license expiry - only
95 * block updates and support.
96 */
97 public $is_block_features;
98 /**
99 * @var bool
100 */
101 public $is_cancelled;
102
103 #endregion Properties
104
105 /**
106 * @param stdClass|bool $license
107 */
108 function __construct( $license = false ) {
109 parent::__construct( $license );
110 }
111
112 /**
113 * Get entity type.
114 *
115 * @return string
116 */
117 static function get_type() {
118 return 'license';
119 }
120
121 /**
122 * Check how many site activations left.
123 *
124 * @author Vova Feldman (@svovaf)
125 * @since 1.0.5
126 *
127 * @return int
128 */
129 function left() {
130 if ( ! $this->is_features_enabled() ) {
131 return 0;
132 }
133
134 if ( $this->is_unlimited() ) {
135 return 999;
136 }
137
138 return ( $this->quota - $this->activated - ( $this->is_free_localhost ? 0 : $this->activated_local ) );
139 }
140
141 /**
142 * Check if single site license.
143 *
144 * @author Vova Feldman (@svovaf)
145 * @since 1.1.8.1
146 *
147 * @return bool
148 */
149 function is_single_site() {
150 return ( is_numeric( $this->quota ) && 1 == $this->quota );
151 }
152
153 /**
154 * @author Vova Feldman (@svovaf)
155 * @since 1.0.5
156 *
157 * @return bool
158 */
159 function is_expired() {
160 return ! $this->is_lifetime() && ( strtotime( $this->expiration ) < WP_FS__SCRIPT_START_TIME );
161 }
162
163 /**
164 * Check if license is not expired.
165 *
166 * @author Vova Feldman (@svovaf)
167 * @since 1.2.1
168 *
169 * @return bool
170 */
171 function is_valid() {
172 return ! $this->is_expired();
173 }
174
175 /**
176 * @author Vova Feldman (@svovaf)
177 * @since 1.0.6
178 *
179 * @return bool
180 */
181 function is_lifetime() {
182 return is_null( $this->expiration );
183 }
184
185 /**
186 * @author Vova Feldman (@svovaf)
187 * @since 1.2.0
188 *
189 * @return bool
190 */
191 function is_unlimited() {
192 return is_null( $this->quota );
193 }
194
195 /**
196 * Check if license is fully utilized.
197 *
198 * @author Vova Feldman (@svovaf)
199 * @since 1.0.6
200 *
201 * @param bool|null $is_localhost
202 *
203 * @return bool
204 */
205 function is_utilized( $is_localhost = null ) {
206 if ( is_null( $is_localhost ) ) {
207 $is_localhost = WP_FS__IS_LOCALHOST_FOR_SERVER;
208 }
209
210 if ( $this->is_unlimited() ) {
211 return false;
212 }
213
214 return ! ( $this->is_free_localhost && $is_localhost ) &&
215 ( $this->quota <= $this->activated + ( $this->is_free_localhost ? 0 : $this->activated_local ) );
216 }
217
218 /**
219 * Check if license can be activated.
220 *
221 * @author Vova Feldman (@svovaf)
222 * @since 2.0.0
223 *
224 * @param bool|null $is_localhost
225 *
226 * @return bool
227 */
228 function can_activate( $is_localhost = null ) {
229 return ! $this->is_utilized( $is_localhost ) && $this->is_features_enabled();
230 }
231
232 /**
233 * Check if license can be activated on a given number of production and localhost sites.
234 *
235 * @author Vova Feldman (@svovaf)
236 * @since 2.0.0
237 *
238 * @param int $production_count
239 * @param int $localhost_count
240 *
241 * @return bool
242 */
243 function can_activate_bulk( $production_count, $localhost_count ) {
244 if ( $this->is_unlimited() ) {
245 return true;
246 }
247
248 /**
249 * For simplicity, the logic will work as following: when given X sites to activate the license on, if it's
250 * possible to activate on ALL of them, do the activation. If it's not possible to activate on ALL of them,
251 * do NOT activate on any of them.
252 */
253 return ( $this->quota >= $this->activated + $production_count + ( $this->is_free_localhost ? 0 : $this->activated_local + $localhost_count ) );
254 }
255
256 /**
257 * @author Vova Feldman (@svovaf)
258 * @since 1.2.1
259 *
260 * @return bool
261 */
262 function is_active() {
263 return ( ! $this->is_cancelled );
264 }
265
266 /**
267 * Check if license's plan features are enabled.
268 *
269 * - Either if plan not expired
270 * - If expired, based on the configuration to block features or not.
271 *
272 * @author Vova Feldman (@svovaf)
273 * @since 1.0.6
274 *
275 * @return bool
276 */
277 function is_features_enabled() {
278 return $this->is_active() && ( ! $this->is_block_features || ! $this->is_expired() );
279 }
280
281 /**
282 * Subscription considered to be new without any payments
283 * if the license expires in less than 24 hours
284 * from the license creation.
285 *
286 * @author Vova Feldman (@svovaf)
287 * @since 1.0.9
288 *
289 * @return bool
290 */
291 function is_first_payment_pending() {
292 if ( $this->is_lifetime() ) {
293 return false;
294 }
295
296 return ( WP_FS__TIME_24_HOURS_IN_SEC >= strtotime( $this->expiration ) - strtotime( $this->created ) );
297 }
298
299 /**
300 * @return int
301 */
302 function total_activations() {
303 return ( $this->activated + $this->activated_local );
304 }
305
306 /**
307 * @author Vova Feldman (@svovaf)
308 * @since 2.3.1
309 *
310 * @return string
311 */
312 function get_html_escaped_masked_secret_key() {
313 return self::mask_secret_key_for_html( $this->secret_key );
314 }
315
316 /**
317 * @author Vova Feldman (@svovaf)
318 * @since 2.3.1
319 *
320 * @param string $secret_key
321 *
322 * @return string
323 */
324 static function mask_secret_key_for_html( $secret_key ) {
325 return (
326 // Initial 6 chars - sk_ABC
327 htmlspecialchars( substr( $secret_key, 0, 6 ) ) .
328 // Masking
329 str_pad( '', ( strlen( $secret_key ) - 9 ) * 6, '&bull;' ) .
330 // Last 3 chars.
331 htmlspecialchars( substr( $secret_key, - 3 ) )
332 );
333 }
334 }
335