diff --git a/js/com/pwgen.lw.js b/js/com/pwgen.lw.js new file mode 100644 index 0000000..2d08d6d --- /dev/null +++ b/js/com/pwgen.lw.js @@ -0,0 +1,121 @@ +/** + ** ============================== + ** O O O OOOO + ** O O O O O O + ** O O O O O O + ** OOOO OOOO O OOO OOOO + ** O O O O O O O + ** O O O O O O O + ** OOOO OOOO O O OOOO + ** ============================== + ** Dr. Stefan Bosse http://www.bsslab.de + ** + ** COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED + ** BY THE AUTHOR(S). + ** THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED, + ** MODIFIED, OR OTHERWISE USED IN A CONTEXT + ** OUTSIDE OF THE SOFTWARE SYSTEM. + ** + ** $AUTHORS: Bermi Ferrer, Stefan Bosse + ** $INITIAL: (C) 2011-2015 Bermi Ferrer , 2016-2017 bLAB + ** $REVESIO: 1.1.4 + ** + ** $INFO: + * + * password-generator using seedable random generator (fast,LQ) + * Random generator seed is current system time in microseconds or options.seed value. + * + * options = {length,meorable,lowercase,uppercase,pattern,seed} + * + * $ENDINFO + */ + +var random = undefined; +/* Antti Sykäri's algorithm adapted from Wikipedia +** Returns a random generator function [0.0,1.0| with seed initialization +*/ +var seed = function(s) { + var m_w = s; + var m_z = 987654321; + var mask = 0xffffffff; + + return function() { + m_z = (36969 * (m_z & 65535) + (m_z >> 16)) & mask; + m_w = (18000 * (m_w & 65535) + (m_w >> 16)) & mask; + + var result = ((m_z << 16) + m_w) & mask; + result /= 4294967296; + + return result + 0.5; + } +} + +module.exports.generate = function (options) { + + + function pwgen (options) { + var localName, consonant, letter, vowel, pattern = options.pattern, + char = "", n, i, validChars = [], prefix=options.prefix; + letter = /[a-zA-Z]$/; + vowel = /[aeiouAEIOU]$/; + consonant = /[bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ]$/; + if (options.length == null) { + options.length = 10; + } + if (pattern == null) { + pattern = /\w/; + } + if (prefix == null) { + prefix = ''; + } + + // Non memorable passwords will pick characters from a pre-generated + // list of characters + if (!options.memorable) { + for (i = 33; 126 > i; i += 1) { + char = String.fromCharCode(i); + if (char.match(pattern)) { + validChars.push(char); + } + } + + if (!validChars.length) { + throw new Error("Could not find characters that match the " + + "password pattern " + pattern + ". Patterns must match individual " + + "characters, not the password as a whole."); + } + } + + + while (prefix.length < options.length) { + if (options.memorable) { + if (prefix.match(consonant)) { + pattern = vowel; + } else { + pattern = consonant; + } + n = rand(33, 126); + char = String.fromCharCode(n); + } else { + char = validChars[rand(0, validChars.length)]; + } + + if (options.lowercase) char = char.toLowerCase(); + else if (options.uppercase) char = char.toUpperCase(); + + if (char.match(pattern)) { + prefix = "" + prefix + char; + } + } + return prefix; + }; + + function rand(min, max) { + if (!random) { + random = seed(options.seed|((new Date().getTime())|0)); + } + return Math.floor((random() * (max-min)) + min); + } + + return pwgen(options); +};