diff options
Diffstat (limited to 'static/js/check_password.js')
| -rw-r--r-- | static/js/check_password.js | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/static/js/check_password.js b/static/js/check_password.js new file mode 100644 index 00000000..f8fc40cc --- /dev/null +++ b/static/js/check_password.js @@ -0,0 +1,343 @@ +/* + jQuery(document).ready(function () { + "use strict"; + var $password = $(':password').pwstrength(), + common_words = ["password", "god", "123456"]; + + $password.pwstrength("addRule", "notEmail", function (options, word, score) { + return word.match(/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i) && score; + }, -100, true); + + $password.pwstrength("addRule", "commonWords", function (options, word, score) { + var result = false; + $.each(common_words, function (i, item) { + var re = new RegExp(item, "gi"); + if (word.match(re)) { + result = score; + } + }); + return result; + }, -500, true); + }); + + */ + + + + +/*jslint vars: false, browser: true, nomen: true, regexp: true */ +/*global jQuery */ + +/* +* jQuery Password Strength plugin for Twitter Bootstrap +* +* Copyright (c) 2008-2013 Tane Piper +* Copyright (c) 2013 Alejandro Blanco +* Dual licensed under the MIT and GPL licenses. +* +*/ + +(function ($) { + "use strict"; + + var options = { + errors: [], + // Options + minChar: 8, + errorMessages: { + password_to_short: "The Password is too short", + same_as_username: "Your password cannot be the same as your username" + }, + scores: [17, 26, 40, 50], + verdicts: ["Weak", "Normal", "Medium", "Strong", "Very Strong"], + showVerdicts: true, + raisePower: 1.4, + usernameField: "#username", + onLoad: undefined, + onKeyUp: undefined, + viewports: { + progress: undefined, + verdict: undefined, + errors: undefined + }, + // Rules stuff + ruleScores: { + wordNotEmail: -100, + wordLength: -100, + wordSimilarToUsername: -100, + wordLowercase: 1, + wordUppercase: 3, + wordOneNumber: 3, + wordThreeNumbers: 5, + wordOneSpecialChar: 3, + wordTwoSpecialChar: 5, + wordUpperLowerCombo: 2, + wordLetterNumberCombo: 2, + wordLetterNumberCharCombo: 2 + }, + rules: { + wordNotEmail: true, + wordLength: true, + wordSimilarToUsername: true, + wordLowercase: true, + wordUppercase: true, + wordOneNumber: true, + wordThreeNumbers: true, + wordOneSpecialChar: true, + wordTwoSpecialChar: true, + wordUpperLowerCombo: true, + wordLetterNumberCombo: true, + wordLetterNumberCharCombo: true + }, + validationRules: { + wordNotEmail: function (options, word, score) { + return word.match(/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i) && score; + }, + wordLength: function (options, word, score) { + var wordlen = word.length, + lenScore = Math.pow(wordlen, options.raisePower); + if (wordlen < options.minChar) { + lenScore = (lenScore + score); + options.errors.push(options.errorMessages.password_to_short); + } + return lenScore; + }, + wordSimilarToUsername: function (options, word, score) { + var username = $(options.usernameField).val(); + if (username && word.toLowerCase().match(username.toLowerCase())) { + options.errors.push(options.errorMessages.same_as_username); + return score; + } + return true; + }, + wordLowercase: function (options, word, score) { + return word.match(/[a-z]/) && score; + }, + wordUppercase: function (options, word, score) { + return word.match(/[A-Z]/) && score; + }, + wordOneNumber : function (options, word, score) { + return word.match(/\d+/) && score; + }, + wordThreeNumbers : function (options, word, score) { + return word.match(/(.*[0-9].*[0-9].*[0-9])/) && score; + }, + wordOneSpecialChar : function (options, word, score) { + return word.match(/.[!,@,#,$,%,\^,&,*,?,_,~]/) && score; + }, + wordTwoSpecialChar : function (options, word, score) { + return word.match(/(.*[!,@,#,$,%,\^,&,*,?,_,~].*[!,@,#,$,%,\^,&,*,?,_,~])/) && score; + }, + wordUpperLowerCombo : function (options, word, score) { + return word.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/) && score; + }, + wordLetterNumberCombo : function (options, word, score) { + return word.match(/([a-zA-Z])/) && word.match(/([0-9])/) && score; + }, + wordLetterNumberCharCombo : function (options, word, score) { + return word.match(/([a-zA-Z0-9].*[!,@,#,$,%,\^,&,*,?,_,~])|([!,@,#,$,%,\^,&,*,?,_,~].*[a-zA-Z0-9])/) && score; + } + } + }, + + setProgressBar = function ($el, score) { + var options = $el.data("pwstrength"), + progressbar = options.progressbar.find('.progress-bar'), + $verdict; + + if (options.showVerdicts) { + if (options.viewports.verdict) { + $verdict = $(options.viewports.verdict).find(".password-verdict"); + } else { + $verdict = $el.parent().find(".password-verdict"); + if ($verdict.length === 0) { + $verdict = $('<span class="password-verdict"></span>'); + $verdict.insertAfter($el); + } + } + } + + + if (score < options.scores[0]) { + progressbar.addClass("progress-bar-danger").removeClass("progress-bar-warning").removeClass("progress-bar-success"); + progressbar.css("width", "5%"); + if (options.showVerdicts) { + $verdict.text(options.verdicts[0]); + } + } else if (score >= options.scores[0] && score < options.scores[1]) { + progressbar.addClass("progress-bar-danger").removeClass("progress-bar-warning").removeClass("progress-bar-success"); + progressbar.css("width", "25%"); + if (options.showVerdicts) { + $verdict.text(options.verdicts[1]); + } + } else if (score >= options.scores[1] && score < options.scores[2]) { + progressbar.addClass("progress-bar-warning").removeClass("progress-bar-danger").removeClass("progress-bar-success"); + progressbar.css("width", "50%"); + if (options.showVerdicts) { + $verdict.text(options.verdicts[2]); + } + } else if (score >= options.scores[2] && score < options.scores[3]) { + progressbar.addClass("progress-bar-warning").removeClass("progress-bar-danger").removeClass("progress-bar-success"); + progressbar.css("width", "75%"); + if (options.showVerdicts) { + $verdict.text(options.verdicts[3]); + } + } else if (score >= options.scores[3]) { + progressbar.addClass("progress-bar-success").removeClass("progress-bar-warning").removeClass("progress-bar-danger"); + progressbar.css("width", "100%"); + if (options.showVerdicts) { + $verdict.text(options.verdicts[4]); + } + } + }, + + calculateScore = function ($el) { + var self = this, + word = $el.val(), + totalScore = 0, + options = $el.data("pwstrength"); + + $.each(options.rules, function (rule, active) { + if (active === true) { + var score = options.ruleScores[rule], + result = options.validationRules[rule](options, word, score); + if (result) { + totalScore += result; + } + } + }); + setProgressBar($el, totalScore); + return totalScore; + }, + + progressWidget = function () { + return '<div class="progress"><div class="progress-bar progress-bar-striped"></div></div>'; + }, + + methods = { + init: function (settings) { + var self = this, + allOptions = $.extend(options, settings); + + return this.each(function (idx, el) { + var $el = $(el), + progressbar, + verdict; + + $el.data("pwstrength", allOptions); + + $el.on("keyup", function (event) { + var options = $el.data("pwstrength"); + options.errors = []; + calculateScore.call(self, $el); + if ($.isFunction(options.onKeyUp)) { + options.onKeyUp(event); + } + }); + + progressbar = $(progressWidget()); + if (allOptions.viewports.progress) { + $(allOptions.viewports.progress).append(progressbar); + } else { + progressbar.insertAfter($el); + } + progressbar.find(".bar").css("width", "0%"); + $el.data("pwstrength").progressbar = progressbar; + + if (allOptions.showVerdicts) { + verdict = $('<span class="password-verdict">' + allOptions.verdicts[0] + '</span>'); + if (allOptions.viewports.verdict) { + $(allOptions.viewports.verdict).append(verdict); + } else { + verdict.insertAfter($el); + } + } + + if ($.isFunction(allOptions.onLoad)) { + allOptions.onLoad(); + } + }); + }, + + destroy: function () { + this.each(function (idx, el) { + var $el = $(el); + $el.parent().find("span.password-verdict").remove(); + $el.parent().find("div.progress").remove(); + $el.parent().find("ul.error-list").remove(); + $el.removeData("pwstrength"); + }); + }, + + forceUpdate: function () { + var self = this; + this.each(function (idx, el) { + var $el = $(el), + options = $el.data("pwstrength"); + options.errors = []; + calculateScore.call(self, $el); + }); + }, + + outputErrorList: function () { + this.each(function (idx, el) { + var output = '<ul class="error-list">', + $el = $(el), + errors = $el.data("pwstrength").errors, + viewports = $el.data("pwstrength").viewports, + verdict; + $el.parent().find("ul.error-list").remove(); + + if (errors.length > 0) { + $.each(errors, function (i, item) { + output += '<li>' + item + '</li>'; + }); + output += '</ul>'; + if (viewports.errors) { + $(viewports.errors).html(output); + } else { + output = $(output); + verdict = $el.parent().find("span.password-verdict"); + if (verdict.length > 0) { + el = verdict; + } + output.insertAfter(el); + } + } + }); + }, + + addRule: function (name, method, score, active) { + this.each(function (idx, el) { + var options = $(el).data("pwstrength"); + options.rules[name] = active; + options.ruleScores[name] = score; + options.validationRules[name] = method; + }); + }, + + changeScore: function (rule, score) { + this.each(function (idx, el) { + $(el).data("pwstrength").ruleScores[rule] = score; + }); + }, + + ruleActive: function (rule, active) { + this.each(function (idx, el) { + $(el).data("pwstrength").rules[rule] = active; + }); + } + }; + + $.fn.pwstrength = function (method) { + var result; + if (methods[method]) { + result = methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); + } else if (typeof method === "object" || !method) { + result = methods.init.apply(this, arguments); + } else { + $.error("Method " + method + " does not exist on jQuery.pwstrength"); + } + return result; + }; +}(jQuery)); |
