/* jQuery Password Strength Plugin (pstrength) - A jQuery plugin to provide accessibility functions * Author: Tane Piper (digitalspaghetti@gmail.com) * Website: http://digitalspaghetti.me.uk * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php * This code uses a modified version of Steve Moitozo's algorithm (http://www.geekwisdom.com/dyn/passwdmeter) * * === Changelog === * Version 1.2 (03/09/2007) * Added more options for colors and common words * Added common words checked to see if words like 'password' or 'qwerty' are being entered * Added minimum characters required for password * Re-worked scoring system to give better results * * Version 1.1 (20/08/2007) * Changed code to be more jQuery-like * * Version 1.0 (20/07/2007) * Initial version. */ (function($){ /** @name pstrength * @var mixed options An object of options * @returns object jQuery Returns the output to the screen */ $.fn.pstrength = function(options) { // Take the passed options and merge with default options var options = $.extend({}, $.fn.pstrength.defaults, options); // Main logic return this.each(function(){ // Check to see if any options have been attached as expandos var o = $.meta ? $.extend({}, options, $(this).data()) : options; // Get the ID of the password field var infoarea = $(this).attr('id'); // Add in the text to show the bar and text $(this).after('
'); // Check the password on each KeyUp $(this).keyup(function(){ $.fn.pstrength.runPassword($(this).val(), infoarea, o); }); }); }; /** * $.fn.pstrength.defaults * These are the default values that can be overidden */ $.fn.pstrength.defaults = { verdects: ["Very Weak", "Weak", "Medium", "Strong", "Very Strong"], colors: ["#f00","#c06", "#f60","#3c0","#3f0"], scores: [10,15,30,40], minchar: 6 }; /** * $.fn.pstrength.runPassword * This function takes the password and generates the colour for the bar and text required */ $.fn.pstrength.runPassword = function (password, infoarea, options){ // Check password nPerc = $.fn.pstrength.checkPassword(password, options); // Get controls var ctlText = "#" + infoarea + "_text"; // Color and text if (nPerc < 0 && nPerc > -199) { strColor = '#ccc'; strText = 'Too Short'; } else if(nPerc <= options.scores[0]) { strColor = options.colors[0]; strText = options.verdects[0]; } else if (nPerc > options.scores[0] && nPerc <= options.scores[1]) { strColor = options.colors[1]; strText = options.verdects[1]; } else if (nPerc > options.scores[1] && nPerc <= options.scores[2]) { strColor = options.colors[2]; strText = options.verdects[2]; } else if (nPerc > options.scores[2] && nPerc <= options.scores[3]) { strColor = options.colors[3]; strText = options.verdects[3]; } else { strColor = options.colors[4]; strText = options.verdects[4]; } $(ctlText).html("" + strText + ""); }; /** * $.fn.pstrength.checkPassword * This function takes the password and generates the score based on the rules */ $.fn.pstrength.checkPassword = function(password, options) { var intScore = 0; var strVerdict = options.verdects[0]; // PASSWORD LENGTH if (password.length < options.minchar) // Password too short { intScore = (intScore - 100) } else if (password.length >= options.minchar && password.length <= (options.minchar + 2)) // Password Short { intScore = (intScore + 6) } else if (password.length >= (options.minchar + 3) && password.length <= (options.minchar + 4))// Password Medium { intScore = (intScore + 12) } else if (password.length >= (options.minchar + 5)) // Password Large { intScore = (intScore + 18) } if (password.match(/[a-z]/)) // [verified] at least one lower case letter { intScore = (intScore + 1) } if (password.match(/[A-Z]/)) // [verified] at least one upper case letter { intScore = (intScore + 5) } // NUMBERS if (password.match(/\d+/)) // [verified] at least one number { intScore = (intScore + 5) } if (password.match(/(.*[0-9].*[0-9].*[0-9])/)) // [verified] at least three numbers { intScore = (intScore + 7) } // SPECIAL CHAR if (password.match(/.[!,@,#,$,%,^,&,*,?,_,~]/)) // [verified] at least one special character { intScore = (intScore + 5) } // [verified] at least two special characters if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) { intScore = (intScore + 7) } // COMBOS if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) // [verified] both upper and lower case { intScore = (intScore + 2) } if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) // [verified] both letters and numbers { intScore = (intScore + 3) } // [verified] letters, numbers, and special characters if (password.match(/([a-zA-Z0-9].*[!,@,#,$,%,^,&,*,?,_,~])|([!,@,#,$,%,^,&,*,?,_,~].*[a-zA-Z0-9])/)) { intScore = (intScore + 3) } return intScore; }; })(jQuery);