summaryrefslogtreecommitdiff
path: root/frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
Unidiff
Diffstat (limited to 'frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js47
1 files changed, 37 insertions, 10 deletions
diff --git a/frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js b/frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
index 1a5caff..b0b9b63 100644
--- a/frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
+++ b/frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
@@ -1,752 +1,779 @@
1/* 1/*
2 2
3Copyright 2008-2013 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz, the online password manager. 5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please 6For further information about its features and functionalities please
7refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
8 8
9* Clipperz is free software: you can redistribute it and/or modify it 9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published 10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or 11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version. 12 (at your option) any later version.
13 13
14* Clipperz is distributed in the hope that it will be useful, but 14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of 15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
18 18
19* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/. 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21 21
22*/ 22*/
23 23
24try { if (typeof(Clipperz.PM.Proxy.Offline) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.PM.Proxy.Offline) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.Proxy.Offline.DataStore depends on Clipperz.PM.Proxy.Offline!"; 25 throw "Clipperz.PM.Proxy.Offline.DataStore depends on Clipperz.PM.Proxy.Offline!";
26} 26}
27 27
28//============================================================================= 28//=============================================================================
29 29
30Clipperz.PM.Proxy.Offline.DataStore = function(args) { 30Clipperz.PM.Proxy.Offline.DataStore = function(args) {
31 args = args || {}; 31 args = args || {};
32 32
33 this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null); 33 this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null);
34 this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly); 34 this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly);
35 this._shouldPayTolls = args.shouldPayTolls || false; 35 this._shouldPayTolls = args.shouldPayTolls || false;
36 36
37 this._tolls = {}; 37 this._tolls = {};
38 this._connections = {}; 38 this._connections = {};
39 39
40 this._C = null;
40 this._b = null; 41 this._b = null;
41 this._B = null; 42 this._B = null;
42 this._A = null; 43 this._A = null;
43 this._userData = null; 44 this._userData = null;
44 45
45 return this; 46 return this;
46} 47}
47 48
48//Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, { 49//Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
49Clipperz.PM.Proxy.Offline.DataStore.prototype = MochiKit.Base.update(null, { 50Clipperz.PM.Proxy.Offline.DataStore.prototype = MochiKit.Base.update(null, {
50 51
51 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
52 53
53 'isReadOnly': function () { 54 'isReadOnly': function () {
54 return this._isReadOnly; 55 return this._isReadOnly;
55 }, 56 },
56 57
57 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
58 59
59 'shouldPayTolls': function() { 60 'shouldPayTolls': function() {
60 return this._shouldPayTolls; 61 return this._shouldPayTolls;
61 }, 62 },
62 63
63 //------------------------------------------------------------------------- 64 //-------------------------------------------------------------------------
64 65
65 'data': function () { 66 'data': function () {
66 return this._data; 67 return this._data;
67 }, 68 },
68 69
69 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
70 71
71 'tolls': function () { 72 'tolls': function () {
72 return this._tolls; 73 return this._tolls;
73 }, 74 },
74 75
75 //------------------------------------------------------------------------- 76 //-------------------------------------------------------------------------
76 77
77 'connections': function () { 78 'connections': function () {
78 return this._connections; 79 return this._connections;
79 }, 80 },
80 81
81 //========================================================================= 82 //=========================================================================
82 83
83 'resetData': function() { 84 'resetData': function() {
84 this._data = { 85 this._data = {
85 'users': { 86 'users': {
86 'catchAllUser': { 87 'catchAllUser': {
87 __masterkey_test_value__: 'masterkey', 88 __masterkey_test_value__: 'masterkey',
88 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 89 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
89 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 90 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
90 } 91 }
91 } 92 }
92 }; 93 };
93 }, 94 },
94 95
95 //------------------------------------------------------------------------- 96 //-------------------------------------------------------------------------
96 97
97 'setupWithEncryptedData': function(someData) { 98 'setupWithEncryptedData': function(someData) {
98 this._data = Clipperz.Base.deepClone(someData); 99 this._data = Clipperz.Base.deepClone(someData);
99 }, 100 },
100 101
101 //------------------------------------------------------------------------- 102 //-------------------------------------------------------------------------
102 103
103 'setupWithData': function(someData) { 104 'setupWithData': function(someData) {
104 var deferredResult; 105 var deferredResult;
105 var resultData; 106 var resultData;
106 var i, c; 107 var i, c;
107 108
108//Clipperz.log(">>> Proxy.Test.setupWithData"); 109//Clipperz.log(">>> Proxy.Test.setupWithData");
109 resultData = this._data; 110 resultData = this._data;
110 111
111 deferredResult = new MochiKit.Async.Deferred(); 112 deferredResult = new MochiKit.Async.Deferred();
112 c = someData['users'].length; 113 c = someData['users'].length;
113 114
114 for (i=0; i<c; i++) { 115 for (i=0; i<c; i++) {
115 varnewConnection; 116 varnewConnection;
116 varrecordConfiguration; 117 varrecordConfiguration;
117 118
118 deferredResult.addCallback(MochiKit.Base.method(this, 'userSerializedEncryptedData', someData['users'][i])); 119 deferredResult.addCallback(MochiKit.Base.method(this, 'userSerializedEncryptedData', someData['users'][i]));
119 deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) { 120 deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) {
120//console.log("SERIALIZED USER", aUserSerializationContext); 121//console.log("SERIALIZED USER", aUserSerializationContext);
121 resultData['users'][aUserSerializationContext['credentials']['C']] = { 122 resultData['users'][aUserSerializationContext['credentials']['C']] = {
122 's': aUserSerializationContext['credentials']['s'], 123 's': aUserSerializationContext['credentials']['s'],
123 'v': aUserSerializationContext['credentials']['v'], 124 'v': aUserSerializationContext['credentials']['v'],
124 'version': aUserSerializationContext['data']['connectionVersion'], 125 'version': aUserSerializationContext['data']['connectionVersion'],
125 'userDetails': aUserSerializationContext['encryptedData']['user']['header'], 126 'userDetails': aUserSerializationContext['encryptedData']['user']['header'],
126 'userDetailsVersion':aUserSerializationContext['encryptedData']['user']['version'], 127 'userDetailsVersion':aUserSerializationContext['encryptedData']['user']['version'],
127 'statistics': aUserSerializationContext['encryptedData']['user']['statistics'], 128 'statistics': aUserSerializationContext['encryptedData']['user']['statistics'],
128 'lock': aUserSerializationContext['encryptedData']['user']['lock'], 129 'lock': aUserSerializationContext['encryptedData']['user']['lock'],
129 'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records']) 130 'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records'])
130 } 131 }
131 }, this)); 132 }, this));
132 } 133 }
133 134
134 deferredResult.addCallback(MochiKit.Base.bind(function() { 135 deferredResult.addCallback(MochiKit.Base.bind(function() {
135//console.log("this._data", resultData); 136//console.log("this._data", resultData);
136 this._data = resultData; 137 this._data = resultData;
137 }, this)); 138 }, this));
138 139
139 deferredResult.callback(); 140 deferredResult.callback();
140//Clipperz.log("<<< Proxy.Test.setupWithData"); 141//Clipperz.log("<<< Proxy.Test.setupWithData");
141 142
142 return deferredResult; 143 return deferredResult;
143 }, 144 },
144 145
145 //========================================================================= 146 //=========================================================================
146 147
148 'C': function() {
149 return this._C;
150 },
151
152 'set_C': function(aValue) {
153 this._C = aValue;
154 },
155
156 //-------------------------------------------------------------------------
157
147 'b': function() { 158 'b': function() {
148 return this._b; 159 return this._b;
149 }, 160 },
150 161
151 'set_b': function(aValue) { 162 'set_b': function(aValue) {
152 this._b = aValue; 163 this._b = aValue;
153 }, 164 },
154 165
155 //------------------------------------------------------------------------- 166 //-------------------------------------------------------------------------
156 167
157 'B': function() { 168 'B': function() {
158 return this._B; 169 return this._B;
159 }, 170 },
160 171
161 'set_B': function(aValue) { 172 'set_B': function(aValue) {
162 this._B = aValue; 173 this._B = aValue;
163 }, 174 },
164 175
165 //------------------------------------------------------------------------- 176 //-------------------------------------------------------------------------
166 177
167 'A': function() { 178 'A': function() {
168 return this._A; 179 return this._A;
169 }, 180 },
170 181
171 'set_A': function(aValue) { 182 'set_A': function(aValue) {
172 this._A = aValue; 183 this._A = aValue;
173 }, 184 },
174 185
175 //------------------------------------------------------------------------- 186 //-------------------------------------------------------------------------
176 187
177 'userData': function() { 188 'userData': function() {
178 return this._userData; 189 return this._userData;
179 }, 190 },
180 191
181 'setUserData': function(aValue) { 192 'setUserData': function(aValue) {
182 this._userData = aValue; 193 this._userData = aValue;
183 }, 194 },
184 195
185 //========================================================================= 196 //=========================================================================
186 197
187 'getTollForRequestType': function (aRequestType) { 198 'getTollForRequestType': function (aRequestType) {
188 varresult; 199 varresult;
189 vartargetValue; 200 vartargetValue;
190 var cost; 201 var cost;
191 202
192 targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 203 targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
193 switch (aRequestType) { 204 switch (aRequestType) {
194 case 'REGISTER': 205 case 'REGISTER':
195 cost = 5; 206 cost = 5;
196 break; 207 break;
197 case 'CONNECT': 208 case 'CONNECT':
198 cost = 5; 209 cost = 5;
199 break; 210 break;
200 case 'MESSAGE': 211 case 'MESSAGE':
201 cost = 2; 212 cost = 2;
202 break; 213 break;
203 } 214 }
204 215
205 result = { 216 result = {
206 requestType: aRequestType, 217 requestType: aRequestType,
207 targetValue: targetValue, 218 targetValue: targetValue,
208 cost: cost 219 cost: cost
209 } 220 }
210 221
211 if (this.shouldPayTolls()) { 222 if (this.shouldPayTolls()) {
212 this.tolls()[targetValue] = result; 223 this.tolls()[targetValue] = result;
213 } 224 }
214 225
215 return result; 226 return result;
216 }, 227 },
217 228
218 //------------------------------------------------------------------------- 229 //-------------------------------------------------------------------------
219 230
220 'checkToll': function (aFunctionName, someParameters) { 231 'checkToll': function (aFunctionName, someParameters) {
221 if (this.shouldPayTolls()) { 232 if (this.shouldPayTolls()) {
222 var localToll; 233 var localToll;
223 vartollParameters; 234 vartollParameters;
224 235
225 tollParameters = someParameters['toll']; 236 tollParameters = someParameters['toll'];
226 localToll = this.tolls()[tollParameters['targetValue']]; 237 localToll = this.tolls()[tollParameters['targetValue']];
227 238
228 if (localToll != null) { 239 if (localToll != null) {
229 if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) { 240 if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) {
230 throw "Toll value too low."; 241 throw "Toll value too low.";
231 }; 242 };
232 } else { 243 } else {
233 throw "Missing toll"; 244 throw "Missing toll";
234 } 245 }
235 } 246 }
236 }, 247 },
237 248
238 //========================================================================= 249 //=========================================================================
239 250
240 'processMessage': function(aFunctionName, someParameters) { 251 'processMessage': function (aFunctionName, someParameters) {
241 var result; 252 var result;
242 253
243 switch(aFunctionName) { 254 switch(aFunctionName) {
244 case 'knock': 255 case 'knock':
245 result = this._knock(someParameters); 256 result = this._knock(someParameters);
246 break; 257 break;
247 case 'registration': 258 case 'registration':
248 this.checkToll(aFunctionName, someParameters); 259 this.checkToll(aFunctionName, someParameters);
249 result = this._registration(someParameters.parameters); 260 result = this._registration(someParameters.parameters);
250 break; 261 break;
251 case 'handshake': 262 case 'handshake':
252 this.checkToll(aFunctionName, someParameters); 263 this.checkToll(aFunctionName, someParameters);
253 result = this._handshake(someParameters.parameters); 264 result = this._handshake(someParameters.parameters);
254 break; 265 break;
255 case 'message': 266 case 'message':
256 this.checkToll(aFunctionName, someParameters); 267 this.checkToll(aFunctionName, someParameters);
257 result = this._message(someParameters.parameters); 268 result = this._message(someParameters.parameters);
258 break; 269 break;
259 case 'logout': 270 case 'logout':
260 result = this._logout(someParameters.parameters); 271 result = this._logout(someParameters.parameters);
261 break; 272 break;
262 } 273 }
263 274
264 return result; 275 return result;
265 }, 276 },
266 277
267 //========================================================================= 278 //=========================================================================
268 279
269 '_knock': function(someParameters) { 280 '_knock': function(someParameters) {
270 var result; 281 var result;
271 282
272 result = { 283 result = {
273 toll: this.getTollForRequestType(someParameters['requestType']) 284 toll: this.getTollForRequestType(someParameters['requestType'])
274 // toll: { 285 // toll: {
275 // requestType: someParameters['requestType'], 286 // requestType: someParameters['requestType'],
276 // targetValue: "3a1ba0be23580f902885c6c8a6b035e228ed1ca74d77de5f9bb0e0c899f07cfe", 287 // targetValue: "3a1ba0be23580f902885c6c8a6b035e228ed1ca74d77de5f9bb0e0c899f07cfe",
277 // cost: 288 // cost:
278 // } 289 // }
279 } 290 }
280 291
281 return result; 292 return result;
282 }, 293 },
283 294
284 //------------------------------------------------------------------------- 295 //-------------------------------------------------------------------------
285 296
286 '_registration': function(someParameters) { 297 '_registration': function(someParameters) {
287//console.log("_registration", someParameters); 298//console.log("_registration", someParameters);
288 if (this.isReadOnly() == false) { 299 if (this.isReadOnly() == false) {
289 if (typeof(this.data()['users'][someParameters['credentials']['C']]) == 'undefined') { 300 if (typeof(this.data()['users'][someParameters['credentials']['C']]) == 'undefined') {
290 this.data()['users'][someParameters['credentials']['C']] = { 301 this.data()['users'][someParameters['credentials']['C']] = {
291 's': someParameters['credentials']['s'], 302 's': someParameters['credentials']['s'],
292 'v': someParameters['credentials']['v'], 303 'v': someParameters['credentials']['v'],
293 'version':someParameters['credentials']['version'], 304 'version':someParameters['credentials']['version'],
294 // 'lock': someParameters['user']['lock'], 305 // 'lock': someParameters['user']['lock'],
295 'lock': Clipperz.Crypto.Base.generateRandomSeed(), 306 'lock': Clipperz.Crypto.Base.generateRandomSeed(),
296 // 'maxNumberOfRecords':'100', 307 // 'maxNumberOfRecords':'100',
297 'userDetails': someParameters['user']['header'], 308 'userDetails': someParameters['user']['header'],
298 'statistics': someParameters['user']['statistics'], 309 'statistics': someParameters['user']['statistics'],
299 'userDetailsVersion':someParameters['user']['version'], 310 'userDetailsVersion':someParameters['user']['version'],
300 'records':{} 311 'records':{}
301 } 312 }
302 } else { 313 } else {
303 throw "user already exists"; 314 throw "user already exists";
304 } 315 }
305 } else { 316 } else {
306 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; 317 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
307 } 318 }
308 319
309 result = { 320 result = {
310 result: { 321 result: {
311 'lock': this.data()['users'][someParameters['credentials']['C']]['lock'], 322 'lock': this.data()['users'][someParameters['credentials']['C']]['lock'],
312 'result':'done' 323 'result':'done'
313 }, 324 },
314 toll: this.getTollForRequestType('CONNECT') 325 toll: this.getTollForRequestType('CONNECT')
315 } 326 }
316 327
317 return MochiKit.Async.succeed(result); 328 return MochiKit.Async.succeed(result);
318 }, 329 },
319 330
320 //------------------------------------------------------------------------- 331 //-------------------------------------------------------------------------
321 332
322 '_handshake': function(someParameters) { 333 '_handshake': function(someParameters) {
323 var result; 334 var result;
324 varnextTollRequestType; 335 varnextTollRequestType;
325 336
326//Clipperz.log(">>> Proxy.Offline.DataStore._handshake"); 337//Clipperz.log(">>> Proxy.Offline.DataStore._handshake");
327 result = {}; 338 result = {};
328 if (someParameters.message == "connect") { 339 if (someParameters.message == "connect") {
329 var userData; 340 var userData;
330 var randomBytes; 341 var randomBytes;
331 var b, B, v; 342 var b, B, v;
332 343
333//console.log(">>> Proxy.Offline.DataStore._handshake.connect", someParameters); 344//console.log(">>> Proxy.Offline.DataStore._handshake.connect", someParameters);
334 userData = this.data()['users'][someParameters.parameters.C]; 345 userData = this.data()['users'][someParameters.parameters.C];
335 346
336 if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) { 347 if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) {
337 this.setUserData(userData); 348 this.setUserData(userData);
338 } else { 349 } else {
339 this.setUserData(this.data()['users']['catchAllUser']); 350 this.setUserData(this.data()['users']['catchAllUser']);
340 } 351 }
341 352
342 randomBytes = Clipperz.Crypto.Base.generateRandomSeed(); 353 randomBytes = Clipperz.Crypto.Base.generateRandomSeed();
354 this.set_C(someParameters.parameters.C);
343 this.set_b(new Clipperz.Crypto.BigInt(randomBytes, 16)); 355 this.set_b(new Clipperz.Crypto.BigInt(randomBytes, 16));
344 v = new Clipperz.Crypto.BigInt(this.userData()['v'], 16); 356 v = new Clipperz.Crypto.BigInt(this.userData()['v'], 16);
345 this.set_B(v.add(Clipperz.Crypto.SRP.g().powerModule(this.b(), Clipperz.Crypto.SRP.n()))); 357 this.set_B((Clipperz.Crypto.SRP.k().multiply(v)).add(Clipperz.Crypto.SRP.g().powerModule(this.b(), Clipperz.Crypto.SRP.n())));
346 358
347 this.set_A(someParameters.parameters.A); 359 this.set_A(someParameters.parameters.A);
348 360
349 result['s'] = this.userData()['s']; 361 result['s'] = this.userData()['s'];
350 result['B'] = this.B().asString(16); 362 result['B'] = this.B().asString(16);
351 363
352 nextTollRequestType = 'CONNECT'; 364 nextTollRequestType = 'CONNECT';
353 } else if (someParameters.message == "credentialCheck") { 365 } else if (someParameters.message == "credentialCheck") {
354 var v, u, S, A, K, M1; 366 var v, u, s, S, A, K, M1;
367 var stringHash = function (aValue) {
368 return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aValue)).toHexString().substring(2);
369 };
355 370
356//console.log(">>> Proxy.Offline.DataStore._handshake.credentialCheck", someParameters); 371//console.log(">>> Proxy.Offline.DataStore._handshake.credentialCheck", someParameters);
357 v = new Clipperz.Crypto.BigInt(this.userData()['v'], 16); 372 v = new Clipperz.Crypto.BigInt(this.userData()['v'], 16);
358 u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(this.B().asString(10))).toHexString(), 16);
359 A = new Clipperz.Crypto.BigInt(this.A(), 16); 373 A = new Clipperz.Crypto.BigInt(this.A(), 16);
374 u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + this.B().asString(10))).toHexString(), 16);
375 s = new Clipperz.Crypto.BigInt(this.userData()['s'], 16);
360 S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(this.b(), Clipperz.Crypto.SRP.n()); 376 S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(this.b(), Clipperz.Crypto.SRP.n());
361 377
362 K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2); 378 K = stringHash(S.asString(10));
363 379
364 M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + this.B().asString(10) + K)).toHexString().slice(2); 380 M1 = stringHash(
381 "597626870978286801440197562148588907434001483655788865609375806439877501869636875571920406529" +
382 stringHash(this.C()) +
383 s.asString(10) +
384 A.asString(10) +
385 this.B().asString(10) +
386 K
387 );
365 if (someParameters.parameters.M1 == M1) { 388 if (someParameters.parameters.M1 == M1) {
366 var M2; 389 var M2;
367 390
368 M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2); 391 M2 = stringHash(
392 A.asString(10) +
393 someParameters.parameters.M1 +
394 K
395 );
369 result['M2'] = M2; 396 result['M2'] = M2;
370 } else { 397 } else {
371 throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error"); 398 throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error");
372 } 399 }
373 400
374 nextTollRequestType = 'MESSAGE'; 401 nextTollRequestType = 'MESSAGE';
375 } else if (someParameters.message == "oneTimePassword") { 402 } else if (someParameters.message == "oneTimePassword") {
376 var otpData; 403 var otpData;
377 404
378//console.log("HANDSHAKE WITH OTP", someParameters.parameters.oneTimePasswordKey); 405//console.log("HANDSHAKE WITH OTP", someParameters.parameters.oneTimePasswordKey);
379//console.log("someParameters", someParameters); 406//console.log("someParameters", someParameters);
380//console.log("data.OTP", Clipperz.Base.serializeJSON(this.data()['onetimePasswords'])); 407//console.log("data.OTP", Clipperz.Base.serializeJSON(this.data()['onetimePasswords']));
381 otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey]; 408 otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey];
382 409
383 try { 410 try {
384 if (typeof(otpData) != 'undefined') { 411 if (typeof(otpData) != 'undefined') {
385 if (otpData['status'] == 'ACTIVE') { 412 if (otpData['status'] == 'ACTIVE') {
386 if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) { 413 if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) {
387 result = { 414 result = {
388 'data': otpData['data'], 415 'data': otpData['data'],
389 'version':otpData['version'] 416 'version':otpData['version']
390 } 417 }
391 418
392 otpData['status'] = 'REQUESTED'; 419 otpData['status'] = 'REQUESTED';
393 } else { 420 } else {
394 otpData['status'] = 'DISABLED'; 421 otpData['status'] = 'DISABLED';
395 throw "The requested One Time Password has been disabled, due to a wrong keyChecksum"; 422 throw "The requested One Time Password has been disabled, due to a wrong keyChecksum";
396 } 423 }
397 } else { 424 } else {
398 throw "The requested One Time Password was not active"; 425 throw "The requested One Time Password was not active";
399 } 426 }
400 } else { 427 } else {
401 throw "The requested One Time Password has not been found" 428 throw "The requested One Time Password has not been found"
402 } 429 }
403 } catch (exception) { 430 } catch (exception) {
404 result = { 431 result = {
405 'data': Clipperz.PM.Crypto.randomKey(), 432 'data': Clipperz.PM.Crypto.randomKey(),
406 'version':Clipperz.PM.Connection.communicationProtocol.currentVersion 433 'version':Clipperz.PM.Connection.communicationProtocol.currentVersion
407 } 434 }
408 } 435 }
409 nextTollRequestType = 'CONNECT'; 436 nextTollRequestType = 'CONNECT';
410 } else { 437 } else {
411 MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message); 438 MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message);
412 } 439 }
413//console.log("<<< Proxy.Offline._handshake", result); 440//console.log("<<< Proxy.Offline._handshake", result);
414 441
415 result = { 442 result = {
416 result: result, 443 result: result,
417 toll: this.getTollForRequestType(nextTollRequestType) 444 toll: this.getTollForRequestType(nextTollRequestType)
418 } 445 }
419 446
420 return MochiKit.Async.succeed(result); 447 return MochiKit.Async.succeed(result);
421 }, 448 },
422 449
423 //------------------------------------------------------------------------- 450 //-------------------------------------------------------------------------
424 451
425 '_message': function(someParameters) { 452 '_message': function(someParameters) {
426 var result; 453 var result;
427 454
428 result = {}; 455 result = {};
429 456
430 //===================================================================== 457 //=====================================================================
431 // 458 //
432 // R E A D - O N L Y M e t h o d s 459 // R E A D - O N L Y M e t h o d s
433 // 460 //
434 //===================================================================== 461 //=====================================================================
435 if (someParameters.message == 'getUserDetails') { 462 if (someParameters.message == 'getUserDetails') {
436 var recordsStats; 463 var recordsStats;
437 var recordReference; 464 var recordReference;
438 465
439 //try { 466 //try {
440 recordsStats = {}; 467 recordsStats = {};
441 for (recordReference in this.userData()['records']) { 468 for (recordReference in this.userData()['records']) {
442 recordsStats[recordReference] = { 469 recordsStats[recordReference] = {
443 'updateDate': this.userData()['records'][recordReference]['updateDate'] 470 'updateDate': this.userData()['records'][recordReference]['updateDate']
444 } 471 }
445 } 472 }
446 473
447 result['header'] = this.userDetails(); 474 result['header'] = this.userDetails();
448 result['statistics'] = this.statistics(); 475 result['statistics'] = this.statistics();
449 result['maxNumberOfRecords'] = this.userData()['maxNumberOfRecords']; 476 result['maxNumberOfRecords'] = this.userData()['maxNumberOfRecords'];
450 result['version'] = this.userData()['userDetailsVersion']; 477 result['version'] = this.userData()['userDetailsVersion'];
451 result['recordsStats'] = recordsStats; 478 result['recordsStats'] = recordsStats;
452 479
453 if (this.isReadOnly() == false) { 480 if (this.isReadOnly() == false) {
454 varlock; 481 varlock;
455 482
456 if (typeof(this.userData()['lock']) == 'undefined') { 483 if (typeof(this.userData()['lock']) == 'undefined') {
457 this.userData()['lock'] = "<<LOCK>>"; 484 this.userData()['lock'] = "<<LOCK>>";
458 } 485 }
459 486
460 result['lock'] = this.userData()['lock']; 487 result['lock'] = this.userData()['lock'];
461 } 488 }
462//} catch (exception) { 489//} catch (exception) {
463 //console.log("*#*#*#*#*#*#*", exception); 490 //console.log("*#*#*#*#*#*#*", exception);
464 //throw exception; 491 //throw exception;
465//} 492//}
466 //===================================================================== 493 //=====================================================================
467 } else if (someParameters.message == 'getRecordDetail') { 494 } else if (someParameters.message == 'getRecordDetail') {
468 recordData = this.userData()['records'][someParameters['parameters']['reference']]; 495 recordData = this.userData()['records'][someParameters['parameters']['reference']];
469 496
470 result['reference'] = someParameters['parameters']['reference']; 497 result['reference'] = someParameters['parameters']['reference'];
471 result['data'] = recordData['data']; 498 result['data'] = recordData['data'];
472 result['version'] = recordData['version']; 499 result['version'] = recordData['version'];
473 result['creationData'] = recordData['creationDate']; 500 result['creationData'] = recordData['creationDate'];
474 result['updateDate'] = recordData['updateDate']; 501 result['updateDate'] = recordData['updateDate'];
475 result['accessDate'] = recordData['accessDate']; 502 result['accessDate'] = recordData['accessDate'];
476 503
477 currentVersionData = recordData['versions'][recordData['currentVersion']]; 504 currentVersionData = recordData['versions'][recordData['currentVersion']];
478 505
479 result['currentVersion'] = {}; 506 result['currentVersion'] = {};
480 result['currentVersion']['reference'] = recordData['currentVersion']; 507 result['currentVersion']['reference'] = recordData['currentVersion'];
481 result['currentVersion']['version'] = currentVersionData['version']; 508 result['currentVersion']['version'] = currentVersionData['version'];
482 result['currentVersion']['header'] = currentVersionData['header']; 509 result['currentVersion']['header'] = currentVersionData['header'];
483 result['currentVersion']['data'] = currentVersionData['data']; 510 result['currentVersion']['data'] = currentVersionData['data'];
484 result['currentVersion']['creationData'] = currentVersionData['creationDate']; 511 result['currentVersion']['creationData'] = currentVersionData['creationDate'];
485 result['currentVersion']['updateDate'] = currentVersionData['updateDate']; 512 result['currentVersion']['updateDate'] = currentVersionData['updateDate'];
486 result['currentVersion']['accessDate'] = currentVersionData['accessDate']; 513 result['currentVersion']['accessDate'] = currentVersionData['accessDate'];
487 if (typeof(currentVersionData['previousVersion']) != 'undefined') { 514 if (typeof(currentVersionData['previousVersion']) != 'undefined') {
488 result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey']; 515 result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey'];
489 result['currentVersion']['previousVersion'] = currentVersionData['previousVersion']; 516 result['currentVersion']['previousVersion'] = currentVersionData['previousVersion'];
490 } 517 }
491 518
492 //===================================================================== 519 //=====================================================================
493 // 520 //
494 // R E A D - W R I T E M e t h o d s 521 // R E A D - W R I T E M e t h o d s
495 // 522 //
496 //===================================================================== 523 //=====================================================================
497 } else if (someParameters.message == 'upgradeUserCredentials') { 524 } else if (someParameters.message == 'upgradeUserCredentials') {
498 if (this.isReadOnly() == false) { 525 if (this.isReadOnly() == false) {
499 var parameters; 526 var parameters;
500 parameters = someParameters.parameters; 527 parameters = someParameters.parameters;
501 528
502 if (parameters['C'] == null) { 529 if (parameters['C'] == null) {
503 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed; 530 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
504 } else if (parameters['s'] == null) { 531 } else if (parameters['s'] == null) {
505 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed; 532 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
506 } else if (parameters['v'] == null) { 533 } else if (parameters['v'] == null) {
507 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed; 534 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
508 } else if (parameters['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion) { 535 } else if (parameters['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion) {
509 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed; 536 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
510 } else { 537 } else {
511 result = {result:"done", parameters:parameters}; 538 result = {result:"done", parameters:parameters};
512 } 539 }
513 } else { 540 } else {
514 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; 541 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
515 } 542 }
516 //===================================================================== 543 //=====================================================================
517 /* } else if (someParameters.message == 'updateData') { 544 /* } else if (someParameters.message == 'updateData') {
518 if (this.isReadOnly() == false) { 545 if (this.isReadOnly() == false) {
519 var i, c; 546 var i, c;
520 547
521//console.log("###==============================================================="); 548//console.log("###===============================================================");
522//console.log("###>>>", Clipperz.Base.serializeJSON(someParameters)); 549//console.log("###>>>", Clipperz.Base.serializeJSON(someParameters));
523//console.log("###--- userData", Clipperz.Base.serializeJSON(this.userData())); 550//console.log("###--- userData", Clipperz.Base.serializeJSON(this.userData()));
524 if (this.userData()['lock']!= someParameters['parameters']['user']['lock']) { 551 if (this.userData()['lock']!= someParameters['parameters']['user']['lock']) {
525 throw "the lock attribute is not processed correctly" 552 throw "the lock attribute is not processed correctly"
526 } 553 }
527 554
528 this.userData()['userDetails'] = someParameters['parameters']['user']['header']; 555 this.userData()['userDetails'] = someParameters['parameters']['user']['header'];
529 this.userData()['statistics'] = someParameters['parameters']['user']['statistics']; 556 this.userData()['statistics'] = someParameters['parameters']['user']['statistics'];
530 this.userData()['userDetailsVersions']= someParameters['parameters']['user']['version']; 557 this.userData()['userDetailsVersions']= someParameters['parameters']['user']['version'];
531 558
532 c = someParameters['parameters']['records'].length; 559 c = someParameters['parameters']['records'].length;
533 for (i=0; i<c; i++) { 560 for (i=0; i<c; i++) {
534 var currentRecord; 561 var currentRecord;
535 var currentRecordData; 562 var currentRecordData;
536 563
537 currentRecordData = someParameters['parameters']['records'][i]; 564 currentRecordData = someParameters['parameters']['records'][i];
538 currentRecord = this.userData()['records'][currentRecordData['record']['reference']]; 565 currentRecord = this.userData()['records'][currentRecordData['record']['reference']];
539 566
540 if (currentRecord == null) { 567 if (currentRecord == null) {
541 } 568 }
542 569
543 currentRecord['data'] = currentRecordData['record']['data']; 570 currentRecord['data'] = currentRecordData['record']['data'];
544 currentRecord['version'] = currentRecordData['record']['version']; 571 currentRecord['version'] = currentRecordData['record']['version'];
545 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference']; 572 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
546 573
547 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = { 574 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
548 'data': currentRecordData['currentRecordVersion']['data'], 575 'data': currentRecordData['currentRecordVersion']['data'],
549 'version': currentRecordData['currentRecordVersion']['version'], 576 'version': currentRecordData['currentRecordVersion']['version'],
550 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'], 577 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
551 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey'] 578 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey']
552 } 579 }
553 } 580 }
554 581
555 this.userData()['lock'] = Clipperz.PM.Crypto.randomKey(); 582 this.userData()['lock'] = Clipperz.PM.Crypto.randomKey();
556 result['lock'] = this.userData()['lock']; 583 result['lock'] = this.userData()['lock'];
557 result['result'] = 'done'; 584 result['result'] = 'done';
558//console.log("###<<< userData", Clipperz.Base.serializeJSON(this.userData())); 585//console.log("###<<< userData", Clipperz.Base.serializeJSON(this.userData()));
559 } else { 586 } else {
560 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; 587 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
561 } 588 }
562 */ //===================================================================== 589 */ //=====================================================================
563 } else if (someParameters.message == 'saveChanges') { 590 } else if (someParameters.message == 'saveChanges') {
564 if (this.isReadOnly() == false) { 591 if (this.isReadOnly() == false) {
565 var i, c; 592 var i, c;
566 593
567//console.log("###==============================================================="); 594//console.log("###===============================================================");
568//console.log("###>>>", someParameters); 595//console.log("###>>>", someParameters);
569//console.log("###>>>", Clipperz.Base.serializeJSON(someParameters)); 596//console.log("###>>>", Clipperz.Base.serializeJSON(someParameters));
570//console.log("###--- userData", Clipperz.Base.serializeJSON(this.userData())); 597//console.log("###--- userData", Clipperz.Base.serializeJSON(this.userData()));
571//console.log("###==============================================================="); 598//console.log("###===============================================================");
572//console.log("--- userData.lock ", this.userData()['lock']); 599//console.log("--- userData.lock ", this.userData()['lock']);
573//console.log("--- parameters.lock", someParameters['parameters']['user']['lock']); 600//console.log("--- parameters.lock", someParameters['parameters']['user']['lock']);
574 if (this.userData()['lock']!= someParameters['parameters']['user']['lock']) { 601 if (this.userData()['lock']!= someParameters['parameters']['user']['lock']) {
575 throw "the lock attribute is not processed correctly" 602 throw "the lock attribute is not processed correctly"
576 } 603 }
577 604
578 this.userData()['userDetails'] = someParameters['parameters']['user']['header']; 605 this.userData()['userDetails'] = someParameters['parameters']['user']['header'];
579 this.userData()['statistics'] = someParameters['parameters']['user']['statistics']; 606 this.userData()['statistics'] = someParameters['parameters']['user']['statistics'];
580 this.userData()['userDetailsVersions']= someParameters['parameters']['user']['version']; 607 this.userData()['userDetailsVersions']= someParameters['parameters']['user']['version'];
581 608
582 c = someParameters['parameters']['records']['updated'].length; 609 c = someParameters['parameters']['records']['updated'].length;
583 for (i=0; i<c; i++) { 610 for (i=0; i<c; i++) {
584 var currentRecord; 611 var currentRecord;
585 var currentRecordData; 612 var currentRecordData;
586 613
587 currentRecordData = someParameters['parameters']['records']['updated'][i]; 614 currentRecordData = someParameters['parameters']['records']['updated'][i];
588 currentRecord = this.userData()['records'][currentRecordData['record']['reference']]; 615 currentRecord = this.userData()['records'][currentRecordData['record']['reference']];
589 616
590 if ( 617 if (
591 (typeof(this.userData()['records'][currentRecordData['record']['reference']]) == 'undefined') 618 (typeof(this.userData()['records'][currentRecordData['record']['reference']]) == 'undefined')
592 && 619 &&
593 (typeof(currentRecordData['currentRecordVersion']) == 'undefined') 620 (typeof(currentRecordData['currentRecordVersion']) == 'undefined')
594 ) { 621 ) {
595//console.log("######## SHIT HAPPENS"); 622//console.log("######## SHIT HAPPENS");
596 throw "Record added without a recordVersion"; 623 throw "Record added without a recordVersion";
597 } 624 }
598 625
599 if (currentRecord == null) { 626 if (currentRecord == null) {
600 currentRecord = {}; 627 currentRecord = {};
601 currentRecord['versions'] = {}; 628 currentRecord['versions'] = {};
602 currentRecord['creationDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); 629 currentRecord['creationDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
603 currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); 630 currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
604 631
605 this.userData()['records'][currentRecordData['record']['reference']] = currentRecord; 632 this.userData()['records'][currentRecordData['record']['reference']] = currentRecord;
606 } 633 }
607 634
608 currentRecord['data'] = currentRecordData['record']['data']; 635 currentRecord['data'] = currentRecordData['record']['data'];
609 currentRecord['version']= currentRecordData['record']['version']; 636 currentRecord['version']= currentRecordData['record']['version'];
610 currentRecord['updateDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); 637 currentRecord['updateDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
611 638
612 if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') { 639 if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') {
613 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference']; 640 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
614 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = { 641 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
615 'data': currentRecordData['currentRecordVersion']['data'], 642 'data': currentRecordData['currentRecordVersion']['data'],
616 'version': currentRecordData['currentRecordVersion']['version'], 643 'version': currentRecordData['currentRecordVersion']['version'],
617 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'], 644 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
618 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey'], 645 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey'],
619 'creationDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), 646 'creationDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
620 'updateDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), 647 'updateDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
621 'accessDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()) 648 'accessDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date())
622 } 649 }
623 } 650 }
624 } 651 }
625 652
626 c = someParameters['parameters']['records']['deleted'].length; 653 c = someParameters['parameters']['records']['deleted'].length;
627 for (i=0; i<c; i++) { 654 for (i=0; i<c; i++) {
628 var currentRecordReference; 655 var currentRecordReference;
629 656
630 currentRecordReference = someParameters['parameters']['records']['deleted'][i]; 657 currentRecordReference = someParameters['parameters']['records']['deleted'][i];
631//console.log("DELETING records", currentRecordReference); 658//console.log("DELETING records", currentRecordReference);
632 delete this.userData()['records'][currentRecordReference]; 659 delete this.userData()['records'][currentRecordReference];
633 } 660 }
634 661
635 this.userData()['lock'] = Clipperz.PM.Crypto.randomKey(); 662 this.userData()['lock'] = Clipperz.PM.Crypto.randomKey();
636 result['lock'] = this.userData()['lock']; 663 result['lock'] = this.userData()['lock'];
637 result['result'] = 'done'; 664 result['result'] = 'done';
638//console.log("###<<< userData", Clipperz.Base.serializeJSON(this.userData())); 665//console.log("###<<< userData", Clipperz.Base.serializeJSON(this.userData()));
639 } else { 666 } else {
640 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; 667 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
641 } 668 }
642 669
643 //===================================================================== 670 //=====================================================================
644 // 671 //
645 // U N H A N D L E D M e t h o d 672 // U N H A N D L E D M e t h o d
646 // 673 //
647 //===================================================================== 674 //=====================================================================
648 } else { 675 } else {
649 MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message); 676 MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message);
650 } 677 }
651 678
652 result = { 679 result = {
653 result: result, 680 result: result,
654 toll: this.getTollForRequestType('MESSAGE') 681 toll: this.getTollForRequestType('MESSAGE')
655 } 682 }
656 683
657 return MochiKit.Async.succeed(result); 684 return MochiKit.Async.succeed(result);
658 }, 685 },
659 686
660 //------------------------------------------------------------------------- 687 //-------------------------------------------------------------------------
661 688
662 '_logout': function(someParameters) { 689 '_logout': function(someParameters) {
663 return MochiKit.Async.succeed({result: 'done'}); 690 return MochiKit.Async.succeed({result: 'done'});
664 }, 691 },
665 692
666 //========================================================================= 693 //=========================================================================
667 //######################################################################### 694 //#########################################################################
668 695
669 'isTestData': function() { 696 'isTestData': function() {
670 return (typeof(this.userData()['__masterkey_test_value__']) != 'undefined'); 697 return (typeof(this.userData()['__masterkey_test_value__']) != 'undefined');
671 }, 698 },
672 699
673 'userDetails': function() { 700 'userDetails': function() {
674 var result; 701 var result;
675 702
676 if (this.isTestData()) { 703 if (this.isTestData()) {
677 var serializedHeader; 704 var serializedHeader;
678 var version; 705 var version;
679 706
680//MochiKit.Logging.logDebug("### test data"); 707//MochiKit.Logging.logDebug("### test data");
681 version = this.userData()['userDetailsVersion']; 708 version = this.userData()['userDetailsVersion'];
682 serializedHeader = Clipperz.Base.serializeJSON(this.userData()['userDetails']); 709 serializedHeader = Clipperz.Base.serializeJSON(this.userData()['userDetails']);
683 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(this.userData()['__masterkey_test_value__'], serializedHeader); 710 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(this.userData()['__masterkey_test_value__'], serializedHeader);
684 } else { 711 } else {
685//MochiKit.Logging.logDebug("### NOT test data"); 712//MochiKit.Logging.logDebug("### NOT test data");
686 result = this.userData()['userDetails']; 713 result = this.userData()['userDetails'];
687 } 714 }
688 715
689 return result; 716 return result;
690 }, 717 },
691 718
692 'statistics': function() { 719 'statistics': function() {
693 var result; 720 var result;
694 721
695 if (this.userData()['statistics'] != null) { 722 if (this.userData()['statistics'] != null) {
696 if (this.isTestData()) { 723 if (this.isTestData()) {
697 var serializedStatistics; 724 var serializedStatistics;
698 var version; 725 var version;
699 726
700 version = this.userData()['userDetailsVersion']; 727 version = this.userData()['userDetailsVersion'];
701 serializedStatistics = Clipperz.Base.serializeJSON(this.userData()['statistics']); 728 serializedStatistics = Clipperz.Base.serializeJSON(this.userData()['statistics']);
702 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(this.userData()['__masterkey_test_value__'], serializedStatistics); 729 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(this.userData()['__masterkey_test_value__'], serializedStatistics);
703 } else { 730 } else {
704 result = this.userData()['statistics']; 731 result = this.userData()['statistics'];
705 } 732 }
706 } else { 733 } else {
707 result = null; 734 result = null;
708 } 735 }
709 736
710 return result; 737 return result;
711 }, 738 },
712 739
713/* 740/*
714 'userSerializedEncryptedData': function(someData) { 741 'userSerializedEncryptedData': function(someData) {
715 var deferredResult; 742 var deferredResult;
716 var deferredContext; 743 var deferredContext;
717 744
718 deferredContext = { 'data': someData }; 745 deferredContext = { 'data': someData };
719 746
720 deferredResult = new Clipperz.Async.Deferred('Proxy.Test.serializeUserEncryptedData', {trace:false}); 747 deferredResult = new Clipperz.Async.Deferred('Proxy.Test.serializeUserEncryptedData', {trace:false});
721 deferredResult.addCallback(MochiKit.Base.bind(function(aDeferredContext) { 748 deferredResult.addCallback(MochiKit.Base.bind(function(aDeferredContext) {
722 aDeferredContext['user'] = this.createUserUsingConfigurationData(aDeferredContext['data']); 749 aDeferredContext['user'] = this.createUserUsingConfigurationData(aDeferredContext['data']);
723 return aDeferredContext; 750 return aDeferredContext;
724 }, this)); 751 }, this));
725 deferredResult.addCallback(function(aDeferredContext) { 752 deferredResult.addCallback(function(aDeferredContext) {
726 // return aDeferredContext['user'].encryptedDataUsingVersion(aDeferredContext['data']['version']); 753 // return aDeferredContext['user'].encryptedDataUsingVersion(aDeferredContext['data']['version']);
727 return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']); 754 return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']);
728 }); 755 });
729 deferredResult.addCallback(function(aUserEncryptedData) { 756 deferredResult.addCallback(function(aUserEncryptedData) {
730 deferredContext['encryptedData'] = aUserEncryptedData; 757 deferredContext['encryptedData'] = aUserEncryptedData;
731 return deferredContext; 758 return deferredContext;
732 }); 759 });
733 deferredResult.addCallback(function(aDeferredContext) { 760 deferredResult.addCallback(function(aDeferredContext) {
734 var connection; 761 var connection;
735 762
736 connection = new Clipperz.PM.Connection.communicationProtocol.versions[aDeferredContext['data']['connectionVersion']]() 763 connection = new Clipperz.PM.Connection.communicationProtocol.versions[aDeferredContext['data']['connectionVersion']]()
737 aDeferredContext['credentials'] = connection.serverSideUserCredentials(aDeferredContext['user'].username(),aDeferredContext['user'].passphrase()); 764 aDeferredContext['credentials'] = connection.serverSideUserCredentials(aDeferredContext['user'].username(),aDeferredContext['user'].passphrase());
738 765
739 return aDeferredContext; 766 return aDeferredContext;
740 }); 767 });
741 768
742 // deferredResult.addCallback(function(aDeferredContext) { 769 // deferredResult.addCallback(function(aDeferredContext) {
743//console.log("#-#-#-#-#", aDeferredContext); 770//console.log("#-#-#-#-#", aDeferredContext);
744 // return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']); 771 // return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']);
745 // }, deferredContext); 772 // }, deferredContext);
746 // deferredResult.addCallback(function(aUserSerializedData) { 773 // deferredResult.addCallback(function(aUserSerializedData) {
747//console.log("USER SERIALIZED DATA", aUserSerializedData); 774//console.log("USER SERIALIZED DATA", aUserSerializedData);
748 // }); 775 // });
749// 776//
750 // deferredResult.addCallback(MochiKit.Async.succeed, deferredContext); 777 // deferredResult.addCallback(MochiKit.Async.succeed, deferredContext);
751 deferredResult.callback(deferredContext); 778 deferredResult.callback(deferredContext);
752 779