var Uploader = { roomId: null, createRoom: function(callback) { var self = this; $.post('/room', {}, function(response) { callback($.parseJSON(response).id); }) }, getRoom: function(path,callback) { $.getJSON('/room/'+this.roomId+'/'+path, callback) }, getFile: function(fileName, callback) { var xhr = new XMLHttpRequest(); xhr.open('GET', '/files/'+this.roomId+'/'+fileName, true); xhr.responseType = 'arraybuffer'; xhr.onload = callback; xhr.send(); }, deleteRoom: function() { $.ajax({ type: 'DELETE', url: '/room/'+this.roomId }) }, uploadFile: function(path, name, data, progress, success){ var formData = new FormData(); formData.append("path", path); formData.append("file", data, name); $.ajax({ url: '/room/'+this.roomId, data: formData, success: success, cache: false, processData: false, contentType: false, xhr: function () { var xhr = new XMLHttpRequest() xhr.upload.addEventListener('progress', progress, false) return xhr }, type: 'POST' }); }, createDirectory: function(path, success) { $.ajax({ url: '/room/mkdir/'+this.roomId, type: 'POST', data: {path: path}, success: success }); }, deleteFile: function(id) { $.ajax({ type: 'DELETE', url: '/room/'+this.roomId+'/'+id }) }, } var CryptoUploader = { createRoom: function() { Uploader.createRoom(function(roomId){ CryptoUtils.initialize() .then(function(){ window.location = window.location.href+"#"+roomId+","+CryptoUtils.urlSafeKey; window.location.reload(); }) }); }, uploadFile: function() { var fileReader = new FileReader(); var data; var file = document.getElementById("file-selector").files[0]; var self = this; var params = window.location.hash.substr(1).split(','); var path = params.length >= 3 ? params[2] : ''; fileReader.onload = function(e) { self.data = fileReader.result; $("#progress-bar").show(); CryptoUtils.encryptFilename(file.name) .then(function(encrypted) { var fileName = encrypted; console.log(self.data); CryptoUtils.encrypt(self.data) .then(function(encrypted){ Uploader.uploadFile(path, fileName, encrypted, self.progress, function(e){ self.showRoomContent();; $("#progress-bar").hide(); }); }).catch(function(err){ console.error(err); }); }).catch(function(err){ console.error(err); }); }; fileReader.readAsArrayBuffer(file); }, progress: function(e) { if(e.lengthComputable) { $("#progress-bar") .prop("value", e.loaded) .prop("max", e.total); } }, downloadFile: function(fileName, fileId) { Uploader.getFile(fileId, function(e){ if(this.status == 200) { CryptoUtils.decrypt(this.response). then(function(decrypted){ var a = document.createElement("a"); document.body.appendChild(a); a.style = "display: none"; blob = new Blob([decrypted], {type: "application/octet-binary"}), url = window.URL.createObjectURL(blob); a.href = url; a.download = fileName; a.click(); window.URL.revokeObjectURL(url); }).catch(function(err){ console.error(err); }) } }) }, showRoomContent: function() { var self = this; var params = window.location.hash.substr(1).split(',') var path = params.length >= 3 ? params[2] : '' var is_parent = path == '' $("#file-list > ul").empty(); if(!is_parent) { var e = $("
  • ").appendTo("#file-list > ul"); $("⬅️ Parent Directory") .on('click', function(e){ var dirs = path.split('/'); dirs.pop(); params[2] = dirs.join('/') if(params[2] == '') { params.splice(2,1); } console.log(params[2]); window.location.hash = params.join(','); CryptoUploader.showRoomContent(); }).appendTo(e); } Uploader.getRoom(path, function(data){ for(let f of data.entries()) { let file = f[1]; CryptoUtils.decryptFileName(file.name) .then(function(fileName) { var fileName = CryptoUtils.arrayBufferToString(fileName); var e = $("
  • ").appendTo("#file-list > ul"); if(file.is_directory) { $("📁 "+CryptoUploader.sanitizeHTML(fileName)+"") .on('click', function(e){ window.location.hash += is_parent ? ",/"+file.name : '/'+file.name; CryptoUploader.showRoomContent(); }).appendTo(e); } else { $("📄 "+CryptoUploader.sanitizeHTML(fileName)+"") .on('click', function(e){CryptoUploader.downloadFile(fileName, path+'/'+file.name)}) .appendTo(e); } $("🗑️") .on('click', function(e){ Uploader.deleteFile(path+'/'+file.name); CryptoUploader.showRoomContent(); }) .addClass("delete-button") .appendTo(e); $("#empty-room").hide(); }).catch(function(err){ console.log(f[1]); console.error(err); }); } }); }, createDirectory: function() { var params = window.location.hash.substr(1).split(',') var path = params.length >= 3 ? params[2] : '' var directoryName = $("#directory-name"); if(directoryName.css('display') != 'none') { if(directoryName.val() != '') { CryptoUtils.encryptFilename(directoryName.val()) .then(function(encrypted) { Uploader.createDirectory(path+'/'+encrypted, CryptoUploader.showRoomContent); }).catch(function(err) { console.log(err); }); directoryName.val(''); } directoryName.hide(); } else { directoryName.show(); } }, sanitizeHTML: function (str) { var temp = document.createElement('div'); temp.textContent = str; return temp.innerHTML; } } $(function(){ if(window.location.hash) { var params = window.location.hash.substr(1).split(','); var roomId = params.shift(); var key = params.shift(); $("#create-room").hide(); $("#room").show(); $("#progress-bar").hide(); $("#create-directory-button").on('click', CryptoUploader.createDirectory); Uploader.roomId = roomId; CryptoUtils.initialize(key).then(function(){ $("#file-selector").on('input', function(){ CryptoUploader.uploadFile(); }); CryptoUploader.showRoomContent(); }).catch(function(err){ console.error(err); }); } else { $("#room").hide(); $("#create-room > input").show().on('click', function(e){ CryptoUploader.createRoom(); }); } })