Browse Source

add filename encryption

encrypt 4 years ago
parent
commit
e820c6fe0c
2 changed files with 90 additions and 22 deletions
  1. 47 1
      client/crypto.js
  2. 43 21
      client/main.js

+ 47 - 1
client/crypto.js

@@ -47,7 +47,23 @@ var CryptoUtils = {
 	    return new Blob([iv, encrypted], {type: 'application/octet-binary'});  
     	});
     },
-    
+
+    encryptFilename: function(data, iv) {
+	var self = this;
+	iv = this.stringToArrayBuffer(iv);
+	data = this.stringToArrayBuffer(data);
+	return window.crypto.subtle.encrypt(
+	    {		
+		name: this.cypher,
+		iv: iv,
+	    },
+	    this.key,
+	    data
+	).then(function(encrypted){
+	    return base32.encode(encrypted);
+    	});
+    },
+
     decrypt: function(data) {
 	var self = this;
 	return window.crypto.subtle.decrypt(
@@ -59,6 +75,20 @@ var CryptoUtils = {
 	    data.slice(12)
 	);
     },
+
+    decryptFileName: function(data, iv) {
+	var self = this;
+	var data = new Uint8Array(base32.decode.asBytes(data)).buffer;
+	iv = this.stringToArrayBuffer(iv);
+	return window.crypto.subtle.decrypt(
+	    {
+		name: this.cypher,
+		iv: iv,
+	    },
+	    this.key,
+	    data
+	);	    
+    },
     
     importKey: function(key) {
 	var self = this;
@@ -87,5 +117,21 @@ var CryptoUtils = {
 	    bufView[i] = str.charCodeAt(i);
 	}
 	return buf;
+    },
+
+    stringToArrayBuffer: function(str) {
+	var utf8 = str;
+	return new Uint8Array(utf8.split('').map(function (item) {
+	    return item.charCodeAt();
+	})).buffer;
+    },
+
+    arrayBufferToString: function(buf) {
+	buf = new Uint8Array(buf);
+	var utf8 = Array.from(buf).map(function (item) {
+	    return String.fromCharCode(item);
+	}).join('');
+
+	return utf8;
     }
 }

+ 43 - 21
client/main.js

@@ -73,14 +73,21 @@ var CryptoUploader = {
 	var file = document.getElementById("file-selector").files[0];
 	var self = this;
 	fileReader.onload = function(e) {
-	    this.data = fileReader.result;
+	    self.data = fileReader.result;
 	    $("#progress-bar").show();
-	    CryptoUtils.encrypt(this.data)
-	    	.then(function(encrypted){
-		    Uploader.uploadFile(file.name, encrypted, self.progress, function(e){
-			self.showRoomContent();;
-			$("#progress-bar").hide();
-		    });
+	    CryptoUtils.encryptFilename(file.name, Uploader.roomId)
+		.then(function(encrypted) {
+		    var fileName = encrypted;
+		    console.log(self.data);
+		    CryptoUtils.encrypt(self.data)
+	    		.then(function(encrypted){
+			    Uploader.uploadFile(fileName, encrypted, self.progress, function(e){
+				self.showRoomContent();;
+				$("#progress-bar").hide();
+			    });
+			}).catch(function(err){
+			    console.error(err);
+			});
 		}).catch(function(err){
 		    console.error(err);
 		});
@@ -96,8 +103,8 @@ var CryptoUploader = {
 	}
     },
 	
-    downloadFile: function(fileName) {
-	Uploader.getFile(fileName, function(e){
+    downloadFile: function(fileName, fileId) {
+	Uploader.getFile(fileId, function(e){
 	    if(this.status == 200) {
 		CryptoUtils.decrypt(this.response).
 		    then(function(decrypted){
@@ -118,24 +125,39 @@ var CryptoUploader = {
     },
 
     showRoomContent: function() {
+	var self = this;
 	$("#file-list > ul").empty();
 	Uploader.getRoom(function(data){
 	    for(let f of data.entries()) {
-		var e = $("<li></li>").appendTo("#file-list > ul");
-		$("<a>"+f[1]+"</a>")
-		    .on('click', function(e){CryptoUploader.downloadFile(e.target.text)})
-		    .appendTo(e);
-		$("<span>🗑️</span>")
-		    .on('click', function(e){
-			Uploader.deleteFile(e.target.parentNode.querySelector("a").text);
-			CryptoUploader.showRoomContent();
-		    })
-		    .addClass("delete-button")
-		    .appendTo(e);
-		  
+		CryptoUtils.decryptFileName(f[1], Uploader.roomId)
+		    .then(function(fileName) {
+			console.log(fileName);
+			window.nene = fileName;
+			var fileName = CryptoUtils.arrayBufferToString(fileName);
+			var e = $("<li></li>").appendTo("#file-list > ul");
+			$("<a>"+self.sanitizeHTML(fileName)+"</a>")
+			    .on('click', function(e){CryptoUploader.downloadFile(fileName, f[1])})
+			    .appendTo(e);
+			$("<span>🗑️</span>")
+			    .on('click', function(e){
+				Uploader.deleteFile(e.target.parentNode.querySelector("a").text);
+				CryptoUploader.showRoomContent();
+			    })
+			    .addClass("delete-button")
+			    .appendTo(e);
+		    }).catch(function(err){
+			console.log(f[1]);
+			console.error(err);
+		    });			
 	    }
 	})
     },
+
+    sanitizeHTML: function (str) {
+	var temp = document.createElement('div');
+	temp.textContent = str;
+	return temp.innerHTML;
+    }
 }
 
 $(function(){