// $Id$ (function ($) { /** * Attach handlers to evaluate the strength of any password fields and to check * that its confirmation is correct. */ Drupal.behaviors.password = { attach: function (context, settings) { var translate = settings.password; $('input.password-field:not(.password-processed)', context).each(function () { var passwordInput = $(this).addClass('password-processed'); var innerWrapper = $(this).parent(); var outerWrapper = $(this).parent().parent(); // Add the password strength layers. var passwordStrength = $('span.password-strength', innerWrapper); var passwordResult = $('span.password-result', passwordStrength); innerWrapper.addClass('password-parent'); // Add the description box at the end. var passwordMeter = '
' + translate.strengthTitle + '
'; $('div.description', outerWrapper).prepend('
'); $(innerWrapper).append(passwordMeter); var passwordDescription = $('div.password-suggestions', outerWrapper).hide(); // Add the password confirmation layer. $('input.password-confirm', outerWrapper).after('
' + translate['confirmTitle'] + '
').parent().addClass('confirm-parent'); var confirmInput = $('input.password-confirm', outerWrapper); var confirmResult = $('div.password-confirm', outerWrapper); var confirmChild = $('span', confirmResult); // Check the password strength. var passwordCheck = function () { // Evaluate the password strength. var result = Drupal.evaluatePasswordStrength(passwordInput.val(), settings.password); // Update the suggestions for how to improve the password. if (passwordDescription.html() != result.message) { passwordDescription.html(result.message); } // Only show the description box if there is a weakness in the password. if (result.strength == 100) { passwordDescription.hide(); } else { passwordDescription.show(); } // Adjust the length of the strength indicator. $('#indicator').css('width', result.strength + '%'); passwordCheckMatch(); }; // Check that password and confirmation inputs match. var passwordCheckMatch = function () { if (confirmInput.val()) { var success = passwordInput.val() === confirmInput.val(); // Show the confirm result. confirmResult.css({ visibility: 'visible' }); // Remove the previous styling if any exists. if (this.confirmClass) { confirmChild.removeClass(this.confirmClass); } // Fill in the success message and set the class accordingly. var confirmClass = success ? 'ok' : 'error'; confirmChild.html(translate['confirm' + (success ? 'Success' : 'Failure')]).addClass(confirmClass); this.confirmClass = confirmClass; } else { confirmResult.css({ visibility: 'hidden' }); } }; // Monitor keyup and blur events. // Blur must be used because a mouse paste does not trigger keyup. passwordInput.keyup(passwordCheck).focus(passwordCheck).blur(passwordCheck); confirmInput.keyup(passwordCheckMatch).blur(passwordCheckMatch); }); } }; /** * Evaluate the strength of a user's password. * * Returns the estimated strength and the relevant output message. */ Drupal.evaluatePasswordStrength = function (password, translate) { var weaknesses = 0, strength = 100, msg = []; var hasLowercase = password.match(/[a-z]+/); var hasUppercase = password.match(/[A-Z]+/); var hasNumbers = password.match(/[0-9]+/); var hasPunctuation = password.match(/[^a-zA-Z0-9]+/); // If there is a username edit box on the page, compare password to that, otherwise // use value from the database. var usernameBox = $('input.username'); var username = (usernameBox.length > 0) ? usernameBox.val() : translate.username; // Lose 10 points for every character less than 6. if (password.length < 6) { msg.push(translate.tooShort); strength -= (6 - password.length) * 10; } // Count weaknesses. if (!hasLowercase) { msg.push(translate.addLowerCase); weaknesses++; } if (!hasUppercase) { msg.push(translate.addUpperCase); weaknesses++; } if (!hasNumbers) { msg.push(translate.addNumbers); weaknesses++; } if (!hasPunctuation) { msg.push(translate.addPunctuation); weaknesses++; } // Apply penalty for each weakness (balanced against length penalty). switch (weaknesses) { case 1: strength -= 12.5; break; case 2: strength -= 25; break; case 3: strength -= 40; break; case 4: strength -= 40; break; } // Check if password is the same as the username. if (password !== '' && password.toLowerCase() === username.toLowerCase()) { msg.push(translate.sameAsUsername); // Passwords the same as username are always very weak. strength = 5; } // Assemble the final message. msg = translate.hasWeaknesses + ''; return { strength: strength, message: msg }; }; /** * Show all of the picture-related form elements at admin/settings/user * depending on whether user pictures are enabled or not. */ Drupal.behaviors.userSettings = { attach: function (context, settings) { $('#edit-user-pictures', context).change(function () { $('div.user-admin-picture-settings', context).toggle(); }); } }; })(jQuery);