From e36f685bd210170cc5f19d4ae859e3c43d25251f Mon Sep 17 00:00:00 2001 From: Danny Coates Date: Thu, 3 Aug 2017 10:04:09 -0700 Subject: [PATCH] throw key errors before download begins --- frontend/src/fileReceiver.js | 78 +++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/frontend/src/fileReceiver.js b/frontend/src/fileReceiver.js index 209a9ecd..ebbe5cc8 100644 --- a/frontend/src/fileReceiver.js +++ b/frontend/src/fileReceiver.js @@ -7,42 +7,8 @@ class FileReceiver extends EventEmitter { } download() { - return Promise.all([ - new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - - xhr.onprogress = event => { - if (event.lengthComputable && event.target.status !== 404) { - this.emit('progress', [event.loaded, event.total]); - } - }; - - xhr.onload = function(event) { - if (xhr.status === 404) { - reject(new Error('notfound')); - return; - } - - const blob = new Blob([this.response]); - const fileReader = new FileReader(); - fileReader.onload = function() { - const meta = JSON.parse(xhr.getResponseHeader('X-File-Metadata')); - resolve({ - data: this.result, - aad: meta.aad, - filename: meta.filename, - iv: meta.id - }); - }; - - fileReader.readAsArrayBuffer(blob); - }; - - xhr.open('get', '/assets' + location.pathname.slice(0, -1), true); - xhr.responseType = 'blob'; - xhr.send(); - }), - window.crypto.subtle.importKey( + return window.crypto.subtle + .importKey( 'jwk', { kty: 'oct', @@ -56,7 +22,45 @@ class FileReceiver extends EventEmitter { true, ['encrypt', 'decrypt'] ) - ]) + .then(key => { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + + xhr.onprogress = event => { + if (event.lengthComputable && event.target.status !== 404) { + this.emit('progress', [event.loaded, event.total]); + } + }; + + xhr.onload = function(event) { + if (xhr.status === 404) { + reject(new Error('notfound')); + return; + } + + const blob = new Blob([this.response]); + const fileReader = new FileReader(); + fileReader.onload = function() { + const meta = JSON.parse(xhr.getResponseHeader('X-File-Metadata')); + resolve([ + { + data: this.result, + aad: meta.aad, + filename: meta.filename, + iv: meta.id + }, + key + ]); + }; + + fileReader.readAsArrayBuffer(blob); + }; + + xhr.open('get', '/assets' + location.pathname.slice(0, -1), true); + xhr.responseType = 'blob'; + xhr.send(); + }); + }) .then(([fdata, key]) => { this.emit('decrypting', true); return Promise.all([