main.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. var Uploader = {
  2. roomId: null,
  3. createRoom: function(callback) {
  4. var self = this;
  5. $.post('/room', {}, function(response) {
  6. callback($.parseJSON(response).id);
  7. })
  8. },
  9. getRoom: function(path,callback) {
  10. $.getJSON('/room/'+this.roomId+'/'+path, callback)
  11. },
  12. getFile: function(fileName, callback) {
  13. var xhr = new XMLHttpRequest();
  14. xhr.open('GET', '/files/'+this.roomId+'/'+fileName, true);
  15. xhr.responseType = 'arraybuffer';
  16. xhr.onload = callback;
  17. xhr.send();
  18. },
  19. deleteRoom: function() {
  20. $.ajax({
  21. type: 'DELETE',
  22. url: '/room/'+this.roomId
  23. })
  24. },
  25. uploadFile: function(path, name, data, progress, success){
  26. var formData = new FormData();
  27. formData.append("path", path);
  28. formData.append("file", data, name);
  29. $.ajax({
  30. url: '/room/'+this.roomId,
  31. data: formData,
  32. success: success,
  33. cache: false,
  34. processData: false,
  35. contentType: false,
  36. xhr: function () {
  37. var xhr = new XMLHttpRequest()
  38. xhr.upload.addEventListener('progress', progress, false)
  39. return xhr
  40. },
  41. type: 'POST'
  42. });
  43. },
  44. createDirectory: function(path, success) {
  45. $.ajax({
  46. url: '/room/mkdir/'+this.roomId,
  47. type: 'POST',
  48. data: {path: path},
  49. success: success
  50. });
  51. },
  52. deleteFile: function(id) {
  53. $.ajax({
  54. type: 'DELETE',
  55. url: '/room/'+this.roomId+'/'+id
  56. })
  57. },
  58. }
  59. var CryptoUploader = {
  60. createRoom: function() {
  61. Uploader.createRoom(function(roomId){
  62. CryptoUtils.initialize()
  63. .then(function(){
  64. window.location = window.location.href+"#"+roomId+","+CryptoUtils.urlSafeKey;
  65. window.location.reload();
  66. })
  67. });
  68. },
  69. uploadFile: function() {
  70. var fileReader = new FileReader();
  71. var data;
  72. var file = document.getElementById("file-selector").files[0];
  73. var self = this;
  74. var params = window.location.hash.substr(1).split(',');
  75. var path = params.length >= 3 ? params[2] : '';
  76. fileReader.onload = function(e) {
  77. self.data = fileReader.result;
  78. $("#progress-bar").show();
  79. CryptoUtils.encryptFilename(file.name)
  80. .then(function(encrypted) {
  81. var fileName = encrypted;
  82. console.log(self.data);
  83. CryptoUtils.encrypt(self.data)
  84. .then(function(encrypted){
  85. Uploader.uploadFile(path, fileName, encrypted, self.progress, function(e){
  86. self.showRoomContent();;
  87. $("#progress-bar").hide();
  88. });
  89. }).catch(function(err){
  90. console.error(err);
  91. });
  92. }).catch(function(err){
  93. console.error(err);
  94. });
  95. };
  96. fileReader.readAsArrayBuffer(file);
  97. },
  98. progress: function(e) {
  99. if(e.lengthComputable) {
  100. $("#progress-bar")
  101. .prop("value", e.loaded)
  102. .prop("max", e.total);
  103. }
  104. },
  105. downloadFile: function(fileName, fileId) {
  106. Uploader.getFile(fileId, function(e){
  107. if(this.status == 200) {
  108. CryptoUtils.decrypt(this.response).
  109. then(function(decrypted){
  110. var a = document.createElement("a");
  111. document.body.appendChild(a);
  112. a.style = "display: none";
  113. blob = new Blob([decrypted], {type: "application/octet-binary"}),
  114. url = window.URL.createObjectURL(blob);
  115. a.href = url;
  116. a.download = fileName;
  117. a.click();
  118. window.URL.revokeObjectURL(url);
  119. }).catch(function(err){
  120. console.error(err);
  121. })
  122. }
  123. })
  124. },
  125. showRoomContent: function() {
  126. var self = this;
  127. var params = window.location.hash.substr(1).split(',')
  128. var path = params.length >= 3 ? params[2] : ''
  129. var is_parent = path == ''
  130. $("#file-list > ul").empty();
  131. if(!is_parent) {
  132. var e = $("<li></li>").appendTo("#file-list > ul");
  133. $("<span>⬅️</span> <a>Parent Directory</a>")
  134. .on('click', function(e){
  135. var dirs = path.split('/');
  136. dirs.pop();
  137. params[2] = dirs.join('/')
  138. if(params[2] == '') {
  139. params.splice(2,1);
  140. }
  141. console.log(params[2]);
  142. window.location.hash = params.join(',');
  143. CryptoUploader.showRoomContent();
  144. }).appendTo(e);
  145. }
  146. Uploader.getRoom(path, function(data){
  147. for(let f of data.entries()) {
  148. let file = f[1];
  149. CryptoUtils.decryptFileName(file.name)
  150. .then(function(fileName) {
  151. var fileName = CryptoUtils.arrayBufferToString(fileName);
  152. var e = $("<li></li>").appendTo("#file-list > ul");
  153. if(file.is_directory) {
  154. $("<span>📁</span> <a>"+CryptoUploader.sanitizeHTML(fileName)+"</a>")
  155. .on('click', function(e){
  156. window.location.hash += is_parent ? ",/"+file.name : '/'+file.name;
  157. CryptoUploader.showRoomContent();
  158. }).appendTo(e);
  159. }
  160. else {
  161. $("<span>📄</span> <a>"+CryptoUploader.sanitizeHTML(fileName)+"</a>")
  162. .on('click', function(e){CryptoUploader.downloadFile(fileName, path+'/'+file.name)})
  163. .appendTo(e);
  164. }
  165. $("<span>🗑️</span>")
  166. .on('click', function(e){
  167. Uploader.deleteFile(path+'/'+file.name);
  168. CryptoUploader.showRoomContent();
  169. })
  170. .addClass("delete-button")
  171. .appendTo(e);
  172. $("#empty-room").hide();
  173. }).catch(function(err){
  174. console.log(f[1]);
  175. console.error(err);
  176. });
  177. }
  178. });
  179. },
  180. createDirectory: function() {
  181. var params = window.location.hash.substr(1).split(',')
  182. var path = params.length >= 3 ? params[2] : ''
  183. var directoryName = $("#directory-name");
  184. if(directoryName.css('display') != 'none') {
  185. if(directoryName.val() != '') {
  186. CryptoUtils.encryptFilename(directoryName.val())
  187. .then(function(encrypted) {
  188. Uploader.createDirectory(path+'/'+encrypted, CryptoUploader.showRoomContent);
  189. }).catch(function(err) {
  190. console.log(err);
  191. });
  192. directoryName.val('');
  193. }
  194. directoryName.hide();
  195. }
  196. else {
  197. directoryName.show();
  198. }
  199. },
  200. sanitizeHTML: function (str) {
  201. var temp = document.createElement('div');
  202. temp.textContent = str;
  203. return temp.innerHTML;
  204. }
  205. }
  206. $(function(){
  207. if(window.location.hash) {
  208. var params = window.location.hash.substr(1).split(',');
  209. var roomId = params.shift();
  210. var key = params.shift();
  211. $("#create-room").hide();
  212. $("#room").show();
  213. $("#progress-bar").hide();
  214. $("#create-directory-button").on('click', CryptoUploader.createDirectory);
  215. Uploader.roomId = roomId;
  216. CryptoUtils.initialize(key).then(function(){
  217. $("#file-selector").on('input', function(){
  218. CryptoUploader.uploadFile();
  219. });
  220. CryptoUploader.showRoomContent();
  221. }).catch(function(err){
  222. console.error(err);
  223. });
  224. }
  225. else {
  226. $("#room").hide();
  227. $("#create-room > input").show().on('click', function(e){
  228. CryptoUploader.createRoom();
  229. });
  230. }
  231. })