From cdda78f4119af78746881a871abf4428cf057980 Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Fri, 14 Aug 2015 13:27:14 +0100 Subject: [PATCH 01/18] added password.html template --- password.html | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 password.html diff --git a/password.html b/password.html new file mode 100644 index 00000000..a41cec17 --- /dev/null +++ b/password.html @@ -0,0 +1,27 @@ + + + + + + Generate Password + + + + + +
+

+ + privacytools.io + +

+

+

Secure Password Generator

+
+ + -- 2.47.2 From 0cac76a14a71fe8b415cf2a90581685ca6808b90 Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Fri, 14 Aug 2015 14:27:22 +0100 Subject: [PATCH 02/18] added password generation form --- password.html | 53 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/password.html b/password.html index a41cec17..6d4ddbe2 100644 --- a/password.html +++ b/password.html @@ -1,6 +1,5 @@ - Generate Password @@ -10,9 +9,13 @@ margin: 30px; max-width: 600px; } + .form-container { + background-color: #F8F8F8; + border: 1px #F0F0F0 solid; + padding: 10px; + } -

@@ -20,8 +23,52 @@ privacytools.io

-

Secure Password Generator

+
+
+ +
+ + + + +
+
+
+ + +
+
+ + + + +
+ + Advanced Options + +
+ + + -- 2.47.2 From 1ee8ae89b10e7eb2c95a9c7145581d5051953e42 Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Fri, 14 Aug 2015 16:35:54 +0100 Subject: [PATCH 03/18] added simple client-side password generator --- js/passwordGenerator.js | 29 +++++++++++++++++++++++++++++ password.html | 38 ++++++++++++++++++++++++++++---------- 2 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 js/passwordGenerator.js diff --git a/js/passwordGenerator.js b/js/passwordGenerator.js new file mode 100644 index 00000000..da85dcf0 --- /dev/null +++ b/js/passwordGenerator.js @@ -0,0 +1,29 @@ +var passwordGenerator = (function() { + return { + generatePassword: function (options) { + var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXTZ"; + var lowercase = "abcdefghiklmnopqrstuvwxyz"; + var numbers = "0123456789"; + var punct = ".,-/#!$%^&*;:{}=-_`~()]"; + var candidates = ''; + if (options.includeUppercaseChars) { + candidates += uppercase; + } + if (options.includeLowercaseChars) { + candidates += lowercase; + } + if (options.includeNumbers) { + candidates += numbers; + } + if (options.includePunctuationChars) { + candidates += punct; + } + var result = ""; + for (var i = 0; i < options.passwordLength; i++) { + var randomNum = Math.floor(Math.random() * candidates.length); + result += candidates.substring(randomNum, randomNum + 1); + } + return result; + } + }; +})(); diff --git a/password.html b/password.html index 6d4ddbe2..757a8043 100644 --- a/password.html +++ b/password.html @@ -30,31 +30,31 @@
- +
- +
@@ -65,10 +65,28 @@ + -- 2.47.2 From b9f69e4d3a717fb63bf50dbbc765c1196fe6d3e3 Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Fri, 14 Aug 2015 16:39:06 +0100 Subject: [PATCH 04/18] show error if no options are selected --- password.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/password.html b/password.html index 757a8043..2e67b6b5 100644 --- a/password.html +++ b/password.html @@ -80,6 +80,10 @@ }; function outputGeneratedPassword() { var password = passwordGenerator.generatePassword(getOptions()); + if (password === '') { + alert("Whops. You unselected all the options. I don't know what characters you want. Click on the button entitled \"Advanced Options\" and enable some options and thent try again. Nice one"); + return; + } $("#password-input").val(password); } $(function() { -- 2.47.2 From 97fa39d5ead308eb6ec2f9b9f3ce36b8d567ebd8 Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Fri, 14 Aug 2015 16:40:10 +0100 Subject: [PATCH 05/18] corrected typo --- password.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/password.html b/password.html index 2e67b6b5..58ba3e3e 100644 --- a/password.html +++ b/password.html @@ -81,7 +81,7 @@ function outputGeneratedPassword() { var password = passwordGenerator.generatePassword(getOptions()); if (password === '') { - alert("Whops. You unselected all the options. I don't know what characters you want. Click on the button entitled \"Advanced Options\" and enable some options and thent try again. Nice one"); + alert("Whops. You unselected all the options. I don't know what characters you want. Click on the button entitled \"Advanced Options\" and enable some options then try again. Nice one"); return; } $("#password-input").val(password); -- 2.47.2 From b38eadd4ed759758544946cefeb2206b42d1874b Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Fri, 14 Aug 2015 17:48:30 +0100 Subject: [PATCH 06/18] added more length options --- password.html | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/password.html b/password.html index 58ba3e3e..a8f050b1 100644 --- a/password.html +++ b/password.html @@ -37,7 +37,101 @@
-- 2.47.2 From e13220c2fb63daedf5746ad3bf95d044a87a48aa Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Fri, 14 Aug 2015 17:54:07 +0100 Subject: [PATCH 07/18] modularized random number generation logic --- js/passwordGenerator.js | 56 +++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/js/passwordGenerator.js b/js/passwordGenerator.js index da85dcf0..e25e611f 100644 --- a/js/passwordGenerator.js +++ b/js/passwordGenerator.js @@ -1,29 +1,35 @@ var passwordGenerator = (function() { - return { - generatePassword: function (options) { - var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXTZ"; - var lowercase = "abcdefghiklmnopqrstuvwxyz"; - var numbers = "0123456789"; - var punct = ".,-/#!$%^&*;:{}=-_`~()]"; - var candidates = ''; - if (options.includeUppercaseChars) { - candidates += uppercase; - } - if (options.includeLowercaseChars) { - candidates += lowercase; - } - if (options.includeNumbers) { - candidates += numbers; - } - if (options.includePunctuationChars) { - candidates += punct; - } - var result = ""; - for (var i = 0; i < options.passwordLength; i++) { - var randomNum = Math.floor(Math.random() * candidates.length); - result += candidates.substring(randomNum, randomNum + 1); - } - return result; + var generateRandomNum = function (max) { + return Math.floor(Math.random() * max); + }; + + var generatePassword = function (options) { + var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXTZ"; + var lowercase = "abcdefghiklmnopqrstuvwxyz"; + var numbers = "0123456789"; + var punct = ".,-/#!$%^&*;:{}=-_`~()]"; + var candidates = ''; + if (options.includeUppercaseChars) { + candidates += uppercase; } + if (options.includeLowercaseChars) { + candidates += lowercase; + } + if (options.includeNumbers) { + candidates += numbers; + } + if (options.includePunctuationChars) { + candidates += punct; + } + var result = ""; + for (var i = 0; i < options.passwordLength; i++) { + var randomNum = generateRandomNum(candidates.length); + result += candidates.substring(randomNum, randomNum + 1); + } + return result; + }; + + return { + generatePassword: generatePassword }; })(); -- 2.47.2 From 78634330de8474ff0aea030a5efd33df78cfe331 Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Fri, 14 Aug 2015 18:10:56 +0100 Subject: [PATCH 08/18] use secure random number generator --- js/passwordGenerator.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/js/passwordGenerator.js b/js/passwordGenerator.js index e25e611f..6615d06f 100644 --- a/js/passwordGenerator.js +++ b/js/passwordGenerator.js @@ -1,6 +1,12 @@ var passwordGenerator = (function() { var generateRandomNum = function (max) { - return Math.floor(Math.random() * max); + var array = new Uint8Array(1); + window.crypto.getRandomValues(array); + var range = max + 1; + var max_range = 256; + if (array[0] >= Math.floor(max_range / range) * range) + return generateRandomNum(max); + return (array[0] % range); }; var generatePassword = function (options) { -- 2.47.2 From 91fb2972b426f5d048d621ba473e30a82b2a8507 Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Fri, 14 Aug 2015 18:12:27 +0100 Subject: [PATCH 09/18] added guard clause --- js/passwordGenerator.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/js/passwordGenerator.js b/js/passwordGenerator.js index 6615d06f..13e7d41b 100644 --- a/js/passwordGenerator.js +++ b/js/passwordGenerator.js @@ -1,5 +1,8 @@ var passwordGenerator = (function() { var generateRandomNum = function (max) { + if (!window.crypto || !window.crypto.getRandomValues) { + throw new Error('Unsupported browser.'); + } var array = new Uint8Array(1); window.crypto.getRandomValues(array); var range = max + 1; -- 2.47.2 From 1968f71abbc39b50e8eb4225ca08af3e5b81023d Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Sat, 15 Aug 2015 08:52:06 +0100 Subject: [PATCH 10/18] added support for IE 11 --- js/passwordGenerator.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/js/passwordGenerator.js b/js/passwordGenerator.js index 13e7d41b..d5258812 100644 --- a/js/passwordGenerator.js +++ b/js/passwordGenerator.js @@ -1,10 +1,11 @@ var passwordGenerator = (function() { var generateRandomNum = function (max) { - if (!window.crypto || !window.crypto.getRandomValues) { + var crypto = window.crypto || window.msCrypto; + if (!crypto) { throw new Error('Unsupported browser.'); } var array = new Uint8Array(1); - window.crypto.getRandomValues(array); + crypto.getRandomValues(array); var range = max + 1; var max_range = 256; if (array[0] >= Math.floor(max_range / range) * range) -- 2.47.2 From c43189a28813d1177a44d32b749d6a2408eb6479 Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Sat, 15 Aug 2015 09:05:49 +0100 Subject: [PATCH 11/18] added instructions --- password.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/password.html b/password.html index a8f050b1..919173c4 100644 --- a/password.html +++ b/password.html @@ -24,6 +24,9 @@

Secure Password Generator

+
-- 2.47.2 From 627b9c49666b61a6327fb8d174ff3d7c48b3b2c4 Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Sat, 15 Aug 2015 09:07:56 +0100 Subject: [PATCH 12/18] added source code link --- password.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/password.html b/password.html index 919173c4..6acb96e6 100644 --- a/password.html +++ b/password.html @@ -13,6 +13,7 @@ background-color: #F8F8F8; border: 1px #F0F0F0 solid; padding: 10px; + margin-bottom: 20px; } @@ -159,6 +160,7 @@ Advanced Options
+

Source Code: GitHub

-- 2.47.2 From 793665eeb2e22f4bad3ece57a8cdae2ed9bafbeb Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Sat, 15 Aug 2015 10:05:44 +0100 Subject: [PATCH 13/18] added noscript warning --- password.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/password.html b/password.html index 6acb96e6..2895e9fe 100644 --- a/password.html +++ b/password.html @@ -25,6 +25,9 @@

Secure Password Generator

+ -- 2.47.2 From b46a16ff92f6ce919c4f4ea57124b31901af128b Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Sat, 15 Aug 2015 10:15:19 +0100 Subject: [PATCH 14/18] added unsupported browser warning --- password.html | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/password.html b/password.html index 2895e9fe..b0260a7c 100644 --- a/password.html +++ b/password.html @@ -15,6 +15,9 @@ padding: 10px; margin-bottom: 20px; } + .unsupported-browser-alert { + display: none; + } @@ -28,6 +31,11 @@ +
+

+ Hold on. It looks like you are using an unsuported browser (probably Internet Explorer...) Unfortunately, this tool will not work until you upgrade your browser. Sorry for any inconvenience caused. +

+
@@ -181,7 +189,13 @@ } }; function outputGeneratedPassword() { - var password = passwordGenerator.generatePassword(getOptions()); + var password; + try { + password = passwordGenerator.generatePassword(getOptions()); + } + catch (error) { + return $("#unsupported-browser-alert").show(); + } if (password === '') { alert("Whops. You unselected all the options. I don't know what characters you want. Click on the button entitled \"Advanced Options\" and enable some options then try again. Nice one"); return; -- 2.47.2 From 97f89b7ba20d4701d036368e813489059ecf621a Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Sun, 16 Aug 2015 09:02:17 +0100 Subject: [PATCH 15/18] bundled passwordGenerator.js and password.html --- js/passwordGenerator.js | 45 ----------------- password.html | 106 +++++++++++++++++++++++++++++++--------- 2 files changed, 83 insertions(+), 68 deletions(-) delete mode 100644 js/passwordGenerator.js diff --git a/js/passwordGenerator.js b/js/passwordGenerator.js deleted file mode 100644 index d5258812..00000000 --- a/js/passwordGenerator.js +++ /dev/null @@ -1,45 +0,0 @@ -var passwordGenerator = (function() { - var generateRandomNum = function (max) { - var crypto = window.crypto || window.msCrypto; - if (!crypto) { - throw new Error('Unsupported browser.'); - } - var array = new Uint8Array(1); - crypto.getRandomValues(array); - var range = max + 1; - var max_range = 256; - if (array[0] >= Math.floor(max_range / range) * range) - return generateRandomNum(max); - return (array[0] % range); - }; - - var generatePassword = function (options) { - var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXTZ"; - var lowercase = "abcdefghiklmnopqrstuvwxyz"; - var numbers = "0123456789"; - var punct = ".,-/#!$%^&*;:{}=-_`~()]"; - var candidates = ''; - if (options.includeUppercaseChars) { - candidates += uppercase; - } - if (options.includeLowercaseChars) { - candidates += lowercase; - } - if (options.includeNumbers) { - candidates += numbers; - } - if (options.includePunctuationChars) { - candidates += punct; - } - var result = ""; - for (var i = 0; i < options.passwordLength; i++) { - var randomNum = generateRandomNum(candidates.length); - result += candidates.substring(randomNum, randomNum + 1); - } - return result; - }; - - return { - generatePassword: generatePassword - }; -})(); diff --git a/password.html b/password.html index b0260a7c..e24dda53 100644 --- a/password.html +++ b/password.html @@ -1,5 +1,6 @@ + Generate Password @@ -9,17 +10,20 @@ margin: 30px; max-width: 600px; } + .form-container { background-color: #F8F8F8; border: 1px #F0F0F0 solid; padding: 10px; margin-bottom: 20px; } + .unsupported-browser-alert { display: none; } +

@@ -29,15 +33,20 @@

Secure Password Generator

- Hold on. It looks like you are using an unsuported browser (probably Internet Explorer...) Unfortunately, this tool will not work until you upgrade your browser. Sorry for any inconvenience caused. + Hold on. It looks like you are using an unsuported browser (probably Internet + Explorer...) Unfortunately, this tool will not work until you upgrade your + browser. Sorry for any inconvenience caused.

@@ -45,7 +54,10 @@
- +
@@ -146,67 +158,115 @@ - +
- Advanced Options + + Advanced Options

Source Code: GitHub

- + -- 2.47.2 From 28803ae0b996d1c65b247169cee058e0d68f8cec Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Sun, 16 Aug 2015 09:02:43 +0100 Subject: [PATCH 16/18] readability tweak --- password.html | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/password.html b/password.html index e24dda53..ff53d36e 100644 --- a/password.html +++ b/password.html @@ -218,34 +218,28 @@ if (options.includePunctuationChars) { candidates += punct; } - var result = ""; + var password = ""; for (var i = 0; i < options.passwordLength; i++) { var randomNum = generateRandomNum(candidates.length); - result += candidates.substring(randomNum, randomNum + 1); + password += candidates.substring(randomNum, randomNum + 1); } - return result; + return password; }; - return { generatePassword: generatePassword }; })(); (function() { 'use strict'; - function getOptions() { return { passwordLength: $("#password-length").val(), - includeUppercaseChars: $("#include-uppercase-chars-checkbox").is( - ":checked"), - includeLowercaseChars: $("#include-lowercase-chars-checkbox").is( - ":checked"), + includeUppercaseChars: $("#include-uppercase-chars-checkbox").is(":checked"), + includeLowercaseChars: $("#include-lowercase-chars-checkbox").is(":checked"), includeNumbers: $("#include-digits-checkbox").is(":checked"), - includePunctuationChars: $("#include-special-chars-checkbox").is( - ":checked"), + includePunctuationChars: $("#include-special-chars-checkbox").is(":checked"), } }; - function outputGeneratedPassword() { var password; try { @@ -254,9 +248,7 @@ return $("#unsupported-browser-alert").show(); } if (password === '') { - alert( - "Whops. You unselected all the options. I don't know what characters you want. Click on the button entitled \"Advanced Options\" and enable some options then try again. Nice one" - ); + alert("Whops. You unselected all the options. I don't know what characters you want. Click on the button entitled \"Advanced Options\" and enable some options then try again. Nice one"); return; } $("#password-input").val(password); -- 2.47.2 From 08a41d6623162999c914a684466564ab80ea3f0b Mon Sep 17 00:00:00 2001 From: Alex Booker Date: Sun, 16 Aug 2015 09:06:16 +0100 Subject: [PATCH 17/18] uses consistent terminology --- password.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/password.html b/password.html index ff53d36e..4073f104 100644 --- a/password.html +++ b/password.html @@ -169,7 +169,7 @@ Lower-case