diff --git a/frontend/src/download.js b/frontend/src/download.js index d59691c7..52e71f91 100644 --- a/frontend/src/download.js +++ b/frontend/src/download.js @@ -4,7 +4,6 @@ const $ = require('jquery'); const Raven = window.Raven; - $(document).ready(function() { $('#download-progress').hide(); $('#send-file').click(() => { @@ -63,7 +62,7 @@ $(document).ready(function() { document.body.appendChild(a); a.click(); }) - .catch(err => { + .catch(err => { Raven.captureException(err); return Promise.reject(err); }); diff --git a/frontend/src/fileReceiver.js b/frontend/src/fileReceiver.js index 0b969dbc..d73fae3c 100644 --- a/frontend/src/fileReceiver.js +++ b/frontend/src/fileReceiver.js @@ -64,26 +64,26 @@ class FileReceiver extends EventEmitter { ['encrypt', 'decrypt'] ) ]) - .then(([fdata, key]) => { - const salt = this.salt; - return Promise.all([ - window.crypto.subtle.decrypt( - { - name: 'AES-CBC', - iv: salt - }, - key, - fdata.data - ), - new Promise((resolve, reject) => { - resolve(fdata.fname); - }) - ]); - }) - .catch(err => { - Raven.captureException(err); - return Promise.reject(err); - }); + .then(([fdata, key]) => { + const salt = this.salt; + return Promise.all([ + window.crypto.subtle.decrypt( + { + name: 'AES-CBC', + iv: salt + }, + key, + fdata.data + ), + new Promise((resolve, reject) => { + resolve(fdata.fname); + }) + ]); + }) + .catch(err => { + Raven.captureException(err); + return Promise.reject(err); + }); } } diff --git a/frontend/src/fileSender.js b/frontend/src/fileSender.js index af285f86..c443443a 100644 --- a/frontend/src/fileSender.js +++ b/frontend/src/fileSender.js @@ -66,10 +66,6 @@ class FileSender extends EventEmitter { window.crypto.subtle.exportKey('jwk', secretKey) ]); }) - .catch(err => { - Raven.captureException(err) - return Promise.reject(err); - }) .then(([encrypted, keydata]) => { return new Promise((resolve, reject) => { const file = this.file; @@ -106,8 +102,8 @@ class FileSender extends EventEmitter { xhr.send(fd); }); }) - .catch(err => { - Raven.captureException(err) + .catch(err => { + Raven.captureException(err); return Promise.reject(err); }); } diff --git a/frontend/src/upload.js b/frontend/src/upload.js index 984787f4..6d902b0d 100644 --- a/frontend/src/upload.js +++ b/frontend/src/upload.js @@ -2,8 +2,6 @@ const FileSender = require('./fileSender'); const { notify } = require('./utils'); const $ = require('jquery'); -const Raven = window.Raven; - $(document).ready(function() { // reset copy button const $copyBtn = $('#copy-btn'); @@ -11,10 +9,15 @@ $(document).ready(function() { $copyBtn.html('Copy'); $('#page-one').show(); - $('#file-list').hide(); + $('#file-list').show(); $('#upload-progress').hide(); $('#share-link').hide(); + for (let i = 0; i < localStorage.length; i++) { + const id = localStorage.key(i); + populateFileList(localStorage.getItem(id)); + } + // copy link to clipboard $copyBtn.click(() => { const aux = document.createElement('input'); @@ -52,7 +55,52 @@ $(document).ready(function() { file = event.target.files[0]; } - const $fileList = $('#uploaded-files'); + const fileSender = new FileSender(file); + fileSender.on('progress', percentComplete => { + $('#page-one').hide(); + $('#file-list').hide(); + $('#upload-progress').show(); + $('#upload-filename').innerHTML += file.name; + // update progress bar + document + .querySelector('#progress-bar') + .style.setProperty('--progress', percentComplete + '%'); + $('#progress-text').html(`${percentComplete}%`); + }); + fileSender.upload().then(info => { + const url = info.url.trim() + `#${info.secretKey}`.trim(); + $('#link').attr('value', url); + const fileData = { + name: file.name, + fileId: info.fileId, + url: info.url, + secretKey: info.secretKey, + deleteToken: info.deleteToken + }; + localStorage.setItem(info.fileId, JSON.stringify(fileData)); + + $('#page-one').hide(); + $('#file-list').hide(); + $('#upload-progress').hide(); + $('#share-link').show(); + + populateFileList(JSON.stringify(fileData)); + notify('Your upload has finished.'); + }); + }; + + window.allowDrop = function(ev) { + ev.preventDefault(); + }; + + //update file table with current files in localStorage + function populateFileList(file) { + try { + file = JSON.parse(file); + } catch (e) { + return; + } + const row = document.createElement('tr'); const name = document.createElement('td'); const link = document.createElement('td'); @@ -69,6 +117,7 @@ $(document).ready(function() { // create delete button btn.innerHTML = 'x'; btn.classList.add('delete-btn'); + link.innerHTML = file.url.trim() + `#${file.secretKey}`.trim(); // create popup popupDiv.classList.add('popup'); @@ -76,6 +125,14 @@ $(document).ready(function() { 'Delete Nevermind' ); + // delete file + $popupText.find('.del-file').click(e => { + FileSender.delete(file.fileId, file.deleteToken).then(() => { + $(e.target).parents('tr').remove(); + localStorage.removeItem(file.fileId); + }); + }); + // add data cells to table row row.appendChild(name); row.appendChild(link); @@ -85,64 +142,21 @@ $(document).ready(function() { del.appendChild(popupDiv); row.appendChild(del); - const fileSender = new FileSender(file); - fileSender.on('progress', percentComplete => { - $('#page-one').hide(); - $('#file-list').hide(); - $('#upload-progress').show(); - $('#upload-filename').innerHTML += file.name; - // update progress bar - document - .querySelector('#progress-bar') - .style.setProperty('--progress', percentComplete + '%'); - $('#progress-text').html(`${percentComplete}%`); - if (percentComplete === 100) { - notify('Your upload has finished.'); - } + // show popup + del.addEventListener('click', toggleShow); + // hide popup + $popupText.find('.nvm').click(function(e) { + e.stopPropagation(); + toggleShow(); }); - fileSender.upload().then(info => { - const url = info.url.trim() + `#${info.secretKey}`.trim(); - $('#link').attr('value', url); - link.innerHTML = url; - localStorage.setItem(info.fileId, info.deleteToken); - - // delete file - $popupText.find('.del-file').click(e => { - FileSender.delete( - info.fileId, - localStorage.getItem(info.fileId) - ).then(() => { - $(e.target).parents('tr').remove(); - localStorage.removeItem(info.fileId); - }) - .catch(err => { - Raven.captureException(err); - return Promise.reject(err); - }); - }); - - // show popup - del.addEventListener('click', toggleShow); - // hide popup - $popupText.find('.nvm').click(toggleShow); - - $fileList.append(row); //add row to table - $('#page-one').hide(); - $('#file-list').hide(); - $('#upload-progress').hide(); - $('#share-link').show(); - }) - .catch(err => { - Raven.captureException(err); - return Promise.reject(err); + $popupText.click(function(e) { + e.stopPropagation(); }); + $('tbody').append(row); //add row to table + function toggleShow() { $popupText.toggleClass('show'); } - }; - - window.allowDrop = function(ev) { - ev.preventDefault(); - }; + } }); diff --git a/package-lock.json b/package-lock.json index 3ab4be91..e456c480 100644 --- a/package-lock.json +++ b/package-lock.json @@ -198,9 +198,9 @@ "dev": true }, "aws-sdk": { - "version": "2.76.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.76.0.tgz", - "integrity": "sha1-LDe/BON6tKJrX/fHWD1ZYDTHYwk=" + "version": "2.77.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.77.0.tgz", + "integrity": "sha1-gJCQu4dNj0//ysUxZilYdjjnhlw=" }, "babel-code-frame": { "version": "6.22.0", diff --git a/server/config.js b/server/config.js index c49681b8..efe47a40 100644 --- a/server/config.js +++ b/server/config.js @@ -24,7 +24,8 @@ const conf = convict({ }, sentry_id: { format: String, - default: 'https://cdf9a4f43a584f759586af8ceb2194f2@sentry.prod.mozaws.net/238', + default: + 'https://cdf9a4f43a584f759586af8ceb2194f2@sentry.prod.mozaws.net/238', env: 'P2P_SENTRY_CLIENT' }, sentry_dsn: { diff --git a/server/portal_server.js b/server/portal_server.js index 9dc2cf01..7a4b4af9 100644 --- a/server/portal_server.js +++ b/server/portal_server.js @@ -45,9 +45,12 @@ app.get('/', (req, res) => { app.get('/exists/:id', (req, res) => { const id = req.params.id; - storage.exists(id).then(() => { - res.sendStatus(200); - }).catch(err => res.sendStatus(404)); + storage + .exists(id) + .then(() => { + res.sendStatus(200); + }) + .catch(err => res.sendStatus(404)); }); app.get('/download/:id', (req, res) => { diff --git a/test/local.storage.test.js b/test/local.storage.test.js index d7d33f1b..6dcdd6f2 100644 --- a/test/local.storage.test.js +++ b/test/local.storage.test.js @@ -44,16 +44,18 @@ const storage = proxyquire('../server/storage', { describe('Testing Exists from local filesystem', function() { it('Exists returns true when file exists', function() { exists.callsArgWith(1, null, 1); - return storage.exists('test') - .then(() => assert(1)) - .catch(err => assert.fail()) + return storage + .exists('test') + .then(() => assert(1)) + .catch(err => assert.fail()); }); it('Exists returns false when file does not exist', function() { exists.callsArgWith(1, null, 0); - return storage.exists('test') - .then(() => assert.fail()) - .catch(err => assert(1)) + return storage + .exists('test') + .then(() => assert.fail()) + .catch(err => assert(1)); }); }); diff --git a/views/index.handlebars b/views/index.handlebars index ed765aed..4ef0788b 100644 --- a/views/index.handlebars +++ b/views/index.handlebars @@ -38,12 +38,19 @@
- - - - - - + + + + + + + + + + + + +
FileCopy URLExpires inDelete
FileCopy URLExpires inDelete