Skip to content

Instantly share code, notes, and snippets.

@gotoashishgupta
Last active February 1, 2018 05:27
Show Gist options
  • Save gotoashishgupta/e5cb43af0701eeddd756f51d12dbdd57 to your computer and use it in GitHub Desktop.
Save gotoashishgupta/e5cb43af0701eeddd756f51d12dbdd57 to your computer and use it in GitHub Desktop.
function _checkPasswordStrength (password = '') {
password = password.trim();
const _passwordLength = password.length;
// Password Strength Additions
const _passwordLengthTest = _passwordLength >= 8 ? _passwordLength : 0;
const _numberOfCharactersTest = _passwordLength * 4;
let _strength = 0;
let _penalty = 0;
let _uppercaseLettersTest = 0;
let _lowercaseLettersTest = 0;
let _numbersTest = 0;
let _symbolsTest = 0;
let _middleNumbersOrSymbolsTest = 0;
let _requirementsTest = 0;
let _shortPasswordTest = 0;
let _lettersOnlyTest = 0;
let _numbersOnlyTest = 0;
let _repeatCharactersTest = 0;
let _consecutiveUppercaseLettersTest = 0;
let _consecutiveLowercaseLettersTest = 0;
let _consecutiveNumbersTest = 0;
_uppercaseLettersTest = password.match(/[A-Z]/g) || 0;
if(_uppercaseLettersTest !== 0) {
_uppercaseLettersTest = (
_passwordLength - _uppercaseLettersTest.length
) * 2;
}
_lowercaseLettersTest = password.match(/[a-z]/g) || 0;
if(_lowercaseLettersTest !== 0) {
_lowercaseLettersTest = (
_passwordLength - _lowercaseLettersTest.length
) * 2;
}
_numbersTest = password.match(/[0-9]/g) || 0;
if(_numbersTest !== 0) {
_numbersTest = _numbersTest.length * 4;
}
_symbolsTest = password.match(/[!-\/.:-@\[-`{-~]/g) || 0;
if(_symbolsTest !== 0) {
_symbolsTest = _symbolsTest.length * 6;
}
_middleNumbersOrSymbolsTest = password.match(
/(\w\d[!-\/.:-@\[-`{-~]|[!-\/.:-@\[-`{-~]\w\d|\d[!-\/.:-@\[-`{-~]\w)/g
) || 0;
if(_middleNumbersOrSymbolsTest !== 0) {
_middleNumbersOrSymbolsTest = _middleNumbersOrSymbolsTest.length * 2;
}
// check Passed Password Strength Additions test for _requirementsTest
const _flags = [_numberOfCharactersTest, _uppercaseLettersTest,
_lowercaseLettersTest, _numbersTest, _symbolsTest,
_middleNumbersOrSymbolsTest];
const _passedMatches = $.grep(_flags, function (el) {
return el === true;
}).length;
_requirementsTest = _passedMatches * 2;
// Strength Bonus
_strength = _passwordLengthTest + _numberOfCharactersTest +
_uppercaseLettersTest + _lowercaseLettersTest + _numbersTest +
_symbolsTest + _middleNumbersOrSymbolsTest + _requirementsTest;
// Password Strength Deductions
_shortPasswordTest = _passwordLength < 8 ?
Math.min(_strength, 10) : 0;
_lettersOnlyTest = password.match(/^\w+$/g) ?
_passwordLength : 0;
_numbersOnlyTest = password.match(/^\d+$/g) ? _passwordLength : 0;
_repeatCharactersTest = password.split('').join('').match(/(.)\1+/g) || 0;
if(_repeatCharactersTest !== 0) {
_repeatCharactersTest = _repeatCharactersTest.length * 10;
}
_consecutiveUppercaseLettersTest = password.match(/[A-Z]{2,}/g) || 0;
if(_consecutiveUppercaseLettersTest !== 0) {
_consecutiveUppercaseLettersTest =
_consecutiveUppercaseLettersTest.length * 2;
}
_consecutiveLowercaseLettersTest = password.match(/[a-z]{2,}/g) || 0;
if(_consecutiveLowercaseLettersTest !== 0) {
_consecutiveLowercaseLettersTest =
_consecutiveLowercaseLettersTest.length * 2;
}
_consecutiveNumbersTest = password.match(/\d{2,}/g) || 0;
if(_consecutiveNumbersTest !== 0) {
_consecutiveNumbersTest =
_consecutiveNumbersTest.length * 2;
}
// Penalty
_penalty = _shortPasswordTest + _lettersOnlyTest + _numbersOnlyTest +
_repeatCharactersTest + _consecutiveUppercaseLettersTest +
_consecutiveLowercaseLettersTest + _consecutiveNumbersTest;
// Adjusted Strength
_strength -= _penalty;
_strength = _strength < 0 ? 0 : _strength > 100 ? 100 : _strength;
return _strength;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment