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:
@@ -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"
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 () {
|
||||
|
||||
Reference in New Issue
Block a user