UNPKG

hipstapas.core

Version:

Easy and unobtrusive generation of secure strings, uuids, passphrases (using EFF wordlists) and random numbers.

86 lines (72 loc) 3.45 kB
const { randomNumber } = require('../helpers/random'); const { validate, evaluateValidation } = require('../helpers/validator'); const { wordlistLargeMap } = require('../helpers/wordlistLarge'); const { generationResult, emptyObject } = require('../helpers/utils'); function generateWordlist(rolls) { // generate words the EFF way: https://www.eff.org/de/dice let words = []; let previousRolls = new Map(); var i = 0; while (i < rolls) { var roll1 = randomNumber(1, 6); var roll2 = randomNumber(1, 6); var roll3 = randomNumber(1, 6); var roll4 = randomNumber(1, 6); var roll5 = randomNumber(1, 6); // Just to be sure there are no duplicates, // check that every new roll does not match previous ones! let roll = `${roll1}${roll2}${roll3}${roll4}${roll5}`; if (!previousRolls.has(roll)) { previousRolls.set(roll, roll); words.push(wordlistLargeMap.get(roll)); i++; } } return words.join(' '); } function generateWordlists(resultsCount, rolls) { let wordlists = [] for (let count = 0; count < resultsCount; count++) { wordlists.push(generateWordlist(rolls)); } return wordlists; } function validateAndGenerateWordlists(options = emptyObject()) { const resultsCountParameter = options.resultsCount; const wordsParameter = options.words; const minWordsCount = 1; const maxWordsCount = 50; const resultsCount = 1; const words = 6; // generate 6 words by (EFF) default var validateWordsCount = validate(wordsParameter, { rules: [ { "check": function (v) { return Number.isInteger(v); }, "message": `Only numbers between ${minWordsCount} and ${maxWordsCount} are allowed as values for the query parameter 'words'. Example: https://hipstapas.dev/api/wordlist?words=10` }, { "check": function (v) { return v >= minWordsCount && v <= maxWordsCount; }, "message": `The value of the query parameter 'words' must be between ${minWordsCount} and ${maxWordsCount}. Example: https://hipstapas.dev/api/wordlist?words=10` } ] }, words); var validateResultsCount = validate(resultsCountParameter, { rules: [ { "check": function (v) { return Number.isInteger(v); }, "message": "Only numbers between 1 and 100 are allowed as values for the query parameter 'resultsCount'. Example: https://hipstapas.dev/api/wordlist?resultsCount=10" }, { "check": function (v) { return v >= 1 && v <= 100; }, "message": "The value of the query parameter 'resultsCount' must be between 1 and 100. Example: https://hipstapas.dev/api/wordlist?resultsCount=10" } ] }, resultsCount); const validateResults = evaluateValidation([ validateResultsCount, validateWordsCount ]); var results = []; if (validateResults.success) { results = generateWordlists(validateResultsCount.value, validateWordsCount.value); } return generationResult(validateResults, results); } module.exports = { validateAndGenerateWordlists }