1
0
mirror of http://git.whoc.org.uk/git/password-manager.git synced 2025-10-25 17:47:34 +02:00

Implemented Attachments in client

This commit is contained in:
Dario Chiappetta
2015-11-23 16:10:44 +01:00
parent 8608fb4253
commit 8c59393433
50 changed files with 4862 additions and 272 deletions

View File

@@ -62,7 +62,7 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.JSON, Clipperz.PM.Proxy, {
//=========================================================================
'_sendMessage': function(aFunctionName, aVersion, someParameters) {
'_sendMessage': function(aFunctionName, aVersion, someParameters, someOptionalParameters) {
var deferredResult;
var parameters;
@@ -71,13 +71,19 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.JSON, Clipperz.PM.Proxy, {
version: aVersion,
parameters: Clipperz.Base.serializeJSON(someParameters)
};
someOptionalParameters = someOptionalParameters || {};
//console.log("PROXY.JSON._sendMessage", parameters);
deferredResult = new Clipperz.Async.Deferred("Proxy.JSON._sendMessage", {trace:false});
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestSent');
deferredResult.addCallback(MochiKit.Async.doXHR, this.url(), {
deferredResult.addCallback(Clipperz.Async.doXHR, this.url(), {
// deferredResult.addCallback(MochiKit.Async.doXHR, this.url(), {
method:'POST',
sendContent:MochiKit.Base.queryString(parameters),
headers:{"Content-Type":"application/x-www-form-urlencoded"}
headers:{"Content-Type":"application/x-www-form-urlencoded"},
// downloadProgress:someOptionalParameters['downloadProgressCallback'] || null,
// uploadProgress:someOptionalParameters['uploadProgressCallback'] || null,
});
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestReceived');
deferredResult.addCallback(MochiKit.Base.itemgetter('responseText'));
@@ -94,6 +100,114 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.JSON, Clipperz.PM.Proxy, {
return deferredResult;
},
//-------------------------------------------------------------------------
// TODO: test
'_uploadAttachment': function(someArguments, aProgressCallback, aSharedSecret, aToll) {
var formData;
var deferredResult;
var parameters = {
'toll': aToll,
'parameters': {
'message': 'uploadAttachment',
'srpSharedSecret': aSharedSecret,
'parameters': {
'attachmentReference': someArguments['attachmentReference'],
'recordReference': someArguments['recordReference'],
'version': someArguments['version']
}
}
}
var blob = new Blob([someArguments['arrayBufferData']]);
formData = new FormData();
formData.append('method', 'message');
formData.append('version', 'fake-app-version'); // Not implemented anywhere yet
formData.append('parameters', JSON.stringify(parameters));
formData.append('data', blob);
deferredResult = new Clipperz.Async.Deferred("Proxy.JSON._sendMessage", {trace:false});
//deferredResult.addCallback(function(){console.log("About to send request");});
deferredResult.addCallback(Clipperz.Async.doXHR, this.url(), {
method:'POST',
sendContent:formData,
// headers:{"Content-Type":"application/x-www-form-urlencoded"},
uploadProgress: aProgressCallback || null,
});
//deferredResult.addCallback(function(something){console.log("Done sending request"); return something;});
deferredResult.addCallback(function (someValues) {
if (someValues['result'] == 'EXCEPTION') {
throw someValues['message'];
}
// TODO: check return value with actual request. Expected: ArrayBuffer
return someValues;
});
deferredResult.callback();
return deferredResult;
},
// TODO: test
'_downloadAttachment': function(someArguments, aProgressCallback, aSharedSecret, aToll) {
var deferredResult;
var parameters;
var innerParameters = {
'toll': aToll,
'parameters': {
'message': 'downloadAttachment',
'srpSharedSecret': aSharedSecret,
'parameters': {
'reference': someArguments['reference']
}
}
}
parameters = {
method: 'message',
version: 'fake-app-version',
parameters: Clipperz.Base.serializeJSON(innerParameters)
};
deferredResult = new Clipperz.Async.Deferred("Proxy.JSON._downloadAttachment", {trace:false});
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestSent');
//deferredResult.addCallback(function(){console.log("About to send request");});
deferredResult.addCallback(Clipperz.Async.doXHR, this.url(), {
method:'POST',
responseType:'arraybuffer',
sendContent:MochiKit.Base.queryString(parameters),
headers:{"Content-Type":"application/x-www-form-urlencoded"},
downloadProgress:aProgressCallback || null,
});
deferredResult.addCallback(
function(something){
// console.log("Done sending request", something);
return something;
});
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestReceived');
deferredResult.addCallback(MochiKit.Base.itemgetter('response'));
deferredResult.addCallback(function (anArrayBuffer) {
var result = (anArrayBuffer.byteLength > 0) ? anArrayBuffer : false;
var DEBUG = 'PUT_A_BREAKPOINT_HERE';
return {
result: anArrayBuffer,
};
})
// deferredResult.addErrback(function(something) {
// return something;
// });
deferredResult.callback();
return deferredResult;
},
//=========================================================================
__syntaxFix__: "syntax fix"

View File

@@ -37,6 +37,8 @@ Clipperz.PM.Proxy.Offline.DataStore = function(args) {
this._tolls = {};
this._currentStaticConnection = null;
this.NETWORK_SIMULATED_SPEED = 100*1024;
return this;
}
@@ -233,9 +235,9 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
//=========================================================================
'processMessage': function (aFunctionName, someParameters) {
'processMessage': function (aFunctionName, someParameters, someOptionalParameters) {
var deferredResult;
try {
var result;
var connection;
@@ -266,7 +268,7 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
this.storeConnectionForRequestWithConnectionAndResponse(aFunctionName, someParameters, connection, result);
deferredResult = MochiKit.Async.succeed(result);
deferredResult = MochiKit.Async.succeed(result)
} catch (exception) {
deferredResult = MochiKit.Async.fail(exception);
}
@@ -274,6 +276,69 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
return deferredResult;
},
//-------------------------------------------------------------------------
uploadAttachment: function(someArguments, aProgressCallback, aSharedSecret, aToll) {
var connection = this.currentStaticConnection();
var attachmentReference = someArguments['attachmentReference'];
if (this.isReadOnly() == false) {
connection['userData']['attachments'][attachmentReference] = {
'record': someArguments['recordReference'],
'status': 'AVAILABLE',
'data': someArguments['arrayBufferData'],
'version': someArguments['version'],
};
return this.simulateNetworkDelayResponse(someArguments['arrayBufferData'].length, aProgressCallback, {
result: {},
toll: this.getTollForRequestType('MESSAGE')
});
} else {
throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
}
},
downloadAttachment: function(someArguments, aProgressCallback, aSharedSecret, aToll) {
var connection = this.currentStaticConnection();
var reference = someArguments['reference'];
var result = connection['userData']['attachments'][reference]['data'];
return this.simulateNetworkDelayResponse(result.length, aProgressCallback, {
result: result,
// toll: this.getTollForRequestType('MESSAGE')
});
},
simulateNetworkDelayResponse: function(payloadSize, progressCallback, aResponse) {
var deferredResult;
var i;
deferredResult = new Clipperz.Async.Deferred("Proxy.Offline.DataStore.simulateNetworkDelay", {trace:false});
for (i = 0; i < payloadSize/this.NETWORK_SIMULATED_SPEED; i++) {
var loaded = i*this.NETWORK_SIMULATED_SPEED;
deferredResult.addCallback(MochiKit.Async.wait, 1);
deferredResult.addMethod(this, 'runProgressCallback', progressCallback, loaded, payloadSize);
}
deferredResult.addCallback(MochiKit.Async.succeed, aResponse);
deferredResult.callback();
return deferredResult;
},
runProgressCallback: function(aCallback, aLoadedValue, aTotalValue) {
var fakeProgressEvent = {
'lengthComputable': true,
'loaded': aLoadedValue,
'total': aTotalValue,
}
return aCallback(fakeProgressEvent);
},
//=========================================================================
'_knock': function(aConnection, someParameters) {
@@ -340,7 +405,9 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
userData = this.data()['users'][someParameters.parameters.C];
otpsData = this.data()['onetimePasswords'];
//console.log("Proxy.Offline.DataStore._handshake: otpsData:", otpsData);
if (! userData['attachments']) {
userData['attachments'] = {};
}
userOTPs = {};
MochiKit.Base.map(function(aOTP) {
@@ -349,9 +416,6 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
}
},MochiKit.Base.values(otpsData));
//console.log("Proxy.Offline.DataStore._handshake: userOTPs:", userOTPs);
//console.log("Proxy.Offline.DataStore._handshake(): userOTPs:",userOTPs);
if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) {
aConnection['userData'] = userData;
aConnection['userOTPs'] = userOTPs;
@@ -455,7 +519,7 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
//-------------------------------------------------------------------------
'_message': function(aConnection, someParameters) {
'_message': function(aConnection, someParameters, someOptionalParameters) {
var result;
if (MochiKit.Base.keys(aConnection).length==0) {
@@ -499,8 +563,14 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
//=====================================================================
} else if (someParameters.message == 'getRecordDetail') {
MochiKit.Base.update(result, aConnection['userData']['records'][someParameters['parameters']['reference']]);
result['reference'] = someParameters['parameters']['reference'];
var reference = someParameters['parameters']['reference'];
MochiKit.Base.update(result, aConnection['userData']['records'][reference]);
result['reference'] = reference;
result['attachmentStatus'] = this.attachmentStatus(aConnection, reference);
//console.log('Proxy.getRecordDetail', result);
} else if (someParameters.message == 'getAllRecordDetails') {
MochiKit.Base.update(result, aConnection['userData']['records']);
} else if (someParameters.message == 'getOneTimePasswordsDetails') {
@@ -613,7 +683,9 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
*/ //=====================================================================
} else if (someParameters.message == 'saveChanges') {
if (this.isReadOnly() == false) {
var i, c;
//console.log("Proxy.Offline.DataStore.saveChanges: parameters:", someParameters);
//console.log("Proxy.Offline.DataStore.saveChanges: attachments:", aConnection['userData']['attachments']);
var i, c, j, d;
if (aConnection['userData']['lock'] != someParameters['parameters']['user']['lock']) {
throw "the lock attribute is not processed correctly"
@@ -664,8 +736,12 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
'accessDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date())
}
}
this.pruneAttachments(aConnection, currentRecordData['record']['reference'], currentRecordData['attachments']);
}
//console.log("Proxy.Offline.DataStore.saveChanges: attachments:", aConnection['userData']['attachments']);
c = someParameters['parameters']['records']['deleted'].length;
for (i=0; i<c; i++) {
var currentRecordReference;
@@ -731,7 +807,7 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
},MochiKit.Base.values(aConnection['userOTPs']));
} else {
throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
}
}
//=====================================================================
//
// U N H A N D L E D M e t h o d
@@ -816,10 +892,47 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
} else {
result = null;
}
return result;
},
'attachmentStatus': function(aConnection, aRecordReference) {
var result;
//console.log("Proxy.attachmentStatus: data:", aConnection['userData']['attachments']);
result = {};
if (aConnection['userData']['attachments']) {
var reference;
for (reference in aConnection['userData']['attachments']) {
//console.log("Proxy.attachmentStatus: -> comparison: serverRecordReference, aRecordReference", aConnection['userData']['attachments'][reference]['record'], aRecordReference);
if (aConnection['userData']['attachments'][reference]['record'] == aRecordReference) {
result[reference] = aConnection['userData']['attachments'][reference]['status'];
}
}
}
//console.log("Proxy.attachmentStatus: result:", result);
return result;
},
/** Removes all the stored attachments whose reference is not in the given list */
'pruneAttachments': function(aConnection, aRecordReference, someAttachmentReferences) {
if (aConnection['userData']['attachments']) {
var reference;
for (reference in aConnection['userData']['attachments']) {
var attachment = aConnection['userData']['attachments'][reference];
if ( (attachment['record'] == aRecordReference) &&
(someAttachmentReferences.indexOf(reference) < 0)
) {
delete aConnection['userData']['attachments'][reference];
}
}
}
},
/*
'userSerializedEncryptedData': function(someData) {
var deferredResult;

View File

@@ -53,10 +53,19 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline, Clipperz.PM.Proxy, {
//-------------------------------------------------------------------------
'_sendMessage': function(aFunctionName, aVersion, someParameters) {
return this.dataStore().processMessage(aFunctionName, someParameters);
'_sendMessage': function(aFunctionName, aVersion, someParameters, someOptionalParameters) {
return this.dataStore().processMessage(aFunctionName, someParameters, someOptionalParameters);
},
'_uploadAttachment': function(someArguments, aProgressCallback, aSharedSecret, aToll) {
return this.dataStore().uploadAttachment(someArguments, aProgressCallback, aSharedSecret, aToll);
},
'_downloadAttachment': function(someArguments, aProgressCallback, aSharedSecret, aToll) {
return this.dataStore().downloadAttachment(someArguments, aProgressCallback, aSharedSecret, aToll);
},
//-------------------------------------------------------------------------
'isReadOnly': function () {