1
|
|
|
<?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName |
2
|
|
|
/** |
3
|
|
|
* The password strength checker. |
4
|
|
|
* |
5
|
|
|
* @package jetpack |
6
|
|
|
*/ |
7
|
|
|
|
8
|
|
|
/** |
9
|
|
|
* Checks passwords strength. |
10
|
|
|
*/ |
11
|
|
|
class Jetpack_Password_Checker { |
12
|
|
|
|
13
|
|
|
/** |
14
|
|
|
* Minimum entropy bits a password should contain. 36 bits of entropy is considered |
15
|
|
|
* to be a reasonable password, 28 stands for a weak one. |
16
|
|
|
* |
17
|
|
|
* @const Integer |
18
|
|
|
*/ |
19
|
|
|
const MINIMUM_BITS = 28; |
20
|
|
|
|
21
|
|
|
/** |
22
|
|
|
* Currently tested password. |
23
|
|
|
* |
24
|
|
|
* @var String |
25
|
|
|
*/ |
26
|
|
|
public $password = ''; |
27
|
|
|
|
28
|
|
|
/** |
29
|
|
|
* Test results array. |
30
|
|
|
* |
31
|
|
|
* @var Array |
32
|
|
|
*/ |
33
|
|
|
public $test_results = ''; |
34
|
|
|
|
35
|
|
|
/** |
36
|
|
|
* Current password score. |
37
|
|
|
* |
38
|
|
|
* @var Integer |
39
|
|
|
*/ |
40
|
|
|
public $score = 0; |
41
|
|
|
|
42
|
|
|
/** |
43
|
|
|
* Current multiplier affecting the score. |
44
|
|
|
* |
45
|
|
|
* @var Integer |
46
|
|
|
*/ |
47
|
|
|
public $multiplier = 4; |
48
|
|
|
|
49
|
|
|
/** |
50
|
|
|
* A common password blacklist, which on match will immediately disqualify the password. |
51
|
|
|
* |
52
|
|
|
* @var Array |
53
|
|
|
*/ |
54
|
|
|
public $common_passwords = array(); |
55
|
|
|
|
56
|
|
|
/** |
57
|
|
|
* Minimum password length setting. |
58
|
|
|
* |
59
|
|
|
* @var Integer |
60
|
|
|
*/ |
61
|
|
|
public $min_password_length = 6; |
62
|
|
|
|
63
|
|
|
/** |
64
|
|
|
* User defined strings that passwords need to be tested for a match against. |
65
|
|
|
* |
66
|
|
|
* @var Array |
67
|
|
|
*/ |
68
|
|
|
private $user_strings_to_test = array(); |
69
|
|
|
|
70
|
|
|
/** |
71
|
|
|
* The user object for whom the password is being tested. |
72
|
|
|
* |
73
|
|
|
* @var WP_User |
74
|
|
|
*/ |
75
|
|
|
protected $user; |
76
|
|
|
|
77
|
|
|
/** |
78
|
|
|
* The user identifier for whom the password is being tested, used if there's no user object. |
79
|
|
|
* |
80
|
|
|
* @var WP_User |
81
|
|
|
*/ |
82
|
|
|
protected $user_id; |
83
|
|
|
|
84
|
|
|
/** |
85
|
|
|
* Creates an instance of the password checker class for the specified user, or |
86
|
|
|
* defaults to the currently logged in user. |
87
|
|
|
* |
88
|
|
|
* @param Mixed $user can be an integer ID, or a WP_User object. |
89
|
|
|
*/ |
90
|
|
|
public function __construct( $user = null ) { |
91
|
|
|
|
92
|
|
|
/** |
93
|
|
|
* Filters Jetpack's password strength enforcement settings. You can supply your own passwords |
94
|
|
|
* that should not be used for authenticating in addition to weak and easy to guess strings for |
95
|
|
|
* each user. For example, you can add passwords from known password databases to avoid compromised |
96
|
|
|
* password usage. |
97
|
|
|
* |
98
|
|
|
* @since 7.2.0 |
99
|
|
|
* |
100
|
|
|
* @param Array $restricted_passwords strings that are forbidden for use as passwords. |
101
|
|
|
*/ |
102
|
|
|
$this->common_passwords = apply_filters( 'jetpack_password_checker_restricted_strings', array() ); |
103
|
|
|
|
104
|
|
|
if ( is_null( $user ) ) { |
105
|
|
|
$this->user_id = get_current_user_id(); |
106
|
|
|
} elseif ( is_object( $user ) && isset( $user->ID ) ) { |
107
|
|
|
|
108
|
|
|
// Existing user, using their ID. |
109
|
|
|
$this->user_id = $user->ID; |
110
|
|
|
|
111
|
|
|
} elseif ( is_object( $user ) ) { |
112
|
|
|
|
113
|
|
|
// Newly created user, using existing data. |
114
|
|
|
$this->user = $user; |
115
|
|
|
$this->user_id = 'new_user'; |
|
|
|
|
116
|
|
|
|
117
|
|
|
} else { |
118
|
|
|
$this->user_id = $user; |
|
|
|
|
119
|
|
|
} |
120
|
|
|
$this->min_password_length = apply_filters( 'better_password_min_length', $this->min_password_length ); |
121
|
|
|
} |
122
|
|
|
|
123
|
|
|
/** |
124
|
|
|
* Run tests against a password. |
125
|
|
|
* |
126
|
|
|
* @param String $password the tested string. |
127
|
|
|
* @param Boolean $required_only only test against required conditions, defaults to false. |
128
|
|
|
* @return Array $results an array containing failed and passed test results. |
129
|
|
|
*/ |
130
|
|
|
public function test( $password, $required_only = false ) { |
131
|
|
|
|
132
|
|
|
$this->password = $password; |
133
|
|
|
$results = $this->run_tests( $this->list_tests(), $required_only ); |
134
|
|
|
|
135
|
|
|
// If we've failed on the required tests, return now. |
136
|
|
|
if ( ! empty( $results['failed'] ) ) { |
137
|
|
|
return array( |
138
|
|
|
'passed' => false, |
139
|
|
|
'test_results' => $results, |
140
|
|
|
); |
141
|
|
|
} |
142
|
|
|
|
143
|
|
|
/** |
144
|
|
|
* Filters Jetpack's password strength enforcement settings. You can modify the minimum |
145
|
|
|
* entropy bits requirement using this filter. |
146
|
|
|
* |
147
|
|
|
* @since 7.2.0 |
148
|
|
|
* |
149
|
|
|
* @param Array $minimum_entropy_bits minimum entropy bits requirement. |
150
|
|
|
*/ |
151
|
|
|
$bits = apply_filters( 'jetpack_password_checker_minimum_entropy_bits', self::MINIMUM_BITS ); |
152
|
|
|
$entropy_bits = $this->calculate_entropy_bits( $this->password ); |
153
|
|
|
|
154
|
|
|
// If we have failed the entropy bits test, run the regex tests so we can suggest improvements. |
155
|
|
|
if ( $entropy_bits < $bits ) { |
156
|
|
|
$results['failed']['entropy_bits'] = $entropy_bits; |
157
|
|
|
$results = array_merge( |
158
|
|
|
$results, |
159
|
|
|
$this->run_tests( $this->list_tests( 'preg_match' ), false ) |
|
|
|
|
160
|
|
|
); |
161
|
|
|
} |
162
|
|
|
|
163
|
|
|
return( array( |
164
|
|
|
'passed' => empty( $results['failed'] ), |
165
|
|
|
'test_results' => $results, |
166
|
|
|
) ); |
167
|
|
|
} |
168
|
|
|
|
169
|
|
|
/** |
170
|
|
|
* Run the tests using the currently set up object values. |
171
|
|
|
* |
172
|
|
|
* @param Array $tests tests to run. |
173
|
|
|
* @param Boolean $required_only whether to run only required tests. |
174
|
|
|
* @return Array test results. |
175
|
|
|
*/ |
176
|
|
|
protected function run_tests( $tests, $required_only = false ) { |
177
|
|
|
|
178
|
|
|
$results = array( |
179
|
|
|
'passed' => array(), |
180
|
|
|
'failed' => array(), |
181
|
|
|
); |
182
|
|
|
|
183
|
|
|
foreach ( $tests as $test_type => $section_tests ) { |
184
|
|
|
foreach ( $section_tests as $test_name => $test_data ) { |
185
|
|
|
|
186
|
|
|
// Skip non-required tests if required_only param is set. |
187
|
|
|
if ( $required_only && ! $test_data['required'] ) { |
188
|
|
|
continue; |
189
|
|
|
} |
190
|
|
|
|
191
|
|
|
$test_function = 'test_' . $test_type; |
192
|
|
|
|
193
|
|
|
$result = call_user_func( array( $this, $test_function ), $test_data ); |
194
|
|
|
|
195
|
|
|
if ( $result ) { |
196
|
|
|
$results['passed'][] = array( 'test_name' => $test_name ); |
197
|
|
|
} else { |
198
|
|
|
$results['failed'][] = array( |
199
|
|
|
'test_name' => $test_name, |
200
|
|
|
'explanation' => $test_data['error'], |
201
|
|
|
); |
202
|
|
|
|
203
|
|
|
if ( isset( $test_data['fail_immediately'] ) ) { |
204
|
|
|
return $results; |
205
|
|
|
} |
206
|
|
|
} |
207
|
|
|
} |
208
|
|
|
} |
209
|
|
|
|
210
|
|
|
return $results; |
211
|
|
|
} |
212
|
|
|
|
213
|
|
|
/** |
214
|
|
|
* Returns a list of tests that need to be run on password strings. |
215
|
|
|
* |
216
|
|
|
* @param Array $sections only return specific sections with the passed keys, defaults to all. |
|
|
|
|
217
|
|
|
* @return Array test descriptions. |
218
|
|
|
*/ |
219
|
|
|
protected function list_tests( $sections = false ) { |
220
|
|
|
// Note: these should be in order of priority. |
221
|
|
|
$tests = array( |
222
|
|
|
'preg_match' => array( |
223
|
|
|
'no_backslashes' => array( |
224
|
|
|
'pattern' => '^[^\\\\]*$', |
225
|
|
|
'error' => __( 'Passwords may not contain the character "\".', 'jetpack' ), |
226
|
|
|
'required' => true, |
227
|
|
|
'fail_immediately' => true, |
228
|
|
|
), |
229
|
|
|
'minimum_length' => array( |
230
|
|
|
'pattern' => '^.{' . $this->min_password_length . ',}', |
231
|
|
|
/* translators: %d is a number of characters in the password. */ |
232
|
|
|
'error' => sprintf( __( 'Password must be at least %d characters.', 'jetpack' ), $this->min_password_length ), |
233
|
|
|
'required' => true, |
234
|
|
|
'fail_immediately' => true, |
235
|
|
|
), |
236
|
|
|
'has_mixed_case' => array( |
237
|
|
|
'pattern' => '([a-z].*?[A-Z]|[A-Z].*?[a-z])', |
238
|
|
|
'error' => __( 'This password is too easy to guess: you can improve it by adding additional uppercase letters, lowercase letters, or numbers.', 'jetpack' ), |
239
|
|
|
'trim' => true, |
240
|
|
|
'required' => false, |
241
|
|
|
), |
242
|
|
|
'has_digit' => array( |
243
|
|
|
'pattern' => '\d', |
244
|
|
|
'error' => __( 'This password is too easy to guess: you can improve it by mixing both letters and numbers.', 'jetpack' ), |
245
|
|
|
'trim' => false, |
246
|
|
|
'required' => false, |
247
|
|
|
), |
248
|
|
|
'has_special_char' => array( |
249
|
|
|
'pattern' => '[^a-zA-Z\d]', |
250
|
|
|
'error' => __( 'This password is too easy to guess: you can improve it by including special characters such as !#=?*&.', 'jetpack' ), |
251
|
|
|
'required' => false, |
252
|
|
|
), |
253
|
|
|
), |
254
|
|
|
'compare_to_list' => array( |
255
|
|
|
'not_a_common_password' => array( |
256
|
|
|
'list_callback' => 'get_common_passwords', |
257
|
|
|
'compare_callback' => 'negative_in_array', |
258
|
|
|
'error' => __( 'This is a very common password. Choose something that will be harder for others to guess.', 'jetpack' ), |
259
|
|
|
'required' => true, |
260
|
|
|
), |
261
|
|
|
'not_same_as_other_user_data' => array( |
262
|
|
|
'list_callback' => 'get_other_user_data', |
263
|
|
|
'compare_callback' => 'test_not_same_as_other_user_data', |
264
|
|
|
'error' => __( 'Your password is too weak: Looks like you\'re including easy to guess information about yourself. Try something a little more unique.', 'jetpack' ), |
265
|
|
|
'required' => true, |
266
|
|
|
), |
267
|
|
|
), |
268
|
|
|
); |
269
|
|
|
|
270
|
|
|
/** |
271
|
|
|
* Filters Jetpack's password strength enforcement settings. You can determine the tests run |
272
|
|
|
* and their order based on whatever criteria you wish to specify. |
273
|
|
|
* |
274
|
|
|
* @since 7.2.0 |
275
|
|
|
* |
276
|
|
|
* @param Array $minimum_entropy_bits minimum entropy bits requirement. |
277
|
|
|
*/ |
278
|
|
|
$tests = apply_filters( 'jetpack_password_checker_tests', $tests ); |
279
|
|
|
|
280
|
|
|
if ( ! $sections ) { |
281
|
|
|
return $tests; |
282
|
|
|
} |
283
|
|
|
|
284
|
|
|
$sections = (array) $sections; |
285
|
|
|
return array_intersect_key( $tests, array_flip( $sections ) ); |
286
|
|
|
} |
287
|
|
|
|
288
|
|
|
/** |
289
|
|
|
* Provides the regular expression tester functionality. |
290
|
|
|
* |
291
|
|
|
* @param Array $test_data the current test data. |
292
|
|
|
* @return Boolean does the test pass? |
293
|
|
|
*/ |
294
|
|
|
protected function test_preg_match( $test_data ) { |
295
|
|
|
$password = stripslashes( $this->password ); |
296
|
|
|
|
297
|
|
|
if ( isset( $test_data['trim'] ) ) { |
298
|
|
|
$password = substr( $password, 1, -1 ); |
299
|
|
|
} |
300
|
|
|
|
301
|
|
|
if ( ! preg_match( '/' . $test_data['pattern'] . '/u', $password ) ) { |
302
|
|
|
return false; |
303
|
|
|
} |
304
|
|
|
|
305
|
|
|
return true; |
306
|
|
|
} |
307
|
|
|
|
308
|
|
|
/** |
309
|
|
|
* Provides the comparison tester functionality. |
310
|
|
|
* |
311
|
|
|
* @param Array $test_data the current test data. |
312
|
|
|
* @return Boolean does the test pass? |
313
|
|
|
*/ |
314
|
|
|
protected function test_compare_to_list( $test_data ) { |
315
|
|
|
$list_callback = $test_data['list_callback']; |
316
|
|
|
$compare_callback = $test_data['compare_callback']; |
317
|
|
|
|
318
|
|
|
if ( |
319
|
|
|
! is_callable( array( $this, $list_callback ) ) |
320
|
|
|
|| ! is_callable( array( $this, $compare_callback ) ) |
321
|
|
|
) { |
322
|
|
|
return false; |
323
|
|
|
} |
324
|
|
|
|
325
|
|
|
$list = call_user_func( array( $this, $list_callback ) ); |
326
|
|
|
if ( empty( $list ) ) { |
327
|
|
|
return true; |
328
|
|
|
} |
329
|
|
|
|
330
|
|
|
return call_user_func( array( $this, $compare_callback ), $this->password, $list ); |
331
|
|
|
} |
332
|
|
|
|
333
|
|
|
/** |
334
|
|
|
* Getter for the common password list. |
335
|
|
|
* |
336
|
|
|
* @return Array common passwords. |
337
|
|
|
*/ |
338
|
|
|
protected function get_common_passwords() { |
339
|
|
|
return $this->common_passwords; |
340
|
|
|
} |
341
|
|
|
|
342
|
|
|
/** |
343
|
|
|
* Returns the widely known user data that can not be used in the password to avoid |
344
|
|
|
* predictable strings. |
345
|
|
|
* |
346
|
|
|
* @return Array user data. |
347
|
|
|
*/ |
348
|
|
|
protected function get_other_user_data() { |
349
|
|
|
|
350
|
|
|
if ( ! isset( $this->user ) ) { |
351
|
|
|
$user_data = get_userdata( $this->user_id ); |
352
|
|
|
|
353
|
|
|
$first_name = get_user_meta( $user_data->ID, 'first_name', true ); |
354
|
|
|
$last_name = get_user_meta( $user_data->ID, 'last_name', true ); |
355
|
|
|
$nickname = get_user_meta( $user_data->ID, 'nickname', true ); |
356
|
|
|
|
357
|
|
|
$this->add_user_strings_to_test( $nickname ); |
358
|
|
|
$this->add_user_strings_to_test( $user_data->user_nicename ); |
359
|
|
|
$this->add_user_strings_to_test( $user_data->display_name ); |
360
|
|
|
} else { |
361
|
|
|
$user_data = $this->user; |
362
|
|
|
|
363
|
|
|
$first_name = $user_data->first_name; |
364
|
|
|
$last_name = $user_data->last_name; |
365
|
|
|
} |
366
|
|
|
$email_username = substr( $user_data->user_email, 0, strpos( $user_data->user_email, '@' ) ); |
367
|
|
|
|
368
|
|
|
$this->add_user_strings_to_test( $user_data->user_email ); |
369
|
|
|
$this->add_user_strings_to_test( $email_username, '.' ); |
370
|
|
|
$this->add_user_strings_to_test( $first_name ); |
371
|
|
|
$this->add_user_strings_to_test( $last_name ); |
372
|
|
|
|
373
|
|
|
return $this->user_strings_to_test; |
374
|
|
|
} |
375
|
|
|
|
376
|
|
|
/** |
377
|
|
|
* Compare the password for matches with known user data. |
378
|
|
|
* |
379
|
|
|
* @param String $password the string to be tested. |
380
|
|
|
* @param Array $strings_to_test known user data. |
381
|
|
|
* @return Boolean does the test pass? |
382
|
|
|
*/ |
383
|
|
|
protected function test_not_same_as_other_user_data( $password, $strings_to_test ) { |
384
|
|
|
$password_lowercase = strtolower( $password ); |
385
|
|
|
foreach ( array_unique( $strings_to_test ) as $string ) { |
386
|
|
|
if ( empty( $string ) ) { |
387
|
|
|
continue; |
388
|
|
|
} |
389
|
|
|
|
390
|
|
|
$string = strtolower( $string ); |
391
|
|
|
$string_reversed = strrev( $string ); |
392
|
|
|
|
393
|
|
|
if ( $password_lowercase === $string || $password_lowercase === $string_reversed ) { |
394
|
|
|
return false; |
395
|
|
|
} |
396
|
|
|
|
397
|
|
|
// Also check for the string or reversed string with any numbers just stuck to the end to catch things like bob123 as passwords. |
398
|
|
|
if ( |
399
|
|
|
preg_match( '/^' . preg_quote( $string, '/' ) . '\d+$/', $password_lowercase ) |
400
|
|
|
|| preg_match( '/^' . preg_quote( $string_reversed, '/' ) . '\d+$/', $password_lowercase ) |
401
|
|
|
) { |
402
|
|
|
return false; |
403
|
|
|
} |
404
|
|
|
} |
405
|
|
|
return true; |
406
|
|
|
} |
407
|
|
|
|
408
|
|
|
/** |
409
|
|
|
* A shorthand for the not in array construct. |
410
|
|
|
* |
411
|
|
|
* @param Mixed $needle the needle. |
412
|
|
|
* @param Array $haystack the haystack. |
413
|
|
|
* @return is the needle not in the haystack? |
414
|
|
|
*/ |
415
|
|
|
protected function negative_in_array( $needle, $haystack ) { |
416
|
|
|
if ( in_array( $needle, $haystack, true ) ) { |
417
|
|
|
return false; |
418
|
|
|
} |
419
|
|
|
|
420
|
|
|
return true; |
421
|
|
|
} |
422
|
|
|
|
423
|
|
|
/** |
424
|
|
|
* A helper function used to break a single string into its constituents so |
425
|
|
|
* that both the full string and its constituents and any variants thereof |
426
|
|
|
* can be tested against the password. |
427
|
|
|
* |
428
|
|
|
* @param String $string the string to be broken down. |
429
|
|
|
* @param String $explode_delimiter delimiter. |
430
|
|
|
* @return NULL|Array array of fragments, or NULL on empty string. |
431
|
|
|
*/ |
432
|
|
|
protected function add_user_strings_to_test( $string, $explode_delimiter = ' ' ) { |
433
|
|
|
|
434
|
|
|
// Don't check against empty strings. |
435
|
|
|
if ( empty( $string ) ) { |
436
|
|
|
return; |
437
|
|
|
} |
438
|
|
|
|
439
|
|
|
$strings = explode( $explode_delimiter, $string ); |
440
|
|
|
|
441
|
|
|
// Remove any non alpha numeric characters from the strings to check against. |
442
|
|
|
foreach ( $strings as $key => $_string ) { |
443
|
|
|
$strings[ $key ] = preg_replace( '/[^a-zA-Z0-9]/', '', $_string ); |
444
|
|
|
} |
445
|
|
|
|
446
|
|
|
// Check the original too. |
447
|
|
|
$strings[] = $string; |
448
|
|
|
|
449
|
|
|
// Check the original minus non alpha numeric characters. |
450
|
|
|
$strings[] = preg_replace( '/[^a-zA-Z0-9]/', '', $string ); |
451
|
|
|
|
452
|
|
|
// Remove any empty strings. |
453
|
|
|
$strings = array_filter( $strings ); |
454
|
|
|
$this->user_strings_to_test = array_merge( $this->user_strings_to_test, $strings ); |
455
|
|
|
} |
456
|
|
|
|
457
|
|
|
/** |
458
|
|
|
* Return a character set size that is used in the string. |
459
|
|
|
* |
460
|
|
|
* @param String $password the password. |
461
|
|
|
* @return Integer number of different character sets in use. |
462
|
|
|
*/ |
463
|
|
|
protected function get_charset_size( $password ) { |
464
|
|
|
$size = 0; |
465
|
|
|
|
466
|
|
|
// Lowercase a-z. |
467
|
|
|
if ( preg_match( '/[a-z]/', $password ) ) { |
468
|
|
|
$size += 26; |
469
|
|
|
} |
470
|
|
|
|
471
|
|
|
// Uppercase A-Z. |
472
|
|
|
if ( preg_match( '/[A-Z]/', substr( $password, 1, -1 ) ) ) { |
473
|
|
|
$size += 26; |
474
|
|
|
} |
475
|
|
|
|
476
|
|
|
// Digits. |
477
|
|
|
if ( preg_match( '/\d/', substr( $password, 1, -1 ) ) ) { |
478
|
|
|
$size += 10; |
479
|
|
|
} |
480
|
|
|
|
481
|
|
|
// Over digits symbols. |
482
|
|
|
if ( preg_match( '/[!|@|#|$|%|^|&|*|(|)]/', $password ) ) { |
483
|
|
|
$size += 10; |
484
|
|
|
} |
485
|
|
|
|
486
|
|
|
// Other symbols. |
487
|
|
|
if ( preg_match( '#[`|~|-|_|=|+|\[|{|\]|}|\\|\|;:\'",<\.>/\?]#', $password ) ) { |
488
|
|
|
$size += 20; |
489
|
|
|
} |
490
|
|
|
|
491
|
|
|
// Spaces. |
492
|
|
|
if ( strpos( $password, ' ' ) ) { |
493
|
|
|
$size++; |
494
|
|
|
} |
495
|
|
|
|
496
|
|
|
return $size; |
497
|
|
|
} |
498
|
|
|
|
499
|
|
|
/** |
500
|
|
|
* Shorthand for getting a character index. |
501
|
|
|
* |
502
|
|
|
* @param String $char character. |
503
|
|
|
* @return Integer the character code. |
504
|
|
|
*/ |
505
|
|
|
protected function get_char_index( $char ) { |
506
|
|
|
$char = strtolower( $char[0] ); |
507
|
|
|
if ( $char < 'a' || $char > 'z' ) { |
508
|
|
|
return 0; |
509
|
|
|
} else { |
510
|
|
|
return ord( $char[0] ) - ord( 'a' ) + 1; |
511
|
|
|
} |
512
|
|
|
} |
513
|
|
|
|
514
|
|
|
/** |
515
|
|
|
* This is the password strength calculation algorithm, based on the formula H = L(logN/log2). |
516
|
|
|
* |
517
|
|
|
* H = Entropy |
518
|
|
|
* L = String length (the for iterator) |
519
|
|
|
* N = Our charset size, via get_charset_size() |
520
|
|
|
* |
521
|
|
|
* @see http://en.wikipedia.org/wiki/Password_strength#Random_passwords |
522
|
|
|
* |
523
|
|
|
* On top of the base formula, we're also multiplying the bits of entropy for every char |
524
|
|
|
* by 1 - (the probabily of it following the previous char) |
525
|
|
|
* i.e.: the probablity of U following Q is ~0.84. If our password contains this pair of characters, |
526
|
|
|
* the u char will only add ( 0.16^2 * charset_score ) to our total of entropy bits. |
527
|
|
|
* |
528
|
|
|
* @param String $password the password. |
529
|
|
|
*/ |
530
|
|
|
protected function calculate_entropy_bits( $password ) { |
531
|
|
|
$bits = 0; |
532
|
|
|
$charset_score = log( $this->get_charset_size( $password ) ) / log( 2 ); |
533
|
|
|
|
534
|
|
|
$aidx = $this->get_char_index( $password[0] ); |
535
|
|
|
$length = strlen( $password ); |
536
|
|
|
|
537
|
|
|
for ( $b = 1; $b < $length; $b++ ) { |
538
|
|
|
$bidx = $this->get_char_index( $password[ $b ] ); |
539
|
|
|
|
540
|
|
|
// 27 = number of chars in the index (a-z,' '). |
541
|
|
|
$c = 1.0 - $this->frequency_table[ $aidx * 27 + $bidx ]; |
542
|
|
|
$bits += $charset_score * $c * $c; |
543
|
|
|
|
544
|
|
|
// Move on to next pair. |
545
|
|
|
$aidx = $bidx; |
546
|
|
|
} |
547
|
|
|
|
548
|
|
|
return $bits; |
549
|
|
|
} |
550
|
|
|
|
551
|
|
|
/** |
552
|
|
|
* A frequency table of character pairs, starting with ' ' then ' a', ' b' [...] , 'a ', 'aa' etc. |
553
|
|
|
* |
554
|
|
|
* @see http://rumkin.com/tools/password/passchk.php |
555
|
|
|
* @var Array |
556
|
|
|
*/ |
557
|
|
|
public $frequency_table = array( |
558
|
|
|
0.23653710453418866, |
559
|
|
|
0.04577693541332556, |
560
|
|
|
0.03449832337075375, |
561
|
|
|
0.042918209651552706, |
562
|
|
|
0.037390873305146524, |
563
|
|
|
0.028509112115468728, |
564
|
|
|
0.02350896632162123, |
565
|
|
|
0.022188657238664526, |
566
|
|
|
0.028429800262428927, |
567
|
|
|
0.04357019973757107, |
568
|
|
|
0.00913602565971716, |
569
|
|
|
0.03223093745443942, |
570
|
|
|
0.02235311269864412, |
571
|
|
|
0.04438081352966905, |
572
|
|
|
0.04512377897652719, |
573
|
|
|
0.020055401662049863, |
574
|
|
|
0.055903192885260244, |
575
|
|
|
0.0024388394809739026, |
576
|
|
|
0.035207464644991984, |
577
|
|
|
0.07355941099285611, |
578
|
|
|
0.036905671380667734, |
579
|
|
|
0.026134421927394666, |
580
|
|
|
0.023787724158040528, |
581
|
|
|
0.011352092141711621, |
582
|
|
|
0.0032354570637119114, |
583
|
|
|
0.005986878553725033, |
584
|
|
|
0.008861933226417843, |
585
|
|
|
0.11511532293337222, |
586
|
|
|
0.027556203528211108, |
587
|
|
|
0.024331243621519172, |
588
|
|
|
0.039266365359381834, |
589
|
|
|
0.031599941682461, |
590
|
|
|
0.014403265782183991, |
591
|
|
|
0.015480973902901297, |
592
|
|
|
0.027770812071730572, |
593
|
|
|
0.00942761335471643, |
594
|
|
|
0.039872867764980315, |
595
|
|
|
0.0078122175244204695, |
596
|
|
|
0.02808456043154979, |
597
|
|
|
0.08429100451960927, |
598
|
|
|
0.04688963405744277, |
599
|
|
|
0.13831170724595424, |
600
|
|
|
0.002540311998833649, |
601
|
|
|
0.025211838460416972, |
602
|
|
|
0.001543082081936142, |
603
|
|
|
0.09519638431258201, |
604
|
|
|
0.061845750109345385, |
605
|
|
|
0.08907071001603732, |
606
|
|
|
0.02137571074500656, |
607
|
|
|
0.027093162268552268, |
608
|
|
|
0.005521504592506197, |
609
|
|
|
0.003023181221752442, |
610
|
|
|
0.007086747339262283, |
611
|
|
|
0.010262720513194342, |
612
|
|
|
0.08785070710016038, |
613
|
|
|
0.14617757690625455, |
614
|
|
|
0.03417291150313457, |
615
|
|
|
0.0059635515381250915, |
616
|
|
|
0.006146668610584633, |
617
|
|
|
0.195202799241872, |
618
|
|
|
0.002774748505613063, |
619
|
|
|
0.004715556203528212, |
620
|
|
|
0.0044776206444088066, |
621
|
|
|
0.11205481848665985, |
622
|
|
|
0.005654468581425864, |
623
|
|
|
0.0028820527773727946, |
624
|
|
|
0.07383000437381543, |
625
|
|
|
0.005516839189386207, |
626
|
|
|
0.006496573844583759, |
627
|
|
|
0.09843067502551392, |
628
|
|
|
0.0027140982650532145, |
629
|
|
|
0.0006893133109782768, |
630
|
|
|
0.08425368129464937, |
631
|
|
|
0.021325557661466685, |
632
|
|
|
0.006493074792243767, |
633
|
|
|
0.07023414491908442, |
634
|
|
|
0.002077270739174807, |
635
|
|
|
0.0024633328473538415, |
636
|
|
|
0.0007744569179180639, |
637
|
|
|
0.015413325557661468, |
638
|
|
|
0.0011990086018370024, |
639
|
|
|
0.13162851727657093, |
640
|
|
|
0.10115993585070711, |
641
|
|
|
0.0026989357049132527, |
642
|
|
|
0.03319317684793702, |
643
|
|
|
0.002946202070272634, |
644
|
|
|
0.0783216212275842, |
645
|
|
|
0.0018358361277154103, |
646
|
|
|
0.00258813238081353, |
647
|
|
|
0.2141688292754046, |
648
|
|
|
0.09853681294649366, |
649
|
|
|
0.0032482869222918796, |
650
|
|
|
0.04359352675317102, |
651
|
|
|
0.01993526753171016, |
652
|
|
|
0.0036880011663507797, |
653
|
|
|
0.008011663507799971, |
654
|
|
|
0.12014696019827964, |
655
|
|
|
0.0029846916460125384, |
656
|
|
|
0.0017553579238956116, |
657
|
|
|
0.029470185158186325, |
658
|
|
|
0.010413179763813967, |
659
|
|
|
0.030699518880303252, |
660
|
|
|
0.03508499781309229, |
661
|
|
|
0.002021285901734947, |
662
|
|
|
0.0010613792097973467, |
663
|
|
|
0.0005295232541186761, |
664
|
|
|
0.009677212421635807, |
665
|
|
|
0.010585799679253535, |
666
|
|
|
0.17101734946785244, |
667
|
|
|
0.07968625164018078, |
668
|
|
|
0.007839043592360402, |
669
|
|
|
0.005438693687126403, |
670
|
|
|
0.0183606939787141, |
671
|
|
|
0.2732701559994168, |
672
|
|
|
0.004953491762647616, |
673
|
|
|
0.007259367254701851, |
674
|
|
|
0.008104971570199739, |
675
|
|
|
0.13274588132380813, |
676
|
|
|
0.004210526315789474, |
677
|
|
|
0.004997813092287506, |
678
|
|
|
0.017006560723137484, |
679
|
|
|
0.007442484327161393, |
680
|
|
|
0.016789619478058026, |
681
|
|
|
0.08477737279486806, |
682
|
|
|
0.005106283714827234, |
683
|
|
|
0.0005026971861787433, |
684
|
|
|
0.04040355736987899, |
685
|
|
|
0.037535500801866156, |
686
|
|
|
0.00885960052485785, |
687
|
|
|
0.0336410555474559, |
688
|
|
|
0.007066919376002332, |
689
|
|
|
0.005344219273946639, |
690
|
|
|
0.0006333284735384167, |
691
|
|
|
0.010684939495553289, |
692
|
|
|
0.0063064586674442345, |
693
|
|
|
0.15386849394955532, |
694
|
|
|
0.015049424114302375, |
695
|
|
|
0.012162705933809595, |
696
|
|
|
0.020425134859308938, |
697
|
|
|
0.037366379938766583, |
698
|
|
|
0.02157165767604607, |
699
|
|
|
0.009373961218836564, |
700
|
|
|
0.0173214754337367, |
701
|
|
|
0.009616562181075958, |
702
|
|
|
0.029522670943286193, |
703
|
|
|
0.010154249890654615, |
704
|
|
|
0.018600962239393497, |
705
|
|
|
0.06362210234728094, |
706
|
|
|
0.03157078291296107, |
707
|
|
|
0.151603440734801, |
708
|
|
|
0.0062329785683044175, |
709
|
|
|
0.014775331681003062, |
710
|
|
|
0.0020854351946347867, |
711
|
|
|
0.1826342032366234, |
712
|
|
|
0.0878017203674005, |
713
|
|
|
0.054190989940224525, |
714
|
|
|
0.010329202507654177, |
715
|
|
|
0.012763376585508092, |
716
|
|
|
0.0064872430383437815, |
717
|
|
|
0.006381105117364048, |
718
|
|
|
0.005388540603586529, |
719
|
|
|
0.0090800408222773, |
720
|
|
|
0.09611196967487973, |
721
|
|
|
0.09940691062837148, |
722
|
|
|
0.01033969966467415, |
723
|
|
|
0.004034407348009914, |
724
|
|
|
0.008826942703017933, |
725
|
|
|
0.11474675608689314, |
726
|
|
|
0.07132584924916169, |
727
|
|
|
0.012388977985129028, |
728
|
|
|
0.005435194634786413, |
729
|
|
|
0.1417174515235457, |
730
|
|
|
0.0037066627788307337, |
731
|
|
|
0.0045802595130485495, |
732
|
|
|
0.060800699810468, |
733
|
|
|
0.005341886572386646, |
734
|
|
|
0.005683627350925791, |
735
|
|
|
0.12434932205860913, |
736
|
|
|
0.004596588423968508, |
737
|
|
|
0.0007534626038781163, |
738
|
|
|
0.07107041842834232, |
739
|
|
|
0.022361277154104096, |
740
|
|
|
0.04784720804782038, |
741
|
|
|
0.06277533168100306, |
742
|
|
|
0.003441901151771395, |
743
|
|
|
0.005828254847645429, |
744
|
|
|
0.0009669047966175828, |
745
|
|
|
0.009470768333576322, |
746
|
|
|
0.002077270739174807, |
747
|
|
|
0.12797667298440007, |
748
|
|
|
0.08797783933518005, |
749
|
|
|
0.005388540603586529, |
750
|
|
|
0.0024913252660737715, |
751
|
|
|
0.007550954949701123, |
752
|
|
|
0.2786866890217233, |
753
|
|
|
0.002509986878553725, |
754
|
|
|
0.029002478495407494, |
755
|
|
|
0.0303204548768042, |
756
|
|
|
0.07576614666861058, |
757
|
|
|
0.00246799825047383, |
758
|
|
|
0.00592389561160519, |
759
|
|
|
0.039574281965301064, |
760
|
|
|
0.00706808572678233, |
761
|
|
|
0.03304505029887739, |
762
|
|
|
0.05474150750838315, |
763
|
|
|
0.0028633911648928414, |
764
|
|
|
0.0005073625892987316, |
765
|
|
|
0.07293541332555767, |
766
|
|
|
0.053528502697186175, |
767
|
|
|
0.022566554891383584, |
768
|
|
|
0.038151334013704616, |
769
|
|
|
0.002716430966613209, |
770
|
|
|
0.005049132526607377, |
771
|
|
|
0.0009902318122175246, |
772
|
|
|
0.008997229916897508, |
773
|
|
|
0.0011861787432570347, |
774
|
|
|
0.1666377022889634, |
775
|
|
|
0.14414462749671964, |
776
|
|
|
0.003374252806531564, |
777
|
|
|
0.005169266656947077, |
778
|
|
|
0.008468873013558828, |
779
|
|
|
0.16337541915731155, |
780
|
|
|
0.002873888321912815, |
781
|
|
|
0.004305000728969237, |
782
|
|
|
0.0031141565825922144, |
783
|
|
|
0.1241172182533897, |
784
|
|
|
0.0052800699810468, |
785
|
|
|
0.008969237498177577, |
786
|
|
|
0.024094474413179766, |
787
|
|
|
0.017029887738737422, |
788
|
|
|
0.01722700102055693, |
789
|
|
|
0.10618457501093455, |
790
|
|
|
0.006147834961364631, |
791
|
|
|
0.0008269427030179326, |
792
|
|
|
0.03303571949263741, |
793
|
|
|
0.024188948826359528, |
794
|
|
|
0.05213937891820965, |
795
|
|
|
0.04505846333284735, |
796
|
|
|
0.0035270447587111824, |
797
|
|
|
0.006799825047383001, |
798
|
|
|
0.0008199445983379502, |
799
|
|
|
0.02206735675754483, |
800
|
|
|
0.001010059775477475, |
801
|
|
|
0.11971191135734072, |
802
|
|
|
0.04656538854060359, |
803
|
|
|
0.011243621519171892, |
804
|
|
|
0.06513019390581717, |
805
|
|
|
0.032375564951159064, |
806
|
|
|
0.06347047674588133, |
807
|
|
|
0.013678961947805804, |
808
|
|
|
0.03309870243475726, |
809
|
|
|
0.006982942119842543, |
810
|
|
|
0.009726199154395685, |
811
|
|
|
0.010121592068814697, |
812
|
|
|
0.032514360693978714, |
813
|
|
|
0.04986032949409535, |
814
|
|
|
0.039734072022160664, |
815
|
|
|
0.15690683773144773, |
816
|
|
|
0.03949963551538125, |
817
|
|
|
0.014790494241143023, |
818
|
|
|
0.002722262720513194, |
819
|
|
|
0.02614375273363464, |
820
|
|
|
0.10753637556495116, |
821
|
|
|
0.06764834523983088, |
822
|
|
|
0.006221315060504448, |
823
|
|
|
0.021317393206006705, |
824
|
|
|
0.0030826651115322934, |
825
|
|
|
0.002399183554454002, |
826
|
|
|
0.0019069835252952323, |
827
|
|
|
0.015595276279341012, |
828
|
|
|
0.0925126111678087, |
829
|
|
|
0.18437906400349907, |
830
|
|
|
0.006538562472663654, |
831
|
|
|
0.008719638431258201, |
832
|
|
|
0.02116693395538708, |
833
|
|
|
0.18241376293920394, |
834
|
|
|
0.007290858725761773, |
835
|
|
|
0.005976381396705059, |
836
|
|
|
0.005629975215045925, |
837
|
|
|
0.09721300481119698, |
838
|
|
|
0.004810030616707975, |
839
|
|
|
0.024303251202799244, |
840
|
|
|
0.012954658113427612, |
841
|
|
|
0.011057005394372358, |
842
|
|
|
0.02733459688001166, |
843
|
|
|
0.10135121737862662, |
844
|
|
|
0.012016912086309959, |
845
|
|
|
0.001055547455897361, |
846
|
|
|
0.009027555037177431, |
847
|
|
|
0.07162326869806095, |
848
|
|
|
0.01007143898527482, |
849
|
|
|
0.07297623560285756, |
850
|
|
|
0.006741507508383147, |
851
|
|
|
0.0036891675171307776, |
852
|
|
|
0.0008409389123778977, |
853
|
|
|
0.011272780288671819, |
854
|
|
|
0.007020265344802449, |
855
|
|
|
0.1030389269572824, |
856
|
|
|
0.15350809155853623, |
857
|
|
|
0.004232686980609419, |
858
|
|
|
0.004353987461729115, |
859
|
|
|
0.0023385333138941536, |
860
|
|
|
0.14450386353695874, |
861
|
|
|
0.002546143752733635, |
862
|
|
|
0.0024470039364338824, |
863
|
|
|
0.01200758128006998, |
864
|
|
|
0.0981227584195947, |
865
|
|
|
0.003161976964572095, |
866
|
|
|
0.040695145064878264, |
867
|
|
|
0.03460446129173349, |
868
|
|
|
0.003908441463770229, |
869
|
|
|
0.01598483743986004, |
870
|
|
|
0.13107216795451232, |
871
|
|
|
0.003129319142732177, |
872
|
|
|
0.00032307916605919226, |
873
|
|
|
0.04050386353695874, |
874
|
|
|
0.05452689896486368, |
875
|
|
|
0.03589677795597026, |
876
|
|
|
0.07087097244496282, |
877
|
|
|
0.006143169558244642, |
878
|
|
|
0.008684647907858289, |
879
|
|
|
0.0004607085580988482, |
880
|
|
|
0.022010205569324977, |
881
|
|
|
0.0009097536083977258, |
882
|
|
|
0.07328765126111678, |
883
|
|
|
0.14751421490013122, |
884
|
|
|
0.008015162560139961, |
885
|
|
|
0.006601545414783497, |
886
|
|
|
0.025279486805656802, |
887
|
|
|
0.1682449336637994, |
888
|
|
|
0.008313748359819215, |
889
|
|
|
0.007010934538562473, |
890
|
|
|
0.005886572386645284, |
891
|
|
|
0.16889575739903775, |
892
|
|
|
0.004123050007289692, |
893
|
|
|
0.011925936725470185, |
894
|
|
|
0.10007289692374982, |
895
|
|
|
0.013380376148126549, |
896
|
|
|
0.009021723283277445, |
897
|
|
|
0.08650823735238372, |
898
|
|
|
0.007756232686980609, |
899
|
|
|
0.0007243038343781893, |
900
|
|
|
0.0026791077416533026, |
901
|
|
|
0.02797492345823006, |
902
|
|
|
0.032384895757399036, |
903
|
|
|
0.04187432570345531, |
904
|
|
|
0.00882461000145794, |
905
|
|
|
0.0032401224668318998, |
906
|
|
|
0.00033357632307916605, |
907
|
|
|
0.027878116343490307, |
908
|
|
|
0.0022277299897944304, |
909
|
|
|
0.14333518005540166, |
910
|
|
|
0.1725534334451086, |
911
|
|
|
0.02781629975215046, |
912
|
|
|
0.006909462020702727, |
913
|
|
|
0.005264907420906838, |
914
|
|
|
0.16661437527336345, |
915
|
|
|
0.004325995043009185, |
916
|
|
|
0.003334596880011664, |
917
|
|
|
0.005312727802886718, |
918
|
|
|
0.14024668318996938, |
919
|
|
|
0.0013261408368566844, |
920
|
|
|
0.003504884093891238, |
921
|
|
|
0.006375273363464061, |
922
|
|
|
0.04964922000291588, |
923
|
|
|
0.008290421344219274, |
924
|
|
|
0.09536783787724158, |
925
|
|
|
0.05394372357486515, |
926
|
|
|
0.005505175681586237, |
927
|
|
|
0.005339553870826651, |
928
|
|
|
0.01782067356757545, |
929
|
|
|
0.006710016037323225, |
930
|
|
|
0.05105933809593235, |
931
|
|
|
0.002983525295232541, |
932
|
|
|
0.002940370316372649, |
933
|
|
|
0.0004548768041988629, |
934
|
|
|
0.01208456043154979, |
935
|
|
|
0.000915585362297711, |
936
|
|
|
0.20146260387811635, |
937
|
|
|
0.067196967487972, |
938
|
|
|
0.006158332118384605, |
939
|
|
|
0.025438110511736407, |
940
|
|
|
0.07753783350342616, |
941
|
|
|
0.1273876658405015, |
942
|
|
|
0.009337804344656656, |
943
|
|
|
0.07683452398308792, |
944
|
|
|
0.0070412596588423975, |
945
|
|
|
0.08747164309666132, |
946
|
|
|
0.0038827817466102928, |
947
|
|
|
0.018116926665694706, |
948
|
|
|
0.005017641055547455, |
949
|
|
|
0.004567429654468581, |
950
|
|
|
0.028277008310249308, |
951
|
|
|
0.05271555620352821, |
952
|
|
|
0.004394809739029013, |
953
|
|
|
0.0013343052923166642, |
954
|
|
|
0.00411605190260971, |
955
|
|
|
0.059621519171890944, |
956
|
|
|
0.09073859163143316, |
957
|
|
|
0.01446858142586383, |
958
|
|
|
0.006770666277883074, |
959
|
|
|
0.003425572240851436, |
960
|
|
|
0.0004455459979588861, |
961
|
|
|
0.010401516256013998, |
962
|
|
|
0.005825922146085436, |
963
|
|
|
0.10833882490158916, |
964
|
|
|
0.007584779122321038, |
965
|
|
|
0.016903921854497742, |
966
|
|
|
0.02719580113719201, |
967
|
|
|
0.0304814112844438, |
968
|
|
|
0.02206385770520484, |
969
|
|
|
0.013064295086747339, |
970
|
|
|
0.02696369733197259, |
971
|
|
|
0.009581571657676046, |
972
|
|
|
0.026761918647033093, |
973
|
|
|
0.006510570053943724, |
974
|
|
|
0.021941390873305145, |
975
|
|
|
0.07042659279778393, |
976
|
|
|
0.05437410701268406, |
977
|
|
|
0.1425175681586237, |
978
|
|
|
0.027802303542790494, |
979
|
|
|
0.037690625455605774, |
980
|
|
|
0.0019606356611750987, |
981
|
|
|
0.1095623268698061, |
982
|
|
|
0.06157748942994606, |
983
|
|
|
0.044618749088788455, |
984
|
|
|
0.04955124653739612, |
985
|
|
|
0.03608689313310978, |
986
|
|
|
0.018381688292754043, |
987
|
|
|
0.003404577926811489, |
988
|
|
|
0.015036594255722409, |
989
|
|
|
0.009600233270156, |
990
|
|
|
0.10794693103951014, |
991
|
|
|
0.12447528794284882, |
992
|
|
|
0.0031981338387520046, |
993
|
|
|
0.0074716430966613205, |
994
|
|
|
0.003202799241871993, |
995
|
|
|
0.13437643971424407, |
996
|
|
|
0.006655197550663361, |
997
|
|
|
0.0036693395538708266, |
998
|
|
|
0.049338970695436656, |
999
|
|
|
0.09486863974340283, |
1000
|
|
|
0.0015990669193760023, |
1001
|
|
|
0.0026604461291733486, |
1002
|
|
|
0.051775477474850555, |
1003
|
|
|
0.0041347135150896636, |
1004
|
|
|
0.005450357194926374, |
1005
|
|
|
0.12030325120279925, |
1006
|
|
|
0.04581309228750547, |
1007
|
|
|
0.0004537104534188657, |
1008
|
|
|
0.12425601399620935, |
1009
|
|
|
0.025981629975215047, |
1010
|
|
|
0.023926519900860182, |
1011
|
|
|
0.04423385333138941, |
1012
|
|
|
0.0017950138504155123, |
1013
|
|
|
0.002661612479953346, |
1014
|
|
|
0.0006333284735384167, |
1015
|
|
|
0.008449045050298877, |
1016
|
|
|
0.000653156436798367, |
1017
|
|
|
0.04816678816153958, |
1018
|
|
|
0.008625164018078437, |
1019
|
|
|
0.0039037760606502403, |
1020
|
|
|
0.005228750546726928, |
1021
|
|
|
0.004531272780288672, |
1022
|
|
|
0.0056672984400058316, |
1023
|
|
|
0.00359585945473101, |
1024
|
|
|
0.0032179618020119548, |
1025
|
|
|
0.0038093016474704767, |
1026
|
|
|
0.011452398308791368, |
1027
|
|
|
0.002519317684793702, |
1028
|
|
|
0.00280390727511299, |
1029
|
|
|
0.005572824026826068, |
1030
|
|
|
0.004554599795888614, |
1031
|
|
|
0.004531272780288672, |
1032
|
|
|
0.0035841959469310393, |
1033
|
|
|
0.004400641492928998, |
1034
|
|
|
0.0036670068523108326, |
1035
|
|
|
0.004839189386207902, |
1036
|
|
|
0.006258638285464354, |
1037
|
|
|
0.004897506925207757, |
1038
|
|
|
0.840776789619478, |
1039
|
|
|
0.004968654322787578, |
1040
|
|
|
0.002886718180492783, |
1041
|
|
|
0.0019757982213150604, |
1042
|
|
|
0.0018568304417553576, |
1043
|
|
|
0.001691208630995772, |
1044
|
|
|
0.09009243329931477, |
1045
|
|
|
0.14030150167662925, |
1046
|
|
|
0.013242746756086894, |
1047
|
|
|
0.013746610293045632, |
1048
|
|
|
0.027342761335471644, |
1049
|
|
|
0.16938912377897652, |
1050
|
|
|
0.006607377168683481, |
1051
|
|
|
0.01661933226417845, |
1052
|
|
|
0.008173786266219566, |
1053
|
|
|
0.13297448607668758, |
1054
|
|
|
0.0034675608689313307, |
1055
|
|
|
0.016641492928998396, |
1056
|
|
|
0.011722991689750693, |
1057
|
|
|
0.021493512173786266, |
1058
|
|
|
0.03430820819361423, |
1059
|
|
|
0.10099548039072752, |
1060
|
|
|
0.00873596734217816, |
1061
|
|
|
0.0018323370753754193, |
1062
|
|
|
0.020103222044029742, |
1063
|
|
|
0.047197550663362, |
1064
|
|
|
0.040833940807697915, |
1065
|
|
|
0.03361189677795597, |
1066
|
|
|
0.010844729552412887, |
1067
|
|
|
0.005544831608106138, |
1068
|
|
|
0.0007522962530981193, |
1069
|
|
|
0.01525120279924187, |
1070
|
|
|
0.00815512465373961, |
1071
|
|
|
0.2109648636827526, |
1072
|
|
|
0.058258055110074355, |
1073
|
|
|
0.007181221752442048, |
1074
|
|
|
0.043560868931331105, |
1075
|
|
|
0.004058900714389853, |
1076
|
|
|
0.10618107595859454, |
1077
|
|
|
0.0062399766729844, |
1078
|
|
|
0.004835690333867911, |
1079
|
|
|
0.02679224376731302, |
1080
|
|
|
0.08414637702288964, |
1081
|
|
|
0.0030698352529523252, |
1082
|
|
|
0.03637498177576906, |
1083
|
|
|
0.01592885260242018, |
1084
|
|
|
0.017413617145356466, |
1085
|
|
|
0.008430383437818923, |
1086
|
|
|
0.037231083248286924, |
1087
|
|
|
0.03290275550371775, |
1088
|
|
|
0.007538125091121154, |
1089
|
|
|
0.004500947660008748, |
1090
|
|
|
0.05932409972299169, |
1091
|
|
|
0.16006764834523984, |
1092
|
|
|
0.03309636973319726, |
1093
|
|
|
0.007766729844000583, |
1094
|
|
|
0.005225251494386936, |
1095
|
|
|
0.0006321621227584196, |
1096
|
|
|
0.012989648636827526, |
1097
|
|
|
0.005274238227146815, |
1098
|
|
|
0.1254503571949264, |
1099
|
|
|
0.12852719055255868, |
1100
|
|
|
0.0035433736696311416, |
1101
|
|
|
0.005203090829566993, |
1102
|
|
|
0.0019314768916751715, |
1103
|
|
|
0.20520775623268697, |
1104
|
|
|
0.002509986878553725, |
1105
|
|
|
0.00343606939787141, |
1106
|
|
|
0.027138649948972155, |
1107
|
|
|
0.13926578218399185, |
1108
|
|
|
0.004565096952908587, |
1109
|
|
|
0.005614812654905963, |
1110
|
|
|
0.00874413179763814, |
1111
|
|
|
0.004109053797929727, |
1112
|
|
|
0.008300918501239247, |
1113
|
|
|
0.08270943286193323, |
1114
|
|
|
0.002912377897652719, |
1115
|
|
|
0.0037066627788307337, |
1116
|
|
|
0.06909578655780726, |
1117
|
|
|
0.03242805073625893, |
1118
|
|
|
0.05237614812654906, |
1119
|
|
|
0.04723487388832191, |
1120
|
|
|
0.0038991106575302524, |
1121
|
|
|
0.006299460562764251, |
1122
|
|
|
0.00043388249015891526, |
1123
|
|
|
0.020029741944889927, |
1124
|
|
|
0.005311561452106721, |
1125
|
|
|
0.09334072022160665, |
1126
|
|
|
0.022940953491762648, |
1127
|
|
|
0.024658988190698353, |
1128
|
|
|
0.02901297565242747, |
1129
|
|
|
0.03531593526753171, |
1130
|
|
|
0.0758023035427905, |
1131
|
|
|
0.013711619769645722, |
1132
|
|
|
0.021597317393206007, |
1133
|
|
|
0.009670214316955824, |
1134
|
|
|
0.044728386062108175, |
1135
|
|
|
0.010596296836273509, |
1136
|
|
|
0.03264382563055839, |
1137
|
|
|
0.0604822860475288, |
1138
|
|
|
0.05489546581134276, |
1139
|
|
|
0.11501851581863246, |
1140
|
|
|
0.01837585653885406, |
1141
|
|
|
0.026237060796034405, |
1142
|
|
|
0.0011255285026971862, |
1143
|
|
|
0.08704125965884241, |
1144
|
|
|
0.10156349322058608, |
1145
|
|
|
0.06660562764251349, |
1146
|
|
|
0.023434319871701415, |
1147
|
|
|
0.010777081207173057, |
1148
|
|
|
0.005409534917626476, |
1149
|
|
|
0.003123487388832191, |
1150
|
|
|
0.0028762210234728096, |
1151
|
|
|
0.0089995626184575, |
1152
|
|
|
0.07518297127861205, |
1153
|
|
|
0.2314868056568013, |
1154
|
|
|
0.002226563639014434, |
1155
|
|
|
0.003285610147251786, |
1156
|
|
|
0.0027455897361131363, |
1157
|
|
|
0.2724537104534189, |
1158
|
|
|
0.0016655489138358362, |
1159
|
|
|
0.0019209797346551977, |
1160
|
|
|
0.0022137337804344656, |
1161
|
|
|
0.17690392185449774, |
1162
|
|
|
0.0014532730718763668, |
1163
|
|
|
0.0024994897215337513, |
1164
|
|
|
0.015302522233561744, |
1165
|
|
|
0.003441901151771395, |
1166
|
|
|
0.015303688584341741, |
1167
|
|
|
0.09314593964134713, |
1168
|
|
|
0.0017833503426155418, |
1169
|
|
|
0.0005108616416387229, |
1170
|
|
|
0.017828838023035427, |
1171
|
|
|
0.010385187345094037, |
1172
|
|
|
0.003168975069252078, |
1173
|
|
|
0.01902901297565243, |
1174
|
|
|
0.005525003644846187, |
1175
|
|
|
0.0010088934246974776, |
1176
|
|
|
0.0009272488700976819, |
1177
|
|
|
0.036282840064149294, |
1178
|
|
|
0.0022977110365942554, |
1179
|
|
|
0.0766805656801283, |
1180
|
|
|
0.22270418428342326, |
1181
|
|
|
0.005283569033386791, |
1182
|
|
|
0.007155562035282111, |
1183
|
|
|
0.01173582154833066, |
1184
|
|
|
0.1715620352821111, |
1185
|
|
|
0.003925936725470185, |
1186
|
|
|
0.004425134859308937, |
1187
|
|
|
0.020040239101909902, |
1188
|
|
|
0.14243242455168392, |
1189
|
|
|
0.0016737133692958156, |
1190
|
|
|
0.0066808572678232975, |
1191
|
|
|
0.011980755212130047, |
1192
|
|
|
0.012638577052048404, |
1193
|
|
|
0.07206065024055984, |
1194
|
|
|
0.08115701997375711, |
1195
|
|
|
0.00710424260096224, |
1196
|
|
|
0.0007278028867181805, |
1197
|
|
|
0.02347630849978131, |
1198
|
|
|
0.04595538708266512, |
1199
|
|
|
0.01481965301064295, |
1200
|
|
|
0.013925061962385188, |
1201
|
|
|
0.0018125091121154687, |
1202
|
|
|
0.00529173348884677, |
1203
|
|
|
0.0016340574427759146, |
1204
|
|
|
0.03072401224668319, |
1205
|
|
|
0.0023746901880740633, |
1206
|
|
|
0.25174165330223064, |
1207
|
|
|
0.06673392622831317, |
1208
|
|
|
0.00878378772415804, |
1209
|
|
|
0.03956261845750109, |
1210
|
|
|
0.010077270739174807, |
1211
|
|
|
0.0844787869951888, |
1212
|
|
|
0.00985216503863537, |
1213
|
|
|
0.004973319725907567, |
1214
|
|
|
0.01893220586091267, |
1215
|
|
|
0.11200583175389998, |
1216
|
|
|
0.0028715556203528212, |
1217
|
|
|
0.004095057588569762, |
1218
|
|
|
0.01202391019098994, |
1219
|
|
|
0.01756757544831608, |
1220
|
|
|
0.014825484764542934, |
1221
|
|
|
0.05312961073042717, |
1222
|
|
|
0.06746872721971132, |
1223
|
|
|
0.003845458521650386, |
1224
|
|
|
0.0210806239976673, |
1225
|
|
|
0.019443067502551394, |
1226
|
|
|
0.08017028721387957, |
1227
|
|
|
0.01825572240851436, |
1228
|
|
|
0.005365213587986587, |
1229
|
|
|
0.01959702580551101, |
1230
|
|
|
0.026184575010934536, |
1231
|
|
|
0.02474879720075813, |
1232
|
|
|
0.002171745152354571, |
1233
|
|
|
0.25827321767021433, |
1234
|
|
|
0.048050153083539875, |
1235
|
|
|
0.01043184137629392, |
1236
|
|
|
0.03930485493512174, |
1237
|
|
|
0.027640180784370902, |
1238
|
|
|
0.03294007872867765, |
1239
|
|
|
0.006474413179763814, |
1240
|
|
|
0.018314039947514214, |
1241
|
|
|
0.015119405161102202, |
1242
|
|
|
0.014706516984983233, |
1243
|
|
|
0.005494678524566263, |
1244
|
|
|
0.03309870243475726, |
1245
|
|
|
0.043864120134130345, |
1246
|
|
|
0.058996355153812505, |
1247
|
|
|
0.06265986295378335, |
1248
|
|
|
0.04633328473538417, |
1249
|
|
|
0.03790756670068523, |
1250
|
|
|
0.0004642076104388394, |
1251
|
|
|
0.037849249161685375, |
1252
|
|
|
0.08369966467415076, |
1253
|
|
|
0.04999679253535501, |
1254
|
|
|
0.02392768625164018, |
1255
|
|
|
0.010998687855372504, |
1256
|
|
|
0.009881323808135296, |
1257
|
|
|
0.003867619186470331, |
1258
|
|
|
0.012434465665548913, |
1259
|
|
|
0.007253535500801866, |
1260
|
|
|
0.11106225397288234, |
1261
|
|
|
0.17624726636535937, |
1262
|
|
|
0.008209943140399476, |
1263
|
|
|
0.008390727511299025, |
1264
|
|
|
0.012682898381688294, |
1265
|
|
|
0.1825653885406036, |
1266
|
|
|
0.001538416678816154, |
1267
|
|
|
0.004590756670068524, |
1268
|
|
|
0.008710307625018223, |
1269
|
|
|
0.1299513048549351, |
1270
|
|
|
0.002677941390873305, |
1271
|
|
|
0.012309666132089225, |
1272
|
|
|
0.014087184720804781, |
1273
|
|
|
0.01199941682461, |
1274
|
|
|
0.031246537396121883, |
1275
|
|
|
0.07206648199445984, |
1276
|
|
|
0.008254264470039366, |
1277
|
|
|
0.0007033095203382417, |
1278
|
|
|
0.007034261554162415, |
1279
|
|
|
0.006599212713223502, |
1280
|
|
|
0.013906400349905234, |
1281
|
|
|
0.050098265053214755, |
1282
|
|
|
0.007133401370462167, |
1283
|
|
|
0.017750692520775622, |
1284
|
|
|
0.0008257763522379356, |
1285
|
|
|
0.03918821985712203, |
1286
|
|
|
0.06015454147834961, |
1287
|
|
|
); |
1288
|
|
|
} |
1289
|
|
|
|
Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.
Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..