-rw-r--r-- | frontend/beta/js/Clipperz/PM/Connection.js | 9 | ||||
-rw-r--r-- | frontend/beta/js/Clipperz/PM/DataModel/Record.js | 12 | ||||
-rw-r--r-- | frontend/beta/js/Clipperz/PM/DataModel/User.js | 17 |
3 files changed, 24 insertions, 14 deletions
diff --git a/frontend/beta/js/Clipperz/PM/Connection.js b/frontend/beta/js/Clipperz/PM/Connection.js index 85aea21..e81c7a6 100644 --- a/frontend/beta/js/Clipperz/PM/Connection.js +++ b/frontend/beta/js/Clipperz/PM/Connection.js @@ -267,69 +267,73 @@ deferredResult.addErrback(MochiKit.Base.bind(function(res) {MochiKit.Logging.log this.srpConnection().set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16)); this.srpConnection().set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16)); if (typeof(someParameters['oneTimePassword']) != 'undefined') { this.setOneTimePassword(someParameters['oneTimePassword']); } args = {}; args.message = 'credentialCheck'; args.version = this.clipperz_pm_crypto_version(); args.parameters = {}; args.parameters['M1'] = this.srpConnection().M1(); return args; }, this)); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.6 - Connection.login - 6: "/* + res*/); return res;}); //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake')); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.7 - Connection.login - 7: "/* + res*/); return res;}); //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); //# deferredResult.addCallback(MochiKit.Base.method(this, 'loginDone')); deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) { var result; //MochiKit.Logging.logDebug(">>> Connection.loginDone: " + this + " (M2: " + this.srpConnection().M2() + ")"); if (someParameters['M2'] == this.srpConnection().M2()) { result = new MochiKit.Async.Deferred(); //MochiKit.Logging.logDebug("--- Connection.loginDone - someParameters: " + Clipperz.Base.serializeJSON(someParameters)); this.setConnectionId(someParameters['connectionId']); this.user().setLoginInfo(someParameters['loginInfo']); this.user().setShouldDownloadOfflineCopy(someParameters['offlineCopyNeeded']); - this.user().setLock(someParameters['lock']); + + if ((isReconnecting == true) && (this.user().lock() != someParameters['lock'])) { + throw Clipperz.PM.Connection.exception.StaleData; + } if (this.oneTimePassword() != null) { result.addCallback(MochiKit.Base.method(this.user().oneTimePasswordManager(), 'archiveOneTimePassword', this.oneTimePassword())); } + result.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_loggedIn'); result.addCallback(MochiKit.Async.succeed, someParameters); result.callback(); //MochiKit.Logging.logDebug("--- Connection.loginDone - 1 - result: "/* + Clipperz.Base.serializeJSON(result)*/); } else { //MochiKit.Logging.logDebug("--- Connection.loginDone - 2 - ERROR"); //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum); } //MochiKit.Logging.logDebug("<<< Connection.loginDone - result: " + Clipperz.Base.serializeJSON(result)); return result; }, this)); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.8 - Connection.login - 8: "/* + res*/); return res;}); //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); deferredResult.callback(this); //MochiKit.Logging.logDebug("<<< Connection.login"); return deferredResult; }, //========================================================================= 'logout': function() { var deferredResult; //MochiKit.Logging.logDebug(">>> Connection.logout: " + this); deferredResult = new MochiKit.Async.Deferred(); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.logout - 1: " + res); return res;}); deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'logout'), {}); @@ -548,34 +552,35 @@ Clipperz.PM.Connection.SRP['1.1'].prototype = MochiKit.Base.update(new Clipperz. //----------------------------------------------------------------------------- 'C': function() { if (this._C == null) { this._C = this.hash()(new Clipperz.ByteArray(this.user().username() + this.user().passphrase())).toHexString().substring(2); } return this._C; }, //----------------------------------------------------------------------------- 'P': function() { if (this._P == null) { this._P = this.hash()(new Clipperz.ByteArray(this.user().passphrase() + this.user().username())).toHexString().substring(2); } return this._P; }, //----------------------------------------------------------------------------- 'hash': function() { return Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash; }, //----------------------------------------------------------------------------- __syntaxFix__: "syntax fix" }); Clipperz.PM.Connection.exception = { - WrongChecksum: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue") + WrongChecksum: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue"), + StaleData: new MochiKit.Base.NamedError("Stale data") }; diff --git a/frontend/beta/js/Clipperz/PM/DataModel/Record.js b/frontend/beta/js/Clipperz/PM/DataModel/Record.js index ffb45de..ecb6c37 100644 --- a/frontend/beta/js/Clipperz/PM/DataModel/Record.js +++ b/frontend/beta/js/Clipperz/PM/DataModel/Record.js @@ -610,69 +610,71 @@ console.log("Record.processData - currentVersionParameters", currentVersionParam aResult['version'] = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; return aResult; }, result); //MochiKit.Logging.logDebug("--- Record.encryptedData - 6"); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Record.encryptedData - 5: " + res); return res;}); deferredResult.callback(); //MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.encryptedData"); return deferredResult; }, //------------------------------------------------------------------------- 'syncDirectLoginReferenceValues': function() { //MochiKit.Logging.logDebug(">>> Record.syncDirectLoginReferenceValues"); MochiKit.Iter.forEach(MochiKit.Base.values(this.directLogins()), function(aDirectLogin) { aDirectLogin.record().user().synchronizeDirectLogin(aDirectLogin); }); MochiKit.Iter.forEach(this.removedDirectLogins(), function(aDirectLogin) { aDirectLogin.record().user().removeDirectLogin(aDirectLogin); }); this.resetRemovedDirectLogins(); //MochiKit.Logging.logDebug("<<< Record.syncDirectLoginReferenceValues"); }, //------------------------------------------------------------------------- 'saveChanges': function() { var result; - if (this.isBrandNew() == false) { - result = this.user().saveRecords([this], 'updateData'); - } else { - result = this.user().saveRecords([this], 'addNewRecords'); - } +// if (this.isBrandNew() == false) { +// result = this.user().saveRecords([this], 'updateData'); +// } else { +// result = this.user().saveRecords([this], 'addNewRecords'); +// } + + result = this.user().saveRecords([this]); return result; }, /* 'saveChanges': function() { var deferredResult; var result; Clipperz.NotificationCenter.notify(this.user(), 'updatedSection', 'records', true); //MochiKit.Logging.logDebug(">>> Record.saveChanges"); //MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.saveChanges"); if (this.headerNotes() != null) { this.setNotes(this.headerNotes()); } this.syncDirectLoginReferenceValues(); this.currentVersion().createNewVersion(); result = {'records': [{}]}; deferredResult = new MochiKit.Async.Deferred(); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_collectRecordInfo'); deferredResult.addCallback(MochiKit.Base.method(this, 'updateKey')); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_encryptUserData'); deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData')); deferredResult.addCallback(function(aResult, res) { aResult['user'] = res; return aResult; }, result); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_encryptRecordData'); diff --git a/frontend/beta/js/Clipperz/PM/DataModel/User.js b/frontend/beta/js/Clipperz/PM/DataModel/User.js index dbbe9a0..b065557 100644 --- a/frontend/beta/js/Clipperz/PM/DataModel/User.js +++ b/frontend/beta/js/Clipperz/PM/DataModel/User.js @@ -256,72 +256,72 @@ MochiKit.Logging.logError("- User.errorHandler: " + anErrorString + " (" + anExc 'records': function() { return this._records; }, //......................................................................... 'addRecord': function(aValue, isBatchUpdate) { this.records()[aValue.reference()] = aValue; if (isBatchUpdate != true) { Clipperz.NotificationCenter.notify(aValue, 'recordAdded', null, true); Clipperz.NotificationCenter.notify(this, 'updatedSection', 'records', true); } }, //----------------------------------------------------------------------------- 'addNewRecord': function() { var record; //MochiKit.Logging.logDebug(">>> User.addNewRecord"); record = new Clipperz.PM.DataModel.Record({user:this}); this.addRecord(record); Clipperz.NotificationCenter.notify(this, 'updatedSection', 'records', true); //MochiKit.Logging.logDebug("<<< User.addNewRecord"); return record; }, //------------------------------------------------------------------------- - 'saveRecords': function(someRecords, aMethodName) { + 'saveRecords': function(someRecords /*, aMethodName*/) { var deferredResult; - var methodName; +// var methodName; var result; var i,c; //console.log("User.saveRecords - someRecords", someRecords); - methodName = aMethodName || 'addNewRecords'; +// methodName = aMethodName || 'addNewRecords'; Clipperz.NotificationCenter.notify(this, 'updatedSection', 'records', true); //MochiKit.Logging.logDebug(">>> User.saveRecords"); //MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] User.saveRecords"); /* MochiKit.Logging.logDebug("--- User.saveRecords - 1"); MochiKit.Iter.forEach(someRecords, function(aRecord) { if (aRecord.headerNotes() != null) { aRecord.setNotes(aRecord.headerNotes()); } aRecord.syncDirectLoginReferenceValues(); aRecord.currentVersion().createNewVersion(); aRecord.updateKey(); }); MochiKit.Logging.logDebug("--- User.saveRecords - 2"); */ result = {'records': []}; deferredResult = new MochiKit.Async.Deferred(); c = someRecords.length; for (i=0; i<c; i++) { deferredResult.addCallback(function(aRecord) { if (aRecord.headerNotes() != null) { aRecord.setNotes(aRecord.headerNotes()); } aRecord.syncDirectLoginReferenceValues(); aRecord.currentVersion().createNewVersion(); aRecord.updateKey(); }, someRecords[i]); deferredResult.addCallback(MochiKit.Async.wait, 0.1); } @@ -338,146 +338,149 @@ MochiKit.Logging.logDebug("--- User.saveRecords - 2"); return aResult; }, result); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 5 " + res); return res;}); c = someRecords.length; for (i=0; i<c; i++) { var recordData; recordData = {}; //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.1 " + res); return res;}); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_encryptRecordData'); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.2 " + res); return res;}); deferredResult.addCallback(MochiKit.Base.method(someRecords[i], 'encryptedData')); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.3 " + res); return res;}); deferredResult.addCallback(function(aResult, res) { aResult['record'] = res; return aResult; }, recordData); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.4 " + res); return res;}); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', {} /*'saveCard_encryptRecordVersions'*/); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.5 " + res); return res;}); deferredResult.addCallback(MochiKit.Base.method(someRecords[i].currentVersion(), 'encryptedData')); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.6 " + res); return res;}); deferredResult.addCallback(function(aResult, res) { aResult['currentRecordVersion'] = res; return aResult; }, recordData); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.7 " + res); return res;}); deferredResult.addCallback(function(aResult, res) { - aResult['records'].push(res); + aResult['records'] = { 'updated': [res] }; return aResult; }, result); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.8 " + res); return res;}); } //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 7 " + res); return res;}); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_sendingData'); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 8 " + res); return res;}); - deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), methodName); +// deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), methodName); + deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), 'saveChanges'); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 9 " + res); return res;}); for (i=0; i<c; i++) { //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 9.1 " + res); return res;}); deferredResult.addCallback(MochiKit.Base.method(someRecords[i], 'takeSnapshotOfCurrentData')); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 9.2 " + res); return res;}); deferredResult.addCallback(MochiKit.Base.method(someRecords[i], 'setIsBrandNew'), false); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 9.3 " + res); return res;}); } //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 10 " + res); return res;}); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'recordUpdated'); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 11 " + res); return res;}); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'directLoginUpdated'); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 12 " + res); return res;}); deferredResult.callback(); return deferredResult; }, //------------------------------------------------------------------------- 'removeRecord': function(aRecord) { //MochiKit.Logging.logDebug(">>> User.removeRecord"); delete this.records()[aRecord.reference()]; //MochiKit.Logging.logDebug("--- User.removeRecord - 1"); Clipperz.NotificationCenter.notify(aRecord, 'recordRemoved', null, false); Clipperz.NotificationCenter.notify(this, 'updatedSection', 'records', true); //MochiKit.Logging.logDebug("<<< User.removeRecord"); }, //------------------------------------------------------------------------- 'deleteRecordsAction': function(someRecords) { var deferredResult; var parameters; //MochiKit.Logging.logDebug(">>> User.deleteRecordsAction - someRecords.length: " + someRecords.length); parameters = {}; deferredResult = new MochiKit.Async.Deferred(); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 1 " + res); return res;}); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'deleteRecord_collectData'); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 2 " + res); return res;}); deferredResult.addCallback(function(someParameters, someRecords) { var recordReferences; recordReferences = MochiKit.Base.map(function(aRecord) { var result; result = aRecord.reference(); aRecord.remove(); return result; }, someRecords); - someParameters.recordReferences = recordReferences; +// someParameters.recordReferences = recordReferences; + someParameters['records'] = { 'deleted': recordReferences}; return someParameters; }, parameters); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 3 " + res); return res;}); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'deleteRecord_encryptData'); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 4 " + res); return res;}); deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData')); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 5 " + res); return res;}); deferredResult.addCallback(function(someParameters, anUserEncryptedData) { someParameters.user = anUserEncryptedData; return someParameters; }, parameters); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 6 " + res); return res;}); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'deleteRecord_sendingData'); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecords parameters: " + Clipperz.Base.serializeJSON(res)); return res;}); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 7 " + res); return res;}); - deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), 'deleteRecords'); +// deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), 'deleteRecords'); + deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), 'saveChanges'); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 8 " + res); return res;}); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'deleteRecord_updatingInterface'); //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 9 " + res); return res;}); deferredResult.callback(someRecords); //MochiKit.Logging.logDebug("<<< User.deleteRecordsAction"); return deferredResult; }, //------------------------------------------------------------------------- 'resetAllLocalData': function() { this.resetConnection(); this.setUsername(""); this.setPassphrase(""); this._header = null; this._statistics = null; this._preferences = null; this._records = {}; this._directLoginReferences = {}; }, //------------------------------------------------------------------------- 'deleteAccountAction': function() { var deferredResult; //MochiKit.Logging.logDebug(">>> user.deleteAccountAction - " + this); deferredResult = new MochiKit.Async.Deferred(); deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), 'deleteUser'); |