Chris@0
|
1 /**
|
Chris@0
|
2 * DO NOT EDIT THIS FILE.
|
Chris@0
|
3 * See the following change record for more information,
|
Chris@0
|
4 * https://www.drupal.org/node/2815083
|
Chris@0
|
5 * @preserve
|
Chris@0
|
6 **/
|
Chris@0
|
7
|
Chris@0
|
8 (function ($, Drupal, drupalSettings) {
|
Chris@0
|
9 Drupal.behaviors.password = {
|
Chris@0
|
10 attach: function attach(context, settings) {
|
Chris@0
|
11 var $passwordInput = $(context).find('input.js-password-field').once('password');
|
Chris@0
|
12
|
Chris@0
|
13 if ($passwordInput.length) {
|
Chris@0
|
14 var translate = settings.password;
|
Chris@0
|
15
|
Chris@0
|
16 var $passwordInputParent = $passwordInput.parent();
|
Chris@0
|
17 var $passwordInputParentWrapper = $passwordInputParent.parent();
|
Chris@0
|
18 var $passwordSuggestions = void 0;
|
Chris@0
|
19
|
Chris@0
|
20 $passwordInputParent.addClass('password-parent');
|
Chris@0
|
21
|
Chris@0
|
22 $passwordInputParentWrapper.find('input.js-password-confirm').parent().append('<div aria-live="polite" aria-atomic="true" class="password-confirm js-password-confirm">' + translate.confirmTitle + ' <span></span></div>').addClass('confirm-parent');
|
Chris@0
|
23
|
Chris@0
|
24 var $confirmInput = $passwordInputParentWrapper.find('input.js-password-confirm');
|
Chris@0
|
25 var $confirmResult = $passwordInputParentWrapper.find('div.js-password-confirm');
|
Chris@0
|
26 var $confirmChild = $confirmResult.find('span');
|
Chris@0
|
27
|
Chris@0
|
28 if (settings.password.showStrengthIndicator) {
|
Chris@0
|
29 var passwordMeter = '<div class="password-strength"><div class="password-strength__meter"><div class="password-strength__indicator js-password-strength__indicator"></div></div><div aria-live="polite" aria-atomic="true" class="password-strength__title">' + translate.strengthTitle + ' <span class="password-strength__text js-password-strength__text"></span></div></div>';
|
Chris@0
|
30 $confirmInput.parent().after('<div class="password-suggestions description"></div>');
|
Chris@0
|
31 $passwordInputParent.append(passwordMeter);
|
Chris@0
|
32 $passwordSuggestions = $passwordInputParentWrapper.find('div.password-suggestions').hide();
|
Chris@0
|
33 }
|
Chris@0
|
34
|
Chris@0
|
35 var passwordCheckMatch = function passwordCheckMatch(confirmInputVal) {
|
Chris@0
|
36 var success = $passwordInput.val() === confirmInputVal;
|
Chris@0
|
37 var confirmClass = success ? 'ok' : 'error';
|
Chris@0
|
38
|
Chris@0
|
39 $confirmChild.html(translate['confirm' + (success ? 'Success' : 'Failure')]).removeClass('ok error').addClass(confirmClass);
|
Chris@0
|
40 };
|
Chris@0
|
41
|
Chris@0
|
42 var passwordCheck = function passwordCheck() {
|
Chris@0
|
43 if (settings.password.showStrengthIndicator) {
|
Chris@0
|
44 var result = Drupal.evaluatePasswordStrength($passwordInput.val(), settings.password);
|
Chris@0
|
45
|
Chris@0
|
46 if ($passwordSuggestions.html() !== result.message) {
|
Chris@0
|
47 $passwordSuggestions.html(result.message);
|
Chris@0
|
48 }
|
Chris@0
|
49
|
Chris@0
|
50 $passwordSuggestions.toggle(result.strength !== 100);
|
Chris@0
|
51
|
Chris@0
|
52 $passwordInputParent.find('.js-password-strength__indicator').css('width', result.strength + '%').removeClass('is-weak is-fair is-good is-strong').addClass(result.indicatorClass);
|
Chris@0
|
53
|
Chris@0
|
54 $passwordInputParent.find('.js-password-strength__text').html(result.indicatorText);
|
Chris@0
|
55 }
|
Chris@0
|
56
|
Chris@0
|
57 if ($confirmInput.val()) {
|
Chris@0
|
58 passwordCheckMatch($confirmInput.val());
|
Chris@0
|
59 $confirmResult.css({ visibility: 'visible' });
|
Chris@0
|
60 } else {
|
Chris@0
|
61 $confirmResult.css({ visibility: 'hidden' });
|
Chris@0
|
62 }
|
Chris@0
|
63 };
|
Chris@0
|
64
|
Chris@0
|
65 $passwordInput.on('input', passwordCheck);
|
Chris@0
|
66 $confirmInput.on('input', passwordCheck);
|
Chris@0
|
67 }
|
Chris@0
|
68 }
|
Chris@0
|
69 };
|
Chris@0
|
70
|
Chris@0
|
71 Drupal.evaluatePasswordStrength = function (password, translate) {
|
Chris@0
|
72 password = password.trim();
|
Chris@0
|
73 var indicatorText = void 0;
|
Chris@0
|
74 var indicatorClass = void 0;
|
Chris@0
|
75 var weaknesses = 0;
|
Chris@0
|
76 var strength = 100;
|
Chris@0
|
77 var msg = [];
|
Chris@0
|
78
|
Chris@0
|
79 var hasLowercase = /[a-z]/.test(password);
|
Chris@0
|
80 var hasUppercase = /[A-Z]/.test(password);
|
Chris@0
|
81 var hasNumbers = /[0-9]/.test(password);
|
Chris@0
|
82 var hasPunctuation = /[^a-zA-Z0-9]/.test(password);
|
Chris@0
|
83
|
Chris@0
|
84 var $usernameBox = $('input.username');
|
Chris@0
|
85 var username = $usernameBox.length > 0 ? $usernameBox.val() : translate.username;
|
Chris@0
|
86
|
Chris@0
|
87 if (password.length < 12) {
|
Chris@0
|
88 msg.push(translate.tooShort);
|
Chris@0
|
89 strength -= (12 - password.length) * 5 + 30;
|
Chris@0
|
90 }
|
Chris@0
|
91
|
Chris@0
|
92 if (!hasLowercase) {
|
Chris@0
|
93 msg.push(translate.addLowerCase);
|
Chris@0
|
94 weaknesses++;
|
Chris@0
|
95 }
|
Chris@0
|
96 if (!hasUppercase) {
|
Chris@0
|
97 msg.push(translate.addUpperCase);
|
Chris@0
|
98 weaknesses++;
|
Chris@0
|
99 }
|
Chris@0
|
100 if (!hasNumbers) {
|
Chris@0
|
101 msg.push(translate.addNumbers);
|
Chris@0
|
102 weaknesses++;
|
Chris@0
|
103 }
|
Chris@0
|
104 if (!hasPunctuation) {
|
Chris@0
|
105 msg.push(translate.addPunctuation);
|
Chris@0
|
106 weaknesses++;
|
Chris@0
|
107 }
|
Chris@0
|
108
|
Chris@0
|
109 switch (weaknesses) {
|
Chris@0
|
110 case 1:
|
Chris@0
|
111 strength -= 12.5;
|
Chris@0
|
112 break;
|
Chris@0
|
113
|
Chris@0
|
114 case 2:
|
Chris@0
|
115 strength -= 25;
|
Chris@0
|
116 break;
|
Chris@0
|
117
|
Chris@0
|
118 case 3:
|
Chris@0
|
119 strength -= 40;
|
Chris@0
|
120 break;
|
Chris@0
|
121
|
Chris@0
|
122 case 4:
|
Chris@0
|
123 strength -= 40;
|
Chris@0
|
124 break;
|
Chris@0
|
125 }
|
Chris@0
|
126
|
Chris@0
|
127 if (password !== '' && password.toLowerCase() === username.toLowerCase()) {
|
Chris@0
|
128 msg.push(translate.sameAsUsername);
|
Chris@0
|
129
|
Chris@0
|
130 strength = 5;
|
Chris@0
|
131 }
|
Chris@0
|
132
|
Chris@0
|
133 if (strength < 60) {
|
Chris@0
|
134 indicatorText = translate.weak;
|
Chris@0
|
135 indicatorClass = 'is-weak';
|
Chris@0
|
136 } else if (strength < 70) {
|
Chris@0
|
137 indicatorText = translate.fair;
|
Chris@0
|
138 indicatorClass = 'is-fair';
|
Chris@0
|
139 } else if (strength < 80) {
|
Chris@0
|
140 indicatorText = translate.good;
|
Chris@0
|
141 indicatorClass = 'is-good';
|
Chris@0
|
142 } else if (strength <= 100) {
|
Chris@0
|
143 indicatorText = translate.strong;
|
Chris@0
|
144 indicatorClass = 'is-strong';
|
Chris@0
|
145 }
|
Chris@0
|
146
|
Chris@0
|
147 msg = translate.hasWeaknesses + '<ul><li>' + msg.join('</li><li>') + '</li></ul>';
|
Chris@0
|
148
|
Chris@0
|
149 return {
|
Chris@0
|
150 strength: strength,
|
Chris@0
|
151 message: msg,
|
Chris@0
|
152 indicatorText: indicatorText,
|
Chris@0
|
153 indicatorClass: indicatorClass
|
Chris@0
|
154 };
|
Chris@0
|
155 };
|
Chris@0
|
156 })(jQuery, Drupal, drupalSettings); |