diff --git a/.stylelintrc b/.stylelintrc index 3c593e83..c0c673c7 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -1,6 +1,6 @@ extends: stylelint-config-standard rules: - color-hex-case: upper + color-hex-case: lower declaration-colon-newline-after: null selector-list-comma-newline-after: null diff --git a/frontend/src/common.js b/frontend/src/common.js index 82d7e35b..5fa712a3 100644 --- a/frontend/src/common.js +++ b/frontend/src/common.js @@ -7,4 +7,4 @@ window.analytics = new testPilotGA({ an: 'Firefox Send', ds: 'web', tid: window.trackerId -}) +}); diff --git a/frontend/src/download.js b/frontend/src/download.js index 033335a6..21db9ccb 100644 --- a/frontend/src/download.js +++ b/frontend/src/download.js @@ -18,12 +18,10 @@ $(document).ready(function() { target.preventDefault(); sendEvent('recipient', 'restarted', { cd2: 'completed' - }) - .then(() => { + }).then(() => { location.href = target.currentTarget.href; }); - }) - + }); $('.legal-links a, .social-links a, #dl-firefox').click(function(target) { target.preventDefault(); @@ -31,15 +29,14 @@ $(document).ready(function() { // record exited event by recipient sendEvent('recipient', 'exited', { cd3: metric - }) - .then(() => { + }).then(() => { location.href = target.currentTarget.href; }); - }) + }); $('#expired-send-new').click(function() { storage.referrer = 'errored-download'; - }) + }); const filename = $('#dl-filename').html(); const bytelength = Number($('#dl-bytelength').text()); @@ -60,9 +57,7 @@ $(document).ready(function() { const fileReceiver = new FileReceiver(); const unexpiredFiles = storage.numFiles; - fileReceiver.on('progress', progress => { - window.onunload = function() { storage.referrer = 'cancelled-download'; // record download-stopped (cancelled by tab close or reload) @@ -72,8 +67,8 @@ $(document).ready(function() { cm6: unexpiredFiles, cm7: storage.totalDownloads, cd2: 'cancelled' - }) - } + }); + }; $('#download-page-one').attr('hidden', true); $('#download-progress').removeAttr('hidden'); @@ -81,15 +76,21 @@ $(document).ready(function() { // update progress bar $('#dl-progress').circleProgress('value', percent); $('.percent-number').html(`${Math.floor(percent * 100)}`); - $('.progress-text').text(`${filename} (${bytes(progress[0], {decimalPlaces: 1, fixedDecimals: true})} of ${bytes(progress[1], {decimalPlaces: 1})})`); + $('.progress-text').text( + `${filename} (${bytes(progress[0], { + decimalPlaces: 1, + fixedDecimals: true + })} of ${bytes(progress[1], { decimalPlaces: 1 })})` + ); //on complete if (percent === 1) { fileReceiver.removeAllListeners('progress'); - document.l10n.formatValues('downloadNotification', 'downloadFinish') - .then(translated => { - notify(translated[0]); - $('.title').html(translated[1]); - }); + document.l10n + .formatValues('downloadNotification', 'downloadFinish') + .then(translated => { + notify(translated[0]); + $('.title').html(translated[1]); + }); window.onunload = null; } }); @@ -138,10 +139,9 @@ $(document).ready(function() { cd6: err }); - document.l10n.formatValue('expiredPageHeader') - .then(translated => { - $('.title').text(translated); - }); + document.l10n.formatValue('expiredPageHeader').then(translated => { + $('.title').text(translated); + }); $('#download-btn').attr('hidden', true); $('#expired-img').removeAttr('hidden'); console.log('The file has expired, or has already been deleted.'); diff --git a/frontend/src/fileReceiver.js b/frontend/src/fileReceiver.js index 155a8dd9..ad1611df 100644 --- a/frontend/src/fileReceiver.js +++ b/frontend/src/fileReceiver.js @@ -58,41 +58,46 @@ class FileReceiver extends EventEmitter { true, ['encrypt', 'decrypt'] ) - ]).then(([fdata, key]) => { - this.emit('decrypting', true); - return Promise.all([ - window.crypto.subtle.decrypt( - { - name: 'AES-GCM', - iv: hexToArray(fdata.iv), - additionalData: hexToArray(fdata.aad) - }, - key, - fdata.data - ).then(decrypted => { - this.emit('decrypting', false); - return Promise.resolve(decrypted) - }), - fdata.filename, - hexToArray(fdata.aad) - ]); - }).then(([decrypted, fname, proposedHash]) => { - this.emit('hashing', true); - return window.crypto.subtle.digest('SHA-256', decrypted).then(calculatedHash => { - this.emit('hashing', false); - const integrity = new Uint8Array(calculatedHash).toString() === proposedHash.toString(); - if (!integrity) { - this.emit('unsafe', true) - return Promise.reject(); - } else { - this.emit('safe', true); - return Promise.all([ - decrypted, - decodeURIComponent(fname) - ]); - } + ]) + .then(([fdata, key]) => { + this.emit('decrypting', true); + return Promise.all([ + window.crypto.subtle + .decrypt( + { + name: 'AES-GCM', + iv: hexToArray(fdata.iv), + additionalData: hexToArray(fdata.aad) + }, + key, + fdata.data + ) + .then(decrypted => { + this.emit('decrypting', false); + return Promise.resolve(decrypted); + }), + fdata.filename, + hexToArray(fdata.aad) + ]); }) - }) + .then(([decrypted, fname, proposedHash]) => { + this.emit('hashing', true); + return window.crypto.subtle + .digest('SHA-256', decrypted) + .then(calculatedHash => { + this.emit('hashing', false); + const integrity = + new Uint8Array(calculatedHash).toString() === + proposedHash.toString(); + if (!integrity) { + this.emit('unsafe', true); + return Promise.reject(); + } else { + this.emit('safe', true); + return Promise.all([decrypted, decodeURIComponent(fname)]); + } + }); + }); } } diff --git a/frontend/src/storage.js b/frontend/src/storage.js index c7a9aa85..c95d93a6 100644 --- a/frontend/src/storage.js +++ b/frontend/src/storage.js @@ -2,9 +2,9 @@ const { isFile } = require('./utils'); class Storage { constructor(engine) { - this.engine = engine + this.engine = engine; } - + get totalDownloads() { return Number(this.engine.getItem('totalDownloads')); } @@ -23,7 +23,7 @@ class Storage { set referrer(str) { this.engine.setItem('referrer', str); } - + get files() { const fs = []; for (let i = 0; i < this.engine.length; i++) { @@ -49,7 +49,7 @@ class Storage { getFileById(id) { return this.engine.getItem(id); } - + has(property) { return this.engine.hasOwnProperty(property); } @@ -57,10 +57,10 @@ class Storage { remove(property) { this.engine.removeItem(property); } - + addFile(id, file) { this.engine.setItem(id, JSON.stringify(file)); } } -module.exports = Storage; \ No newline at end of file +module.exports = Storage; diff --git a/frontend/src/upload.js b/frontend/src/upload.js index b4f535f9..e836d297 100644 --- a/frontend/src/upload.js +++ b/frontend/src/upload.js @@ -1,7 +1,13 @@ /* global MAXFILESIZE */ require('./common'); const FileSender = require('./fileSender'); -const { notify, gcmCompliant, findMetric, sendEvent, ONE_DAY_IN_MS } = require('./utils'); +const { + notify, + gcmCompliant, + findMetric, + sendEvent, + ONE_DAY_IN_MS +} = require('./utils'); const bytes = require('bytes'); const Storage = require('./storage'); const storage = new Storage(localStorage); @@ -19,15 +25,13 @@ if (storage.has('referrer')) { } $(document).ready(function() { - - gcmCompliant() - .catch(err => { - $('#page-one').attr('hidden', true); - $('#unsupported-browser').removeAttr('hidden'); - // record unsupported event - sendEvent('sender', 'unsupported', { - cd6: err - }); + gcmCompliant().catch(err => { + $('#page-one').attr('hidden', true); + $('#unsupported-browser').removeAttr('hidden'); + // record unsupported event + sendEvent('sender', 'unsupported', { + cd6: err + }); }); $('#file-upload').change(onUpload); @@ -38,35 +42,32 @@ $(document).ready(function() { // record exited event by recipient sendEvent('sender', 'exited', { cd3: metric - }) - .then(() => { + }).then(() => { location.href = target.currentTarget.href; }); - }) + }); $('#send-new-completed').click(function(target) { target.preventDefault(); // record restarted event sendEvent('sender', 'restarted', { cd2: 'completed' - }) - .then(() => { + }).then(() => { storage.referrer = 'completed-upload'; location.href = target.currentTarget.href; }); - }) + }); $('#send-new-error').click(function(target) { target.preventDefault(); // record restarted event sendEvent('sender', 'restarted', { cd2: 'errored' - }) - .then(() => { + }).then(() => { storage.referrer = 'errored-upload'; location.href = target.currentTarget.href; }); - }) + }); $('body').on('dragover', allowDrop).on('drop', onUpload); // reset copy button @@ -87,7 +88,6 @@ $(document).ready(function() { } } - // copy link to clipboard $copyBtn.click(() => { // record copied event from success screen @@ -103,7 +103,9 @@ $(document).ready(function() { //disable button for 3s $copyBtn.attr('disabled', true); $('#link').attr('disabled', true); - $copyBtn.html(''); + $copyBtn.html( + '' + ); window.setTimeout(() => { $copyBtn.attr('disabled', false); $('#link').attr('disabled', false); @@ -137,12 +139,14 @@ $(document).ready(function() { let file = ''; if (event.type === 'drop') { - if (event.originalEvent.dataTransfer.files.length > 1 || event.originalEvent.dataTransfer.files[0].size === 0){ + if ( + event.originalEvent.dataTransfer.files.length > 1 || + event.originalEvent.dataTransfer.files[0].size === 0 + ) { $('.upload-window').removeClass('ondrag'); - document.l10n.formatValue('uploadPageMultipleFilesAlert') - .then(str => { - alert(str); - }); + document.l10n.formatValue('uploadPageMultipleFilesAlert').then(str => { + alert(str); + }); return; } file = event.originalEvent.dataTransfer.files[0]; @@ -151,7 +155,9 @@ $(document).ready(function() { } if (file.size > MAXFILESIZE) { - return document.l10n.formatValue('fileTooBig', {size: bytes(MAXFILESIZE)}).then(alert); + return document.l10n + .formatValue('fileTooBig', { size: bytes(MAXFILESIZE) }) + .then(alert); } $('#page-one').attr('hidden', true); @@ -165,10 +171,9 @@ $(document).ready(function() { $('#cancel-upload').click(() => { fileSender.cancel(); location.reload(); - document.l10n.formatValue('uploadCancelNotification') - .then(str => { - notify(str); - }); + document.l10n.formatValue('uploadCancelNotification').then(str => { + notify(str); + }); storage.referrer = 'cancelled-upload'; // record upload-stopped (cancelled) by sender @@ -189,7 +194,12 @@ $(document).ready(function() { $('#ul-progress').circleProgress().on('circle-animation-end', function() { $('.percent-number').html(`${Math.floor(percent * 100)}`); }); - $('.progress-text').text(`${file.name} (${bytes(progress[0], {decimalPlaces: 1, fixedDecimals: true})} of ${bytes(progress[1], {decimalPlaces: 1})})`); + $('.progress-text').text( + `${file.name} (${bytes(progress[0], { + decimalPlaces: 1, + fixedDecimals: true + })} of ${bytes(progress[1], { decimalPlaces: 1 })})` + ); }); fileSender.on('loading', isStillLoading => { @@ -245,15 +255,15 @@ $(document).ready(function() { // record upload-stopped (completed) by sender sendEvent('sender', 'upload-stopped', { - cm1: file.size, - cm2: totalTime, - cm3: uploadSpeed, - cm5: storage.totalUploads, - cm6: unexpiredFiles, - cm7: storage.totalDownloads, - cd1: event.type === 'drop' ? 'drop' : 'click', - cd2: 'completed' - }); + cm1: file.size, + cm2: totalTime, + cm3: uploadSpeed, + cm5: storage.totalUploads, + cm6: unexpiredFiles, + cm7: storage.totalDownloads, + cd1: event.type === 'drop' ? 'drop' : 'click', + cd2: 'completed' + }); const fileData = { name: file.name, @@ -270,7 +280,10 @@ $(document).ready(function() { }; storage.addFile(info.fileId, fileData); - $('#upload-filename').attr('data-l10n-id', 'uploadSuccessConfirmHeader'); + $('#upload-filename').attr( + 'data-l10n-id', + 'uploadSuccessConfirmHeader' + ); t = window.setTimeout(() => { $('#page-one').attr('hidden', true); $('#upload-progress').attr('hidden', true); @@ -279,10 +292,9 @@ $(document).ready(function() { }, 1000); populateFileList(fileData); - document.l10n.formatValue('notifyUploadDone') - .then(str => { - notify(str); - }); + document.l10n.formatValue('notifyUploadDone').then(str => { + notify(str); + }); }) .catch(err => { Raven.captureException(err); @@ -334,10 +346,18 @@ $(document).ready(function() { const row = document.createElement('tr'); const name = document.createElement('td'); const link = document.createElement('td'); - const $copyIcon = $('', { src: '/resources/copy-16.svg', class: 'icon-copy', 'data-l10n-id': 'copyUrlHover'}); + const $copyIcon = $('', { + src: '/resources/copy-16.svg', + class: 'icon-copy', + 'data-l10n-id': 'copyUrlHover' + }); const expiry = document.createElement('td'); const del = document.createElement('td'); - const $delIcon = $('', { src: '/resources/close-16.svg', class: 'icon-delete', 'data-l10n-id': 'deleteButtonHover' }); + const $delIcon = $('', { + src: '/resources/close-16.svg', + class: 'icon-delete', + 'data-l10n-id': 'deleteButtonHover' + }); const popupDiv = document.createElement('div'); const $popupText = $('
', { class: 'popuptext' }); const cellText = document.createTextNode(file.name); @@ -345,14 +365,8 @@ $(document).ready(function() { const url = file.url.trim() + `#${file.secretKey}`.trim(); $('#link').attr('value', url); - $('#copy-text').attr( - 'data-l10n-args', - '{"filename": "' + file.name + '"}' - ); - $('#copy-text').attr( - 'data-l10n-id', - 'copyUrlFormLabelWithName' - ); + $('#copy-text').attr('data-l10n-args', '{"filename": "' + file.name + '"}'); + $('#copy-text').attr('data-l10n-id', 'copyUrlFormLabelWithName'); $popupText.attr('tabindex', '-1'); name.appendChild(cellText); @@ -383,10 +397,9 @@ $(document).ready(function() { aux.select(); document.execCommand('copy'); document.body.removeChild(aux); - document.l10n.formatValue('copiedUrl') - .then(translated => { - link.innerHTML = translated; - }); + document.l10n.formatValue('copiedUrl').then(translated => { + link.innerHTML = translated; + }); window.setTimeout(() => { const linkImg = document.createElement('img'); $(linkImg).addClass('icon-copy'); @@ -446,12 +459,7 @@ $(document).ready(function() { $(popupNvmSpan).addClass('nvm'); $(popupNvmSpan).attr('data-l10n-id', 'nevermindButton'); - $popupText.html([ - popupDelSpan, - ' ', - ' ', - popupNvmSpan - ]); + $popupText.html([popupDelSpan, ' ', ' ', popupNvmSpan]); // add data cells to table row row.appendChild(name); @@ -470,7 +478,8 @@ $(document).ready(function() { $popupText.find('.del-file').click(e => { FileSender.delete(file.fileId, file.deleteToken).then(() => { $(e.target).parents('tr').remove(); - const timeToExpiry = ONE_DAY_IN_MS - (Date.now() - file.creationDate.getTime()); + const timeToExpiry = + ONE_DAY_IN_MS - (Date.now() - file.creationDate.getTime()); // record upload-deleted from file list sendEvent('sender', 'upload-deleted', { cm1: file.size, @@ -482,17 +491,17 @@ $(document).ready(function() { cm7: storage.totalDownloads, cd1: file.typeOfUpload, cd4: 'upload-list' - }) - .then(() => { + }).then(() => { storage.remove(file.fileId); - }) + }); toggleHeader(); }); }); document.getElementById('delete-file').onclick = () => { FileSender.delete(file.fileId, file.deleteToken).then(() => { - const timeToExpiry = ONE_DAY_IN_MS - (Date.now() - file.creationDate.getTime()); + const timeToExpiry = + ONE_DAY_IN_MS - (Date.now() - file.creationDate.getTime()); // record upload-deleted from success screen sendEvent('sender', 'upload-deleted', { cm1: file.size, @@ -504,11 +513,10 @@ $(document).ready(function() { cm7: storage.totalDownloads, cd1: file.typeOfUpload, cd4: 'success-screen' - }) - .then(() => { + }).then(() => { storage.remove(file.fileId); location.reload(); - }) + }); }); }; // show popup @@ -529,7 +537,6 @@ $(document).ready(function() { $popupText.removeClass('show'); }); - toggleHeader(); } function toggleHeader() { diff --git a/frontend/src/utils.js b/frontend/src/utils.js index f8d6f833..d338b7c9 100644 --- a/frontend/src/utils.js +++ b/frontend/src/utils.js @@ -70,7 +70,7 @@ function gcmCompliant() { } function findMetric(href) { - switch(href) { + switch (href) { case 'https://www.mozilla.org/': return 'mozilla'; case 'https://www.mozilla.org/about/legal': @@ -95,17 +95,18 @@ function findMetric(href) { } function isFile(id) { - return !['referrer', - 'totalDownloads', - 'totalUploads', - 'testpilot_ga__cid'].includes(id); + return ![ + 'referrer', + 'totalDownloads', + 'totalUploads', + 'testpilot_ga__cid' + ].includes(id); } function sendEvent() { - return window.analytics - .sendEvent - .apply(window.analytics, arguments) - .catch(() => 0); + return window.analytics.sendEvent + .apply(window.analytics, arguments) + .catch(() => 0); } const ONE_DAY_IN_MS = 86400000; diff --git a/public/main.css b/public/main.css index e1a1bf7b..c776f5f2 100644 --- a/public/main.css +++ b/public/main.css @@ -27,7 +27,10 @@ body { padding-bottom: 51px; } -input, select, textarea, button { +input, +select, +textarea, +button { font-family: inherit; } @@ -49,7 +52,7 @@ a { width: 630px; text-align: center; margin: 0 auto 60px; - color: #0C0C0D; + color: #0c0c0d; } .upload-window { @@ -80,7 +83,7 @@ a { } .link { - color: #0094FB; + color: #0094fb; text-decoration: none; } @@ -92,10 +95,10 @@ a { } #browse { - background: #0297F8; + background: #0297f8; border-radius: 5px; font-size: 15px; - color: #FFF; + color: #fff; width: 240px; height: 44px; display: flex; @@ -129,7 +132,7 @@ th { td { font-size: 15px; vertical-align: top; - color: #4A4A4A; + color: #4a4a4a; padding: 17px 19px 0; line-height: 23px; } @@ -149,7 +152,9 @@ tbody { table-layout: fixed; } -.icon-delete, .icon-copy, .icon-check { +.icon-delete, +.icon-copy, +.icon-check { cursor: pointer; } @@ -165,7 +170,7 @@ tbody { visibility: hidden; width: 160px; background-color: #555; - color: #FFF; + color: #fff; text-align: center; border-radius: 6px; padding: 8px 0; @@ -239,7 +244,7 @@ tbody { } #cancel-upload { - color: #D70022; + color: #d70022; cursor: pointer; text-decoration: underline; } @@ -268,13 +273,13 @@ tbody { align-self: flex-start; margin-top: 60px; margin-bottom: 10px; - color: #0C0C0D; + color: #0c0c0d; } #link { width: 480px; height: 56px; - border: 1px solid #0297F8; + border: 1px solid #0297f8; border-radius: 6px 0 0 6px; font-size: 24px; color: #737373; @@ -284,15 +289,15 @@ tbody { } #link:disabled { - border: 1px solid #05A700; - background: #FFF; + border: 1px solid #05a700; + background: #fff; } #copy-btn { width: 165px; height: 60px; - background: #0297F8; - border: 1px solid #0297F8; + background: #0297f8; + border: 1px solid #0297f8; border-radius: 0 6px 6px 0; color: white; cursor: pointer; @@ -300,15 +305,15 @@ tbody { } #copy-btn:disabled { - background: #05A700; - border: 1px solid #05A700; + background: #05a700; + border: 1px solid #05a700; cursor: auto; } #delete-file { width: 176px; height: 44px; - background: #FFF; + background: #fff; border: 1px solid rgba(12, 12, 13, 0.3); border-radius: 5px; font-size: 15px; @@ -322,7 +327,7 @@ tbody { font-size: 15px; margin: auto; text-align: center; - color: #0094FB; + color: #0094fb; cursor: pointer; text-decoration: underline; } @@ -336,7 +341,8 @@ tbody { text-align: center; } -#upload-error[hidden], #unsupported-browser[hidden] { +#upload-error[hidden], +#unsupported-browser[hidden] { display: none; } @@ -358,7 +364,7 @@ tbody { line-height: 23px; width: 630px; text-align: center; - color: #7D7D7D; + color: #7d7d7d; margin: 0 auto 23px; } @@ -370,14 +376,14 @@ tbody { margin-bottom: 181px; width: 260px; height: 80px; - background: #12BC00; + background: #12bc00; border-radius: 3px; cursor: pointer; border: 0; box-shadow: 0 5px 3px rgb(234, 234, 234); font-family: 'Fira Sans'; font-weight: 500; - color: #FFF; + color: #fff; font-size: 26px; display: flex; justify-content: center; @@ -406,15 +412,15 @@ tbody { margin-top: 20px; margin-bottom: 30px; text-align: center; - background: #0297F8; - border: 1px solid #0297F8; + background: #0297f8; + border: 1px solid #0297f8; border-radius: 5px; font-weight: 300; cursor: pointer; } #download-btn:disabled { - background: #47B04B; + background: #47b04b; cursor: auto; } @@ -436,7 +442,7 @@ tbody { line-height: 23px; width: 630px; text-align: center; - color: #7D7D7D; + color: #7d7d7d; margin: 0 auto 23px; } @@ -495,7 +501,8 @@ tbody { margin-left: 30px; } -.github, .twitter { +.github, +.twitter { width: 32px; height: 32px; margin-bottom: -5px; diff --git a/server/config.js b/server/config.js index e937d1e9..526d4eea 100644 --- a/server/config.js +++ b/server/config.js @@ -39,7 +39,7 @@ const conf = convict({ }, max_file_size: { format: Number, - default: (1024 * 1024 * 1024) * 2, + default: 1024 * 1024 * 1024 * 2, env: 'P2P_MAX_FILE_SIZE' } }); diff --git a/server/server.js b/server/server.js index 09ea7799..1b7b4f03 100644 --- a/server/server.js +++ b/server/server.js @@ -34,10 +34,12 @@ app.engine( app.set('view engine', 'handlebars'); app.use(helmet()); -app.use(helmet.hsts({ - maxAge: 31536000, - force: conf.env === 'production' -})); +app.use( + helmet.hsts({ + maxAge: 31536000, + force: conf.env === 'production' + }) +); app.use( helmet.contentSecurityPolicy({ directives: { @@ -62,11 +64,13 @@ app.use( } }) ); -app.use(busboy({ - limits: { - fileSize: conf.max_file_size - } -})); +app.use( + busboy({ + limits: { + fileSize: conf.max_file_size + } + }) +); app.use(bodyParser.json()); app.use(express.static(STATIC_PATH)); app.use('/l20n', express.static(L20N)); @@ -112,16 +116,14 @@ app.get('/download/:id', (req, res) => { storage .length(id) .then(contentLength => { - storage - .ttl(id) - .then(timeToExpiry => { - res.render('download', { - filename: decodeURIComponent(filename), - filesize: bytes(contentLength), - sizeInBytes: contentLength, - timeToExpiry: timeToExpiry - }); - }) + storage.ttl(id).then(timeToExpiry => { + res.render('download', { + filename: decodeURIComponent(filename), + filesize: bytes(contentLength), + sizeInBytes: contentLength, + timeToExpiry: timeToExpiry + }); + }); }) .catch(() => { res.status(404).render('notfound'); @@ -228,21 +230,23 @@ app.post('/upload', (req, res, next) => { req.busboy.on('file', (fieldname, file, filename) => { log.info('Uploading:', newId); - storage.set(newId, file, filename, meta).then(() => { - const protocol = conf.env === 'production' ? 'https' : req.protocol; - const url = `${protocol}://${req.get('host')}/download/${newId}/`; - res.json({ - url, - delete: meta.delete, - id: newId - }); - }, - err => { - if (err.message === 'limit') { - return res.sendStatus(413); + storage.set(newId, file, filename, meta).then( + () => { + const protocol = conf.env === 'production' ? 'https' : req.protocol; + const url = `${protocol}://${req.get('host')}/download/${newId}/`; + res.json({ + url, + delete: meta.delete, + id: newId + }); + }, + err => { + if (err.message === 'limit') { + return res.sendStatus(413); + } + res.sendStatus(500); } - res.sendStatus(500); - }); + ); }); req.on('close', err => { @@ -256,7 +260,7 @@ app.post('/upload', (req, res, next) => { .catch(err => { log.info('DeleteError:', newId); }); - }) + }); }); app.get('/__lbheartbeat__', (req, res) => { diff --git a/server/storage.js b/server/storage.js index d92de791..40a699ec 100644 --- a/server/storage.js +++ b/server/storage.js @@ -83,8 +83,8 @@ function ttl(id) { } else { reject(err); } - }) - }) + }); + }); } function filename(id) { @@ -235,8 +235,8 @@ function awsSet(newId, file, filename, meta) { hitLimit = true; upload.abort(); }); - return upload.promise() - .then(() => { + return upload.promise().then( + () => { redis_client.hmset(newId, meta); redis_client.expire(newId, 86400000); log.info('awsUploadFinish', 'Upload Finished of ' + filename); @@ -247,7 +247,8 @@ function awsSet(newId, file, filename, meta) { } else { throw err; } - }); + } + ); } function awsDelete(id, delete_token) {