keeweb/app/scripts/util/password-generator.js

40 lines
1.4 KiB
JavaScript
Raw Normal View History

2015-10-19 23:24:32 +02:00
'use strict';
var kdbxweb = require('kdbxweb');
var PasswordGenerator = {
charRanges: {
upper: 'ABCDEFGHJKLMNPQRSTUVWXYZ',
lower: 'abcdefghijkmnpqrstuvwxyz',
2015-10-20 19:17:15 +02:00
digits: '123456789',
2015-10-19 23:24:32 +02:00
special: '!@#$%^&*_+-=,./?;:`"~\'\\',
2015-10-20 19:17:15 +02:00
brackets: '(){}[]<>',
2015-10-19 23:24:32 +02:00
high: '¡¢£¤¥¦§©ª«¬®¯°±²³´µ¶¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ',
2015-10-20 19:17:15 +02:00
ambiguous: 'O0oIl'
2015-10-19 23:24:32 +02:00
},
generate: function(opts) {
if (!opts || typeof opts.length !== 'number' || opts.length < 0) {
return '';
}
var ranges = Object.keys(this.charRanges)
.filter(function(r) { return opts[r]; })
.map(function(r) { return this.charRanges[r]; }, this);
if (!ranges.length) {
return '';
}
2015-10-20 19:17:15 +02:00
var randomBytes = kdbxweb.Random.getBytes(opts.length);
var chars = [];
for (var i = 0; i < opts.length; i++) {
var range = ranges[i % ranges.length];
var rand = Math.round(Math.random() * 1000) + randomBytes[i];
chars.push(range[rand % range.length]);
2015-10-19 23:24:32 +02:00
}
2015-10-20 19:17:15 +02:00
return _.shuffle(chars).join('');
},
present: function(length) {
return new Array(length + 1).join('•');
2015-10-19 23:24:32 +02:00
}
};
module.exports = PasswordGenerator;