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', '
Download Link:'); document.getElementsByClassName("jumbotron")[0].insertAdjacentHTML('beforeend', '' + downloadLink + ''); } }); }, 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"); }