pwstrength-bootstrap
Version:
jQuery plugin for Twitter Bootstrap that provides rulesets for visualy displaying the quality of a users typed in password.
3 lines • 14.4 kB
JavaScript
/* pwstrength-bootstrap 2026-04-24 - GPLv3 & MIT License */
(s=>{var o,a,r,t={},i=(o=window.i18next,t.fallback={wordMinLength:"Your password is too short",wordMaxLength:"Your password is too long",wordInvalidChar:"Your password contains an invalid character",wordNotEmail:"Do not use your email as your password",wordSimilarToUsername:"Your password cannot contain your username",wordTwoCharacterClasses:"Use different character classes",wordRepetitions:"Too many repetitions",wordSequences:"Your password contains sequences",errorList:"Errors:",veryWeak:"Very Weak",weak:"Weak",normal:"Normal",medium:"Medium",strong:"Strong",veryStrong:"Very Strong"},t.t=function(r){var e="";return(e=o?o.t(r):t.fallback[r])===r?"":e},{});try{!s&&module&&module.exports&&(s=require("jquery"),r=require("jsdom").jsdom,s=s(r().defaultView))}catch(r){}a=s,r={},i.forbiddenSequences=["0123456789","abcdefghijklmnopqrstuvwxyz","qwertyuiop","asdfghjkl","zxcvbnm","!@#$%^&*()_+"],r.wordNotEmail=function(r,e,o){return e.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)?o:0},r.wordMinLength=function(r,e,o){var e=e.length,s=Math.pow(e,r.rules.raisePower);return e<r.common.minChar&&(s+=o),s},r.wordMaxLength=function(r,e,o){var e=e.length,s=Math.pow(e,r.rules.raisePower);return e>r.common.maxChar?o:s},r.wordInvalidChar=function(r,e,o){return r.common.invalidCharsRegExp.test(e)?o:0},r.wordMinLengthStaticScore=function(r,e,o){return e.length<r.common.minChar?0:o},r.wordMaxLengthStaticScore=function(r,e,o){return e.length>r.common.maxChar?0:o},r.wordSimilarToUsername=function(r,e,o){r=a(r.common.usernameField).val();return r&&e.toLowerCase().match(r.replace(/[-[\]/{}()*+=?:.\\^$|!,]/g,"\\$&").toLowerCase())?o:0},r.wordTwoCharacterClasses=function(r,e,o){r=new RegExp("(."+r.rules.specialCharClass+")");if(e.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)||e.match(/([a-zA-Z])/)&&e.match(/([0-9])/)||e.match(r)&&e.match(/[a-zA-Z0-9_]/))return o},r.wordRepetitions=function(r,e,o){return e.match(/(.)\1\1/)?o:0},r.wordSequences=function(r,o,e){var s,t=!1;return 2<o.length&&(a.each(i.forbiddenSequences,function(r,e){t||(e=[e,e.split("").reverse().join("")],a.each(e,function(r,e){for(s=0;s<o.length-2;s+=1)-1<e.indexOf(o.toLowerCase().substring(s,s+3))&&(t=!0)}))}),t)?e:0},r.wordLowercase=function(r,e,o){return e.match(/[a-z]/)&&o},r.wordUppercase=function(r,e,o){return e.match(/[A-Z]/)&&o},r.wordOneNumber=function(r,e,o){return e.match(/\d+/)&&o},r.wordThreeNumbers=function(r,e,o){return e.match(/(.*[0-9].*[0-9].*[0-9])/)&&o},r.wordOneSpecialChar=function(r,e,o){r=new RegExp(r.rules.specialCharClass);return e.match(r)&&o},r.wordTwoSpecialChar=function(r,e,o){r=new RegExp("(.*"+r.rules.specialCharClass+".*"+r.rules.specialCharClass+")");return e.match(r)&&o},r.wordUpperLowerCombo=function(r,e,o){return e.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)&&o},r.wordLetterNumberCombo=function(r,e,o){return e.match(/([a-zA-Z])/)&&e.match(/([0-9])/)&&o},r.wordLetterNumberCharCombo=function(r,e,o){r=new RegExp("([a-zA-Z0-9].*"+r.rules.specialCharClass+")|("+r.rules.specialCharClass+".*[a-zA-Z0-9])");return e.match(r)&&o},r.wordIsACommonPassword=function(r,e,o){return 0<=a.inArray(e,r.rules.commonPasswords)?o:0},i.validation=r,i.executeRules=function(s,t){var n=0;return a.each(s.rules.activated,function(r,e){var o;e&&(e=s.rules.scores[r],"function"==typeof(o="function"!=typeof(o=i.validation[r])?s.rules.extra[r]:o))&&((o=o(s,t,e))&&(n+=o),o<0||(isNaN(parseFloat(o))||!isFinite(o))&&!o)&&0<(e=s.ui.spanError(s,r)).length&&s.instances.errors.push(e)}),n};try{module&&module.exports&&(module.exports=i)}catch(r){}var n,c,u,d,p,l,m,h,w={common:{}},g=(w.common.minChar=6,w.common.maxChar=20,w.common.usernameField="#username",w.common.invalidCharsRegExp=new RegExp(/[\s,'"]/),w.common.userInputs=[],w.common.onLoad=void 0,w.common.onKeyUp=void 0,w.common.onScore=void 0,w.common.zxcvbn=!1,w.common.zxcvbnTerms=[],w.common.events=["keyup","change","paste"],w.common.debug=!1,w.rules={},w.rules.extra={},w.rules.scores={wordNotEmail:-100,wordMinLength:-50,wordMaxLength:-50,wordInvalidChar:-100,wordSimilarToUsername:-100,wordSequences:-20,wordTwoCharacterClasses:2,wordRepetitions:-25,wordLowercase:1,wordUppercase:3,wordOneNumber:3,wordThreeNumbers:5,wordOneSpecialChar:3,wordTwoSpecialChar:5,wordUpperLowerCombo:2,wordLetterNumberCombo:2,wordLetterNumberCharCombo:2,wordIsACommonPassword:-100},w.rules.activated={wordNotEmail:!0,wordMinLength:!0,wordMaxLength:!1,wordInvalidChar:!1,wordSimilarToUsername:!0,wordSequences:!0,wordTwoCharacterClasses:!0,wordRepetitions:!0,wordLowercase:!0,wordUppercase:!0,wordOneNumber:!0,wordThreeNumbers:!0,wordOneSpecialChar:!0,wordTwoSpecialChar:!0,wordUpperLowerCombo:!0,wordLetterNumberCombo:!0,wordLetterNumberCharCombo:!0,wordIsACommonPassword:!0},w.rules.raisePower=1.4,w.rules.specialCharClass="[!,@,#,$,%,^,&,*,?,_,~]",w.rules.commonPasswords=["123456","password","12345678","qwerty","123456789","12345","1234","111111","1234567","dragon","123123","baseball","abc123","football","monkey","letmein","696969","shadow","master","666666","qwertyuiop","123321","mustang","1234567890","michael","654321","pussy","superman","1qaz2wsx","7777777","fuckyou","121212","000000","qazwsx","123qwe","killer","trustno1","jordan","jennifer","zxcvbnm","asdfgh","hunter","buster","soccer","harley","batman","andrew","tigger","sunshine","iloveyou","fuckme","2000","charlie","robert","thomas","hockey","ranger","daniel","starwars","klaster","112233","george","asshole","computer","michelle","jessica","pepper","1111","zxcvbn","555555","11111111","131313","freedom","777777","pass","fuck","maggie","159753","aaaaaa","ginger","princess","joshua","cheese","amanda","summer","love","ashley","6969","nicole","chelsea","biteme","matthew","access","yankees","987654321","dallas","austin","thunder","taylor","matrix"],w.ui={},w.ui.bootstrap2=!1,w.ui.bootstrap3=!1,w.ui.colorClasses=["danger","danger","danger","warning","warning","success"],w.ui.showProgressBar=!0,w.ui.progressBarEmptyPercentage=1,w.ui.progressBarMinWidth=1,w.ui.progressBarMinPercentage=1,w.ui.progressExtraCssClasses="",w.ui.progressBarExtraCssClasses="",w.ui.showPopover=!1,w.ui.popoverPlacement="bottom",w.ui.showStatus=!1,w.ui.spanError=function(r,e){r=r.i18n.t(e);return r?'<span style="color: #d52929">'+r+"</span>":""},w.ui.popoverError=function(r){var e=r.instances.errors,o="<div>"+r.i18n.t("errorList")+'<ul class="error-list" style="margin-bottom: 0;">';return s.each(e,function(r,e){o+="<li>"+e+"</li>"}),o+="</ul></div>"},w.ui.showVerdicts=!0,w.ui.showVerdictsInsideProgressBar=!1,w.ui.useVerdictCssClass=!1,w.ui.showErrors=!1,w.ui.showScore=!1,w.ui.container=void 0,w.ui.viewports={progress:void 0,verdict:void 0,errors:void 0,score:void 0},w.ui.scores=[0,14,26,38,50],w.i18n={},w.i18n.t=t.t,{}),v=(n=s,c=["error","warning","success"],u=["veryWeak","weak","normal","medium","strong","veryStrong"],g.getContainer=function(r,e){r=n(r.ui.container);return r=r&&1===r.length?r:e.parent()},g.findElement=function(r,e,o){return(e?r.find(e):r).find(o)},g.getUIElements=function(r,e){var o;return r.instances.viewports||(e=g.getContainer(r,e),(o={}).$progressbar=g.findElement(e,r.ui.viewports.progress,"div.progress"),r.ui.showVerdictsInsideProgressBar&&(o.$verdict=o.$progressbar.find("span.password-verdict")),r.ui.showPopover||(r.ui.showVerdictsInsideProgressBar||(o.$verdict=g.findElement(e,r.ui.viewports.verdict,"span.password-verdict")),o.$errors=g.findElement(e,r.ui.viewports.errors,"ul.error-list")),o.$score=g.findElement(e,r.ui.viewports.score,"span.password-score"),r.instances.viewports=o)},g.initHelper=function(r,e,o,s){r=g.getContainer(r,e);s?r.find(s).append(o):n(o).insertAfter(e)},g.initVerdict=function(r,e){g.initHelper(r,e,'<span class="password-verdict"></span>',r.ui.viewports.verdict)},g.initErrorList=function(r,e){g.initHelper(r,e,'<ul class="error-list"></ul>',r.ui.viewports.errors)},g.initScore=function(r,e){g.initHelper(r,e,'<span class="password-score"></span>',r.ui.viewports.score)},g.initUI=function(r,e){r.ui.showPopover?g.initPopover(r,e):(r.ui.showErrors&&g.initErrorList(r,e),r.ui.showVerdicts&&!r.ui.showVerdictsInsideProgressBar&&g.initVerdict(r,e)),r.ui.showProgressBar&&g.initProgressBar(r,e),r.ui.showScore&&g.initScore(r,e)},g.updateVerdict=function(r,e,o,s){e=g.getUIElements(r,e).$verdict;e.removeClass(r.ui.colorClasses.join(" ")),-1<o&&e.addClass(r.ui.colorClasses[o]),r.ui.showVerdictsInsideProgressBar&&e.css("white-space","nowrap"),e.html(s)},g.updateErrors=function(r,e,o){var e=g.getUIElements(r,e).$errors,s="";o||n.each(r.instances.errors,function(r,e){s+="<li>"+e+"</li>"}),e.html(s)},g.updateScore=function(r,e,o,s){r=g.getUIElements(r,e).$score,e="";s||(e=o.toFixed(2)),r.html(e)},g.updateFieldStatus=function(o,r,e,s){var t=r;o.ui.bootstrap2?t=r.parents(".control-group").first():o.ui.bootstrap3&&(t=r.parents(".form-group").first()),n.each(c,function(r,e){e=g.cssClassesForBS(o,e),t.removeClass(e)}),s||(e=c[Math.floor(e/2)],e=g.cssClassesForBS(o,e),t.addClass(e))},g.cssClassesForBS=function(r,e){return r.ui.bootstrap3?e="has-"+e:r.ui.bootstrap2||(e="border-"+(e="error"===e?"danger":e)),e},g.getVerdictAndCssClass=function(r,e){return void 0===e?["",0]:(e=e<=r.ui.scores[0]?0:e<r.ui.scores[1]?1:e<r.ui.scores[2]?2:e<r.ui.scores[3]?3:e<r.ui.scores[4]?4:5,[r.i18n.t(u[e]),e])},g.updateUI=function(r,e,o){var s,t=g.getVerdictAndCssClass(r,o),n=0===o?"":t[0];t=t[1],s=r.ui.useVerdictCssClass?t:-1,r.ui.showProgressBar&&g.showProgressBar(r,e,o,t,s,n),r.ui.showStatus&&g.updateFieldStatus(r,e,t,void 0===o),r.ui.showPopover?g.updatePopover(r,e,n,void 0===o):(r.ui.showVerdicts&&!r.ui.showVerdictsInsideProgressBar&&g.updateVerdict(r,e,s,n),r.ui.showErrors&&g.updateErrors(r,e,void 0===o)),r.ui.showScore&&g.updateScore(r,e,o,void 0===o)},d=s,g.percentage=function(r,e,o){e=Math.floor(100*e/o),o=r.ui.progressBarMinPercentage;return 100<(e=e<=o?o:e)?100:e},g.initProgressBar=function(r,e){var o=g.getContainer(r,e),s='<div class="progress ';r.ui.bootstrap2?s+=r.ui.progressBarExtraCssClasses+'"><div class="':s+=r.ui.progressExtraCssClasses+'"><div class="'+r.ui.progressBarExtraCssClasses+" progress-",s+='bar">',r.ui.showVerdictsInsideProgressBar&&(s+='<span class="password-verdict"></span>'),s+="</div></div>",r.ui.viewports.progress?o.find(r.ui.viewports.progress).append(s):d(s).insertAfter(e)},g.showProgressBar=function(r,e,o,s,t,n){o=void 0===o?r.ui.progressBarEmptyPercentage:g.percentage(r,o,r.ui.scores[4]);g.updateProgressBar(r,e,s,o),r.ui.showVerdictsInsideProgressBar&&g.updateVerdict(r,e,t,n)},g.updateProgressBar=function(o,r,e,s){var r=g.getUIElements(o,r).$progressbar,t=r.find(".progress-bar"),n="progress-";o.ui.bootstrap2&&(t=r.find(".bar"),n=""),d.each(o.ui.colorClasses,function(r,e){o.ui.bootstrap2||o.ui.bootstrap3?t.removeClass(n+"bar-"+e):t.removeClass("bg-"+e)}),o.ui.bootstrap2||o.ui.bootstrap3?t.addClass(n+"bar-"+o.ui.colorClasses[e]):t.addClass("bg-"+o.ui.colorClasses[e]),0<s?t.css("min-width",o.ui.progressBarMinWidth+"px"):t.css("min-width",""),t.css("width",s+"%")},g.initPopover=function(r,e){try{e.popover("destroy")}catch(r){e.popover("dispose")}e.popover({html:!0,placement:r.ui.popoverPlacement,trigger:"manual",content:" "})},g.updatePopover=function(r,e,o,s){var t=e.data("bs.popover"),n="",a=!0,i=!1;r.ui.showVerdicts&&!r.ui.showVerdictsInsideProgressBar&&0<o.length&&(n='<h5><span class="password-verdict">'+o+"</span></h5>",a=!1),r.ui.showErrors&&(0<r.instances.errors.length&&(a=!1),n+=r.ui.popoverError(r)),a||s?e.popover("hide"):(r.ui.bootstrap2?t=e.data("popover"):t||(t=bootstrap.Popover.getInstance(e[0]),i=!0),(i?$(t.tip).is(":visible"):t.$arrow&&0<t.$arrow.parents("body").length)?(i?$(t.tip).find(".popover-body"):e.find("+ .popover .popover-content")).html(n):(r.ui.bootstrap2||r.ui.bootstrap3?t.options.content=n:i?t._config.content=n:t.config.content=n,e.popover("show")))},{});p=s,m=function(r){var o,e,s=p(r.target),t=s.data("pwstrength-bootstrap"),n=s.val();void 0!==t&&(t.instances.errors=[],0===n.length?e=void 0:(e=t.common.zxcvbn?(o=[],p.each(t.common.userInputs.concat([t.common.usernameField]),function(r,e){e=p(e).val();e&&o.push(e)}),o=o.concat(t.common.zxcvbnTerms),e=zxcvbn(n,o).guesses,Math.log(e)*Math.LOG2E):i.executeRules(t,n),"function"==typeof t.common.onScore&&(e=t.common.onScore(t,n,e))),g.updateUI(t,s,e),s=(n=g.getVerdictAndCssClass(t,e))[1],n=n[0],t.common.debug&&console.log(e+" - "+n),"function"==typeof t.common.onKeyUp)&&t.common.onKeyUp(r,{score:e,verdictText:n,verdictLevel:s})},h=function(r){var e=p(r.target),o=e.val(),s=0,t=function(){e.val()!==o?m(r):s<3&&(s+=1,setTimeout(t,100))};setTimeout(t,100)},v.init=function(t){return this.each(function(r,e){var o=p.extend(!0,{},w),o=p.extend(!0,o,t),s=p(e);o.instances={},s.data("pwstrength-bootstrap",o),p.each(o.common.events,function(r,e){s.on(e,"paste"===e?h:m)}),g.initUI(o,s),s.trigger("keyup"),"function"==typeof o.common.onLoad&&o.common.onLoad()}),this},v.destroy=function(){return this.each(function(r,e){var e=p(e),o=e.data("pwstrength-bootstrap"),o=g.getUIElements(o,e);o.$progressbar.remove(),o.$verdict.remove(),o.$errors.remove(),e.removeData("pwstrength-bootstrap")}),this},v.forceUpdate=function(){return this.each(function(r,e){m({target:e})}),this},v.addRule=function(o,s,t,n){return this.each(function(r,e){e=p(e).data("pwstrength-bootstrap");e.rules.activated[o]=n,e.rules.scores[o]=t,e.rules.extra[o]=s}),this},l=function(o,s,t){this.each(function(r,e){p(e).data("pwstrength-bootstrap").rules[s][o]=t})},v.changeScore=function(r,e){return l.call(this,r,"scores",e),this},v.ruleActive=function(r,e){return l.call(this,r,"activated",e),this},v.ruleIsMet=function(t){var n=0;return"wordMinLength"===t?t="wordMinLengthStaticScore":"wordMaxLength"===t&&(t="wordMaxLengthStaticScore"),this.each(function(r,e){var o=p(e).data("pwstrength-bootstrap"),s=i.validation[t];"function"==typeof(s="function"!=typeof s?o.rules.extra[t]:s)&&(s=s(o,p(e).val(),1),!isNaN(parseFloat(s)))&&isFinite(s)&&(n+=s)}),n===this.length},p.fn.pwstrength=function(r){var e;return v[r]?e=v[r].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof r&&r?p.error("Method "+r+" does not exist on jQuery.pwstrength-bootstrap"):e=v.init.apply(this,arguments),e}})(jQuery);
//# sourceMappingURL=pwstrength-bootstrap.min.map