cas-service-ja/overlays/org.apereo.cas.cas-server-w.../WEB-INF/classes/static/js/passwordMeter.js

143 lines
5.7 KiB
JavaScript
Raw Normal View History

2024-10-20 17:44:40 +08:00
/* global jqueryReady, policyPattern, zxcvbn, passwordStrengthI18n */
/*eslint-disable no-unused-vars*/
function jqueryReady() {
var strength = passwordStrengthI18n;
$.fn.zxcvbnProgressBar = function (options) {
//init settings
var settings = $.extend({
allProgressBarClasses: 'progress-bar-danger progress-bar-warning progress-bar-success progress-bar-striped active',
progressBarClass0: 'progress-bar-danger progress-bar-striped active',
progressBarClass1: 'progress-bar-danger progress-bar-striped active',
progressBarClass2: 'progress-bar-warning progress-bar-striped active',
progressBarClass3: 'progress-bar-success',
progressBarClass4: 'progress-bar-success'
}, options);
return this.each(function () {
settings.progressBar = this;
//init progress bar display
UpdateProgressBar();
//Update progress bar on each keypress of password input
$(settings.passwordInput).keyup(function (event) {
UpdateProgressBar();
});
});
function UpdateProgressBar() {
var progressBar = settings.progressBar;
var password = $('#password').val();
if (password) {
var result = zxcvbn(password, settings.userInputs);
//result.score: 0, 1, 2, 3 or 4 - if crack time is less than 10**2, 10**4, 10**6, 10**8, Infinity.
var scorePercentage = (result.score + 1) * 20;
$(progressBar).css('width', scorePercentage + '%');
if (result.score == 0) {
//weak
$(progressBar).removeClass(settings.allProgressBarClasses).addClass(settings.progressBarClass0);
$(progressBar).html(strength[0]);
}
else if (result.score == 1) {
//normal
$(progressBar).removeClass(settings.allProgressBarClasses).addClass(settings.progressBarClass1);
$(progressBar).html(strength[1]);
}
else if (result.score == 2) {
//medium
$(progressBar).removeClass(settings.allProgressBarClasses).addClass(settings.progressBarClass2);
$(progressBar).html(strength[2]);
}
else if (result.score == 3) {
//strong
$(progressBar).removeClass(settings.allProgressBarClasses).addClass(settings.progressBarClass3);
$(progressBar).html(strength[3]);
}
else if (result.score == 4) {
//very strong
$(progressBar).removeClass(settings.allProgressBarClasses).addClass(settings.progressBarClass4);
$(progressBar).html(strength[4]);
}
}
else {
$(progressBar).css('width', '0%');
$(progressBar).removeClass(settings.allProgressBarClasses).addClass(settings.progressBarClass0);
$(progressBar).html('');
}
}
};
var policyPatternRegex = new RegExp(policyPattern);
var password = document.getElementById('password');
var confirmed = document.getElementById('confirmedPassword');
password.addEventListener('input', validate);
confirmed.addEventListener('input', validate);
var alertSettings = {
allAlertClasses: 'fa-times-circle fa-exclamation-circle fa-info-circle fa-check-circle',
alertClassDanger: 'fa-times-circle',
alertClassWarning: 'fa-exclamation-circle',
alertClassInfo: 'fa-info-circle',
alertClassSuccess: 'fa-check-circle'
};
function validate() {
var val = password.value;
var cnf = confirmed.value;
$('#password-policy-violation-msg').hide();
$('#password-confirm-mismatch-msg').hide();
var passwordPolicyViolated = val === '' || !policyPatternRegex.test(val);
var passwordMismatch = val !== '' && val !== cnf;
var disableSubmit = passwordPolicyViolated || passwordMismatch;
$('#submit').prop('disabled', disableSubmit);
var result = zxcvbn(val);
$('#strengthProgressBar').zxcvbnProgressBar({ passwordInput: '#password' });
// Check strength, update the text indicator
if (val !== '') {
$('#password-strength-warning').text(result.feedback.warning);
$('#password-strength-suggestions').text(result.feedback.suggestions);
var clz = alertSettings.alertClassDanger;
switch (result.score) {
case 0:
case 1:
clz = alertSettings.alertClassDanger;
break;
case 2:
clz = alertSettings.alertClassWarning;
break;
case 3:
clz = alertSettings.alertClassInfo;
break;
case 4:
case 5:
default:
clz = alertSettings.alertClassSuccess;
break;
}
$('#password-strength-icon').removeClass(alertSettings.allAlertClasses).addClass(clz);
} else {
$('#password-strength-icon').removeClass(alertSettings.allAlertClasses);
$('#password-strength-warning').text('');
$('#password-strength-suggestions').text('');
}
// Check for mismatch
if (passwordMismatch && cnf !== '') {
$('#password-confirm-mismatch-msg').show();
}
// Check password policy
if (passwordPolicyViolated) {
$('#password-policy-violation-msg').show();
return;
}
}
}