Update Master Password Web version to support all algorithm versions and Tom's latest mpw-js.
This commit is contained in:
parent
b050cc4994
commit
ca3a8ee78c
4
.gitmodules
vendored
4
.gitmodules
vendored
@ -16,6 +16,6 @@
|
|||||||
[submodule "External/jrswizzle"]
|
[submodule "External/jrswizzle"]
|
||||||
path = External/jrswizzle
|
path = External/jrswizzle
|
||||||
url = git://github.com/jonmarimba/jrswizzle.git
|
url = git://github.com/jonmarimba/jrswizzle.git
|
||||||
[submodule "Site/mpw-js/js/mpw-js"]
|
[submodule "MasterPassword/Web/js/mpw-js"]
|
||||||
path = Site/mpw-js/js/mpw-js
|
path = MasterPassword/Web/js/mpw-js
|
||||||
url = https://github.com/tmthrgd/mpw-js.git
|
url = https://github.com/tmthrgd/mpw-js.git
|
||||||
|
1
MasterPassword/Web/.gitignore
vendored
Normal file
1
MasterPassword/Web/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
js/es5
|
@ -60,6 +60,9 @@ input:focus, select:focus {
|
|||||||
input.half, select.half {
|
input.half, select.half {
|
||||||
width: 33%;
|
width: 33%;
|
||||||
}
|
}
|
||||||
|
input.minimal, select.minimal {
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
input[type="submit"], input[type="image"] {
|
input[type="submit"], input[type="image"] {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border: none;
|
border: none;
|
Before Width: | Height: | Size: 423 B After Width: | Height: | Size: 423 B |
@ -22,6 +22,12 @@
|
|||||||
<input id="masterPassword" type="password" placeholder="Your Master Password" /><br>
|
<input id="masterPassword" type="password" placeholder="Your Master Password" /><br>
|
||||||
<input type="submit" value="⏎" /><br>
|
<input type="submit" value="⏎" /><br>
|
||||||
<input type="image" src="img/spinner.svg" />
|
<input type="image" src="img/spinner.svg" />
|
||||||
|
<select id="version" class="minimal">
|
||||||
|
<option value="0">V0</option>
|
||||||
|
<option value="1">V1</option>
|
||||||
|
<option value="2">V2</option>
|
||||||
|
<option value="3" selected>V3</option>
|
||||||
|
</select>
|
||||||
</p>
|
</p>
|
||||||
</form></section>
|
</form></section>
|
||||||
|
|
15
MasterPassword/Web/js/Makefile
Normal file
15
MasterPassword/Web/js/Makefile
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
build: mkdir-es5 es5/mpw-js/pbkdf2.js es5/mpw-js/scrypt.js es5/mpw-js/mpw.js es5/setImmediate-polyfill.js
|
||||||
|
|
||||||
|
mkdir-es5:
|
||||||
|
mkdir -p es5
|
||||||
|
mkdir -p es5/mpw-js
|
||||||
|
|
||||||
|
es5/%: $*
|
||||||
|
babel $* -o $@ --presets es2015 --source-maps
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf es5 2>/dev/null
|
||||||
|
|
||||||
|
update:
|
||||||
|
git submodule update --init --recursive
|
||||||
|
git submodule foreach git pull origin master
|
8
MasterPassword/Web/js/README.md
Normal file
8
MasterPassword/Web/js/README.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
ES5
|
||||||
|
===
|
||||||
|
|
||||||
|
If your browser does not support ECMAScript 6, you will need to run babel to compile an ES5-compatible version of the ES6 mpw-js code.
|
||||||
|
|
||||||
|
1. Install npm. On OS X, you can use `brew install npm`.
|
||||||
|
2. Install babel. With npm installed, you can use `npm -g install babel-cli babel-preset-es2015`
|
||||||
|
3. Build the ES5-translation of the ES6 code. From this directory, just run `make`.
|
@ -1,3 +1,13 @@
|
|||||||
|
// Test for required ES6 features
|
||||||
|
// Use an eval call to avoid a hard-fail on ES5 parsers.
|
||||||
|
var ES6 = false;
|
||||||
|
var esdir = "es5/";
|
||||||
|
try {
|
||||||
|
// Use ES6 code if the ES6 class, let, destructive assignment and rest arguments are supported.
|
||||||
|
eval("class $ES6 { constructor() { let b = true; this.b = b; } } var [ES6, esdir] = ((...args) => args)(new $ES6().b, '')");
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
|
||||||
// If crypto.subtle is not supported, try crypto.webkitSubtle instead.
|
// If crypto.subtle is not supported, try crypto.webkitSubtle instead.
|
||||||
if (window.crypto && !window.crypto.subtle && window.crypto.webkitSubtle)
|
if (window.crypto && !window.crypto.subtle && window.crypto.webkitSubtle)
|
||||||
window.crypto.subtle = window.crypto.webkitSubtle;
|
window.crypto.subtle = window.crypto.webkitSubtle;
|
||||||
@ -12,9 +22,8 @@ if (!window.crypto || !window.crypto.subtle) {
|
|||||||
document.write("<script src=https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/lib-typedarrays-min.js><\/script>");
|
document.write("<script src=https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/lib-typedarrays-min.js><\/script>");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Number.MAX_SAFE_INTEGER) {
|
if (!Number.MAX_SAFE_INTEGER)
|
||||||
Number.MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
|
Number.MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
|
||||||
}
|
|
||||||
|
|
||||||
// If Typed Arrays are not supported we include the polyfill
|
// If Typed Arrays are not supported we include the polyfill
|
||||||
// https://github.com/inexorabletash/polyfill
|
// https://github.com/inexorabletash/polyfill
|
||||||
@ -29,24 +38,11 @@ window.TextEncoder || document.write("<script src=js/encoding-polyfill.js><\/scr
|
|||||||
window.Promise || document.write("<script src=js/promise-polyfill.js><\/script>");
|
window.Promise || document.write("<script src=js/promise-polyfill.js><\/script>");
|
||||||
|
|
||||||
// If setImmediate is not implemented we include the polyfill
|
// If setImmediate is not implemented we include the polyfill
|
||||||
window.setImmediate || document.write("<script src=js/setImmediate-polyfill.js><\/script>");
|
window.setImmediate || document.write("<script src=js/" + esdir + "setImmediate-polyfill.js><\/script>");
|
||||||
|
|
||||||
// Test for required ES6 features
|
|
||||||
// Use an eval call to avoid a hard-fail on ES5 parsers.
|
|
||||||
var ES6 = false;
|
|
||||||
var esdir = "es5/";
|
|
||||||
try {
|
|
||||||
// Use ES6 code if the ES6 class, let, destructive assignment and rest arguments are supported.
|
|
||||||
eval("class $ES6 { constructor() { let b = true; this.b = b; } } var [ES6, esdir] = ((...args) => args)(new $ES6().b, '')");
|
|
||||||
} catch (e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// If ES6 is not supported we must include traceur-runtime.js
|
|
||||||
ES6 || document.write("<script src=js/mpw-js/traceur-runtime.js><\/script>");
|
|
||||||
|
|
||||||
// Include the scrypt implementation
|
// Include the scrypt implementation
|
||||||
document.write("<script src=lib/" + esdir + "pbkdf2.js><\/script>");
|
document.write("<script src=js/" + esdir + "mpw-js/pbkdf2.js><\/script>");
|
||||||
document.write("<script src=js/mpw-js/" + esdir + "scrypt.js?1><\/script>");
|
document.write("<script src=js/" + esdir + "mpw-js/scrypt.js?1><\/script>");
|
||||||
|
|
||||||
// Include the MPW class
|
// Include the MPW class
|
||||||
document.write("<script src=js/mpw-js/" + esdir + "mpw.js?1><\/script>");
|
document.write("<script src=js/" + esdir + "mpw-js/mpw.js?1><\/script>");
|
@ -1,72 +1,79 @@
|
|||||||
var mpw;
|
var mpw, error;
|
||||||
|
|
||||||
function updateMPW() {
|
function updateMPW() {
|
||||||
update('identity', 'identity');
|
mpw = null;
|
||||||
mpw = new MPW( $('#userName')[0].value, $('#masterPassword')[0].value );
|
startWork();
|
||||||
updateActive();
|
mpw = new MPW( $('#userName')[0].value, $('#masterPassword')[0].value, $('#version')[0].valueAsNumber );
|
||||||
|
mpw.key.then(
|
||||||
|
function() {
|
||||||
|
doneWork();
|
||||||
|
},
|
||||||
|
function(reason) {
|
||||||
|
error = reason;
|
||||||
|
mpw = null;
|
||||||
|
doneWork();
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
function updateActive() {
|
function startWork() {
|
||||||
if (!mpw)
|
update(true);
|
||||||
update('identity');
|
|
||||||
|
|
||||||
else
|
|
||||||
mpw.key.then(
|
|
||||||
function() {
|
|
||||||
update('site');
|
|
||||||
},
|
|
||||||
function(reason) {
|
|
||||||
update('identity', null, reason);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
function update(active, working, error) {
|
function doneWork() {
|
||||||
// Working
|
update(false);
|
||||||
if (working == 'identity') {
|
}
|
||||||
$('#identity').addClass('working').find('input, select').attr('disabled', 'disabled');
|
function update(working) {
|
||||||
}
|
var screen = mpw? 'site': 'identity';
|
||||||
else {
|
|
||||||
$('#userName')[0].value = $('#masterPassword')[0].value = '';
|
|
||||||
$('#identity').removeClass('working').find('input, select').removeAttr('disabled');
|
|
||||||
}
|
|
||||||
if (working == 'site')
|
|
||||||
$('#site').addClass('working');
|
|
||||||
else
|
|
||||||
$('#site').removeClass('working');
|
|
||||||
|
|
||||||
// Active
|
// Screen Name
|
||||||
if (active == 'identity') {
|
if (screen == 'identity') {
|
||||||
$('#identity').addClass('active');
|
$('#identity').addClass('active');
|
||||||
$('#site').removeClass('active');
|
|
||||||
|
|
||||||
if (!working)
|
if (!working)
|
||||||
$('#userName').focus();
|
$('#userName').focus();
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
$('#identity').removeClass('active');
|
$('#identity').removeClass('active');
|
||||||
|
|
||||||
|
if (screen == 'site') {
|
||||||
$('#site').addClass('active');
|
$('#site').addClass('active');
|
||||||
$('#siteName').focus();
|
|
||||||
|
|
||||||
if (!working)
|
if (!working)
|
||||||
$('#siteName').focus();
|
$('#siteName').focus();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
$('#site').removeClass('active');
|
||||||
|
|
||||||
|
// Working
|
||||||
|
if (working && screen == 'identity')
|
||||||
|
$('#identity').addClass('working').find('input, select').attr('disabled', 'disabled');
|
||||||
|
else {
|
||||||
|
$('#userName')[0].value = $('#masterPassword')[0].value = '';
|
||||||
|
$('#identity').removeClass('working').find('input, select').removeAttr('disabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (working && screen == 'site')
|
||||||
|
$('#site').addClass('working');
|
||||||
|
else
|
||||||
|
$('#site').removeClass('working');
|
||||||
|
|
||||||
// Error
|
// Error
|
||||||
$('#error').text(error);
|
$('#error').text(error);
|
||||||
}
|
}
|
||||||
function updateSite() {
|
function updateSite() {
|
||||||
update('site', 'site');
|
if (!mpw) {
|
||||||
|
doneWork();
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (!mpw)
|
startWork();
|
||||||
updateActive();
|
mpw.generatePassword( $('#siteName')[0].value, $('#siteCounter')[0].valueAsNumber, $('#siteType')[0].value )
|
||||||
|
.then( function (sitePassword) {
|
||||||
else
|
$('#sitePassword').text(sitePassword);
|
||||||
mpw.generatePassword( $('#siteName')[0].value, $('#siteCounter')[0].valueAsNumber, $('#siteType')[0].value )
|
doneWork();
|
||||||
.then( function (sitePassword) {
|
}, function (reason) {
|
||||||
$('#sitePassword').text(sitePassword);
|
error = reason;
|
||||||
update('site');
|
doneWork();
|
||||||
}, function (reason) {
|
});
|
||||||
update('site', null, reason);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
function selectText(element) {
|
function selectText(element) {
|
||||||
var doc = document, range, selection;
|
var doc = document, range, selection;
|
||||||
@ -95,11 +102,11 @@ $(function() {
|
|||||||
});
|
});
|
||||||
$('#logout').on('click', function() {
|
$('#logout').on('click', function() {
|
||||||
mpw = null;
|
mpw = null;
|
||||||
updateActive();
|
doneWork();
|
||||||
});
|
});
|
||||||
$('#sitePassword').on('click', function() {
|
$('#sitePassword').on('click', function() {
|
||||||
selectText(this);
|
selectText(this);
|
||||||
});
|
});
|
||||||
|
|
||||||
updateActive();
|
doneWork();
|
||||||
});
|
});
|
@ -208,4 +208,4 @@ window.setImmediate || !function (global) {
|
|||||||
// the arguments
|
// the arguments
|
||||||
arg || (attachTo.setImmediate = (func, ...params) => global.setTimeout(() => func(...params), 0));
|
arg || (attachTo.setImmediate = (func, ...params) => global.setTimeout(() => func(...params), 0));
|
||||||
}, 0, true);
|
}, 0, true);
|
||||||
}(this || window);
|
}(this || window);
|
Loading…
Reference in New Issue
Block a user