summaryrefslogtreecommitdiff
path: root/frontend/gamma/js/Clipperz/PM/DataModel/User.js
Unidiff
Diffstat (limited to 'frontend/gamma/js/Clipperz/PM/DataModel/User.js') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.js20
1 files changed, 10 insertions, 10 deletions
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.js
index 72d4006..646ce21 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.js
@@ -1,814 +1,814 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz Community Edition.
6Clipperz Community Edition is an online password manager. 6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 7For further information about its features and functionalities please
8refer to http://www.clipperz.com. 8refer to http://www.clipperz.com.
9 9
10* Clipperz Community Edition is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
11 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
12 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
13 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
14 14
15* Clipperz Community Edition is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
19 19
20* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 21 License along with Clipperz Community Edition. If not, see
22 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
23 23
24*/ 24*/
25 25
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
29 29
30 30
31//############################################################################# 31//#############################################################################
32 32
33Clipperz.PM.DataModel.User = function (args) { 33Clipperz.PM.DataModel.User = function (args) {
34 args = args || {}; 34 args = args || {};
35 35
36 Clipperz.PM.DataModel.User.superclass.constructor.apply(this, arguments); 36 Clipperz.PM.DataModel.User.superclass.constructor.apply(this, arguments);
37 37
38 this._username = args.username || null; 38 this._username = args.username || null;
39 this._getPassphraseFunction = args.getPassphraseFunction || null; 39 this._getPassphraseFunction = args.getPassphraseFunction || null;
40 40
41 this._data = null; 41 this._data = null;
42 42
43 this._connection = null; 43 this._connection = null;
44 this._connectionVersion = 'current'; 44 this._connectionVersion = 'current';
45 45
46 this._serverData = null; 46 this._serverData = null;
47 this._serverLockValue = null; 47 //this._serverLockValue = null;
48 this._transientState = null; 48 this._transientState = null;
49 49
50 this._deferredLocks = { 50 this._deferredLocks = {
51 'passphrase': new MochiKit.Async.DeferredLock(), 51 'passphrase': new MochiKit.Async.DeferredLock(),
52 'serverData': new MochiKit.Async.DeferredLock(), 52 'serverData': new MochiKit.Async.DeferredLock(),
53 // 'recordsIndex': new MochiKit.Async.DeferredLock(), 53 // 'recordsIndex': new MochiKit.Async.DeferredLock(),
54 // 'directLoginsIndex':new MochiKit.Async.DeferredLock() 54 // 'directLoginsIndex':new MochiKit.Async.DeferredLock()
55 // 'preferences': new MochiKit.Async.DeferredLock() 55 // 'preferences': new MochiKit.Async.DeferredLock()
56 // 'oneTimePasswords': new MochiKit.Async.DeferredLock() 56 // 'oneTimePasswords': new MochiKit.Async.DeferredLock()
57 '__syntaxFix__': 'syntax fix' 57 '__syntaxFix__': 'syntax fix'
58 }; 58 };
59 59
60 return this; 60 return this;
61} 61}
62 62
63Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, { 63Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, {
64 64
65 'toString': function () { 65 'toString': function () {
66 return "Clipperz.PM.DataModel.User - " + this.username(); 66 return "Clipperz.PM.DataModel.User - " + this.username();
67 }, 67 },
68 68
69 //------------------------------------------------------------------------- 69 //-------------------------------------------------------------------------
70 70
71 'username': function () { 71 'username': function () {
72 return this._username; 72 return this._username;
73 }, 73 },
74 74
75 'setUsername': function (aValue) { 75 'setUsername': function (aValue) {
76 this._username = aValue; 76 this._username = aValue;
77 }, 77 },
78 78
79 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
80 80
81 'displayName': function() { 81 'displayName': function() {
82 return "" + this.username() + ""; 82 return "" + this.username() + "";
83 }, 83 },
84 84
85 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
86 86
87 'data': function () { 87 'data': function () {
88 if (this._data == null) { 88 if (this._data == null) {
89 this._data = new Clipperz.KeyValueObjectStore(/*{'name':'User.data [1]'}*/); 89 this._data = new Clipperz.KeyValueObjectStore(/*{'name':'User.data [1]'}*/);
90 }; 90 };
91 91
92 return this._data; 92 return this._data;
93 }, 93 },
94 94
95 //------------------------------------------------------------------------- 95 //-------------------------------------------------------------------------
96 96/*
97 'serverLockValue': function () { 97 'serverLockValue': function () {
98 return this._serverLockValue; 98 return this._serverLockValue;
99 }, 99 },
100 100
101 'setServerLockValue': function (aValue) { 101 'setServerLockValue': function (aValue) {
102 this._serverLockValue = aValue; 102 this._serverLockValue = aValue;
103 }, 103 },
104 104*/
105 //------------------------------------------------------------------------- 105 //-------------------------------------------------------------------------
106 106
107 'transientState': function () { 107 'transientState': function () {
108 if (this._transientState == null) { 108 if (this._transientState == null) {
109 this._transientState = {} 109 this._transientState = {}
110 } 110 }
111 111
112 return this._transientState; 112 return this._transientState;
113 }, 113 },
114 114
115 'resetTransientState': function (isCommitting) { 115 'resetTransientState': function (isCommitting) {
116 this._transientState = null; 116 this._transientState = null;
117 }, 117 },
118 118
119 //------------------------------------------------------------------------- 119 //-------------------------------------------------------------------------
120 120
121 'deferredLockForSection': function(aSectionName) { 121 'deferredLockForSection': function(aSectionName) {
122 return this._deferredLocks[aSectionName]; 122 return this._deferredLocks[aSectionName];
123 }, 123 },
124 124
125 //------------------------------------------------------------------------- 125 //-------------------------------------------------------------------------
126 126
127 'getPassphrase': function() { 127 'getPassphrase': function() {
128 var deferredResult; 128 var deferredResult;
129 129
130 deferredResult = new Clipperz.Async.Deferred("User.getPassphrase", {trace:false}); 130 deferredResult = new Clipperz.Async.Deferred("User.getPassphrase", {trace:false});
131 deferredResult.acquireLock(this.deferredLockForSection('passphrase')); 131 deferredResult.acquireLock(this.deferredLockForSection('passphrase'));
132 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', this.getPassphraseFunction()); 132 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', this.getPassphraseFunction());
133 deferredResult.releaseLock(this.deferredLockForSection('passphrase')); 133 deferredResult.releaseLock(this.deferredLockForSection('passphrase'));
134 deferredResult.callback(); 134 deferredResult.callback();
135 135
136 return deferredResult; 136 return deferredResult;
137 }, 137 },
138 138
139 'getPassphraseFunction': function () { 139 'getPassphraseFunction': function () {
140 return this._getPassphraseFunction; 140 return this._getPassphraseFunction;
141 }, 141 },
142 142
143 //------------------------------------------------------------------------- 143 //-------------------------------------------------------------------------
144 144
145 'getCredentials': function () { 145 'getCredentials': function () {
146 return Clipperz.Async.collectResults("User; get username and passphrase", { 146 return Clipperz.Async.collectResults("User; get username and passphrase", {
147 'username': MochiKit.Base.method(this, 'username'), 147 'username': MochiKit.Base.method(this, 'username'),
148 'password': MochiKit.Base.method(this, 'getPassphrase') 148 'password': MochiKit.Base.method(this, 'getPassphrase')
149 }, {trace:false})(); 149 }, {trace:false})();
150 }, 150 },
151 151
152 //------------------------------------------------------------------------- 152 //-------------------------------------------------------------------------
153 153
154 'changePassphrase': function (aNewValue) { 154 'changePassphrase': function (aNewValue) {
155 return this.updateCredentials(this.username(), aNewValue); 155 return this.updateCredentials(this.username(), aNewValue);
156 }, 156 },
157 157
158 //......................................................................... 158 //.........................................................................
159 159
160 'updateCredentials': function (aUsername, aPassphrase) { 160 'updateCredentials': function (aUsername, aPassphrase) {
161 vardeferredResult; 161 vardeferredResult;
162 162
163 deferredResult = new Clipperz.Async.Deferred("User.updateCredentials", {trace:false}); 163 deferredResult = new Clipperz.Async.Deferred("User.updateCredentials", {trace:false});
164 // deferredResult.addMethod(this, 'getPassphrase'); 164 // deferredResult.addMethod(this, 'getPassphrase');
165 // deferredResult.setValue('currentPassphrase'); 165 // deferredResult.setValue('currentPassphrase');
166 deferredResult.addMethod(this.connection(), 'ping'); 166 deferredResult.addMethod(this.connection(), 'ping');
167 deferredResult.addMethod(this, 'setUsername', aUsername) 167 deferredResult.addMethod(this, 'setUsername', aUsername)
168 deferredResult.acquireLock(this.deferredLockForSection('passphrase')); 168 deferredResult.acquireLock(this.deferredLockForSection('passphrase'));
169 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', aPassphrase); 169 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', aPassphrase);
170 deferredResult.releaseLock(this.deferredLockForSection('passphrase')); 170 deferredResult.releaseLock(this.deferredLockForSection('passphrase'));
171 // deferredResult.getValue('currentPassphrase'); 171 // deferredResult.getValue('currentPassphrase');
172 deferredResult.addMethod(this, 'prepareRemoteDataWithKey', aPassphrase); 172 deferredResult.addMethod(this, 'prepareRemoteDataWithKey', aPassphrase);
173 deferredResult.addMethod(this.connection(), 'updateCredentials', aUsername, aPassphrase); 173 deferredResult.addMethod(this.connection(), 'updateCredentials', aUsername, aPassphrase);
174 deferredResult.callback(); 174 deferredResult.callback();
175 175
176 return deferredResult; 176 return deferredResult;
177 }, 177 },
178 178
179 //------------------------------------------------------------------------- 179 //-------------------------------------------------------------------------
180 180
181 'initialSetupWithNoData': function () { 181 'initialSetupWithNoData': function () {
182 this._serverData = { 182 this._serverData = {
183 'version': '0.1', 183 'version': '0.1',
184 'statistics': "", 184 'statistics': "",
185 'header': { 185 'header': {
186 'data': null, 186 'data': null,
187 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion, 187 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion,
188 188
189 'recordsIndex': new Clipperz.PM.DataModel.User.Header.RecordIndex({ 189 'recordsIndex': new Clipperz.PM.DataModel.User.Header.RecordIndex({
190 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 190 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
191 'recordsData': {'data':null, 'index':{}}, 191 'recordsData': {'data':null, 'index':{}},
192 'recordsStats': null, 192 'recordsStats': null,
193 'directLoginsData': {'data':null, 'index':{}}, 193 'directLoginsData': {'data':null, 'index':{}},
194 'encryptedDataVersion': Clipperz.PM.Crypto.encryptingFunctions.currentVersion, 194 'encryptedDataVersion': Clipperz.PM.Crypto.encryptingFunctions.currentVersion,
195 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail') 195 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
196 }), 196 }),
197 'preferences': new Clipperz.PM.DataModel.User.Header.Preferences({ 197 'preferences': new Clipperz.PM.DataModel.User.Header.Preferences({
198 'name':'preferences', 198 'name':'preferences',
199 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 199 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
200 }), 200 }),
201 'oneTimePasswords': new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ 201 'oneTimePasswords': new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
202 'name':'preferences', 202 'name':'preferences',
203 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 203 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
204 }) 204 })
205 } 205 }
206 }; 206 };
207 207
208 // this._serverLockValue = Clipperz.PM.Crypto.randomKey(); 208 // this._serverLockValue = Clipperz.PM.Crypto.randomKey();
209 }, 209 },
210 210
211 //......................................................................... 211 //.........................................................................
212 212
213 'registerAsNewAccount': function () { 213 'registerAsNewAccount': function () {
214 var deferredResult; 214 var deferredResult;
215 215
216 deferredResult = new Clipperz.Async.Deferred("User.registerAsNewAccount", {trace:false}); 216 deferredResult = new Clipperz.Async.Deferred("User.registerAsNewAccount", {trace:false});
217 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3}); 217 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
218 deferredResult.addMethod(this, 'initialSetupWithNoData') 218 deferredResult.addMethod(this, 'initialSetupWithNoData')
219 deferredResult.addMethod(this, 'getPassphrase'); 219 deferredResult.addMethod(this, 'getPassphrase');
220 deferredResult.addMethod(this, 'prepareRemoteDataWithKey'); 220 deferredResult.addMethod(this, 'prepareRemoteDataWithKey');
221 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 221 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
222 deferredResult.addMethod(this.connection(), 'register'); 222 deferredResult.addMethod(this.connection(), 'register');
223 deferredResult.addCallback(MochiKit.Base.itemgetter('lock')); 223 // deferredResult.addCallback(MochiKit.Base.itemgetter('lock'));
224 deferredResult.addMethod(this, 'setServerLockValue'); 224 // deferredResult.addMethod(this, 'setServerLockValue');
225 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyRegistered'); 225 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyRegistered');
226 226
227 // deferredResult.addErrback (MochiKit.Base.method(this, 'handleRegistrationFailure')); 227 // deferredResult.addErrback (MochiKit.Base.method(this, 'handleRegistrationFailure'));
228 228
229 deferredResult.callback(); 229 deferredResult.callback();
230 230
231 return deferredResult; 231 return deferredResult;
232 }, 232 },
233 233
234 //------------------------------------------------------------------------- 234 //-------------------------------------------------------------------------
235 235
236 'login': function () { 236 'login': function () {
237 var deferredResult; 237 var deferredResult;
238 238
239 deferredResult = new Clipperz.Async.Deferred("User.login", {trace:false}); 239 deferredResult = new Clipperz.Async.Deferred("User.login", {trace:false});
240 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3}); 240 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
241 deferredResult.addMethod(this, 'getPassphrase'); 241 deferredResult.addMethod(this, 'getPassphrase');
242 deferredResult.addCallback(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue); 242 deferredResult.addCallback(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue);
243 deferredResult.addCallback(Clipperz.Async.deferredIf("Is the passphrase an OTP", [ 243 deferredResult.addCallback(Clipperz.Async.deferredIf("Is the passphrase an OTP", [
244 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':1}), 244 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':1}),
245 MochiKit.Base.method(this, 'getCredentials'), 245 MochiKit.Base.method(this, 'getCredentials'),
246 MochiKit.Base.method(this.connection(), 'redeemOneTimePassword'), 246 MochiKit.Base.method(this.connection(), 'redeemOneTimePassword'),
247 MochiKit.Base.method(this.data(), 'setValue', 'passphrase') 247 MochiKit.Base.method(this.data(), 'setValue', 'passphrase')
248 ], [])); 248 ], []));
249 deferredResult.addErrback(MochiKit.Base.method(this, 'getPassphrase')); 249 deferredResult.addErrback(MochiKit.Base.method(this, 'getPassphrase'));
250 deferredResult.addMethod(this.connection(), 'login'); 250 deferredResult.addMethod(this.connection(), 'login', false);
251 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn'); 251 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn');
252 deferredResult.addErrback (MochiKit.Base.method(this, 'handleConnectionFallback')); 252 deferredResult.addErrback (MochiKit.Base.method(this, 'handleConnectionFallback'));
253 253
254 deferredResult.callback(); 254 deferredResult.callback();
255 255
256 return deferredResult; 256 return deferredResult;
257 }, 257 },
258 258
259 //......................................................................... 259 //.........................................................................
260 260
261 'handleConnectionFallback': function(aValue) { 261 'handleConnectionFallback': function(aValue) {
262 var result; 262 var result;
263 263
264 if (aValue instanceof MochiKit.Async.CancelledError) { 264 if (aValue instanceof MochiKit.Async.CancelledError) {
265 result = aValue; 265 result = aValue;
266 } else { 266 } else {
267 this.setConnectionVersion(Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()]); 267 this.setConnectionVersion(Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()]);
268 268
269 if (this.connectionVersion() != null) { 269 if (this.connectionVersion() != null) {
270 result = new Clipperz.Async.Deferred("User.handleConnectionFallback - retry"); 270 result = new Clipperz.Async.Deferred("User.handleConnectionFallback - retry");
271 271
272 result.addMethod(this, 'login'); 272 result.addMethod(this, 'login');
273 result.callback(); 273 result.callback();
274 } else { 274 } else {
275 result = Clipperz.Async.callbacks("User.handleConnectionFallback - failed", [ 275 result = Clipperz.Async.callbacks("User.handleConnectionFallback - failed", [
276 MochiKit.Base.method(this.data(), 'removeValue', 'passphrase'), 276 MochiKit.Base.method(this.data(), 'removeValue', 'passphrase'),
277 MochiKit.Base.method(this, 'setConnectionVersion', 'current'), 277 MochiKit.Base.method(this, 'setConnectionVersion', 'current'),
278 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userLoginFailed'), 278 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userLoginFailed'),
279 MochiKit.Base.partial(MochiKit.Async.fail, Clipperz.PM.DataModel.User.exception.LoginFailed) 279 MochiKit.Base.partial(MochiKit.Async.fail, Clipperz.PM.DataModel.User.exception.LoginFailed)
280 ], {trace:false}); 280 ], {trace:false});
281 } 281 }
282 } 282 }
283 283
284 return result; 284 return result;
285 }, 285 },
286 286
287 //------------------------------------------------------------------------- 287 //-------------------------------------------------------------------------
288 288
289 'lock': function () { 289 'lock': function () {
290 return Clipperz.Async.callbacks("User.lock", [ 290 return Clipperz.Async.callbacks("User.lock", [
291 MochiKit.Base.method(this, 'deleteAllCleanTextData') 291 MochiKit.Base.method(this, 'deleteAllCleanTextData')
292 ], {trace:false}); 292 ], {trace:false});
293 }, 293 },
294 294
295 //------------------------------------------------------------------------- 295 //-------------------------------------------------------------------------
296 296
297 'logout': function () { 297 'logout': function () {
298 return Clipperz.Async.callbacks("User.logout", [ 298 return Clipperz.Async.callbacks("User.logout", [
299 MochiKit.Base.method(this, 'deleteAllCleanTextData'), 299 MochiKit.Base.method(this, 'deleteAllCleanTextData'),
300 MochiKit.Base.method(this.connection(), 'logout') 300 MochiKit.Base.method(this.connection(), 'logout')
301 ], {trace:false}); 301 ], {trace:false});
302 }, 302 },
303 303
304 //------------------------------------------------------------------------- 304 //-------------------------------------------------------------------------
305 305
306 'headerFormatVersion': function(anHeader) { 306 'headerFormatVersion': function(anHeader) {
307 var result; 307 var result;
308 308
309 if (anHeader.charAt(0) == '{') { 309 if (anHeader.charAt(0) == '{') {
310 varheaderData; 310 varheaderData;
311 311
312 headerData = Clipperz.Base.evalJSON(anHeader); 312 headerData = Clipperz.Base.evalJSON(anHeader);
313 result = headerData['version']; 313 result = headerData['version'];
314 } else { 314 } else {
315 result = 'LEGACY'; 315 result = 'LEGACY';
316 } 316 }
317 317
318 return result; 318 return result;
319 }, 319 },
320 320
321 //------------------------------------------------------------------------- 321 //-------------------------------------------------------------------------
322 322
323 'unpackServerData': function (someServerData) { 323 'unpackServerData': function (someServerData) {
324 var unpackedData; 324 var unpackedData;
325 var headerVersion; 325 var headerVersion;
326 326
327 varrecordsIndex; 327 varrecordsIndex;
328 var preferences; 328 var preferences;
329 var oneTimePasswords; 329 var oneTimePasswords;
330 330
331//console.log(">>> ***************** user.unpackServerData", someServerData); 331//console.log(">>> ***************** user.unpackServerData", someServerData);
332 this.setServerLockValue(someServerData['lock']); 332 // this.setServerLockValue(someServerData['lock']);
333 333
334 headerVersion = this.headerFormatVersion(someServerData['header']); 334 headerVersion = this.headerFormatVersion(someServerData['header']);
335 335
336 switch (headerVersion) { 336 switch (headerVersion) {
337 case 'LEGACY': 337 case 'LEGACY':
338 varlegacyHeader; 338 varlegacyHeader;
339 339
340 legacyHeader = new Clipperz.PM.DataModel.User.Header.Legacy({ 340 legacyHeader = new Clipperz.PM.DataModel.User.Header.Legacy({
341 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 341 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
342 'remoteData': { 342 'remoteData': {
343 'data': someServerData['header'], 343 'data': someServerData['header'],
344 'version': someServerData['version'], 344 'version': someServerData['version'],
345 'recordsStats': someServerData['recordsStats'] 345 'recordsStats': someServerData['recordsStats']
346 }, 346 },
347 // 'encryptedDataKeypath': 'data', 347 // 'encryptedDataKeypath': 'data',
348 // 'encryptedVersionKeypath': 'version', 348 // 'encryptedVersionKeypath': 'version',
349 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail') 349 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
350 }); 350 });
351 351
352 recordsIndex = legacyHeader; 352 recordsIndex = legacyHeader;
353 preferences = legacyHeader; 353 preferences = legacyHeader;
354 oneTimePasswords= legacyHeader; 354 oneTimePasswords= legacyHeader;
355 break; 355 break;
356 case '0.1': 356 case '0.1':
357 varheaderData; 357 varheaderData;
358 358
359 headerData = Clipperz.Base.evalJSON(someServerData['header']); 359 headerData = Clipperz.Base.evalJSON(someServerData['header']);
360 360
361 recordsIndex = new Clipperz.PM.DataModel.User.Header.RecordIndex({ 361 recordsIndex = new Clipperz.PM.DataModel.User.Header.RecordIndex({
362 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 362 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
363 'recordsData': headerData['records'], 363 'recordsData': headerData['records'],
364 'recordsStats': someServerData['recordsStats'], 364 'recordsStats': someServerData['recordsStats'],
365 'directLoginsData': headerData['directLogins'], 365 'directLoginsData': headerData['directLogins'],
366 'encryptedDataVersion': someServerData['version'], 366 'encryptedDataVersion': someServerData['version'],
367 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail') 367 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
368 }); 368 });
369 369
370 //Still missing a test case that actually fais with the old version of the code, where the check for undefined was missing 370 //Still missing a test case that actually fais with the old version of the code, where the check for undefined was missing
371 if (typeof(headerData['preferences']) != 'undefined') { 371 if (typeof(headerData['preferences']) != 'undefined') {
372 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({ 372 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({
373 'name':'preferences', 373 'name':'preferences',
374 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 374 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
375 'remoteData': { 375 'remoteData': {
376 'data': headerData['preferences']['data'], 376 'data': headerData['preferences']['data'],
377 'version': someServerData['version'] 377 'version': someServerData['version']
378 } 378 }
379 }); 379 });
380 } else { 380 } else {
381 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({ 381 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({
382 'name':'preferences', 382 'name':'preferences',
383 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 383 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
384 }); 384 });
385 } 385 }
386 386
387 if (typeof(headerData['oneTimePasswords']) != 'undefined') { 387 if (typeof(headerData['oneTimePasswords']) != 'undefined') {
388 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ 388 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
389 'name':'preferences', 389 'name':'preferences',
390 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 390 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
391 'remoteData': { 391 'remoteData': {
392 'data': headerData['oneTimePasswords']['data'], 392 'data': headerData['oneTimePasswords']['data'],
393 'version': someServerData['version'] 393 'version': someServerData['version']
394 } 394 }
395 }); 395 });
396 } else { 396 } else {
397 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ 397 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
398 'name':'preferences', 398 'name':'preferences',
399 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 399 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
400 }); 400 });
401 } 401 }
402 402
403 break; 403 break;
404 } 404 }
405 405
406 unpackedData = { 406 unpackedData = {
407 'version': someServerData['version'], 407 'version': someServerData['version'],
408 'statistics': someServerData['statistics'], 408 'statistics': someServerData['statistics'],
409 'header': { 409 'header': {
410 'data': someServerData['header'], 410 'data': someServerData['header'],
411 'version': headerVersion, 411 'version': headerVersion,
412 412
413 'recordsIndex': recordsIndex, 413 'recordsIndex': recordsIndex,
414 'preferences': preferences, 414 'preferences': preferences,
415 'oneTimePasswords': oneTimePasswords 415 'oneTimePasswords': oneTimePasswords
416 } 416 }
417 }; 417 };
418 418
419 this._serverData = unpackedData; 419 this._serverData = unpackedData;
420//console.log("<<< ***************** user.unpackServerData", this._serverData); 420//console.log("<<< ***************** user.unpackServerData", this._serverData);
421 421
422 return this._serverData; 422 return this._serverData;
423 }, 423 },
424 424
425 //------------------------------------------------------------------------- 425 //-------------------------------------------------------------------------
426 426
427 'getServerData': function() { 427 'getServerData': function() {
428 var deferredResult; 428 var deferredResult;
429 429
430 deferredResult = new Clipperz.Async.Deferred("User.getServerData", {trace:false}); 430 deferredResult = new Clipperz.Async.Deferred("User.getServerData", {trace:false});
431 deferredResult.acquireLock(this.deferredLockForSection('serverData')); 431 deferredResult.acquireLock(this.deferredLockForSection('serverData'));
432 deferredResult.addCallback(MochiKit.Base.bind(function(aResult) { 432 deferredResult.addCallback(MochiKit.Base.bind(function(aResult) {
433 var innerDeferredResult; 433 var innerDeferredResult;
434 434
435 innerDeferredResult = new Clipperz.Async.Deferred("User.getUserDetails.innerDeferred", {trace:false}); 435 innerDeferredResult = new Clipperz.Async.Deferred("User.getUserDetails.innerDeferred", {trace:false});
436 if (this._serverData == null) { 436 if (this._serverData == null) {
437 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadingUserDetails'); 437 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadingUserDetails');
438 innerDeferredResult.addMethod(this.connection(), 'message', 'getUserDetails'); 438 innerDeferredResult.addMethod(this.connection(), 'message', 'getUserDetails');
439 innerDeferredResult.addMethod(this, 'unpackServerData'); 439 innerDeferredResult.addMethod(this, 'unpackServerData');
440 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadedUserDetails'); 440 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadedUserDetails');
441 } 441 }
442 442
443 innerDeferredResult.addCallback(MochiKit.Base.bind(function () { 443 innerDeferredResult.addCallback(MochiKit.Base.bind(function () {
444 return this._serverData; 444 return this._serverData;
445 },this)); 445 },this));
446 innerDeferredResult.callback(); 446 innerDeferredResult.callback();
447 447
448 return innerDeferredResult; 448 return innerDeferredResult;
449 }, this)); 449 }, this));
450 deferredResult.releaseLock(this.deferredLockForSection('serverData')); 450 deferredResult.releaseLock(this.deferredLockForSection('serverData'));
451 deferredResult.callback(); 451 deferredResult.callback();
452 452
453 return deferredResult; 453 return deferredResult;
454 }, 454 },
455 455
456 //------------------------------------------------------------------------- 456 //-------------------------------------------------------------------------
457 457
458 'connectionVersion': function() { 458 'connectionVersion': function() {
459 return this._connectionVersion; 459 return this._connectionVersion;
460 }, 460 },
461 461
462 'setConnectionVersion': function(aValue) { 462 'setConnectionVersion': function(aValue) {
463 if (this._connectionVersion != aValue) { 463 if (this._connectionVersion != aValue) {
464 this.resetConnection(); 464 this.resetConnection();
465 } 465 }
466 this._connectionVersion = aValue; 466 this._connectionVersion = aValue;
467 }, 467 },
468 468
469 //------------------------------------------------------------------------- 469 //-------------------------------------------------------------------------
470 470
471 'connection': function() { 471 'connection': function() {
472 if ((this._connection == null) && (this.connectionVersion() != null) ){ 472 if ((this._connection == null) && (this.connectionVersion() != null) ){
473 this._connection = new Clipperz.PM.Connection.communicationProtocol.versions[this.connectionVersion()]({ 473 this._connection = new Clipperz.PM.Connection.communicationProtocol.versions[this.connectionVersion()]({
474 getCredentialsFunction: MochiKit.Base.method(this, 'getCredentials') 474 getCredentialsFunction: MochiKit.Base.method(this, 'getCredentials')
475 }); 475 });
476 } 476 }
477 477
478 return this._connection; 478 return this._connection;
479 }, 479 },
480 480
481 'resetConnection': function(aValue) { 481 'resetConnection': function(aValue) {
482 if (this._connection != null) { 482 if (this._connection != null) {
483 this._connection.reset(); 483 this._connection.reset();
484 } 484 }
485 485
486 this._connection = null; 486 this._connection = null;
487 }, 487 },
488 488
489 //========================================================================= 489 //=========================================================================
490 490
491 'getHeaderIndex': function (aKey) { 491 'getHeaderIndex': function (aKey) {
492 return Clipperz.Async.callbacks("User.getHeaderIndex", [ 492 return Clipperz.Async.callbacks("User.getHeaderIndex", [
493 MochiKit.Base.method(this, 'getServerData'), 493 MochiKit.Base.method(this, 'getServerData'),
494 MochiKit.Base.itemgetter('header'), 494 MochiKit.Base.itemgetter('header'),
495 MochiKit.Base.itemgetter(aKey) 495 MochiKit.Base.itemgetter(aKey)
496 ], {trace:false}) 496 ], {trace:false})
497 }, 497 },
498 498
499 //========================================================================= 499 //=========================================================================
500 500
501 'getRecords': function () { 501 'getRecords': function () {
502 return Clipperz.Async.callbacks("User.getRecords", [ 502 return Clipperz.Async.callbacks("User.getRecords", [
503 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'), 503 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
504 MochiKit.Base.methodcaller('records'), 504 MochiKit.Base.methodcaller('records'),
505 MochiKit.Base.values 505 MochiKit.Base.values
506 ], {trace:false}); 506 ], {trace:false});
507 }, 507 },
508 508
509 'recordWithLabel': function (aLabel) { 509 'recordWithLabel': function (aLabel) {
510 return Clipperz.Async.callbacks("User.recordWithLabel", [ 510 return Clipperz.Async.callbacks("User.recordWithLabel", [
511 MochiKit.Base.method(this, 'getRecords'), 511 MochiKit.Base.method(this, 'getRecords'),
512 MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aRecord) { 512 MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aRecord) {
513 return Clipperz.Async.callbacks("User.recordWithLabel - check record label", [ 513 return Clipperz.Async.callbacks("User.recordWithLabel - check record label", [
514 MochiKit.Base.methodcaller('label'), 514 MochiKit.Base.methodcaller('label'),
515 MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel) 515 MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel)
516 ], {trace:false}, aRecord); 516 ], {trace:false}, aRecord);
517 }), 517 }),
518 function (someFilteredResults) { 518 function (someFilteredResults) {
519 var result; 519 var result;
520 520
521 switch (someFilteredResults.length) { 521 switch (someFilteredResults.length) {
522 case 0: 522 case 0:
523 result = null; 523 result = null;
524 break; 524 break;
525 case 1: 525 case 1:
526 result = someFilteredResults[0]; 526 result = someFilteredResults[0];
527 break; 527 break;
528 default: 528 default:
529 WTF = TODO; 529 WTF = TODO;
530 break; 530 break;
531 } 531 }
532 532
533 return result; 533 return result;
534 } 534 }
535 ], {trace:false}); 535 ], {trace:false});
536 }, 536 },
537 537
538 //------------------------------------------------------------------------- 538 //-------------------------------------------------------------------------
539 539
540 'getRecord': function (aRecordReference) { 540 'getRecord': function (aRecordReference) {
541 return Clipperz.Async.callbacks("User.getRecord", [ 541 return Clipperz.Async.callbacks("User.getRecord", [
542 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'), 542 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
543 MochiKit.Base.methodcaller('records'), 543 MochiKit.Base.methodcaller('records'),
544 MochiKit.Base.itemgetter(aRecordReference), 544 MochiKit.Base.itemgetter(aRecordReference),
545 545
546 Clipperz.Async.deferredIf("record != null", [ 546 Clipperz.Async.deferredIf("record != null", [
547 MochiKit.Base.operator.identity 547 MochiKit.Base.operator.identity
548 ], [ 548 ], [
549 function () { throw "Record does not exists"} 549 function () { throw "Record does not exists"}
550 ]) 550 ])
551 ], {trace:false}); 551 ], {trace:false});
552 }, 552 },
553 553
554 //------------------------------------------------------------------------- 554 //-------------------------------------------------------------------------
555 555
556 'getRecordDetail': function (aRecordReference) { 556 'getRecordDetail': function (aRecordReference) {
557 return this.connection().message('getRecordDetail', {reference: aRecordReference}); 557 return this.connection().message('getRecordDetail', {reference: aRecordReference});
558 }, 558 },
559 559
560 //------------------------------------------------------------------------- 560 //-------------------------------------------------------------------------
561 561
562 'deleteRecord': function (aRecord) { 562 'deleteRecord': function (aRecord) {
563 return Clipperz.Async.callbacks("User.deleteRecord", [ 563 return Clipperz.Async.callbacks("User.deleteRecord", [
564 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'), 564 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
565 MochiKit.Base.methodcaller('deleteRecord', aRecord) 565 MochiKit.Base.methodcaller('deleteRecord', aRecord)
566 ], {trace:false}); 566 ], {trace:false});
567 }, 567 },
568 568
569 //------------------------------------------------------------------------- 569 //-------------------------------------------------------------------------
570 570
571 'createNewRecord': function () { 571 'createNewRecord': function () {
572 return Clipperz.Async.callbacks("User.createNewRecord", [ 572 return Clipperz.Async.callbacks("User.createNewRecord", [
573 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'), 573 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
574 MochiKit.Base.methodcaller('createNewRecord') 574 MochiKit.Base.methodcaller('createNewRecord')
575 ], {trace:false}); 575 ], {trace:false});
576 }, 576 },
577 577
578 //========================================================================= 578 //=========================================================================
579 579
580 'getDirectLogins': function() { 580 'getDirectLogins': function() {
581 var deferredResult; 581 var deferredResult;
582 582
583 deferredResult = new Clipperz.Async.Deferred("User.getDirectLogins", {trace:false}); 583 deferredResult = new Clipperz.Async.Deferred("User.getDirectLogins", {trace:false});
584 deferredResult.addMethod(this, 'getRecords'); 584 deferredResult.addMethod(this, 'getRecords');
585 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.compose(MochiKit.Base.values, MochiKit.Base.methodcaller('directLogins'))); 585 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.compose(MochiKit.Base.values, MochiKit.Base.methodcaller('directLogins')));
586 deferredResult.addCallback(MochiKit.Base.flattenArray); 586 deferredResult.addCallback(MochiKit.Base.flattenArray);
587 deferredResult.callback(); 587 deferredResult.callback();
588 588
589 return deferredResult; 589 return deferredResult;
590 }, 590 },
591 591
592 //========================================================================= 592 //=========================================================================
593 593
594 'getOneTimePasswords': function () { 594 'getOneTimePasswords': function () {
595 return Clipperz.Async.callbacks("User.getOneTimePasswords", [ 595 return Clipperz.Async.callbacks("User.getOneTimePasswords", [
596 MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'), 596 MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'),
597 MochiKit.Base.methodcaller('oneTimePasswords'), 597 MochiKit.Base.methodcaller('oneTimePasswords'),
598 MochiKit.Base.values 598 MochiKit.Base.values
599 ], {trace:false}); 599 ], {trace:false});
600 }, 600 },
601 601
602 //========================================================================= 602 //=========================================================================
603 603
604 'invokeMethodNamedOnHeader': function (aMethodName, aValue) { 604 'invokeMethodNamedOnHeader': function (aMethodName, aValue) {
605 return Clipperz.Async.collectResults("User.invokeMethodNamedOnHeader [" + aMethodName + "]", { 605 return Clipperz.Async.collectResults("User.invokeMethodNamedOnHeader [" + aMethodName + "]", {
606 'recordIndex': [ 606 'recordIndex': [
607 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'), 607 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
608 MochiKit.Base.methodcaller(aMethodName, aValue) 608 MochiKit.Base.methodcaller(aMethodName, aValue)
609 ], 609 ],
610 'preferences': [ 610 'preferences': [
611 MochiKit.Base.method(this, 'getHeaderIndex', 'preferences'), 611 MochiKit.Base.method(this, 'getHeaderIndex', 'preferences'),
612 MochiKit.Base.methodcaller(aMethodName, aValue) 612 MochiKit.Base.methodcaller(aMethodName, aValue)
613 ], 613 ],
614 'oneTimePasswords': [ 614 'oneTimePasswords': [
615 MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'), 615 MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'),
616 MochiKit.Base.methodcaller(aMethodName, aValue) 616 MochiKit.Base.methodcaller(aMethodName, aValue)
617 ]//, 617 ]//,
618 // 'statistics': [ 618 // 'statistics': [
619 // MochiKit.Base.method(this, 'getStatistics'), 619 // MochiKit.Base.method(this, 'getStatistics'),
620 // MochiKit.Base.methodcaller(aMethodName, aValue) 620 // MochiKit.Base.methodcaller(aMethodName, aValue)
621 // ] 621 // ]
622 }, {trace:false})(); 622 }, {trace:false})();
623 }, 623 },
624 624
625 //------------------------------------------------------------------------- 625 //-------------------------------------------------------------------------
626 626
627 'invokeMethodNamedOnRecords': function (aMethodName, aValue) { 627 'invokeMethodNamedOnRecords': function (aMethodName, aValue) {
628 return Clipperz.Async.callbacks("User.invokeMethodNamedOnRecords[" + aMethodName + "]", [ 628 return Clipperz.Async.callbacks("User.invokeMethodNamedOnRecords[" + aMethodName + "]", [
629 MochiKit.Base.method(this, 'getRecords'), 629 MochiKit.Base.method(this, 'getRecords'),
630 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller(aMethodName, aValue)), 630 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller(aMethodName, aValue)),
631 Clipperz.Async.collectAll 631 Clipperz.Async.collectAll
632 ], {trace:false}); 632 ], {trace:false});
633 }, 633 },
634 634
635 //========================================================================= 635 //=========================================================================
636 636
637 'hasPendingChanges': function () { 637 'hasPendingChanges': function () {
638 vardeferredResult; 638 vardeferredResult;
639 639
640 deferredResult = new Clipperz.Async.Deferred("User.hasPendingChanges", {trace:false}); 640 deferredResult = new Clipperz.Async.Deferred("User.hasPendingChanges", {trace:false});
641 deferredResult.collectResults({ 641 deferredResult.collectResults({
642 'header': [ 642 'header': [
643 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasPendingChanges'), 643 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasPendingChanges'),
644 MochiKit.Base.values 644 MochiKit.Base.values
645 ], 645 ],
646 'records': MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasPendingChanges') 646 'records': MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasPendingChanges')
647 }); 647 });
648 deferredResult.addCallback(Clipperz.Async.or); 648 deferredResult.addCallback(Clipperz.Async.or);
649 deferredResult.callback(); 649 deferredResult.callback();
650 // recordsIndex = legacyHeader; 650 // recordsIndex = legacyHeader;
651 // preferences = legacyHeader; 651 // preferences = legacyHeader;
652 // oneTimePasswords= legacyHeader; 652 // oneTimePasswords= legacyHeader;
653 653
654 return deferredResult; 654 return deferredResult;
655 }, 655 },
656 656
657 //========================================================================= 657 //=========================================================================
658 658
659 'commitTransientState': function () { 659 'commitTransientState': function () {
660 return Clipperz.Async.callbacks("User.commitTransientState", [ 660 return Clipperz.Async.callbacks("User.commitTransientState", [
661 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'commitTransientState'), 661 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'commitTransientState'),
662 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'commitTransientState'), 662 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'commitTransientState'),
663 663
664 MochiKit.Base.method(this, 'transientState'), 664 MochiKit.Base.method(this, 'transientState'),
665 MochiKit.Base.itemgetter('lock'), 665 // MochiKit.Base.itemgetter('lock'),
666 MochiKit.Base.method(this, 'setServerLockValue'), 666 // MochiKit.Base.method(this, 'setServerLockValue'),
667 MochiKit.Base.method(this, 'resetTransientState', true) 667 MochiKit.Base.method(this, 'resetTransientState', true)
668 ], {trace:false}); 668 ], {trace:false});
669 }, 669 },
670 670
671 //------------------------------------------------------------------------- 671 //-------------------------------------------------------------------------
672 672
673 'revertChanges': function () { 673 'revertChanges': function () {
674 return Clipperz.Async.callbacks("User.revertChanges", [ 674 return Clipperz.Async.callbacks("User.revertChanges", [
675 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'revertChanges'), 675 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'revertChanges'),
676 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'revertChanges'), 676 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'revertChanges'),
677 MochiKit.Base.method(this, 'resetTransientState', false) 677 MochiKit.Base.method(this, 'resetTransientState', false)
678 ], {trace:false}); 678 ], {trace:false});
679 }, 679 },
680 680
681 //========================================================================= 681 //=========================================================================
682 682
683 'deleteAllCleanTextData': function () { 683 'deleteAllCleanTextData': function () {
684 return Clipperz.Async.callbacks("User.deleteAllCleanTextData", [ 684 return Clipperz.Async.callbacks("User.deleteAllCleanTextData", [
685 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'deleteAllCleanTextData'), 685 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'deleteAllCleanTextData'),
686 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'deleteAllCleanTextData'), 686 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'deleteAllCleanTextData'),
687 687
688 MochiKit.Base.method(this.data(), 'removeAllData'), 688 MochiKit.Base.method(this.data(), 'removeAllData'),
689 MochiKit.Base.method(this, 'resetTransientState', false) 689 MochiKit.Base.method(this, 'resetTransientState', false)
690 ], {trace:false}); 690 ], {trace:false});
691 }, 691 },
692 692
693 //------------------------------------------------------------------------- 693 //-------------------------------------------------------------------------
694 694
695 'hasAnyCleanTextData': function () { 695 'hasAnyCleanTextData': function () {
696 vardeferredResult; 696 vardeferredResult;
697 697
698 deferredResult = new Clipperz.Async.Deferred("User.hasAnyCleanTextData", {trace:false}); 698 deferredResult = new Clipperz.Async.Deferred("User.hasAnyCleanTextData", {trace:false});
699 deferredResult.collectResults({ 699 deferredResult.collectResults({
700 'header':[ 700 'header':[
701 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasAnyCleanTextData'), 701 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasAnyCleanTextData'),
702 MochiKit.Base.values 702 MochiKit.Base.values
703 ], 703 ],
704 'records':MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasAnyCleanTextData'), 704 'records':MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasAnyCleanTextData'),
705 'data': MochiKit.Base.bind(function () { 705 'data': MochiKit.Base.bind(function () {
706 return MochiKit.Async.succeed(! this.data().isEmpty()); 706 return MochiKit.Async.succeed(! this.data().isEmpty());
707 }, this), 707 }, this),
708 'transientState':MochiKit.Base.bind(function () { 708 'transientState':MochiKit.Base.bind(function () {
709 return MochiKit.Async.succeed(MochiKit.Base.keys(this.transientState()).length != 0); 709 return MochiKit.Async.succeed(MochiKit.Base.keys(this.transientState()).length != 0);
710 }, this) 710 }, this)
711 }); 711 });
712 deferredResult.addCallback(Clipperz.Async.or); 712 deferredResult.addCallback(Clipperz.Async.or);
713 deferredResult.callback(); 713 deferredResult.callback();
714 714
715 return deferredResult; 715 return deferredResult;
716 }, 716 },
717 717
718 //========================================================================= 718 //=========================================================================
719 719
720 'prepareRemoteDataWithKey': function (aKey /*, aCurrentKey*/) { 720 'prepareRemoteDataWithKey': function (aKey /*, aCurrentKey*/) {
721 var deferredResult; 721 var deferredResult;
722 varresult; 722 varresult;
723 723
724 result = {}; 724 result = {};
725 deferredResult = new Clipperz.Async.Deferred("User.prepareRemoteDataWithKey", {trace:false}); 725 deferredResult = new Clipperz.Async.Deferred("User.prepareRemoteDataWithKey", {trace:false});
726 deferredResult.addMethod(this, 'invokeMethodNamedOnHeader', 'prepareRemoteDataWithKey', aKey /*, aCurrentKey*/); 726 deferredResult.addMethod(this, 'invokeMethodNamedOnHeader', 'prepareRemoteDataWithKey', aKey /*, aCurrentKey*/);
727 deferredResult.addCallback(MochiKit.Base.bind(function (aResult, someHeaderPackedData) { 727 deferredResult.addCallback(MochiKit.Base.bind(function (aResult, someHeaderPackedData) {
728 var header; 728 var header;
729 729
730 header = {}; 730 header = {};
731 header['records'] = someHeaderPackedData['recordIndex']['records']; 731 header['records'] = someHeaderPackedData['recordIndex']['records'];
732 header['directLogins'] = someHeaderPackedData['recordIndex']['directLogins']; 732 header['directLogins'] = someHeaderPackedData['recordIndex']['directLogins'];
733 header['preferences'] = {'data': someHeaderPackedData['preferences']['data']}; // this._serverData['header']['preferences']; // Clipperz.Base.evalJSON(this._serverData['header']['data'])['preferences']; //??????????? 733 header['preferences'] = {'data': someHeaderPackedData['preferences']['data']}; // this._serverData['header']['preferences']; // Clipperz.Base.evalJSON(this._serverData['header']['data'])['preferences']; //???????????
734 header['oneTimePasswords'] = {'data': someHeaderPackedData['oneTimePasswords']['data']}; // this._serverData['header']['oneTimePasswords']; // Clipperz.Base.evalJSON(this._serverData['header']['data'])['oneTimePasswords']; //??????????? 734 header['oneTimePasswords'] = {'data': someHeaderPackedData['oneTimePasswords']['data']}; // this._serverData['header']['oneTimePasswords']; // Clipperz.Base.evalJSON(this._serverData['header']['data'])['oneTimePasswords']; //???????????
735 header['version'] = '0.1'; 735 header['version'] = '0.1';
736 736
737 aResult['header'] = Clipperz.Base.serializeJSON(header); 737 aResult['header'] = Clipperz.Base.serializeJSON(header);
738 aResult['statistics'] = this._serverData['statistics']; //"someHeaderPackedData['statistics']['data']"; 738 aResult['statistics'] = this._serverData['statistics']; //"someHeaderPackedData['statistics']['data']";
739 739
740 return aResult; 740 return aResult;
741 }, this), result); 741 }, this), result);
742 deferredResult.addCallback(Clipperz.Async.setItem, result, 'version', Clipperz.PM.Crypto.encryptingFunctions.currentVersion); 742 deferredResult.addCallback(Clipperz.Async.setItem, result, 'version', Clipperz.PM.Crypto.encryptingFunctions.currentVersion);
743 deferredResult.addCallback(Clipperz.Async.setItem, result, 'lock', this.serverLockValue()); 743 // deferredResult.addCallback(Clipperz.Async.setItem, result, 'lock', this.serverLockValue());
744 deferredResult.callback(); 744 deferredResult.callback();
745 745
746 return deferredResult; 746 return deferredResult;
747 }, 747 },
748 748
749 //========================================================================= 749 //=========================================================================
750 750
751 'saveChanges': function () { 751 'saveChanges': function () {
752 vardeferredResult; 752 vardeferredResult;
753 var messageParameters; 753 var messageParameters;
754 754
755 messageParameters = {}; 755 messageParameters = {};
756 756
757 deferredResult = new Clipperz.Async.Deferred("User.saveChangaes", {trace:false}); 757 deferredResult = new Clipperz.Async.Deferred("User.saveChangaes", {trace:false});
758 758
759 deferredResult.addMethod(this, 'getHeaderIndex', 'recordsIndex'); 759 deferredResult.addMethod(this, 'getHeaderIndex', 'recordsIndex');
760 deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); 760 deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords'));
761 deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'records'); 761 deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'records');
762 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 762 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
763 763
764 deferredResult.addMethod(this, 'getPassphrase'); 764 deferredResult.addMethod(this, 'getPassphrase');
765 deferredResult.addMethod(this, 'prepareRemoteDataWithKey'); 765 deferredResult.addMethod(this, 'prepareRemoteDataWithKey');
766 deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'user'); 766 deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'user');
767 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 767 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
768 768
769 deferredResult.addCallback(MochiKit.Async.succeed, messageParameters); 769 deferredResult.addCallback(MochiKit.Async.succeed, messageParameters);
770 deferredResult.addMethod(this.connection(), 'message', 'saveChanges'); 770 deferredResult.addMethod(this.connection(), 'message', 'saveChanges');
771 deferredResult.addCallback(MochiKit.Base.update, this.transientState()) 771 deferredResult.addCallback(MochiKit.Base.update, this.transientState())
772 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 772 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
773 773
774 deferredResult.addMethod(this, 'commitTransientState'); 774 deferredResult.addMethod(this, 'commitTransientState');
775 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 775 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
776 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved'); 776 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved');
777 777
778 deferredResult.addErrbackPass(MochiKit.Base.method(this, 'revertChanges')); 778 deferredResult.addErrbackPass(MochiKit.Base.method(this, 'revertChanges'));
779 deferredResult.addErrbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'failureWhileSavingUserData'); 779 deferredResult.addErrbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'failureWhileSavingUserData');
780 780
781 deferredResult.callback(); 781 deferredResult.callback();
782 782
783 return deferredResult; 783 return deferredResult;
784 }, 784 },
785 785
786 //========================================================================= 786 //=========================================================================
787 __syntaxFix__: "syntax fix" 787 __syntaxFix__: "syntax fix"
788}); 788});
789 789
790//----------------------------------------------------------------------------- 790//-----------------------------------------------------------------------------
791 791
792Clipperz.PM.DataModel.User.registerNewAccount = function (anUsername, aPassphraseFunction) { 792Clipperz.PM.DataModel.User.registerNewAccount = function (anUsername, aPassphraseFunction) {
793 vardeferredResult; 793 vardeferredResult;
794 var user; 794 var user;
795 795
796 user = new Clipperz.PM.DataModel.User({'username':anUsername, 'getPassphraseFunction':aPassphraseFunction}); 796 user = new Clipperz.PM.DataModel.User({'username':anUsername, 'getPassphraseFunction':aPassphraseFunction});
797 797
798 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.User.registerNewAccount", {trace:false}); 798 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.User.registerNewAccount", {trace:false});
799 deferredResult.addMethod(user, 'registerAsNewAccount'); 799 deferredResult.addMethod(user, 'registerAsNewAccount');
800 deferredResult.addMethod(user, 'login'); 800 deferredResult.addMethod(user, 'login');
801 deferredResult.addCallback(MochiKit.Async.succeed, user); 801 deferredResult.addCallback(MochiKit.Async.succeed, user);
802 deferredResult.callback(); 802 deferredResult.callback();
803 803
804 return deferredResult; 804 return deferredResult;
805} 805}
806 806
807//----------------------------------------------------------------------------- 807//-----------------------------------------------------------------------------
808 808
809Clipperz.PM.DataModel.User.exception = { 809Clipperz.PM.DataModel.User.exception = {
810 LoginFailed: new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.LoginFailed"), 810 LoginFailed: new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.LoginFailed"),
811 CredentialUpgradeFailed:new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed") 811 CredentialUpgradeFailed:new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed")
812}; 812};
813 813
814//----------------------------------------------------------------------------- 814//-----------------------------------------------------------------------------