Update Master Password Web version to support all algorithm versions and Tom's latest mpw-js.
This commit is contained in:
		
							
								
								
									
										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);
 | 
				
			||||||
		Reference in New Issue
	
	Block a user