Commit 36e09bbc authored by Tristan Cavelier's avatar Tristan Cavelier

Update CryptStorage and Jio tests

parent 08c3aa1d
...@@ -12,7 +12,7 @@ var newCryptedStorage = function ( spec, my ) { ...@@ -12,7 +12,7 @@ var newCryptedStorage = function ( spec, my ) {
that.serialized = function () { that.serialized = function () {
var o = super_serialized(); var o = super_serialized();
o.username = priv.username; o.username = priv.username;
o.password = priv.password; o.password = priv.password; // TODO : unsecured !!!
o.storage = priv.secondstorage_string; o.storage = priv.secondstorage_string;
return o; return o;
}; };
...@@ -60,8 +60,8 @@ var newCryptedStorage = function ( spec, my ) { ...@@ -60,8 +60,8 @@ var newCryptedStorage = function ( spec, my ) {
priv.password, priv.password,
param); param);
} catch (e) { } catch (e) {
callback({status:0,statusText:'Decrypt Fail', callback({status:403,statusText:'Forbidden',error:'forbidden',
message:'Unable to decrypt.'}); message:'Unable to decrypt.',reason:'unable to decrypt'});
return; return;
} }
callback(undefined,tmp); callback(undefined,tmp);
...@@ -95,181 +95,167 @@ var newCryptedStorage = function ( spec, my ) { ...@@ -95,181 +95,167 @@ var newCryptedStorage = function ( spec, my ) {
return async; return async;
}; };
that.post = function (command) {
that.put (command);
};
/** /**
* Saves a document. * Saves a document.
* @method saveDocument * @method put
*/ */
that.saveDocument = function (command) { that.put = function (command) {
var new_file_name, new_file_content, am = priv.newAsyncModule(), o = {}; var new_file_name, new_file_content, am = priv.newAsyncModule(), o = {};
o.encryptFilePath = function () { o.encryptFilePath = function () {
priv.encrypt(command.getPath(),function(res) { priv.encrypt(command.getDocId(),function(res) {
new_file_name = res; new_file_name = res;
am.call(o,'save'); am.call(o,'save');
}); });
}; };
o.encryptFileContent = function () { o.encryptFileContent = function () {
priv.encrypt(command.getContent(),function(res) { priv.encrypt(command.getDocContent(),function(res) {
new_file_content = res; new_file_content = res;
am.call(o,'save'); am.call(o,'save');
}); });
}; };
o.save = function () { o.save = function () {
var settings = command.cloneOption(), newcommand; var success = function (val) {
settings.success = function () { that.success(); }; val.id = command.getDocId();
settings.error = function (r) { that.error(r); }; that.success (val);
newcommand = that.newCommand( },
'saveDocument', error = function (err) {
{path:new_file_name,content:new_file_content,option:settings}); that.error (err);
that.addJob ( },
that.newStorage( priv.secondstorage_spec ), cloned_doc = command.cloneDoc();
newcommand ); cloned_doc._id = new_file_name;
cloned_doc.content = new_file_content;
that.addJob ('put',priv.secondstorage_spec,cloned_doc,
command.cloneOption(),success,error);
}; };
am.wait(o,'save',1); am.wait(o,'save',1);
am.call(o,'encryptFilePath'); am.call(o,'encryptFilePath');
am.call(o,'encryptFileContent'); am.call(o,'encryptFileContent');
}; // end saveDocument }; // end put
/** /**
* Loads a document. * Loads a document.
* @method loadDocument * @method get
*/ */
that.loadDocument = function (command) { that.get = function (command) {
var new_file_name, option, am = priv.newAsyncModule(), o = {}; var new_file_name, option, am = priv.newAsyncModule(), o = {};
o.encryptFilePath = function () { o.encryptFilePath = function () {
priv.encrypt(command.getPath(),function(res) { priv.encrypt(command.getDocId(),function(res) {
new_file_name = res; new_file_name = res;
am.call(o,'loadDocument'); am.call(o,'get');
}); });
}; };
o.loadDocument = function () { o.get = function () {
var settings = command.cloneOption(), newcommand; that.addJob('get',priv.secondstorage_spec,new_file_name,
settings.error = o.loadOnError; command.cloneOption(),o.success,o.error);
settings.success = o.loadOnSuccess;
newcommand = that.newCommand (
'loadDocument',
{path:new_file_name,option:settings});
that.addJob (
that.newStorage ( priv.secondstorage_spec ), newcommand );
}; };
o.loadOnSuccess = function (result) { o.success = function (val) {
result.name = command.getPath(); val._id = command.getDocId();
if (command.getOption('metadata_only')) { if (command.getOption('metadata_only')) {
that.success(result); that.success (val);
} else { } else {
priv.decrypt (result.content, function(err,res){ priv.decrypt (val.content, function(err,res){
if (err) { if (err) {
that.error(err); that.error(err);
} else { } else {
result.content = res; val.content = res;
// content only: the second storage should that.success (val);
// manage content_only option, so it is not
// necessary to manage it.
that.success(result);
} }
}); });
} }
}; };
o.loadOnError = function (error) { o.error = function (error) {
// NOTE : we can re create an error object instead of
// keep the old ex:status=404,message="document 1y59gyl8g
// not found in localStorage"...
that.error(error); that.error(error);
}; };
am.call(o,'encryptFilePath'); am.call(o,'encryptFilePath');
}; // end loadDocument }; // end get
/** /**
* Gets a document list. * Gets a document list.
* @method getDocumentList * @method allDocs
*/ */
that.getDocumentList = function (command) { that.allDocs = function (command) {
var result_array = [], am = priv.newAsyncModule(), o = {}; var result_array = [], am = priv.newAsyncModule(), o = {};
o.getDocumentList = function () { o.allDocs = function () {
var settings = command.cloneOption(); that.addJob ('allDocs', priv.secondstorage_spec, null,
settings.success = o.getListOnSuccess; command.cloneOption(), o.onSuccess, o.error);
settings.error = o.getListOnError;
that.addJob (
that.newStorage ( priv.secondstorage_spec ),
that.newCommand ( 'getDocumentList', {path:command.getPath(),
option:settings}) );
}; };
o.getListOnSuccess = function (result) { o.onSuccess = function (val) {
result_array = result; if (val.total_rows === 0) {
return am.call(o,'success');
}
result_array = val.rows;
var i, decrypt = function (c) { var i, decrypt = function (c) {
priv.decrypt (result_array[c].name,function (err,res) { priv.decrypt (result_array[c].id,function (err,res) {
if (err) { if (err) {
am.call(o,'error',[err]); am.call(o,'error',[err]);
} else { } else {
am.call(o,'pushResult',[res,c,'name']); result_array[c].id = res;
result_array[c].key = res;
am.call(o,'success');
} }
}); });
if (!command.getOption('metadata_only')) { if (!command.getOption('metadata_only')) {
priv.decrypt (result_array[c].content,function (err,res) { priv.decrypt (
result_array[c].value.content,
function (err,res) {
if (err) { if (err) {
am.call(o,'error',[err]); am.call(o,'error',[err]);
} else { } else {
am.call(o,'pushResult',[res,c,'content']); result_array[c].value.content = res;
am.call(o,'success');
} }
}); });
} }
}; };
if (command.getOption('metadata_only')) { if (command.getOption('metadata_only')) {
am.wait(o,'success',result.length-1); am.wait(o,'success',val.total_rows*1-1);
} else { } else {
am.wait(o,'success',result.length*2-1); am.wait(o,'success',val.total_rows*2-1);
} }
for (i = 0; i < result_array.length; i+= 1) { for (i = 0; i < result_array.length; i+= 1) {
decrypt(i); decrypt(i);
} }
}; };
o.getListOnError = function (error) {
am.call(o,'error',[error]);
};
o.pushResult = function (result,index,key) {
result_array[index][key] = result;
am.call(o,'success');
};
o.error = function (error) { o.error = function (error) {
am.end(); am.end();
that.error (error); that.error (error);
}; };
o.success = function () { o.success = function () {
am.end(); am.end();
that.success (result_array); that.success ({total_rows:result_array.length,rows:result_array});
}; };
am.call(o,'getDocumentList'); am.call(o,'allDocs');
}; // end getDocumentList }; // end allDocs
/** /**
* Removes a document. * Removes a document.
* @method removeDocument * @method remove
*/ */
that.removeDocument = function (command) { that.remove = function (command) {
var new_file_name, o = {}; var new_file_name, o = {};
o.encryptFilePath = function () { o.encryptDocId = function () {
priv.encrypt(command.getPath(),function(res) { priv.encrypt(command.getDocId(),function(res) {
new_file_name = res; new_file_name = res;
o.removeDocument(); o.removeDocument();
}); });
}; };
o.removeDocument = function () { o.removeDocument = function () {
var cloned_option = command.cloneOption(); var cloned_doc = command.cloneDoc();
cloned_option.error = o.removeOnError; cloned_doc._id = new_file_name;
cloned_option.success = o.removeOnSuccess; that.addJob ('remove', priv.secondstorage_spec, cloned_doc,
that.addJob(that.newStorage(priv.secondstorage_spec), command.cloneOption(), o.success, that.error);
that.newCommand(
'removeDocument',
{path:new_file_name,
option:cloned_option}));
}; };
o.removeOnSuccess = function (result) { o.success = function (val) {
that.success(); val.id = command.getDocId();
}; that.success (val);
o.removeOnError = function (error) {
that.error (error);
};
o.encryptFilePath();
}; };
o.encryptDocId();
}; // end remove
return that; return that;
}; };
Jio.addStorageType('crypt', newCryptedStorage); Jio.addStorageType('crypt', newCryptedStorage);
...@@ -1157,29 +1157,27 @@ test ('Document save' , function () { ...@@ -1157,29 +1157,27 @@ test ('Document save' , function () {
storage:{type:'local', storage:{type:'local',
username:'cryptsavelocal', username:'cryptsavelocal',
applicationname:'jiotests'}}); applicationname:'jiotests'}});
o.f = function (result) { o.f = function (err,val) {
if (!result) { if (err) {
result = 'done'; err = err.status;
} else {
result = 'fail';
} }
deepEqual (result,'done','save ok'); deepEqual (err || val,{ok:true,id:'testsave'},'save ok');
}; };
this.spy(o,'f'); this.spy(o,'f');
o.jio.saveDocument('testsave','contentoftest',{success:o.f,error:o.f}); o.jio.put({_id:'testsave',content:'contentoftest'},o.f);
clock.tick(1000); clock.tick(1000);
if (!o.f.calledOnce) { if (!o.f.calledOnce) {
ok (false, 'no response / too much results'); ok (false, 'no response / too much results');
} }
// encrypt 'testsave' with 'cryptsave:mypwd' password // encrypt 'testsave' with 'cryptsave:mypwd' password
o.tmp = LocalOrCookieStorage.getItem( o.tmp = LocalOrCookieStorage.getItem( // '/' = '%2F'
'jio/local/cryptsavelocal/jiotests/rZx5PJxttlf9QpZER/5x354bfX54QFa1'); 'jio/local/cryptsavelocal/jiotests/rZx5PJxttlf9QpZER%2F5x354bfX54QFa1');
if (o.tmp) { if (o.tmp) {
delete o.tmp.last_modified; delete o.tmp._last_modified;
delete o.tmp.creation_date; delete o.tmp._creation_date;
} }
deepEqual (o.tmp, deepEqual (o.tmp,
{name:'rZx5PJxttlf9QpZER/5x354bfX54QFa1', {_id:'rZx5PJxttlf9QpZER/5x354bfX54QFa1',
content:'upZkPIpitF3QMT/DU5jM3gP0SEbwo1n81rMOfLE'}, content:'upZkPIpitF3QMT/DU5jM3gP0SEbwo1n81rMOfLE'},
'Check if the document is realy encrypted'); 'Check if the document is realy encrypted');
o.jio.stop(); o.jio.stop();
...@@ -1194,26 +1192,20 @@ test ('Document load' , function () { ...@@ -1194,26 +1192,20 @@ test ('Document load' , function () {
storage:{type:'local', storage:{type:'local',
username:'cryptloadlocal', username:'cryptloadlocal',
applicationname:'jiotests'}}); applicationname:'jiotests'}});
o.f = function (result) { o.f = function (err,val) {
if (result && !result.status) { deepEqual (err || val,{
deepEqual (result, _id:'testload',content:'contentoftest',
{name:'testload', _last_modified:500,_creation_date:500},'load ok');
content:'contentoftest',
last_modified:500,
creation_date:500},
'load ok');
} else {
ok (false ,'cannot load');
}
}; };
this.spy(o,'f'); this.spy(o,'f');
// encrypt 'testload' with 'cryptload:mypwd' password // encrypt 'testload' with 'cryptload:mypwd' password
// and 'contentoftest' with 'cryptload:mypwd' // and 'contentoftest' with 'cryptload:mypwd'
o.doc = {name:'hiG4H80pwkXCCrlLl1X0BD0BfWLZwDUX', o.doc = {
_id:'hiG4H80pwkXCCrlLl1X0BD0BfWLZwDUX',
content:'kSulH8Qo105dSKHcY2hEBXWXC9b+3PCEFSm1k7k', content:'kSulH8Qo105dSKHcY2hEBXWXC9b+3PCEFSm1k7k',
last_modified:500,creation_date:500}; _last_modified:500,_creation_date:500};
addFileToLocalStorage('cryptloadlocal','jiotests',o.doc); addFileToLocalStorage('cryptloadlocal','jiotests',o.doc);
o.jio.loadDocument('testload',{success:o.f,error:o.f}); o.jio.get('testload',o.f);
clock.tick(1000); clock.tick(1000);
if (!o.f.calledOnce) { if (!o.f.calledOnce) {
ok (false, 'no response / too much results'); ok (false, 'no response / too much results');
...@@ -1230,13 +1222,9 @@ test ('Get Document List', function () { ...@@ -1230,13 +1222,9 @@ test ('Get Document List', function () {
storage:{type:'local', storage:{type:'local',
username:'cryptgetlistlocal', username:'cryptgetlistlocal',
applicationname:'jiotests'}}); applicationname:'jiotests'}});
o.f = function (result) { o.f = function (err,val) {
if (result && !result.status) { deepEqual (err || objectifyDocumentArray(val.rows),
deepEqual (objectifyDocumentArray(result),
objectifyDocumentArray(o.doc_list),'Getting list'); objectifyDocumentArray(o.doc_list),'Getting list');
} else {
ok (false, 'Cannot get list');
}
}; };
o.tick = function (tick) { o.tick = function (tick) {
clock.tick (tick || 1000); clock.tick (tick || 1000);
...@@ -1249,29 +1237,32 @@ test ('Get Document List', function () { ...@@ -1249,29 +1237,32 @@ test ('Get Document List', function () {
} }
}; };
this.spy(o,'f'); this.spy(o,'f');
o.doc_list = [ o.doc_list = [{
{name:'testgetlist1',last_modified:500,creation_date:200}, id:'testgetlist1',key:'testgetlist1',value:{
{name:'testgetlist2',last_modified:300,creation_date:300} _last_modified:500,_creation_date:200}
]; },{
id:'testgetlist2',key:'testgetlist2',value:{
_last_modified:300,_creation_date:300}
}];
o.doc_encrypt_list = [ o.doc_encrypt_list = [
{name:'541eX0WTMDw7rqIP7Ofxd1nXlPOtejxGnwOzMw', {_id:'541eX0WTMDw7rqIP7Ofxd1nXlPOtejxGnwOzMw',
content:'/4dBPUdmLolLfUaDxPPrhjRPdA', content:'/4dBPUdmLolLfUaDxPPrhjRPdA',
last_modified:500,creation_date:200}, _last_modified:500,_creation_date:200},
{name:'541eX0WTMDw7rqIMyJ5tx4YHWSyxJ5UjYvmtqw', {_id:'541eX0WTMDw7rqIMyJ5tx4YHWSyxJ5UjYvmtqw',
content:'/4FBALhweuyjxxD53eFQDSm4VA', content:'/4FBALhweuyjxxD53eFQDSm4VA',
last_modified:300,creation_date:300} _last_modified:300,_creation_date:300}
]; ];
// encrypt with 'cryptgetlist:mypwd' as password // encrypt with 'cryptgetlist:mypwd' as password
LocalOrCookieStorage.setItem( LocalOrCookieStorage.setItem(
'jio/local_file_name_array/cryptgetlistlocal/jiotests', 'jio/local_file_name_array/cryptgetlistlocal/jiotests',
[o.doc_encrypt_list[0].name,o.doc_encrypt_list[1].name]); [o.doc_encrypt_list[0]._id,o.doc_encrypt_list[1]._id]);
LocalOrCookieStorage.setItem( LocalOrCookieStorage.setItem(
'jio/local/cryptgetlistlocal/jiotests/'+o.doc_encrypt_list[0].name, 'jio/local/cryptgetlistlocal/jiotests/'+o.doc_encrypt_list[0]._id,
o.doc_encrypt_list[0]); o.doc_encrypt_list[0]);
LocalOrCookieStorage.setItem( LocalOrCookieStorage.setItem(
'jio/local/cryptgetlistlocal/jiotests/'+o.doc_encrypt_list[1].name, 'jio/local/cryptgetlistlocal/jiotests/'+o.doc_encrypt_list[1]._id,
o.doc_encrypt_list[1]); o.doc_encrypt_list[1]);
o.jio.getDocumentList('.',{success:o.f,error:o.f}); o.jio.allDocs(o.f);
o.tick(10000); o.tick(10000);
o.jio.stop(); o.jio.stop();
...@@ -1286,20 +1277,15 @@ test ('Remove document', function () { ...@@ -1286,20 +1277,15 @@ test ('Remove document', function () {
storage:{type:'local', storage:{type:'local',
username:'cryptremovelocal', username:'cryptremovelocal',
applicationname:'jiotests'}}); applicationname:'jiotests'}});
o.f = function (result) { o.f = function (err,val) {
if (!result) { deepEqual (err || val,{ok:true,id:'file'},'Document remove');
result = 'done';
} else {
result = 'fail';
}
deepEqual (result,'done','Document remove');
}; };
this.spy(o,'f'); this.spy(o,'f');
// encrypt with 'cryptremove:mypwd' as password // encrypt with 'cryptremove:mypwd' as password
o.doc = {name:'JqCLTjyxQqO9jwfxD/lyfGIX+qA', o.doc = {_id:'JqCLTjyxQqO9jwfxD/lyfGIX+qA',
content:'LKaLZopWgML6IxERqoJ2mUyyO', content:'LKaLZopWgML6IxERqoJ2mUyyO',
last_modified:500,creation_date:500}; _last_modified:500,_creation_date:500};
o.jio.removeDocument('file',{success:o.f,error:o.f}); o.jio.remove({_id:'file'},o.f);
clock.tick(1000); clock.tick(1000);
if (!o.f.calledOnce){ if (!o.f.calledOnce){
ok (false, 'no response / too much results'); ok (false, 'no response / too much results');
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment