Diffstat (limited to 'frontend/beta/js/Clipperz/PM/DataModel/Header.js') (more/less context) (ignore whitespace changes)
-rw-r--r-- | frontend/beta/js/Clipperz/PM/DataModel/Header.js | 751 |
1 files changed, 751 insertions, 0 deletions
diff --git a/frontend/beta/js/Clipperz/PM/DataModel/Header.js b/frontend/beta/js/Clipperz/PM/DataModel/Header.js new file mode 100644 index 0000000..ef34732 --- a/dev/null +++ b/frontend/beta/js/Clipperz/PM/DataModel/Header.js | |||
@@ -0,0 +1,751 @@ | |||
1 | /* | ||
2 | |||
3 | Copyright 2008-2011 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz's Javascript Crypto Library. | ||
6 | Javascript Crypto Library provides web developers with an extensive | ||
7 | and efficient set of cryptographic functions. The library aims to | ||
8 | obtain maximum execution speed while preserving modularity and | ||
9 | reusability. | ||
10 | For further information about its features and functionalities please | ||
11 | refer to http://www.clipperz.com | ||
12 | |||
13 | * Javascript Crypto Library is free software: you can redistribute | ||
14 | it and/or modify it under the terms of the GNU Affero General Public | ||
15 | License as published by the Free Software Foundation, either version | ||
16 | 3 of the License, or (at your option) any later version. | ||
17 | |||
18 | * Javascript Crypto Library is distributed in the hope that it will | ||
19 | be useful, but WITHOUT ANY WARRANTY; without even the implied | ||
20 | warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
21 | See the GNU Affero General Public License for more details. | ||
22 | |||
23 | * You should have received a copy of the GNU Affero General Public | ||
24 | License along with Javascript Crypto Library. If not, see | ||
25 | <http://www.gnu.org/licenses/>. | ||
26 | |||
27 | */ | ||
28 | |||
29 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
30 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
31 | if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } | ||
32 | |||
33 | |||
34 | //############################################################################# | ||
35 | |||
36 | Clipperz.PM.DataModel.Header = function(args) { | ||
37 | args = args || {}; | ||
38 | |||
39 | this._user = args.user; | ||
40 | |||
41 | this._serverData = null; | ||
42 | this._serverDataVersion = null; | ||
43 | this._jsonEvaledServerData = null; | ||
44 | |||
45 | this._decryptedLegacyServerData = null; | ||
46 | this._isDecryptingLegacyServerData = false; | ||
47 | this._decryptingLegacyServerDataPendingQueue = []; | ||
48 | |||
49 | this.resetUpdatedSections(); | ||
50 | |||
51 | this._shouldLoadSections = {}; | ||
52 | |||
53 | Clipperz.NotificationCenter.register(this.user(), 'updatedSection', this, 'updatedSectionHandler'); | ||
54 | |||
55 | return this; | ||
56 | } | ||
57 | |||
58 | Clipperz.PM.DataModel.Header.prototype = MochiKit.Base.update(null, { | ||
59 | |||
60 | //------------------------------------------------------------------------- | ||
61 | |||
62 | 'user': function() { | ||
63 | return this._user; | ||
64 | }, | ||
65 | |||
66 | //------------------------------------------------------------------------- | ||
67 | //------------------------------------------------------------------------- | ||
68 | //------------------------------------------------------------------------- | ||
69 | //------------------------------------------------------------------------- | ||
70 | //------------------------------------------------------------------------- | ||
71 | //------------------------------------------------------------------------- | ||
72 | //------------------------------------------------------------------------- | ||
73 | //------------------------------------------------------------------------- | ||
74 | //------------------------------------------------------------------------- | ||
75 | |||
76 | 'updatedSections': function() { | ||
77 | return this._updatedSections; | ||
78 | }, | ||
79 | |||
80 | 'markSectionAsUpdated': function(aSectionName) { | ||
81 | this.updatedSections().push(aSectionName); | ||
82 | }, | ||
83 | |||
84 | 'resetUpdatedSections': function() { | ||
85 | this._updatedSections = [] | ||
86 | }, | ||
87 | |||
88 | 'hasSectionBeenUpdated': function(aSectionName) { | ||
89 | return (this.updatedSections().join().indexOf(aSectionName) != -1); | ||
90 | }, | ||
91 | |||
92 | 'cachedServerDataSection': function(aSectionName) { | ||
93 | return (this.hasSectionBeenUpdated(aSectionName)) ? {} : this.jsonEvaledServerData()[aSectionName]; | ||
94 | }, | ||
95 | |||
96 | 'updateAllSections': function() { | ||
97 | this.resetUpdatedSections(); | ||
98 | this.markSectionAsUpdated('records'); | ||
99 | this.markSectionAsUpdated('directLogins'); | ||
100 | this.markSectionAsUpdated('preferences'); | ||
101 | this.markSectionAsUpdated('oneTimePasswords'); | ||
102 | |||
103 | return MochiKit.Async.succeed(this); | ||
104 | }, | ||
105 | |||
106 | 'updatedSectionHandler': function(anEvent) { | ||
107 | this.markSectionAsUpdated(anEvent.parameters()); | ||
108 | }, | ||
109 | |||
110 | //------------------------------------------------------------------------- | ||
111 | |||
112 | 'getObjectKeyIndex': function(anObject) { | ||
113 | var result; | ||
114 | varitemReference; | ||
115 | var index; | ||
116 | |||
117 | result = {}; | ||
118 | index = 0; | ||
119 | |||
120 | for (itemReference in anObject) { | ||
121 | result[itemReference] = index.toString(); | ||
122 | index ++; | ||
123 | } | ||
124 | |||
125 | return result; | ||
126 | }, | ||
127 | |||
128 | //------------------------------------------------------------------------- | ||
129 | |||
130 | 'serializedDataWithRecordAndDirectLoginIndexes': function(aRecordIndexes, aDirectLoginIndexs) { | ||
131 | var result; | ||
132 | var records; | ||
133 | var recordReference; | ||
134 | |||
135 | //MochiKit.Logging.logDebug(">>> Header.serializedData"); | ||
136 | result = { | ||
137 | 'records': {}, | ||
138 | 'directLogins': {} | ||
139 | }; | ||
140 | |||
141 | records = this.user().records(); | ||
142 | for (recordReference in records) { | ||
143 | result['records'][aRecordIndexes[recordReference]] = this.user().records()[recordReference].headerData(); | ||
144 | } | ||
145 | |||
146 | for (directLoginReference in this.user().directLoginReferences()) { | ||
147 | var currentDirectLogin; | ||
148 | vardirectLoginData; | ||
149 | |||
150 | currentDirectLogin = this.user().directLoginReferences()[directLoginReference]; | ||
151 | if (aRecordIndexes[currentDirectLogin.recordReference()] != null) { | ||
152 | directLoginData = { | ||
153 | // reference: currentDirectLogin.reference(), | ||
154 | record: aRecordIndexes[currentDirectLogin.recordReference()].toString(), | ||
155 | label: currentDirectLogin.label(), | ||
156 | favicon:currentDirectLogin.favicon() || "" | ||
157 | } | ||
158 | |||
159 | result['directLogins'][aDirectLoginIndexs[directLoginReference]] = directLoginData; | ||
160 | } | ||
161 | |||
162 | } | ||
163 | //MochiKit.Logging.logDebug("<<< Header.serializedData - result: " + Clipperz.Base.serializeJSON(result)); | ||
164 | //MochiKit.Logging.logDebug("<<< Header.serializedData"); | ||
165 | |||
166 | return result; | ||
167 | }, | ||
168 | |||
169 | //------------------------------------------------------------------------- | ||
170 | |||
171 | 'encryptedData': function() { | ||
172 | var deferredResult; | ||
173 | var recordIndex; | ||
174 | var directLoginIndex; | ||
175 | varserializedData; | ||
176 | var result; | ||
177 | |||
178 | //MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Header.encryptedData"); | ||
179 | //MochiKit.Logging.logDebug("### Header.encryptedData - " + Clipperz.Base.serializeJSON(this.updatedSections())); | ||
180 | result = { | ||
181 | 'records': this.cachedServerDataSection('records'), | ||
182 | 'directLogins': this.cachedServerDataSection('directLogins'), | ||
183 | 'preferences': this.cachedServerDataSection('preferences'), | ||
184 | 'oneTimePasswords': this.cachedServerDataSection('oneTimePasswords'), | ||
185 | 'version': '0.1' | ||
186 | }; | ||
187 | |||
188 | if (this.hasSectionBeenUpdated('records')) { | ||
189 | recordIndex = this.getObjectKeyIndex(this.user().records()); | ||
190 | result['records']['index'] = recordIndex; | ||
191 | } else { | ||
192 | recordIndex = result['records']['index']; | ||
193 | } | ||
194 | |||
195 | if (this.hasSectionBeenUpdated('directLogins')) { | ||
196 | directLoginIndex = this.getObjectKeyIndex(this.user().directLoginReferences()); | ||
197 | result['directLogins']['index'] = directLoginIndex; | ||
198 | } else { | ||
199 | directLoginIndex = result['directLogins']['index']; | ||
200 | } | ||
201 | |||
202 | if (this.hasSectionBeenUpdated('records') || this.hasSectionBeenUpdated('directLogins')) { | ||
203 | serializedData = this.serializedDataWithRecordAndDirectLoginIndexes(recordIndex, directLoginIndex); | ||
204 | } | ||
205 | |||
206 | deferredResult = new MochiKit.Async.Deferred(); | ||
207 | |||
208 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 1: " + res); return res;}); | ||
209 | if (this.hasSectionBeenUpdated('records')) { | ||
210 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 1.1: " + res); return res;}); | ||
211 | deferredResult.addCallback(function(anHeader, aResult, aSerializedData, aValue) { | ||
212 | return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(anHeader.user().passphrase(), aSerializedData['records']); | ||
213 | }, this, result, serializedData); | ||
214 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 1.2: " + res); return res;}); | ||
215 | deferredResult.addCallback(function(anHeader, aResult, aValue) { | ||
216 | aResult['records']['data'] = aValue; | ||
217 | }, this, result); | ||
218 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 1.3: " + res); return res;}); | ||
219 | } | ||
220 | |||
221 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 2: " + res); return res;}); | ||
222 | if (this.hasSectionBeenUpdated('directLogins')) { | ||
223 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 2.1: " + res); return res;}); | ||
224 | deferredResult.addCallback(function(anHeader, aResult, aSerializedData, aValue) { | ||
225 | return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(anHeader.user().passphrase(), aSerializedData['directLogins']); | ||
226 | }, this, result, serializedData); | ||
227 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 2.2: " + res); return res;}); | ||
228 | deferredResult.addCallback(function(anHeader, aResult, aValue) { | ||
229 | aResult['directLogins']['data'] = aValue; | ||
230 | }, this, result); | ||
231 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 2.3: " + res); return res;}); | ||
232 | } | ||
233 | |||
234 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 3: " + res); return res;}); | ||
235 | if (this.hasSectionBeenUpdated('preferences')) { | ||
236 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 3.1: " + res); return res;}); | ||
237 | deferredResult.addCallback(function(anHeader, aResult, aValue) { | ||
238 | return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(anHeader.user().passphrase(), anHeader.user().preferences().serializedData()); | ||
239 | }, this, result); | ||
240 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 3.2: " + res); return res;}); | ||
241 | deferredResult.addCallback(function(anHeader, aResult, aValue) { | ||
242 | aResult['preferences']['data'] = aValue; | ||
243 | }, this, result); | ||
244 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 3.3: " + res); return res;}); | ||
245 | } | ||
246 | |||
247 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 4: " + res); return res;}); | ||
248 | if (this.hasSectionBeenUpdated('oneTimePasswords')) { | ||
249 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 4.1: " + res); return res;}); | ||
250 | // deferredResult.addCallback(MochiKit.Base.method(this, 'loadOneTimePasswords')); | ||
251 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 4.2: " + res); return res;}); | ||
252 | deferredResult.addCallback(function(anHeader, aResult, aValue) { | ||
253 | return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(anHeader.user().passphrase(), anHeader.user().oneTimePasswordManager().serializedData()); | ||
254 | }, this, result); | ||
255 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 4.3: " + res); return res;}); | ||
256 | deferredResult.addCallback(function(anHeader, aResult, aValue) { | ||
257 | aResult['oneTimePasswords']['data'] = aValue; | ||
258 | }, this, result); | ||
259 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 4.4: " + res); return res;}); | ||
260 | } | ||
261 | |||
262 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 5: " + res); return res;}); | ||
263 | deferredResult.addCallback(function(anHeader, aResult, aValue) { | ||
264 | var serverData; | ||
265 | |||
266 | serverData = Clipperz.Base.serializeJSON(aResult); | ||
267 | anHeader.setServerData(serverData); | ||
268 | |||
269 | return serverData; | ||
270 | }, this, result); | ||
271 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 6: " + res); return res;}); | ||
272 | |||
273 | deferredResult.callback(); | ||
274 | //MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Header.encryptedData"); | ||
275 | |||
276 | return deferredResult; | ||
277 | }, | ||
278 | |||
279 | //------------------------------------------------------------------------- | ||
280 | |||
281 | 'serverData': function() { | ||
282 | return this._serverData; | ||
283 | }, | ||
284 | |||
285 | 'setServerData': function(aValue) { | ||
286 | //MochiKit.Logging.logDebug(">>> Header.setServerData"); | ||
287 | //MochiKit.Logging.logDebug("[start]============================================="); | ||
288 | //MochiKit.Logging.logDebug("SERVER_DATA: " + aValue); | ||
289 | //MochiKit.Logging.logDebug("[end]==============================================="); | ||
290 | this._serverData = aValue; | ||
291 | //MochiKit.Logging.logDebug("--- Header.setServerData - 1"); | ||
292 | this.resetUpdatedSections(); | ||
293 | //MochiKit.Logging.logDebug("--- Header.setServerData - 2"); | ||
294 | this.resetJsonEvaledServerData(); | ||
295 | //MochiKit.Logging.logDebug("<<< Header.setServerData"); | ||
296 | }, | ||
297 | |||
298 | 'jsonEvaledServerData': function() { | ||
299 | if (this._jsonEvaledServerData == null) { | ||
300 | this._jsonEvaledServerData = Clipperz.Base.evalJSON(this.serverData()); | ||
301 | } | ||
302 | |||
303 | return this._jsonEvaledServerData; | ||
304 | }, | ||
305 | |||
306 | 'resetJsonEvaledServerData': function() { | ||
307 | this._jsonEvaledServerData = null; | ||
308 | }, | ||
309 | |||
310 | //------------------------------------------------------------------------- | ||
311 | |||
312 | 'serverDataVersion': function() { | ||
313 | return this._serverDataVersion; | ||
314 | }, | ||
315 | |||
316 | 'setServerDataVersion': function(aValue) { | ||
317 | this._serverDataVersion = aValue; | ||
318 | }, | ||
319 | |||
320 | //------------------------------------------------------------------------- | ||
321 | |||
322 | 'decryptedLegacyServerData': function() { | ||
323 | var deferredResult; | ||
324 | |||
325 | //MochiKit.Logging.logDebug(">>> Header.decryptedLegacyServerData"); | ||
326 | deferredResult = new MochiKit.Async.Deferred(); | ||
327 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 1: "/* + res*/); return res;}); | ||
328 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
329 | deferredResult.addCallback(MochiKit.Base.method(this, 'updateAllSections')); | ||
330 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 2: "/* + res*/); return res;}); | ||
331 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
332 | if (this._decryptedLegacyServerData == null) { | ||
333 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 3: "/* + res*/); return res;}); | ||
334 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
335 | deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_decryptingUserData'); | ||
336 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 4: "/* + res*/); return res;}); | ||
337 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
338 | deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, this.user().passphrase(), this.serverData(), this.serverDataVersion()); | ||
339 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 5: "/* + res*/); return res;}); | ||
340 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
341 | deferredResult.addCallback(function(anHeader, aValue) { | ||
342 | anHeader._decryptedLegacyServerData = aValue; | ||
343 | }, this); | ||
344 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 6: "/* + res*/); return res;}); | ||
345 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
346 | }; | ||
347 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 7: "/* + res*/); return res;}); | ||
348 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
349 | |||
350 | deferredResult.addCallback(function(anHeader) { | ||
351 | return anHeader._decryptedLegacyServerData; | ||
352 | }, this); | ||
353 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 8: "/* + res*/); return res;}); | ||
354 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
355 | deferredResult.callback(); | ||
356 | //MochiKit.Logging.logDebug("<<< Header.decryptedLegacyServerData"); | ||
357 | |||
358 | return deferredResult; | ||
359 | }, | ||
360 | |||
361 | //------------------------------------------------------------------------- | ||
362 | |||
363 | 'serverDataFormat': function() { | ||
364 | var result; | ||
365 | |||
366 | //MochiKit.Logging.logDebug(">>> Header.serverDataFormat"); | ||
367 | if (this.serverData().charAt(0) == '{') { | ||
368 | varserverData; | ||
369 | |||
370 | serverData = Clipperz.Base.evalJSON(this.serverData()); | ||
371 | result = serverData['version']; | ||
372 | } else { | ||
373 | result = 'LEGACY'; | ||
374 | } | ||
375 | //MochiKit.Logging.logDebug("<<< Header.serverDataFormat"); | ||
376 | |||
377 | return result; | ||
378 | }, | ||
379 | |||
380 | //------------------------------------------------------------------------- | ||
381 | |||
382 | 'extractHeaderDataFromUserDetails': function(someUserDetails) { | ||
383 | if (this.serverData() == null) { | ||
384 | this.setServerData(someUserDetails['header']); | ||
385 | this.setServerDataVersion(someUserDetails['version']) | ||
386 | } | ||
387 | }, | ||
388 | |||
389 | //------------------------------------------------------------------------- | ||
390 | |||
391 | 'extractDataWithKey': function(aKey) { | ||
392 | var deferredResult; | ||
393 | |||
394 | //MochiKit.Logging.logDebug(">>> Header.extractDataWithKey"); | ||
395 | deferredResult = new MochiKit.Async.Deferred(); | ||
396 | |||
397 | switch (this.serverDataFormat()) { | ||
398 | case 'LEGACY': | ||
399 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 1: "/* + res*/); return res;}); | ||
400 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
401 | deferredResult.addCallback(MochiKit.Base.method(this, 'decryptedLegacyServerData')); | ||
402 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 2: "/* + res*/); return res;}); | ||
403 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
404 | deferredResult.addCallback(function(someDecryptedValues) { | ||
405 | return someDecryptedValues[aKey] || {}; | ||
406 | }) | ||
407 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 3: "/* + res*/); return res;}); | ||
408 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
409 | break; | ||
410 | case '0.1': | ||
411 | var data; | ||
412 | |||
413 | //# data = Clipperz.Base.evalJSON(this.serverData()); | ||
414 | data = this.jsonEvaledServerData(); | ||
415 | if (typeof(data[aKey]) != 'undefined') { | ||
416 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 4: "/* + res*/); return res;}); | ||
417 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
418 | deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_decryptingUserData'); | ||
419 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 5: "/* + res*/); return res;}); | ||
420 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
421 | deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, this.user().passphrase(), data[aKey]['data'], this.serverDataVersion()); | ||
422 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 6: "/* + res*/); return res;}); | ||
423 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
424 | deferredResult.addCallback(function(/*anHeader,*/ aKey, aData, aRecordIndex, aValue) { | ||
425 | var result; | ||
426 | //MochiKit.Logging.logDebug(">>> [start] ==============================================="); | ||
427 | //MochiKit.Logging.logDebug("--- extractDataWithKey - 0 [" + aKey + "]: " + Clipperz.Base.serializeJSON(aValue)); | ||
428 | //MochiKit.Logging.logDebug("<<< [end] ================================================="); | ||
429 | if (aKey == 'records') { | ||
430 | var recordKey; | ||
431 | |||
432 | result = {}; | ||
433 | for (recordKey in aData['index']) { | ||
434 | result[recordKey] = aValue[aData['index'][recordKey]]; | ||
435 | } | ||
436 | } else if (aKey == 'directLogins') { | ||
437 | varrecordKeyReversedIndex; | ||
438 | var recordKey; | ||
439 | var directLoginKey; | ||
440 | |||
441 | result = {}; | ||
442 | recordKeyReversedIndex = {}; | ||
443 | |||
444 | for (recordKey in aRecordIndex) { | ||
445 | recordKeyReversedIndex[aRecordIndex[recordKey]] = recordKey; | ||
446 | } | ||
447 | |||
448 | //MochiKit.Logging.logDebug("--- extractDataWithKey - 1 - aData['index']: " + Clipperz.Base.serializeJSON(aData['index'])); | ||
449 | for (directLoginKey in aData['index']) { | ||
450 | try { | ||
451 | if ((aData['index'][directLoginKey] != null) && (aValue[aData['index'][directLoginKey]] != null)) { | ||
452 | result[directLoginKey] = aValue[aData['index'][directLoginKey]]; | ||
453 | result[directLoginKey]['record'] = recordKeyReversedIndex[result[directLoginKey]['record']]; | ||
454 | } | ||
455 | } catch(exception) { | ||
456 | //result[directLoginKey] has no properties | ||
457 | MochiKit.Logging.logDebug("[Header 391] EXCEPTION: " + exception); | ||
458 | throw exception; | ||
459 | } | ||
460 | } | ||
461 | //MochiKit.Logging.logDebug("--- extractDataWithKey - 2"); | ||
462 | } else { | ||
463 | result = aValue; | ||
464 | } | ||
465 | |||
466 | return result; | ||
467 | }, /*this,*/ aKey, data[aKey], data['records']['index']); | ||
468 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 6: "/* + res*/); return res;}); | ||
469 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
470 | } else { | ||
471 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 7: "/* + res*/); return res;}); | ||
472 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
473 | deferredResult.addCallback(MochiKit.Async.succeed, {}); | ||
474 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 8: "/* + res*/); return res;}); | ||
475 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
476 | } | ||
477 | break; | ||
478 | } | ||
479 | |||
480 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 9: "/* + res*/); return res;}); | ||
481 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
482 | deferredResult.callback(); | ||
483 | //MochiKit.Logging.logDebug("<<< Header.extractDataWithKey"); | ||
484 | |||
485 | return deferredResult; | ||
486 | }, | ||
487 | |||
488 | //------------------------------------------------------------------------- | ||
489 | |||
490 | 'processRecordData': function(someRecordData) { | ||
491 | var records; | ||
492 | varrecordReference; | ||
493 | |||
494 | //console.log("HeaderRecordData parameters", someRecordData); | ||
495 | //MochiKit.Logging.logDebug(">>> Header.processRecordData"); | ||
496 | records = someRecordData; | ||
497 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 1"); | ||
498 | if (records != null) { | ||
499 | //MochiKit.Logging.logDebug("--- Header.processRecordData - records: " + Clipperz.Base.serializeJSON(records)); | ||
500 | for (recordReference in records) { | ||
501 | var newRecord; | ||
502 | var parameters; | ||
503 | |||
504 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 2 - recordReference: " + recordReference); | ||
505 | if (recordReference != "stacktrace") { | ||
506 | parameters = records[recordReference];//.slice(); | ||
507 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 3"); | ||
508 | if (typeof(parameters['notes']) != 'undefined') { | ||
509 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 4"); | ||
510 | if (parameters['notes'] != "") { | ||
511 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 5"); | ||
512 | parameters['headerNotes'] = parameters['notes']; | ||
513 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 6"); | ||
514 | } | ||
515 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 7"); | ||
516 | delete parameters['notes']; | ||
517 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 8"); | ||
518 | } | ||
519 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 9"); | ||
520 | parameters['reference'] = recordReference; | ||
521 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 10"); | ||
522 | parameters['user'] = this.user(); | ||
523 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 11"); | ||
524 | |||
525 | newRecord = new Clipperz.PM.DataModel.Record(parameters); | ||
526 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 12"); | ||
527 | this.user().addRecord(newRecord, true); | ||
528 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 13"); | ||
529 | } | ||
530 | } | ||
531 | |||
532 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 14"); | ||
533 | Clipperz.NotificationCenter.notify(null, 'recordAdded', null, true); | ||
534 | //MochiKit.Logging.logDebug("--- Header.processRecordData - 15"); | ||
535 | } | ||
536 | //MochiKit.Logging.logDebug("<<< Header.processRecordData"); | ||
537 | |||
538 | return this.user().records(); | ||
539 | }, | ||
540 | |||
541 | //------------------------------------------------------------------------- | ||
542 | |||
543 | 'processDirectLoginData': function(someDirectLoginData) { | ||
544 | var directLogins; | ||
545 | var directLoginReference; | ||
546 | |||
547 | //MochiKit.Logging.logDebug(">>> Header.processDirectLoginData"); | ||
548 | directLogins = someDirectLoginData; | ||
549 | if (directLogins != null) { | ||
550 | for (directLoginReference in directLogins) { | ||
551 | var directLoginReference; | ||
552 | var parameters; | ||
553 | |||
554 | parameters = directLogins[directLoginReference];//.slice(); | ||
555 | parameters.user = this.user(); | ||
556 | parameters.reference = directLoginReference; | ||
557 | directLoginReference = new Clipperz.PM.DataModel.DirectLoginReference(parameters); | ||
558 | if (directLoginReference.record() != null) { | ||
559 | this.user().addDirectLoginReference(directLoginReference, true); | ||
560 | } | ||
561 | } | ||
562 | } | ||
563 | |||
564 | Clipperz.NotificationCenter.notify(null, 'directLoginAdded', null, true); | ||
565 | //MochiKit.Logging.logDebug("<<< Header.processDirectLoginData"); | ||
566 | |||
567 | return this.user().directLoginReferences(); | ||
568 | }, | ||
569 | |||
570 | //------------------------------------------------------------------------- | ||
571 | |||
572 | 'shouldLoadSections': function() { | ||
573 | return this._shouldLoadSections; | ||
574 | }, | ||
575 | |||
576 | 'shouldLoadSection': function(aSectionName) { | ||
577 | var result; | ||
578 | |||
579 | if (typeof(this.shouldLoadSections()[aSectionName]) != 'undefined') { | ||
580 | result = this.shouldLoadSections()[aSectionName]; | ||
581 | } else { | ||
582 | result = true; | ||
583 | } | ||
584 | |||
585 | return result; | ||
586 | }, | ||
587 | |||
588 | 'setShouldLoadSection': function(aSectionName, aValue) { | ||
589 | this.shouldLoadSections()[aSectionName] = aValue; | ||
590 | }, | ||
591 | |||
592 | //------------------------------------------------------------------------- | ||
593 | |||
594 | 'loadRecords': function() { | ||
595 | var deferredResult; | ||
596 | |||
597 | if (this.shouldLoadSection('records') == true) { | ||
598 | this.setShouldLoadSection('records', false); | ||
599 | |||
600 | deferredResult = new MochiKit.Async.Deferred(); | ||
601 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadRecords 1: "/* + res*/); return res;}); | ||
602 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
603 | deferredResult.addCallback(MochiKit.Base.method(this.user(), 'getUserDetails')); | ||
604 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadRecords 2: "/* + res*/); return res;}); | ||
605 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
606 | deferredResult.addCallback(MochiKit.Base.method(this, 'extractHeaderDataFromUserDetails')); | ||
607 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadRecords 3: "/* + res*/); return res;}); | ||
608 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
609 | deferredResult.addCallback(MochiKit.Base.method(this, 'extractDataWithKey', 'records')); | ||
610 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadRecords 4: "/* + res*/); return res;}); | ||
611 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
612 | deferredResult.addCallback(MochiKit.Base.method(this, 'processRecordData')); | ||
613 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadRecords 5: "/* + res*/); return res;}); | ||
614 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
615 | deferredResult.callback(); | ||
616 | } else { | ||
617 | deferredResult = MochiKit.Async.succeed(this.user().records()); | ||
618 | } | ||
619 | |||
620 | return deferredResult; | ||
621 | }, | ||
622 | |||
623 | //------------------------------------------------------------------------- | ||
624 | |||
625 | 'loadDirectLogins': function() { | ||
626 | var deferredResult; | ||
627 | |||
628 | if (this.shouldLoadSection('directLogins') == true) { | ||
629 | this.setShouldLoadSection('directLogins', false); | ||
630 | |||
631 | deferredResult = new MochiKit.Async.Deferred(); | ||
632 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadDirectLogins - 1: "/* + res*/); return res;}); | ||
633 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
634 | deferredResult.addCallback(MochiKit.Base.method(this.user(), 'getUserDetails')); | ||
635 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadDirectLogins - 2: "/* + res*/); return res;}); | ||
636 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
637 | deferredResult.addCallback(MochiKit.Base.method(this, 'extractHeaderDataFromUserDetails')); | ||
638 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadDirectLogins - 3: "/* + res*/); return res;}); | ||
639 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
640 | deferredResult.addCallback(MochiKit.Base.method(this, 'extractDataWithKey', 'directLogins')); | ||
641 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadDirectLogins - 4: "/* + res*/); return res;}); | ||
642 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
643 | deferredResult.addCallback(MochiKit.Base.method(this, 'processDirectLoginData')); | ||
644 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadDirectLogins - 5: "/* + res*/); return res;}); | ||
645 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
646 | deferredResult.callback(); | ||
647 | } else { | ||
648 | deferredResult = MochiKit.Async.succeed(this.user().directLoginReferences()); | ||
649 | } | ||
650 | |||
651 | return deferredResult; | ||
652 | }, | ||
653 | |||
654 | //------------------------------------------------------------------------- | ||
655 | |||
656 | 'loadPreferences': function() { | ||
657 | var deferredResult; | ||
658 | |||
659 | if (this.shouldLoadSection('preferences') == true) { | ||
660 | this.setShouldLoadSection('preferences', false); | ||
661 | |||
662 | deferredResult = new MochiKit.Async.Deferred(); | ||
663 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadPreferences - 1: "/* + res*/); return res;}); | ||
664 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
665 | deferredResult.addCallback(MochiKit.Base.method(this.user(), 'getUserDetails')); | ||
666 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadPreferences - 2: "/* + res*/); return res;}); | ||
667 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
668 | deferredResult.addCallback(MochiKit.Base.method(this, 'extractHeaderDataFromUserDetails')); | ||
669 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadPreferences - 3: "/* + res*/); return res;}); | ||
670 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
671 | deferredResult.addCallback(MochiKit.Base.method(this, 'extractDataWithKey', 'preferences')); | ||
672 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadPreferences - 4: "/* + res*/); return res;}); | ||
673 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
674 | deferredResult.addCallback(MochiKit.Base.method(this.user().preferences(), 'updateWithData')); | ||
675 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadPreferences - 5: "/* + res*/); return res;}); | ||
676 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
677 | deferredResult.callback(); | ||
678 | } else { | ||
679 | deferredResult = MochiKit.Async.succeed(this.user().preferences()); | ||
680 | } | ||
681 | |||
682 | return deferredResult; | ||
683 | }, | ||
684 | |||
685 | //------------------------------------------------------------------------- | ||
686 | |||
687 | 'loadOneTimePasswords': function() { | ||
688 | var deferredResult; | ||
689 | |||
690 | if (this.shouldLoadSection('oneTimePasswords') == true) { | ||
691 | this.setShouldLoadSection('oneTimePasswords', false); | ||
692 | |||
693 | deferredResult = new MochiKit.Async.Deferred(); | ||
694 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 1: "/* + res*/); return res;}); | ||
695 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
696 | deferredResult.addCallback(MochiKit.Base.method(this.user(), 'getUserDetails')); | ||
697 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 2: "/* + res*/); return res;}); | ||
698 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
699 | deferredResult.addCallback(MochiKit.Base.method(this, 'extractHeaderDataFromUserDetails')); | ||
700 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 3: "/* + res*/); return res;}); | ||
701 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
702 | deferredResult.addCallback(MochiKit.Base.method(this, 'extractDataWithKey', 'oneTimePasswords')); | ||
703 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 4: "/* + res*/); return res;}); | ||
704 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
705 | deferredResult.addCallback(MochiKit.Base.method(this.user().oneTimePasswordManager(), 'updateWithData')); | ||
706 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 5: "/* + res*/); return res;}); | ||
707 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
708 | deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'getOneTimePasswordsDetails', {}); | ||
709 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 6: "/* + res*/); return res;}); | ||
710 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
711 | deferredResult.addCallback(MochiKit.Base.method(this.user().oneTimePasswordManager(), 'updateWithServerData')); | ||
712 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 7: "/* + res*/); return res;}); | ||
713 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
714 | deferredResult.callback(); | ||
715 | } else { | ||
716 | deferredResult = MochiKit.Async.succeed(this.user().oneTimePasswordManager()); | ||
717 | } | ||
718 | |||
719 | return deferredResult; | ||
720 | }, | ||
721 | |||
722 | //------------------------------------------------------------------------- | ||
723 | |||
724 | 'loadAllSections': function() { | ||
725 | var deferredResult; | ||
726 | |||
727 | deferredResult = new MochiKit.Async.Deferred(); | ||
728 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadAllSections - 1: "/* + res*/); return res;}); | ||
729 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
730 | deferredResult.addCallback(MochiKit.Base.method(this, 'loadRecords')); | ||
731 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadAllSections - 2: "/* + res*/); return res;}); | ||
732 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
733 | deferredResult.addCallback(MochiKit.Base.method(this, 'loadDirectLogins')); | ||
734 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadAllSections - 3: "/* + res*/); return res;}); | ||
735 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
736 | deferredResult.addCallback(MochiKit.Base.method(this, 'loadPreferences')); | ||
737 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadAllSections - 4: "/* + res*/); return res;}); | ||
738 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
739 | deferredResult.addCallback(MochiKit.Base.method(this, 'loadOneTimePasswords')); | ||
740 | //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadAllSections - 5: "/* + res*/); return res;}); | ||
741 | //deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;}); | ||
742 | deferredResult.callback(); | ||
743 | |||
744 | return deferredResult; | ||
745 | }, | ||
746 | |||
747 | //------------------------------------------------------------------------- | ||
748 | __syntaxFix__: "syntax fix" | ||
749 | |||
750 | }); | ||
751 | |||