changed file name, uncommitted bundle

This commit is contained in:
Abhinav Adduri 2017-06-01 15:12:30 -07:00 committed by Danny Coates
parent 51910b5fc9
commit dd703b228a
No known key found for this signature in database
GPG Key ID: 4C442633C62E00CB
7 changed files with 1998 additions and 749 deletions

View File

@ -1,21 +1,22 @@
const UIWrapper = require('./file').UIWrapper;
const UIWrapper = require('./ui').UIWrapper;
let download = () => {
let xhr = new XMLHttpRequest();
xhr.open("get", "/assets" + location.pathname.slice(0, -1), true);
xhr.responseType = "blob";
let listelem = setupUI();
xhr.addEventListener("progress", updateProgress.bind(null, listelem));
xhr.onload = function(e) {
xhr.open('get', '/assets' + location.pathname.slice(0, -1), true);
xhr.responseType = 'blob';
let listelem = setupUI();
xhr.addEventListener('progress', updateProgress.bind(null, listelem));
xhr.onload = function(e) {
// maybe send a separate request before this one to get the filename?
// maybe render the html itself with the filename, since it's generated server side
// after a get request with the unique id
listelem.emit('name', xhr.getResponseHeader("Content-Disposition").match(/filename="(.+)"/)[1]);
listelem.emit(
'name',
xhr.getResponseHeader('Content-Disposition').match(/filename="(.+)"/)[1]
);
if (this.status == 200) {
let self = this;
@ -27,106 +28,115 @@ let download = () => {
let array = new Uint8Array(arrayBuffer);
salt = strToIv(location.pathname.slice(10, -1));
window.crypto.subtle.importKey(
"jwk",
{
kty: "oct",
window.crypto.subtle
.importKey(
'jwk',
{
kty: 'oct',
k: location.hash.slice(1),
alg: "A128CBC",
ext: true,
},
{
name: "AES-CBC",
},
true,
["encrypt", "decrypt"])
.then((key) => {
return window.crypto.subtle.decrypt(
alg: 'A128CBC',
ext: true
},
{
name: 'AES-CBC'
},
true,
['encrypt', 'decrypt']
)
.then(key => {
return window.crypto.subtle.decrypt(
{
name: "AES-CBC",
iv: salt,
name: 'AES-CBC',
iv: salt
},
key,
array)
})
.then((decrypted) => {
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 = xhr.getResponseHeader("Content-Disposition").match(/filename="(.+)"/)[1];
document.body.appendChild(a);
a.click();
})
.catch((err) => {
alert("This link is either invalid or has expired, or the uploader has deleted the file.");
console.error(err);
});
array
);
})
.then(decrypted => {
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 = xhr
.getResponseHeader('Content-Disposition')
.match(/filename="(.+)"/)[1];
document.body.appendChild(a);
a.click();
})
.catch(err => {
alert(
'This link is either invalid or has expired, or the uploader has deleted the file.'
);
console.error(err);
});
};
fileReader.readAsArrayBuffer(blob);
} else {
alert("This link is either invalid or has expired, or the uploader has deleted the file.")
alert(
'This link is either invalid or has expired, or the uploader has deleted the file.'
);
}
};
xhr.send();
}
};
window.download = download;
let setupUI = () => {
let li = document.createElement("li");
let name = document.createElement("p");
let li = document.createElement('li');
let name = document.createElement('p');
li.appendChild(name);
let progress = document.createElement("p");
let progress = document.createElement('p');
li.appendChild(progress);
document.getElementById("downloaded_files").appendChild(li);
document.getElementById('downloaded_files').appendChild(li);
return new UIWrapper(li, name, null, progress);
}
};
let ivToStr = (iv) => {
let hexStr = "";
let ivToStr = iv => {
let hexStr = '';
for (let i in iv) {
if (iv[i] < 16) {
hexStr += "0" + iv[i].toString(16);
hexStr += '0' + iv[i].toString(16);
} else {
hexStr += iv[i].toString(16);
}
}
window.hexStr = hexStr;
return hexStr;
}
};
let strToIv = (str) => {
let strToIv = str => {
let iv = new Uint8Array(16);
for (let i = 0; i < str.length; i += 2) {
iv[i/2] = parseInt((str.charAt(i) + str.charAt(i + 1)), 16);
iv[i / 2] = parseInt(str.charAt(i) + str.charAt(i + 1), 16);
}
return iv;
}
};
let updateProgress = (UIelem, e) => {
if (e.lengthComputable) {
let percentComplete = Math.floor((e.loaded / e.total) * 100);
UIelem.emit('progress', "Progress: " + percentComplete + "%");
if (e.lengthComputable) {
let percentComplete = Math.floor(e.loaded / e.total * 100);
UIelem.emit('progress', 'Progress: ' + percentComplete + '%');
if (percentComplete === 100) {
let finished = document.createElement("p");
finished.innerText = "Your download has finished.";
let finished = document.createElement('p');
finished.innerText = 'Your download has finished.';
UIelem.li.appendChild(finished);
let close = document.createElement("button");
close.innerText = "Ok";
close.addEventListener("click", () => {
document.getElementById("downloaded_files").removeChild(UIelem.li);
let close = document.createElement('button');
close.innerText = 'Ok';
close.addEventListener('click', () => {
document.getElementById('downloaded_files').removeChild(UIelem.li);
});
UIelem.li.appendChild(close);
}
}
}
}
};

View File

@ -1,3 +1,3 @@
require('./upload');
require('./download');
require('./file');
require('./ui');

View File

@ -8,20 +8,19 @@ class UIWrapper extends EventEmitter {
this.link = link;
this.progress = progress;
this.on("name", (filename) => {
this.on('name', filename => {
this.name.innerText = filename;
});
this.on("link", (link) => {
this.on('link', link => {
this.link.innerText = link;
this.link.setAttribute('href', link);
});
this.on("progress", (progress) => {
this.on('progress', progress => {
this.progress.innerText = progress;
});
}
}
exports.UIWrapper = UIWrapper;
exports.UIWrapper = UIWrapper;

View File

@ -1,7 +1,7 @@
const EventEmitter = require('events');
const UIWrapper = require('./file').UIWrapper;
const UIWrapper = require('./ui').UIWrapper;
let onChange = (event) => {
let onChange = event => {
let file = event.target.files[0];
let reader = new FileReader();
reader.readAsArrayBuffer(file);
@ -11,132 +11,146 @@ let onChange = (event) => {
reader.onload = function(event) {
let self = this;
window.crypto.subtle.generateKey({
name: "AES-CBC",
length: 128
},
true,
["encrypt", "decrypt"])
.then((key) => {
let arrayBuffer = self.result;
let array = new Uint8Array(arrayBuffer);
window.crypto.subtle
.generateKey(
{
name: 'AES-CBC',
length: 128
},
true,
['encrypt', 'decrypt']
)
.then(key => {
let arrayBuffer = self.result;
let array = new Uint8Array(arrayBuffer);
window.crypto.subtle.encrypt({
name: "AES-CBC",
iv: random_iv },
key,
array)
.then(uploadFile.bind(null, file, hex, key))
.catch((err) => console.error(err));
}).catch((err) => console.error(err));
window.crypto.subtle
.encrypt(
{
name: 'AES-CBC',
iv: random_iv
},
key,
array
)
.then(uploadFile.bind(null, file, hex, key))
.catch(err => console.error(err));
})
.catch(err => console.error(err));
};
}
};
window.onChange = onChange;
let uploadFile = (file, hex, key, encrypted) => {
let dataView = new DataView(encrypted);
let blob = new Blob([dataView], { type: file.type });
let fd = new FormData();
fd.append("fname", file.name);
fd.append("data", blob, file.name);
fd.append('fname', file.name);
fd.append('data', blob, file.name);
let xhr = new XMLHttpRequest();
xhr.open("post", "/upload/" + hex, true);
xhr.open('post', '/upload/' + hex, true);
let listelem = setupUI();
listelem.emit('name', file.name);
xhr.upload.addEventListener("progress", updateProgress.bind(null, listelem));
xhr.upload.addEventListener('progress', updateProgress.bind(null, listelem));
xhr.onreadystatechange = () => {
xhr.onreadystatechange = () => {
if (xhr.readyState == XMLHttpRequest.DONE) {
window.crypto.subtle.exportKey("jwk", key).then((keydata) => {
window.crypto.subtle.exportKey('jwk', key).then(keydata => {
localStorage.setItem(hex, xhr.responseText);
listelem.emit('link', "http://localhost:3000/download/" + hex + "/#" + keydata.k)
listelem.emit(
'link',
'http://localhost:3000/download/' + hex + '/#' + keydata.k
);
console.log("Share this link with a friend: http://localhost:3000/download/" + hex + "/#" + keydata.k);
})
console.log(
'Share this link with a friend: http://localhost:3000/download/' +
hex +
'/#' +
keydata.k
);
});
}
};
xhr.send(fd);
}
};
let updateProgress = (UIelem, e) => {
if (e.lengthComputable) {
let percentComplete = Math.floor((e.loaded / e.total) * 100);
UIelem.emit('progress', "Progress: " + percentComplete + "%")
let percentComplete = Math.floor(e.loaded / e.total * 100);
UIelem.emit('progress', 'Progress: ' + percentComplete + '%');
if (percentComplete === 100) {
let btn = document.createElement("button");
btn.innerText = "Delete from server";
btn.addEventListener("click", () => {
let segments = UIelem.link.innerText.split("/");
let btn = document.createElement('button');
btn.innerText = 'Delete from server';
btn.addEventListener('click', () => {
let segments = UIelem.link.innerText.split('/');
let key = segments[segments.length - 2];
let xhr = new XMLHttpRequest();
xhr.open("post", "/delete/" + key, true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.open('post', '/delete/' + key, true);
xhr.setRequestHeader('Content-Type', 'application/json');
if (!localStorage.getItem(key)) return;
xhr.send(JSON.stringify({delete_token: localStorage.getItem(key)}));
xhr.send(JSON.stringify({ delete_token: localStorage.getItem(key) }));
xhr.onreadystatechange = () => {
if (xhr.readyState === XMLHttpRequest.DONE) {
document.getElementById("uploaded_files").removeChild(UIelem.li);
document.getElementById('uploaded_files').removeChild(UIelem.li);
localStorage.removeItem(key);
}
if (xhr.status === 200) {
console.log("The file was successfully deleted.");
console.log('The file was successfully deleted.');
} else {
console.log("The file has expired, or has already been deleted.");
console.log('The file has expired, or has already been deleted.');
}
}
};
});
UIelem.li.appendChild(btn);
}
}
}
};
let setupUI = () => {
let li = document.createElement("li");
let name = document.createElement("p");
let li = document.createElement('li');
let name = document.createElement('p');
li.appendChild(name);
let link = document.createElement("a");
let link = document.createElement('a');
li.appendChild(link);
let progress = document.createElement("p");
let progress = document.createElement('p');
li.appendChild(progress);
document.getElementById("uploaded_files").appendChild(li);
document.getElementById('uploaded_files').appendChild(li);
return new UIWrapper(li, name, link, progress);
}
};
let ivToStr = (iv) => {
let hexStr = "";
let ivToStr = iv => {
let hexStr = '';
for (let i in iv) {
if (iv[i] < 16) {
hexStr += "0" + iv[i].toString(16);
hexStr += '0' + iv[i].toString(16);
} else {
hexStr += iv[i].toString(16);
}
}
window.hexStr = hexStr;
return hexStr;
}
};
let strToIv = (str) => {
let strToIv = str => {
let iv = new Uint8Array(16);
for (let i = 0; i < str.length; i += 2) {
iv[i/2] = parseInt((str.charAt(i) + str.charAt(i + 1)), 16);
iv[i / 2] = parseInt(str.charAt(i) + str.charAt(i + 1), 16);
}
return iv;
}
};

1840
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
"version": "1.0.0",
"description": "",
"scripts": {
"format": "prettier --single-quote --write 'public/*.js' 'app.js'",
"format": "prettier --single-quote --write 'frontend/src/*.js'",
"test": "echo \"Error: no test specified\" && exit 1",
"start": "watchify frontend/src/main.js -o public/bundle.js -d | node server/portal_server.js"
},

File diff suppressed because one or more lines are too long