From a71161bf20920d26e37cc6397ec93a7c6894ce10 Mon Sep 17 00:00:00 2001 From: Daniela Arcese Date: Tue, 6 Jun 2017 17:23:10 -0400 Subject: [PATCH 1/3] add download page and share link ui --- frontend/src/download.js | 105 +++++++++++++----------- frontend/src/upload.js | 125 ++++++++++++++++++----------- public/download.html | 28 +++++-- public/index.html | 48 +++++++++-- public/main.css | 127 +++++++++++++++++++++++++----- public/resources/link_expired.png | Bin 0 -> 19986 bytes public/resources/share.png | Bin 0 -> 22292 bytes 7 files changed, 310 insertions(+), 123 deletions(-) create mode 100644 public/resources/link_expired.png create mode 100644 public/resources/share.png diff --git a/frontend/src/download.js b/frontend/src/download.js index c7a4937b..84493875 100644 --- a/frontend/src/download.js +++ b/frontend/src/download.js @@ -1,53 +1,64 @@ const FileReceiver = require('./fileReceiver'); -let download = () => { - const fileReceiver = new FileReceiver(); - - let li = document.createElement('li'); - let name = document.createElement('p'); - li.appendChild(name); - let progress = document.createElement('p'); - li.appendChild(progress); - - document.getElementById('downloaded_files').appendChild(li); - - fileReceiver.on('progress', percentComplete => { - progress.innerText = `Progress: ${percentComplete}%`; - - if (percentComplete === 100) { - fileReceiver.removeAllListeners('progress'); - - let finished = document.createElement('p'); - finished.innerText = 'Your download has finished.'; - li.appendChild(finished); - - let close = document.createElement('button'); - close.innerText = 'Ok'; - close.addEventListener('click', () => { - document.getElementById('downloaded_files').removeChild(li); - }); - li.appendChild(close); - } +$(document).ready(function(){ + $('.send-new').click(()=>{ + window.location.replace(`${window.location.origin}`); }); + let download = () => { + const fileReceiver = new FileReceiver(); - fileReceiver.download() - .catch((err) => { - console.log('The file has expired, or has already been deleted.'); - document.getElementById('downloaded_files').removeChild(li); - return; - }) - .then(([decrypted, fname]) => { - name.innerText = fname; - let dataView = new DataView(decrypted); - let blob = new Blob([dataView]); - let downloadUrl = URL.createObjectURL(blob); + let li = document.createElement('li'); + let name = document.createElement('p'); + let progress = document.createElement('p'); + let btn = $('#download-btn'); - let a = document.createElement('a'); - a.href = downloadUrl; - a.download = fname; - document.body.appendChild(a); - a.click(); - }); -}; + // li.appendChild(name); + // li.appendChild(progress); -window.download = download; + //document.getElementById('downloaded_files').appendChild(li); + + fileReceiver.on('progress', percentComplete => { + progress.innerText = `Progress: ${percentComplete}%`; + + if (percentComplete === 100) { + fileReceiver.removeAllListeners('progress'); + btn.text('Download complete!'); + btn.attr("disabled", "true"); + // let finished = document.createElement('p'); + // finished.innerText = 'Your download has finished.'; + // li.appendChild(finished); + + // let close = document.createElement('button'); + // close.innerText = 'Ok'; + // close.addEventListener('click', () => { + // document.getElementById('downloaded_files').removeChild(li); + // }); + // li.appendChild(close); + } + }); + + fileReceiver.download() + .catch((err) => { + $('.title').text('This link has expired or never existed in the first place.'); + $('#download-btn').hide(); + $('#expired-img').show(); + console.log('The file has expired, or has already been deleted.'); + // document.getElementById('downloaded_files').removeChild(li); + return; + }) + .then(([decrypted, fname]) => { + name.innerText = fname; + let dataView = new DataView(decrypted); + let blob = new Blob([dataView]); + let downloadUrl = URL.createObjectURL(blob); + + let a = document.createElement('a'); + a.href = downloadUrl; + a.download = fname; + document.body.appendChild(a); + a.click(); + }); + }; + + window.download = download; +}); diff --git a/frontend/src/upload.js b/frontend/src/upload.js index b27e1a0a..5d219658 100644 --- a/frontend/src/upload.js +++ b/frontend/src/upload.js @@ -1,50 +1,87 @@ const FileSender = require('./fileSender'); -let onChange = event => { - const file = event.target.files[0]; +$(document).ready(function(){ + let copyBtn = $('#copy-btn'); + copyBtn.attr("disabled", false); + copyBtn.html("Copy"); + $('#page-one').show(); + $('#file-list').hide(); + $('#upload-progress').hide(); + $('#share-link').hide(); - let fileList = document.getElementById('uploaded-files'); - let row = document.createElement('tr'); - let name = document.createElement('td'); - let link = document.createElement('td'); - let expiry = document.createElement('td'); - - let cellText = document.createTextNode(file.name); - - name.appendChild(cellText); - - let progress = document.createElement('p'); - - row.appendChild(name); - row.appendChild(link); - row.appendChild(expiry); - fileList.appendChild(row); - - const fileSender = new FileSender(file); - fileSender.on('progress', percentComplete => { - progress.innerText = `Progress: ${percentComplete}%`; + copyBtn.click(()=>{ + console.log("copied"); + var aux = document.createElement("input"); + aux.setAttribute("value", $('#link').attr("value")); + document.body.appendChild(aux); + aux.select(); + document.execCommand("copy"); + document.body.removeChild(aux); + copyBtn.attr("disabled", true); + copyBtn.html("Copied!"); }); - fileSender.upload().then(info => { - const url = `${window.location - .origin}/download/${info.fileId}/#${info.secretKey}`; - link.innerHTML = url; - localStorage.setItem(info.fileId, info.deleteToken); - let del = document.createElement('td'); - let btn = document.createElement('button'); - btn.innerHTML = 'x'; - btn.classList.add('delete-btn'); - btn.addEventListener('click', () => { - FileSender.delete( - info.fileId, - localStorage.getItem(info.fileId) - ).then(() => { - fileList.removeChild(row); - localStorage.removeItem(info.fileId); - }); + $('.send-new').click(()=>{ + $('#page-one').show(); + $('#file-list').show(); + $('#upload-progress').hide(); + $('#share-link').hide(); + copyBtn.attr("disabled", false); + copyBtn.html("Copy"); + }); + + let onChange = event => { + const file = event.target.files[0]; + + let fileList = $('#uploaded-files'); + let row = document.createElement('tr'); + let name = document.createElement('td'); + let link = document.createElement('td'); + let expiry = document.createElement('td'); + + let cellText = document.createTextNode(file.name); + + name.appendChild(cellText); + + let progress = document.createElement('p'); + + row.appendChild(name); + row.appendChild(link); + row.appendChild(expiry); + fileList.append(row); + + const fileSender = new FileSender(file); + fileSender.on('progress', percentComplete => { + $('#page-one').hide(); + $('#file-list').hide(); + $('#upload-progress').show(); + $('#upload-filename').innerHTML += file.name; + progress.innerText = `Progress: ${percentComplete}%`; }); - del.appendChild(btn); - row.appendChild(del); - }); -}; + fileSender.upload().then(info => { + const url = `${window.location + .origin}/download/${info.fileId}/#${info.secretKey}`; + $('#link').attr("value", url); + link.innerHTML = url; + localStorage.setItem(info.fileId, info.deleteToken); + let del = document.createElement('td'); + let btn = document.createElement('button'); + btn.innerHTML = 'x'; + btn.classList.add('delete-btn'); + btn.addEventListener('click', (e) => { + FileSender.delete( + info.fileId, + localStorage.getItem(info.fileId) + ).then(() => { + e.target.parentNode.parentNode.remove(); + localStorage.removeItem(info.fileId); + }); + }); + del.appendChild(btn); + row.appendChild(del); + $('#upload-progress').hide(); + $('#share-link').show(); + }); + }; -window.onChange = onChange; + window.onChange = onChange; + }); diff --git a/public/download.html b/public/download.html index 3a0e6ac5..cfc490c7 100644 --- a/public/download.html +++ b/public/download.html @@ -1,15 +1,31 @@ -Download your file - + Download your file + + + + - +
+
+
+ Your friend is sending you a file: +
+ +
+ Send your own files +
+
+
- + - + diff --git a/public/index.html b/public/index.html index ace23482..128d3a95 100644 --- a/public/index.html +++ b/public/index.html @@ -2,9 +2,10 @@ Firefox Fileshare - + + - + @@ -14,7 +15,7 @@ Share your files quickly, privately and securely.
-
+
DRAG & DROP
@@ -24,7 +25,7 @@
- +
@@ -37,12 +38,47 @@ File Copy URL - Expires in - Delete + Expires in + Delete +
+
+
+ Uploading +
+
+
+
+ +
+
+
+ + + + diff --git a/public/main.css b/public/main.css index afffea01..2329feb7 100644 --- a/public/main.css +++ b/public/main.css @@ -1,32 +1,35 @@ /*** index.html ***/ - -/** page-one **/ -body { +html { background: url('resources/background.png'); font-family: 'Fira Sans'; font-weight: 300; font-style: normal; - background-size: cover; + background-size: contain; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + align-content: center; + flex-direction: column; +} +input, select, textarea, button { + font-family:inherit; } +/** page-one **/ .main-window { border: 1px solid; width: 606px; - height: 447px; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - margin: auto; + min-height: 447px; background-color: white; border-radius: 5px; } .title { font-size: 14px; - width: 50%; - margin: 50px auto ; + width: 80%; + margin: 50px auto; + text-align: center; } .upload-window { @@ -44,7 +47,7 @@ body { #browse { float: right; - color: blue; + color: #2D7EFF; } #browse-text { @@ -96,12 +99,6 @@ td { width: 472px; margin: 10px auto ; table-layout: fixed; - overflow-y: scroll; -} - -#file-list { - overflow-y: scroll; - height: 90px; } .delete-btn { @@ -110,3 +107,93 @@ td { background: none; cursor: pointer; } + +/** upload-progress **/ + + +/** share-link **/ +.share-window { + width: 50%; + margin: 0 auto; + width: 470px; + height: 250px; + display: flex; + justify-content: center; + align-items: center; +} + +#share-window-r { + width: 50%; + margin: 0 auto; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; +} + +#share-window-r>div { + font-size: 12px; + padding-bottom: 10px; +} + +#copy { + display: flex; + flex-wrap: nowrap; +} + +#link { + width: 216px; + height: 41px; + border: 1px solid #979797; +} + +#copy-btn { + width: 60px; + height: 45px; + background: #337FEB; + border: 1px solid #979797; + color: white; + cursor: pointer; +} + +#copy-btn:disabled { + background: #47B04B; + cursor: auto; +} + +.send-new { + font-size: 14px; + margin: auto; + width: 80%; + text-align: center; + color: #2D7EFF; + cursor: pointer; +} + +/** download.html **/ +#download-btn { + font-size: 18px; + color: white; + width: 214px; + height: 87px; + margin: 50px auto; + text-align: center; + background: #337FEB; + border: 1px solid #3EA050; + border-radius: 6px; + font-weight: 300; + cursor: pointer; +} + +#download-btn:disabled { + background: #47B04B; + cursor: auto; +} + +#download { + text-align: center; +} + +#expired-img { + display: none; +} diff --git a/public/resources/link_expired.png b/public/resources/link_expired.png new file mode 100644 index 0000000000000000000000000000000000000000..b4872db6f87651138966676db387eb9a386aed20 GIT binary patch literal 19986 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 literal 0 HcmV?d00001 diff --git a/public/resources/share.png b/public/resources/share.png new file mode 100644 index 0000000000000000000000000000000000000000..0628d7ce9b7ccc5b2cf14290bf53091641960c4c GIT binary patch literal 22292 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 literal 0 HcmV?d00001 From 6c29e339463c77a12096a81da744038fd4daa94d Mon Sep 17 00:00:00 2001 From: Daniela Arcese Date: Tue, 6 Jun 2017 17:24:51 -0400 Subject: [PATCH 2/3] format --- frontend/src/download.js | 49 +++++++------- frontend/src/fileReceiver.js | 8 +-- frontend/src/upload.js | 70 ++++++++++---------- server/portal_server.js | 123 +++++++++++++++++------------------ 4 files changed, 125 insertions(+), 125 deletions(-) diff --git a/frontend/src/download.js b/frontend/src/download.js index 84493875..167a39f4 100644 --- a/frontend/src/download.js +++ b/frontend/src/download.js @@ -1,7 +1,7 @@ const FileReceiver = require('./fileReceiver'); -$(document).ready(function(){ - $('.send-new').click(()=>{ +$(document).ready(function() { + $('.send-new').click(() => { window.location.replace(`${window.location.origin}`); }); let download = () => { @@ -23,7 +23,7 @@ $(document).ready(function(){ if (percentComplete === 100) { fileReceiver.removeAllListeners('progress'); btn.text('Download complete!'); - btn.attr("disabled", "true"); + btn.attr('disabled', 'true'); // let finished = document.createElement('p'); // finished.innerText = 'Your download has finished.'; // li.appendChild(finished); @@ -37,27 +37,30 @@ $(document).ready(function(){ } }); - fileReceiver.download() - .catch((err) => { - $('.title').text('This link has expired or never existed in the first place.'); - $('#download-btn').hide(); - $('#expired-img').show(); - console.log('The file has expired, or has already been deleted.'); - // document.getElementById('downloaded_files').removeChild(li); - return; - }) - .then(([decrypted, fname]) => { - name.innerText = fname; - let dataView = new DataView(decrypted); - let blob = new Blob([dataView]); - let downloadUrl = URL.createObjectURL(blob); + fileReceiver + .download() + .catch(err => { + $('.title').text( + 'This link has expired or never existed in the first place.' + ); + $('#download-btn').hide(); + $('#expired-img').show(); + console.log('The file has expired, or has already been deleted.'); + // document.getElementById('downloaded_files').removeChild(li); + return; + }) + .then(([decrypted, fname]) => { + name.innerText = fname; + let dataView = new DataView(decrypted); + let blob = new Blob([dataView]); + let downloadUrl = URL.createObjectURL(blob); - let a = document.createElement('a'); - a.href = downloadUrl; - a.download = fname; - document.body.appendChild(a); - a.click(); - }); + let a = document.createElement('a'); + a.href = downloadUrl; + a.download = fname; + document.body.appendChild(a); + a.click(); + }); }; window.download = download; diff --git a/frontend/src/fileReceiver.js b/frontend/src/fileReceiver.js index 25ddde73..c030fb71 100644 --- a/frontend/src/fileReceiver.js +++ b/frontend/src/fileReceiver.js @@ -20,9 +20,10 @@ class FileReceiver extends EventEmitter { }; xhr.onload = function(e) { - if (xhr.status === 404) { - reject(new Error('The file has expired, or has already been deleted.')); + reject( + new Error('The file has expired, or has already been deleted.') + ); return; } @@ -58,8 +59,7 @@ class FileReceiver extends EventEmitter { true, ['encrypt', 'decrypt'] ) - ]) - .then(([fdata, key]) => { + ]).then(([fdata, key]) => { let salt = this.salt; return Promise.all([ window.crypto.subtle.decrypt( diff --git a/frontend/src/upload.js b/frontend/src/upload.js index 5d219658..2c478610 100644 --- a/frontend/src/upload.js +++ b/frontend/src/upload.js @@ -1,32 +1,32 @@ const FileSender = require('./fileSender'); -$(document).ready(function(){ +$(document).ready(function() { let copyBtn = $('#copy-btn'); - copyBtn.attr("disabled", false); - copyBtn.html("Copy"); + copyBtn.attr('disabled', false); + copyBtn.html('Copy'); $('#page-one').show(); $('#file-list').hide(); $('#upload-progress').hide(); $('#share-link').hide(); - copyBtn.click(()=>{ - console.log("copied"); - var aux = document.createElement("input"); - aux.setAttribute("value", $('#link').attr("value")); + copyBtn.click(() => { + console.log('copied'); + var aux = document.createElement('input'); + aux.setAttribute('value', $('#link').attr('value')); document.body.appendChild(aux); aux.select(); - document.execCommand("copy"); + document.execCommand('copy'); document.body.removeChild(aux); - copyBtn.attr("disabled", true); - copyBtn.html("Copied!"); + copyBtn.attr('disabled', true); + copyBtn.html('Copied!'); }); - $('.send-new').click(()=>{ + $('.send-new').click(() => { $('#page-one').show(); $('#file-list').show(); $('#upload-progress').hide(); $('#share-link').hide(); - copyBtn.attr("disabled", false); - copyBtn.html("Copy"); + copyBtn.attr('disabled', false); + copyBtn.html('Copy'); }); let onChange = event => { @@ -60,28 +60,28 @@ $(document).ready(function(){ fileSender.upload().then(info => { const url = `${window.location .origin}/download/${info.fileId}/#${info.secretKey}`; - $('#link').attr("value", url); - link.innerHTML = url; - localStorage.setItem(info.fileId, info.deleteToken); - let del = document.createElement('td'); - let btn = document.createElement('button'); - btn.innerHTML = 'x'; - btn.classList.add('delete-btn'); - btn.addEventListener('click', (e) => { - FileSender.delete( - info.fileId, - localStorage.getItem(info.fileId) - ).then(() => { - e.target.parentNode.parentNode.remove(); - localStorage.removeItem(info.fileId); - }); + $('#link').attr('value', url); + link.innerHTML = url; + localStorage.setItem(info.fileId, info.deleteToken); + let del = document.createElement('td'); + let btn = document.createElement('button'); + btn.innerHTML = 'x'; + btn.classList.add('delete-btn'); + btn.addEventListener('click', e => { + FileSender.delete( + info.fileId, + localStorage.getItem(info.fileId) + ).then(() => { + e.target.parentNode.parentNode.remove(); + localStorage.removeItem(info.fileId); }); - del.appendChild(btn); - row.appendChild(del); - $('#upload-progress').hide(); - $('#share-link').show(); }); - }; + del.appendChild(btn); + row.appendChild(del); + $('#upload-progress').hide(); + $('#share-link').show(); + }); + }; - window.onChange = onChange; - }); + window.onChange = onChange; +}); diff --git a/server/portal_server.js b/server/portal_server.js index df726ae4..3d518ec4 100644 --- a/server/portal_server.js +++ b/server/portal_server.js @@ -1,115 +1,112 @@ -const express = require("express") -const busboy = require("connect-busboy"); -const path = require("path"); -const fs = require("fs-extra"); -const bodyParser = require("body-parser"); -const crypto = require("crypto"); +const express = require('express'); +const busboy = require('connect-busboy'); +const path = require('path'); +const fs = require('fs-extra'); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); -const app = express() -const redis = require("redis"), - client = redis.createClient(); +const app = express(); +const redis = require('redis'), + client = redis.createClient(); -client.on("error", (err) => { +client.on('error', err => { console.log(err); -}) +}); app.use(busboy()); app.use(bodyParser.json()); -app.use(express.static(path.join(__dirname, "../public"))); +app.use(express.static(path.join(__dirname, '../public'))); -app.get("/download/:id", (req, res) => { - res.sendFile(path.join(__dirname + "/../public/download.html")); +app.get('/download/:id', (req, res) => { + res.sendFile(path.join(__dirname + '/../public/download.html')); }); -app.get("/assets/download/:id", (req, res) => { - +app.get('/assets/download/:id', (req, res) => { let id = req.params.id; - if (!validateID(id)){ + if (!validateID(id)) { res.send(404); return; } - - client.hget(id, "filename", (err, reply) => { // maybe some expiration logic too + client.hget(id, 'filename', (err, reply) => { + // maybe some expiration logic too if (!reply) { res.sendStatus(404); } else { - res.setHeader("Content-Disposition", "attachment; filename=" + reply); - res.setHeader("Content-Type", "application/octet-stream"); - - res.download(__dirname + "/../static/" + id, reply, (err) => { + res.setHeader('Content-Disposition', 'attachment; filename=' + reply); + res.setHeader('Content-Type', 'application/octet-stream'); + + res.download(__dirname + '/../static/' + id, reply, err => { if (!err) { client.del(id); - fs.unlinkSync(__dirname + "/../static/" + id); + fs.unlinkSync(__dirname + '/../static/' + id); } }); } - }) - + }); }); -app.post("/delete/:id", (req, res) => { +app.post('/delete/:id', (req, res) => { let id = req.params.id; - if (!validateID(id)){ + if (!validateID(id)) { res.send(404); return; } - + let delete_token = req.body.delete_token; - - if (!delete_token){ + + if (!delete_token) { res.sendStatus(404); } - client.hget(id, "delete", (err, reply) => { + client.hget(id, 'delete', (err, reply) => { if (!reply) { res.sendStatus(404); } else { client.del(id); - fs.unlinkSync(__dirname + "/../static/" + id); + fs.unlinkSync(__dirname + '/../static/' + id); res.sendStatus(200); } - }) + }); }); -app.post("/upload/:id", (req, res, next) => { - - if (!validateID(req.params.id)){ - res.send(404); - return; - } +app.post('/upload/:id', (req, res, next) => { + if (!validateID(req.params.id)) { + res.send(404); + return; + } - let fstream; - req.pipe(req.busboy); - req.busboy.on("file", (fieldname, file, filename) => { - console.log("Uploading: " + filename); + let fstream; + req.pipe(req.busboy); + req.busboy.on('file', (fieldname, file, filename) => { + console.log('Uploading: ' + filename); - //Path where image will be uploaded - fstream = fs.createWriteStream(__dirname + "/../static/" + req.params.id); - file.pipe(fstream); - fstream.on("close", () => { - let id = req.params.id; - let uuid = crypto.randomBytes(10).toString('hex'); + //Path where image will be uploaded + fstream = fs.createWriteStream(__dirname + '/../static/' + req.params.id); + file.pipe(fstream); + fstream.on('close', () => { + let id = req.params.id; + let uuid = crypto.randomBytes(10).toString('hex'); - client.hmset([id, "filename", filename, "delete", uuid]); + client.hmset([id, 'filename', filename, 'delete', uuid]); - // delete the file off the server in 24 hours - // setTimeout(() => { - // fs.unlinkSync(__dirname + "/static/" + id); - // }, 86400000); + // delete the file off the server in 24 hours + // setTimeout(() => { + // fs.unlinkSync(__dirname + "/static/" + id); + // }, 86400000); - client.expire(id, 86400000); - console.log("Upload Finished of " + filename); - res.send(uuid); - }); + client.expire(id, 86400000); + console.log('Upload Finished of ' + filename); + res.send(uuid); }); + }); }); app.listen(3000, () => { - console.log("Portal app listening on port 3000!") -}) + console.log('Portal app listening on port 3000!'); +}); -let validateID = (route_id) => { +let validateID = route_id => { return route_id.match(/^[0-9a-fA-F]{32}$/) !== null; -} \ No newline at end of file +}; From 7e6c969f79fcd393cedc9315d8d43874ee78edf7 Mon Sep 17 00:00:00 2001 From: Daniela Arcese Date: Tue, 6 Jun 2017 17:31:07 -0400 Subject: [PATCH 3/3] fix send new file links --- frontend/src/download.js | 2 +- public/download.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/download.js b/frontend/src/download.js index 167a39f4..b3457c95 100644 --- a/frontend/src/download.js +++ b/frontend/src/download.js @@ -1,7 +1,7 @@ const FileReceiver = require('./fileReceiver'); $(document).ready(function() { - $('.send-new').click(() => { + $('#send-file').click(() => { window.location.replace(`${window.location.origin}`); }); let download = () => { diff --git a/public/download.html b/public/download.html index cfc490c7..513d3c96 100644 --- a/public/download.html +++ b/public/download.html @@ -18,7 +18,7 @@ -
+
Send your own files