wp/wp-admin/js/password-strength-meter.js
author ymh <ymh.work@gmail.com>
Mon, 14 Oct 2019 17:39:30 +0200
changeset 7 cf61fcea0001
parent 5 5e2f62d02dcd
child 9 177826044cd9
permissions -rw-r--r--
resynchronize code repo with production
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
     1
/* global zxcvbn */
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
window.wp = window.wp || {};
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
var passwordStrength;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
(function($){
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
	wp.passwordStrength = {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
		/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
		 * Determine the strength of a given password
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
		 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
		 * @param string password1 The password
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
		 * @param array blacklist An array of words that will lower the entropy of the password
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
		 * @param string password2 The confirmed password
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
		 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
		meter : function( password1, blacklist, password2 ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
			if ( ! $.isArray( blacklist ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
				blacklist = [ blacklist.toString() ];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
			if (password1 != password2 && password2 && password2.length > 0)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
				return 5;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    21
			if ( 'undefined' === typeof window.zxcvbn ) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    22
				// Password strength unknown.
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    23
				return -1;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    24
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    25
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
			var result = zxcvbn( password1, blacklist );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
			return result.score;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
		},
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
		/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
		 * Builds an array of data that should be penalized, because it would lower the entropy of a password if it were used
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
		 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
		 * @return array The array of data to be blacklisted
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
		 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
		userInputBlacklist : function() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
			var i, userInputFieldsLength, rawValuesLength, currentField,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
				rawValues       = [],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
				blacklist       = [],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
				userInputFields = [ 'user_login', 'first_name', 'last_name', 'nickname', 'display_name', 'email', 'url', 'description', 'weblog_title', 'admin_email' ];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
			// Collect all the strings we want to blacklist
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
			rawValues.push( document.title );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
			rawValues.push( document.URL );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
			userInputFieldsLength = userInputFields.length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
			for ( i = 0; i < userInputFieldsLength; i++ ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
				currentField = $( '#' + userInputFields[ i ] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    49
				if ( 0 === currentField.length ) {
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
					continue;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
				rawValues.push( currentField[0].defaultValue );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
				rawValues.push( currentField.val() );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
			// Strip out non-alphanumeric characters and convert each word to an individual entry
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
			rawValuesLength = rawValues.length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
			for ( i = 0; i < rawValuesLength; i++ ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
				if ( rawValues[ i ] ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
					blacklist = blacklist.concat( rawValues[ i ].replace( /\W/g, ' ' ).split( ' ' ) );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
			// Remove empty values, short words, and duplicates. Short words are likely to cause many false positives.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
			blacklist = $.grep( blacklist, function( value, key ) {
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    67
				if ( '' === value || 4 > value.length ) {
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
				return $.inArray( value, blacklist ) === key;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
			});
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
			return blacklist;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
		}
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    76
	};
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    78
	// Back-compat.
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
	passwordStrength = wp.passwordStrength.meter;
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    80
})(jQuery);