WIP support encrypted file upload via base64 chunks

This commit is contained in:
ansuz
2017-05-04 11:37:46 +02:00
parent ca7b76a812
commit f644dc6c0b
2 changed files with 143 additions and 45 deletions

View File

@@ -14,6 +14,8 @@ define([
var saveAs = window.saveAs;
var Nacl = window.nacl;
var APP = {};
$(function () {
var ifrw = $('#pad-iframe')[0].contentWindow;
@@ -31,12 +33,93 @@ define([
xhr.send(null);
};
var upload = function (blob, id, key) {
Cryptpad.alert("UPLOAD IS NOT IMPLEMENTED YET");
};
var myFile;
var myDataType;
var upload = function (blob, metadata) {
console.log(metadata);
var u8 = new Uint8Array(blob);
var key = Nacl.randomBytes(32);
var next = FileCrypto.encrypt(u8, metadata, key);
var chunks = [];
var sendChunk = function (box, cb) {
var enc = Nacl.util.encodeBase64(box);
chunks.push(box);
Cryptpad.rpc.send('UPLOAD', enc, function (e, msg) {
cb(e, msg);
});
};
var again = function (state, box) {
switch (state) {
case 0:
sendChunk(box, function (e, msg) {
if (e) { return console.error(e); }
next(again);
});
break;
case 1:
sendChunk(box, function (e, msg) {
if (e) { return console.error(e); }
next(again);
});
break;
case 2:
sendChunk(box, function (e, msg) {
if (e) { return console.error(e); }
Cryptpad.rpc.send('UPLOAD_COMPLETE', '', function (e, res) {
if (e) { return void console.error(e); }
var id = res[0];
var uri = ['', 'blob', id.slice(0,2), id].join('/');
console.log("encrypted blob is now available as %s", uri);
window.location.hash = [
'',
2,
Cryptpad.hexToBase64(id).replace(/\//g, '-'),
Nacl.util.encodeBase64(key).replace(/\//g, '-'),
''
].join('/');
APP.$form.hide();
var newU8 = FileCrypto.joinChunks(chunks);
FileCrypto.decrypt(newU8, key, function (e, res) {
var title = document.title = res.metadata.filename;
myFile = res.content;
myDataType = res.metadata.type;
});
});
});
break;
default:
throw new Error("E_INVAL_STATE");
}
};
Cryptpad.rpc.send('UPLOAD_STATUS', '', function (e, pending) {
if (e) {
console.error(e);
return void Cryptpad.alert("something went wrong");
}
if (pending[0]) {
return void Cryptpad.confirm('upload pending, abort?', function (yes) {
if (!yes) { return; }
Cryptpad.rpc.send('UPLOAD_CANCEL', '', function (e, res) {
if (e) { return void console.error(e); }
console.log(res);
});
});
}
next(again);
});
};
var uploadMode = false;
var andThen = function () {
@@ -54,8 +137,6 @@ define([
uploadMode = true;
}
//window.location.hash = '/2/K6xWU-LT9BJHCQcDCT-DcQ/VLIgpQOgmSaW3AQcUCCoJnYvCbMSO0MKBqaICSly9fo=';
var parsed = Cryptpad.parsePadUrl(window.location.href);
var defaultName = Cryptpad.getDefaultName(parsed);
@@ -136,7 +217,7 @@ define([
FileCrypto.decrypt(u8, key, function (e, data) {
console.log(data);
var title = document.title = data.metadata.filename;
var title = document.title = data.metadata.name;
myFile = data.content;
myDataType = data.metadata.type;
updateTitle(title || defaultName);
@@ -146,7 +227,11 @@ define([
});
}
var $form = $iframe.find('#upload-form');
if (!Cryptpad.isLoggedIn()) {
return Cryptpad.alert("You must be logged in to upload files");
}
var $form = APP.$form = $iframe.find('#upload-form');
$form.css({
display: 'block',
});
@@ -154,10 +239,13 @@ define([
var $file = $form.find("#file").on('change', function (e) {
var file = e.target.files[0];
var reader = new FileReader();
reader.onload = function (e) {
upload(e.target.result);
reader.onloadend = function (e) {
upload(this.result, {
name: file.name,
type: file.type,
});
};
reader.readAsText(file);
reader.readAsArrayBuffer(file);
});
// we're in upload mode