password-generation
Version:
Password generation and complexity checking without headache
140 lines (139 loc) • 3.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var utils_1 = require("./utils");
var defaultsConfig = {
length: [7, 10],
specials: 1,
nums: 2,
uppers: 2,
lowers: 3
};
var splitChars = function (str) {
var chars = str.split('');
var total = chars.length;
var uppers = 0;
var lowers = 0;
var nums = 0;
var specials = 0;
var sym;
/* jshint -W084 */
while (sym = chars.pop()) {
/* jshint +W084 */
if (utils_1.charsLowerCase.indexOf(sym) > -1) {
lowers++;
}
else if (utils_1.charsUpperCase.indexOf(sym) > -1) {
uppers++;
}
else if (!isNaN(Number(sym))) {
nums++;
}
else
specials++;
}
return {
uppers: uppers,
lowers: lowers,
nums: nums,
specials: specials,
total: total
};
};
var bonusScore = function (chars) {
var bonus = 0;
if (chars.lowers > 0)
bonus += 2;
if (chars.nums > 0)
bonus += 2;
if (chars.uppers > 0)
bonus += 3;
if (chars.specials > 0)
bonus += 5;
bonus += (chars.specials > 3 ? 3 : chars.specials);
bonus += (chars.nums > 2 ? 2 : chars.nums);
bonus += (chars.uppers > 2 ? 2 : chars.uppers);
return bonus;
};
var score = function (password) {
var chars = splitChars(password);
var bonus = bonusScore(chars);
return chars.total + bonus;
};
exports.rank = function (password) {
var _score = score(password);
if (_score <= 11)
return 0;
else if (_score < 15)
return 1;
else if (_score < 19)
return 2;
else if (_score < 23)
return 3;
else if (_score < 28)
return 4;
else
return 5;
};
var getOptionNum = function (target, defaults, rest) {
if (typeof (defaults) == 'undefined')
defaults = 0;
var val = (typeof (target) == 'undefined') ? defaults : target;
if (val > rest)
val = rest;
return val;
};
var getRest = function (rest, quant) {
var val = rest - quant;
return (val < 0) ? 0 : val;
};
function generate(length, options) {
var tmp = [];
var nums;
var specials;
var uppers;
var lowers;
// Default values for arguments
if (typeof (length) == 'undefined')
length = defaultsConfig.length;
if (length instanceof Array)
length = utils_1.random(length[1], length[0]);
var op = options || {
specials: specials,
nums: nums,
uppers: uppers,
lowers: lowers
};
// Assign quantity of different types
specials = getOptionNum(op.specials, defaultsConfig.specials, length);
length = getRest(length, specials);
nums = getOptionNum(op.nums, defaultsConfig.nums, length);
length = getRest(length, nums);
uppers = getOptionNum(op.uppers, defaultsConfig.uppers, length);
length = getRest(length, uppers);
lowers = getOptionNum(op.lowers, defaultsConfig.lowers, length);
length = getRest(length, lowers);
var key = "";
if (uppers !== 0) {
key = "uppers";
}
if (lowers !== 0) {
key = "lowers";
}
if (specials !== 0) {
key = "specials";
}
// Make an array of symbols
while (specials--)
tmp.push(utils_1.special());
while (nums--)
tmp.push(utils_1.random(9).toString());
while (uppers--)
tmp.push(utils_1.upperChar());
while (lowers--)
tmp.push(utils_1.lowerChar());
while (length--)
tmp.push(utils_1.anyChar(key));
// Shuffle the array and make a string
return utils_1.shuffle(tmp).join('');
}
exports.default = generate;