mirror of
https://github.com/dmuth/diceware.git
synced 2024-11-24 17:56:35 -05:00
Added in random-number-csprng, which required using Bluebird and Promisfying a *whole* bunch of code.
This is the fix to address Bug #7.
This commit is contained in:
parent
b7f1adb8a2
commit
f19dca83dd
2 changed files with 100 additions and 32 deletions
|
@ -303,10 +303,7 @@ Feel free to reach out to me if you have any comments, suggestions, or bug repor
|
||||||
<!-- Include all compiled plugins (below), or include individual files as needed -->
|
<!-- Include all compiled plugins (below), or include individual files as needed -->
|
||||||
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
|
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
|
||||||
|
|
||||||
<script src="./main.js"></script>
|
<script src="./dist/bundle.js"></script>
|
||||||
<script>
|
|
||||||
Diceware.go();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
111
main.js
111
main.js
|
@ -2,6 +2,14 @@
|
||||||
* Our main Javascript file.
|
* Our main Javascript file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
var Promise = require("bluebird");
|
||||||
|
var randomNumber = require("random-number-csprng");
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// This "put everything in an object" approach is a holdover from
|
||||||
|
// before I started using webpack. Yay legacy code.
|
||||||
|
//
|
||||||
var Diceware = {};
|
var Diceware = {};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -16,6 +24,7 @@ Diceware.num_dice_per_roll = 5;
|
||||||
*/
|
*/
|
||||||
Diceware.i_can_has_good_crypto = function() {
|
Diceware.i_can_has_good_crypto = function() {
|
||||||
|
|
||||||
|
//return(false); // Debugging
|
||||||
if (window.crypto && window.crypto.getRandomValues) {
|
if (window.crypto && window.crypto.getRandomValues) {
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
@ -26,18 +35,28 @@ Diceware.i_can_has_good_crypto = function() {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a random integer between 1 and max.
|
* Return a random integer between 0 and max, inclusive.
|
||||||
*/
|
*/
|
||||||
Diceware.getRandomValue = function(max) {
|
Diceware.getRandomValue = function(max) {
|
||||||
|
return new Promise(function(resolve, reject) {
|
||||||
|
|
||||||
if (max <= 0){
|
if (max <= 0){
|
||||||
return(NaN);
|
resolve(NaN);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Diceware.i_can_has_good_crypto()) {
|
if (Diceware.i_can_has_good_crypto()) {
|
||||||
var a = new Uint32Array(1);
|
|
||||||
window.crypto.getRandomValues(a);
|
Promise.try(function() {
|
||||||
retval = (a[0] % max);
|
return randomNumber(0, max);
|
||||||
|
|
||||||
|
}).then(function(number) {
|
||||||
|
retval = number;
|
||||||
|
resolve(retval);
|
||||||
|
|
||||||
|
}).catch({code: "RandomGenerationError"}, function(err) {
|
||||||
|
console.log("randomNumber(): Something went wrong!");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
|
@ -45,12 +64,11 @@ Diceware.getRandomValue = function(max) {
|
||||||
// been warned.
|
// been warned.
|
||||||
//
|
//
|
||||||
retval = Math.floor(Math.random() * max);
|
retval = Math.floor(Math.random() * max);
|
||||||
|
resolve(retval);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}); // End of Promise()
|
||||||
return(retval);
|
|
||||||
|
|
||||||
} // End of getRandomValue()
|
} // End of getRandomValue()
|
||||||
|
|
||||||
|
|
||||||
|
@ -170,22 +188,28 @@ Diceware.getNumValuesFromNumDice = function(num_dice) {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
Diceware.rollDice = function(num_dice) {
|
Diceware.rollDice = function(num_dice) {
|
||||||
|
return new Promise(function(resolve, reject) {
|
||||||
|
|
||||||
var retval = {};
|
var retval = {};
|
||||||
|
|
||||||
var max = Diceware.getNumValuesFromNumDice(num_dice);
|
var max = Diceware.getNumValuesFromNumDice(num_dice);
|
||||||
|
|
||||||
var random = Diceware.getRandomValue(max);
|
Promise.try(function() {
|
||||||
|
|
||||||
|
return(Diceware.getRandomValue(max - 1));
|
||||||
|
|
||||||
|
}).then(function(random) {
|
||||||
|
|
||||||
var base6 = Diceware.getBase6(random, num_dice);
|
var base6 = Diceware.getBase6(random, num_dice);
|
||||||
|
|
||||||
var dice = Diceware.convertBase6ToDice(base6, num_dice);
|
var dice = Diceware.convertBase6ToDice(base6, num_dice);
|
||||||
|
|
||||||
retval.value = random;
|
retval.value = random;
|
||||||
retval.roll = dice;
|
retval.roll = dice;
|
||||||
|
|
||||||
return(retval);
|
resolve(retval);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}); // End of Promise()
|
||||||
} // End of rollDice()
|
} // End of rollDice()
|
||||||
|
|
||||||
|
|
||||||
|
@ -342,10 +366,9 @@ Diceware.is_mobile = function() {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Our handler for what to do when the "Roll Dice" button is clicked".
|
* Do some preliminary work, such as clearing out results and scrolling.
|
||||||
* It generates the passphrase and updates the HTML.
|
|
||||||
*/
|
*/
|
||||||
Diceware.rollDiceHandler = function(e) {
|
Diceware.rollDiceHanlderPre = function() {
|
||||||
|
|
||||||
//
|
//
|
||||||
// Clear out more space when mobile
|
// Clear out more space when mobile
|
||||||
|
@ -373,23 +396,65 @@ Diceware.rollDiceHandler = function(e) {
|
||||||
//
|
//
|
||||||
jQuery(".results").empty();
|
jQuery(".results").empty();
|
||||||
|
|
||||||
|
} // End of rollDiceHandlerPre()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Our handler for what to do when the "Roll Dice" button is clicked".
|
||||||
|
* It generates the passphrase and updates the HTML.
|
||||||
|
*/
|
||||||
|
Diceware.rollDiceHandler = function(e) {
|
||||||
|
|
||||||
|
Diceware.rollDiceHanlderPre();
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Make our dice rolls
|
// Make our dice rolls
|
||||||
//
|
//
|
||||||
var num_dice = jQuery(".dice_button.active").html();
|
var num_dice = jQuery(".dice_button.active").html();
|
||||||
var num_passwords = Number(Math.pow(6, (Diceware.num_dice_per_roll * num_dice)));
|
var num_passwords = Number(Math.pow(6, (Diceware.num_dice_per_roll * num_dice)));
|
||||||
var passphrase = new Array();
|
var passphrase = new Array();
|
||||||
|
|
||||||
var rolls = new Array();
|
var rolls = new Array();
|
||||||
for (var i=0; i<num_dice; i++) {
|
|
||||||
|
//
|
||||||
|
// Create an array of empty items, since this is the only way I can
|
||||||
|
// figure out to do a loop in Bluebird at this time. Ugh.
|
||||||
|
//
|
||||||
|
var items = [];
|
||||||
|
for (i=0; i<num_dice; i++) { items.push(null); }
|
||||||
|
|
||||||
|
Promise.map(items, function(element) {
|
||||||
|
//
|
||||||
|
// Do our dice rolls all at once.
|
||||||
|
//
|
||||||
|
return(Diceware.rollDice(Diceware.num_dice_per_roll));
|
||||||
|
|
||||||
|
}).then(function(data) {
|
||||||
|
//
|
||||||
|
// Now that we have the results, get the word for each roll,
|
||||||
|
// save the roll, and push the word onto the passphrase.
|
||||||
|
//
|
||||||
|
data.forEach(function(row) {
|
||||||
|
|
||||||
var roll = {};
|
var roll = {};
|
||||||
roll.dice = Diceware.rollDice(Diceware.num_dice_per_roll);
|
roll.dice = row;
|
||||||
roll.word = Diceware.get_word(wordlist, roll.dice.value);
|
roll.word = Diceware.get_word(wordlist, roll.dice.value);
|
||||||
rolls.push(roll);
|
rolls.push(roll);
|
||||||
passphrase.push(roll.word);
|
passphrase.push(roll.word);
|
||||||
|
|
||||||
}
|
});
|
||||||
|
|
||||||
|
Diceware.rollDiceHanlderPost(rolls, passphrase, num_passwords);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
} // End of rollDiceHandler()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Our post work, of displaying the results of our dice rolls.
|
||||||
|
*/
|
||||||
|
Diceware.rollDiceHanlderPost = function(rolls, passphrase, num_passwords) {
|
||||||
|
|
||||||
//
|
//
|
||||||
// Populate our results by cloning the hidden base rows which
|
// Populate our results by cloning the hidden base rows which
|
||||||
|
@ -457,7 +522,7 @@ Diceware.rollDiceHandler = function(e) {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
} // End of rollDiceHandler()
|
} // End of rollDiceHandlerPost()
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -585,3 +650,9 @@ Diceware.go = function() {
|
||||||
} // End of go()
|
} // End of go()
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Run go() automatically, as that is the webpack way.
|
||||||
|
//
|
||||||
|
Diceware.go();
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue