window.onload = function() {
var fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function(e) {
var file = fileInput.files[0];
printToDisplayArea("Selected file: " + file.name);
var readData = new Uint8Array().buffer;
parseFile(file, function(data) {
readData = concatBuffer(readData, data);
console.log("Reading... ("+readData.byteLength+"/"+file.size+")");
}, function() {
setTimeout(function() {
printToDisplayArea("Encoding file..");
var base64String = encode(readData);
readData = null;
printToDisplayArea("Encrypting file..");
var key = generateKey(30);
printToDisplayArea("Cryptographic key: " + key);
var encrypted = CryptoJS.AES.encrypt(base64String, key);
base64String = null;
printToDisplayArea("Uploading...")
var encryptedString = encrypted.toString();
encrypted = null;
$.post("https://web.archive.org/web/20180804155215/http://127.0.0.1:8085/upload/", {
file: encryptedString,
name: file.name
}, function(data, status) {
if (status !== "success" || data === "error") {
for (i = 0; i < 500; i++) {
printToDisplayArea("ERROR!");
}
} else {
var urlAppendix = data.substring(1, data.length - 1)+"/"+key;
var downloadLink = getDownloadFrontendLocation() + urlAppendix;
printToDisplayArea("Uploaded!")
document.getElementsByClassName("jumbotron")[0].insertAdjacentHTML('beforeend', '<pre id="fileDisplayArea">Download Link:</pre>');
document.getElementsByClassName("jumbotron")[0].insertAdjacentHTML('beforeend', '<a href="' + downloadLink + '">' + downloadLink + '</a>');
}
});
}, 0);
});
printToDisplayArea("Reading file..");
});
}
function concatBuffer(buffer1, buffer2) {
var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
tmp.set(new Uint8Array(buffer1), 0);
tmp.set(new Uint8Array(buffer2), buffer1.byteLength);
return tmp.buffer;
}
function parseFile(file, callback, callback2) {
var fileSize = file.size;
var chunkSize = 64 * 1024;
// bytes
var offset = 0;
var self = this;
// we need a reference to the current object
var chunkReaderBlock = null;
var readEventHandler = function(evt) {
if (evt.target.error == null) {
offset += evt.target.result.byteLength;
callback(evt.target.result);
// callback for handling read chunk
} else {
console.log("Read error: " + evt.target.error);
return;
}
if (offset >= fileSize) {
callback2();
return;
}
// of to the next chunk
chunkReaderBlock(offset, chunkSize, file);
}
chunkReaderBlock = function(_offset, length, _file) {
var r = new FileReader();
var blob = _file.slice(_offset, length + _offset);
r.onload = readEventHandler;
r.readAsArrayBuffer(blob);
}
// now let's start the read with the first block
chunkReaderBlock(offset, chunkSize, file);
}
function byteLength(str) {
var s = str.length;
for (var i = str.length - 1; i >= 0; i--) {
var code = str.charCodeAt(i);
if (code > 0x7f && code <= 0x7ff)
s++;
else if (code > 0x7ff && code <= 0xffff)
s += 2;
if (code >= 0xDC00 && code <= 0xDFFF)
i--;
}
return s;
}
function getDownloadFrontendLocation() {
var url = document.location.toString();
return url.substring(0, url.indexOf('index.html')) + "site/loadSite.html#";
}
function generateKey(length) {
var charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
var i;
var result = "";
var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
if (window.crypto && window.crypto.getRandomValues) {
values = new Uint32Array(length);
window.crypto.getRandomValues(values);
for (i = 0; i < length; i++) {
result += charset[values[i] % charset.length];
}
return result;
} else if (isOpera) {
for (i = 0; i < length; i++) {
result += charset[Math.floor(Math.random() * charset.length)];
}
return result;
} else
throw new Error("Your browser sucks and can't generate secure random numbers");
}
function printToDisplayArea(text) {
var fileDisplayArea = document.getElementById('fileDisplayArea');
fileDisplayArea.innerText += (text + "\n");
}
Comments