summaryrefslogtreecommitdiff
path: root/frontend/beta/js/Clipperz/PM/Connection.js
Unidiff
Diffstat (limited to 'frontend/beta/js/Clipperz/PM/Connection.js') (more/less context) (show whitespace changes)
-rw-r--r--frontend/beta/js/Clipperz/PM/Connection.js584
1 files changed, 584 insertions, 0 deletions
diff --git a/frontend/beta/js/Clipperz/PM/Connection.js b/frontend/beta/js/Clipperz/PM/Connection.js
new file mode 100644
index 0000000..cf37ccc
--- a/dev/null
+++ b/frontend/beta/js/Clipperz/PM/Connection.js
@@ -0,0 +1,584 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer 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
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31
32//-----------------------------------------------------------------------------
33//
34 // Abstract C O N N E C T I O N class
35//
36//-----------------------------------------------------------------------------
37
38Clipperz.PM.Connection = function (args) {
39 args = args || {};
40
41 this._user = args.user;
42 this._clipperz_pm_crypto_version = null;
43 this._connectionId = null;
44 this._oneTimePassword = null;
45
46 return this;
47}
48
49Clipperz.PM.Connection.prototype = MochiKit.Base.update(null, {
50
51 'user': function() {
52 return this._user;
53 },
54
55 'toString': function() {
56 return "Connection [" + this.version() + "] - user: " + this.user();
57 },
58
59 //=========================================================================
60
61 'version': function() {
62 throw Clipperz.Base.exception.AbstractMethod;
63 },
64
65 'clipperz_pm_crypto_version': function() {
66 if (this._clipperz_pm_crypto_version == null) {
67 var connectionVersions;
68 varversions;
69 varversion;
70 var i, c;
71
72 version = null;
73 connectionVersions = Clipperz.PM.Crypto.communicationProtocol.versions;
74 versions = MochiKit.Base.keys(connectionVersions);
75 c = versions.length;
76 for (i=0; i<c; i++) {
77 if (! (versions[i] == 'current')) {
78 if (this instanceof connectionVersions[versions[i]]) {
79 version = versions[i];
80 };
81 }
82 }
83
84 this._clipperz_pm_crypto_version = version;
85 }
86
87 return this._clipperz_pm_crypto_version;
88 },
89
90 //-------------------------------------------------------------------------
91
92 'defaultErrorHandler': function(anErrorString, anException) {
93MochiKit.Logging.logError("### Connection.defaultErrorHandler: " + anErrorString + " (" + anException + ")");
94 },
95
96 //-------------------------------------------------------------------------
97
98 'login': function(someArguments, aCallback) {
99 throw Clipperz.Base.exception.AbstractMethod;
100 },
101
102 //-------------------------------------------------------------------------
103
104 'message': function(someArguments, aCallback) {
105 throw Clipperz.Base.exception.AbstractMethod;
106 },
107
108 //-------------------------------------------------------------------------
109
110 'sharedSecret': function() {
111 throw Clipperz.Base.exception.AbstractMethod;
112 },
113
114 'serverSideUserCredentials': function() {
115 throw Clipperz.Base.exception.AbstractMethod;
116 },
117
118 //=========================================================================
119
120 'connectionId': function() {
121 return this._connectionId;
122 },
123
124 'setConnectionId': function(aValue) {
125 this._connectionId = aValue;
126 },
127
128 //=========================================================================
129
130 'oneTimePassword': function() {
131 return this._oneTimePassword;
132 },
133
134 'setOneTimePassword': function(aValue) {
135 this._oneTimePassword = aValue;
136 },
137
138 //=========================================================================
139 __syntaxFix__: "syntax fix"
140
141}
142);
143
144
145if (typeof(Clipperz.PM.Connection.SRP) == 'undefined') { Clipperz.PM.Connection.SRP = {}; }
146//-----------------------------------------------------------------------------
147//
148 // S R P [ 1 . 0 ] C O N N E C T I O N class
149//
150//-----------------------------------------------------------------------------
151
152Clipperz.PM.Connection.SRP['1.0'] = function (args) {
153 args = args || {};
154 Clipperz.PM.Connection.call(this, args);
155
156 this._C = null;
157 this._P = null;
158 this._srpConnection = null;
159
160 return this;
161}
162
163Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection(), {
164
165 'version': function() {
166 return '1.0';
167 },
168
169 //=========================================================================
170
171 'register': function(anInvitationCode) {
172 var deferredResult;
173 varparameters;
174
175//MochiKit.Logging.logError(">>> Connection.register: " + this);
176 parameters = {};
177 deferredResult = new MochiKit.Async.Deferred();
178//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 1: " + res); return res;});
179 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'registration_verify');
180//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 2: " + res); return res;});
181 deferredResult.addCallback(function(aConnection, anInvitationCode) {
182 var args;
183
184 args = {};
185 args.message = 'register';
186 args.version = aConnection.clipperz_pm_crypto_version();
187 args.invitationCode = anInvitationCode;
188
189 return args;
190 }, this);
191//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 3: " + res); return res;});
192 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'registration_sendingCredentials');
193//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 4: " + res); return res;});
194 deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData'));
195//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 5: " + res); return res;});
196 deferredResult.addCallback(function(someParameters, anUser, anEncryptedData) {
197 var currentVersionConnection;
198 var args;
199
200 currentVersionConnection = new Clipperz.PM.Crypto.communicationProtocol.versions['current']({user:anUser});
201
202 args = someParameters
203 args.credentials = currentVersionConnection.serverSideUserCredentials();
204 args.user = anEncryptedData;
205 args.version = args.credentials.version;
206 args.message = "completeRegistration";
207
208 return args;
209 }, parameters, this.user());
210//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 6: " + res); return res;});
211 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'registration'));
212//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 7: " + Clipperz.Base.serializeJSON(res)); return res;});
213 deferredResult.addCallback(MochiKit.Base.bind(function(res) {
214 this.user().setLock(res['lock']);
215
216 return res;
217 }, this));
218 deferredResult.callback(anInvitationCode);
219//MochiKit.Logging.logError("<<< Connection.register");
220
221 return deferredResult;
222 },
223
224 //=========================================================================
225
226 'login': function(isReconnecting) {
227 vardeferredResult;
228
229//MochiKit.Logging.logDebug(">>> Connection.login: "/* + this*/);
230//MochiKit.Logging.logDebug("--- Connection.login - isReconnecting: " + (isReconnecting == true));
231 deferredResult = new MochiKit.Async.Deferred();
232//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.1 - Connection.login - 1: "/* + res*/); return res;});
233//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
234 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_sendingCredentials');
235//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.2 - Connection.login - 2: "/* + res*/); return res;});
236//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
237 deferredResult.addCallback(function(aConnection) {
238 var args;
239
240 args = {};
241 args.message = 'connect';
242 args.version = aConnection.clipperz_pm_crypto_version();
243 args.parameters = {};
244//MochiKit.Logging.logDebug("=== Connection.login - username: " + aConnection.srpConnection().C());
245 args.parameters['C'] = aConnection.srpConnection().C();
246 args.parameters['A'] = aConnection.srpConnection().A().asString(16);
247
248 if (isReconnecting == true) {
249//MochiKit.Logging.logDebug("--- Connection.login - reconnecting");
250 //# args.parameters['reconnecting'] = "yes";
251 args.parameters['reconnecting'] = aConnection.connectionId();
252 }
253//MochiKit.Logging.logDebug("--- Connection.login - args: " + Clipperz.Base.serializeJSON(args));
254//MochiKit.Logging.logDebug("--- Connection.login - srp.a: " + aConnection.srpConnection().a().asString(16));
255
256 return args;
257 });
258//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.3 - Connection.login - 3: "/* + res*/); return res;});
259//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
260 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake'));
261//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.4 - Connection.login - 4: "/* + res*/); return res;});
262//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
263 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_credentialVerification');
264//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.5 - Connection.login - 5: "/* + res*/); return res;});
265//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
266deferredResult.addErrback(MochiKit.Base.bind(function(res) {MochiKit.Logging.logDebug("ERROR - c: " + this.srpConnection().C() + " # version: " + this.clipperz_pm_crypto_version()); return res;}, this));
267 deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) {
268 var args;
269
270 this.srpConnection().set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16));
271 this.srpConnection().set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16));
272
273 if (typeof(someParameters['oneTimePassword']) != 'undefined') {
274 this.setOneTimePassword(someParameters['oneTimePassword']);
275 }
276
277 args = {};
278 args.message = 'credentialCheck';
279 args.version = this.clipperz_pm_crypto_version();
280 args.parameters = {};
281 args.parameters['M1'] = this.srpConnection().M1();
282
283 return args;
284 }, this));
285//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.6 - Connection.login - 6: "/* + res*/); return res;});
286//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
287 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake'));
288//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.7 - Connection.login - 7: "/* + res*/); return res;});
289//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
290 //# deferredResult.addCallback(MochiKit.Base.method(this, 'loginDone'));
291 deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) {
292 var result;
293
294//MochiKit.Logging.logDebug(">>> Connection.loginDone: " + this + " (M2: " + this.srpConnection().M2() + ")");
295 if (someParameters['M2'] == this.srpConnection().M2()) {
296 result = new MochiKit.Async.Deferred();
297
298//MochiKit.Logging.logDebug("--- Connection.loginDone - someParameters: " + Clipperz.Base.serializeJSON(someParameters));
299 this.setConnectionId(someParameters['connectionId']);
300 this.user().setLoginInfo(someParameters['loginInfo']);
301 this.user().setShouldDownloadOfflineCopy(someParameters['offlineCopyNeeded']);
302 this.user().setLock(someParameters['lock']);
303
304 if (this.oneTimePassword() != null) {
305 result.addCallback(MochiKit.Base.method(this.user().oneTimePasswordManager(), 'archiveOneTimePassword', this.oneTimePassword()));
306 }
307 result.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_loggedIn');
308 result.addCallback(MochiKit.Async.succeed, someParameters);
309
310 result.callback();
311//MochiKit.Logging.logDebug("--- Connection.loginDone - 1 - result: "/* + Clipperz.Base.serializeJSON(result)*/);
312 } else {
313//MochiKit.Logging.logDebug("--- Connection.loginDone - 2 - ERROR");
314//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
315 result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum);
316 }
317//MochiKit.Logging.logDebug("<<< Connection.loginDone - result: " + Clipperz.Base.serializeJSON(result));
318
319 return result;
320 }, this));
321
322//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.8 - Connection.login - 8: "/* + res*/); return res;});
323//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
324 deferredResult.callback(this);
325//MochiKit.Logging.logDebug("<<< Connection.login");
326
327 return deferredResult;
328 },
329
330 //=========================================================================
331
332 'logout': function() {
333 var deferredResult;
334
335//MochiKit.Logging.logDebug(">>> Connection.logout: " + this);
336 deferredResult = new MochiKit.Async.Deferred();
337//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.logout - 1: " + res); return res;});
338 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'logout'), {});
339//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.logout - 2: " + res); return res;});
340 deferredResult.addCallback(MochiKit.Base.method(this, 'resetSrpConnection'));
341//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.logout - 3: " + res); return res;});
342 deferredResult.callback();
343//MochiKit.Logging.logDebug("<<< Connection.logout");
344
345 return deferredResult;
346 },
347
348 //=========================================================================
349
350 'message': function(aMessageName, someParameters) {
351 var args;
352 var deferredResult;
353
354//MochiKit.Logging.logDebug(">>> Connection.message: " + this);
355 args = {}
356 args['message'] = aMessageName;
357 args['srpSharedSecret'] = this.srpConnection().K();
358 // args['lock'] = this.user().lock();
359
360 if (someParameters != null) {
361 args['parameters'] = someParameters;
362 } else {
363 args['parameters'] = {};
364 }
365//MochiKit.Logging.logDebug("--- Connection.message - args: " + Clipperz.Base.serializeJSON(args));
366
367 // deferredResult = new MochiKit.Async.Deferred(); //### ?????????????
368
369 return this.sendMessage(args);
370 },
371
372 //-------------------------------------------------------------------------
373
374 'sendMessage': function(someArguments) {
375 vardeferredResult;
376
377//MochiKit.Logging.logDebug(">>> Connection.sendMessage: " + this);
378 deferredResult = new MochiKit.Async.Deferred();
379//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.sendMessage - 1: " + res); return res;});
380 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'message'), someArguments);
381//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.sendMessage - 2: " + res); return res;});
382
383 deferredResult.addCallback(MochiKit.Base.bind(function(res) {
384 if (typeof(res['lock']) != 'undefined') {
385 this.user().setLock(res['lock']);
386 }
387 return res;
388 }, this));
389
390 deferredResult.addErrback(MochiKit.Base.method(this, 'messageExceptionHandler'), someArguments);
391//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.sendMessage - 3: " + res); return res;});
392//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.sendMessage - 3: " + Clipperz.Base.serializeJSON(res)); return res;});
393 deferredResult.callback();
394//MochiKit.Logging.logDebug("<<< Connection.sendMessage");
395
396 return deferredResult
397 },
398
399 //-------------------------------------------------------------------------
400
401 'messageExceptionHandler': function(anOriginalMessageArguments, anError) {
402 var result;
403
404//MochiKit.Logging.logDebug(">>> Connection.messageExceptionHandler - this: " + this + ", anError: " + anError);
405 if (anError instanceof MochiKit.Async.CancelledError) {
406//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 1");
407 result = anError;
408//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 2");
409 } else {
410//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 3 - anError.name: " + anError.name + ", message: " + anError.message);
411 if ((anError.message == 'Trying to communicate without an active connection')||
412 (anError.message == 'No tollManager available for current session')
413 ) {
414//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 4");
415 result = this.reestablishConnection(anOriginalMessageArguments);
416//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 5");
417 } else if (anError.message == 'Session with stale data') {
418//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 5.1");
419 Clipperz.NotificationCenter.notify(this, 'EXCEPTION');
420//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 5.2");
421 } else {
422//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 6");
423 result = anError;
424//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 7");
425 }
426//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 8");
427 }
428//MochiKit.Logging.logDebug("<<< Connection.messageExceptionHandler");
429
430 return result;;
431 },
432
433 //=========================================================================
434
435 'reestablishConnection': function(anOriginalMessageArguments) {
436 var deferredResult;
437
438//MochiKit.Logging.logDebug("+++ Connection.reestablishConnection: " + Clipperz.Base.serializeJSON(anOriginalMessageArguments));
439
440//MochiKit.Logging.logDebug(">>> Connection.reestablishConnection: " + this);
441 deferredResult = new MochiKit.Async.Deferred();
442//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.reestablishConnection 1: " + res); return res;});
443 deferredResult.addCallback(MochiKit.Base.method(this, 'resetSrpConnection'));
444//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.reestablishConnection 2: " + res); return res;});
445 deferredResult.addCallback(MochiKit.Base.method(this, 'login'), true);
446//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.reestablishConnection 3: " + res); return res;});
447 deferredResult.addCallback(MochiKit.Base.bind(function(aMessage) {
448 aMessage['srpSharedSecret'] = this.srpConnection().K();
449 return aMessage;
450 }, this), anOriginalMessageArguments);
451//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.reestablishConnection 4: " + Clipperz.Base.serializeJSON(res)); return res;});
452 deferredResult.addCallback(MochiKit.Base.method(this, 'sendMessage'));
453//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.reestablishConnection 5: " + res); return res;});
454 deferredResult.addErrback(Clipperz.NotificationCenter.deferredNotification, this, 'EXCEPTION', null);
455//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.reestablishConnection 6: " + res); return res;});
456 deferredResult.callback();
457//MochiKit.Logging.logDebug("<<< Connection.reestablishConnection");
458
459 return deferredResult;
460 },
461
462 //=========================================================================
463
464 'sharedSecret': function() {
465 return this.srpConnection().K();
466 },
467
468 //=========================================================================
469
470 'serverSideUserCredentials': function() {
471 varresult;
472 varnewSrpConnection;
473
474//MochiKit.Logging.logDebug(">>> Connection.serverSideUserCredentials");
475 newSrpConnection = new Clipperz.Crypto.SRP.Connection({ C:this.C(), P:this.P(), hash:this.hash() });
476 result = newSrpConnection.serverSideCredentials();
477 result['version'] = this.clipperz_pm_crypto_version();
478
479//MochiKit.Logging.logDebug("<<< Connection.serverSideUserCredentials - result: " + Clipperz.Base.serializeJSON(result));
480 return result;
481 },
482
483 //=========================================================================
484
485 'C': function() {
486 if (this._C == null) {
487 this._C = this.hash()(new Clipperz.ByteArray(this.user().username())).toHexString().substring(2);
488 }
489
490 return this._C;
491 },
492
493 //-----------------------------------------------------------------------------
494
495 'P': function() {
496 if (this._P == null) {
497 this._P = this.hash()(new Clipperz.ByteArray(this.user().passphrase() + this.user().username())).toHexString().substring(2);
498 }
499
500 return this._P;
501 },
502
503 //-----------------------------------------------------------------------------
504
505 'hash': function() {
506 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash;
507 },
508
509 //-----------------------------------------------------------------------------
510
511 'srpConnection': function() {
512 if (this._srpConnection == null) {
513 this._srpConnection = new Clipperz.Crypto.SRP.Connection({ C:this.C(), P:this.P(), hash:this.hash() });
514 }
515
516 return this._srpConnection;
517 },
518
519 'resetSrpConnection': function() {
520 this._C = null;
521 this._P = null;
522 this._srpConnection = null;
523 },
524
525 //-----------------------------------------------------------------------------
526 __syntaxFix__: "syntax fix"
527
528});
529
530
531
532//-----------------------------------------------------------------------------
533//
534 // S R P [ 1 . 1 ] C O N N E C T I O N class
535//
536//-----------------------------------------------------------------------------
537
538Clipperz.PM.Connection.SRP['1.1'] = function (args) {
539 args = args || {};
540 Clipperz.PM.Connection.SRP['1.0'].call(this, args);
541
542 return this;
543}
544
545Clipperz.PM.Connection.SRP['1.1'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection.SRP['1.0'](), {
546
547 'version': function() {
548 return '1.1';
549 },
550
551 //-----------------------------------------------------------------------------
552
553 'C': function() {
554 if (this._C == null) {
555 this._C = this.hash()(new Clipperz.ByteArray(this.user().username() + this.user().passphrase())).toHexString().substring(2);
556 }
557
558 return this._C;
559 },
560
561 //-----------------------------------------------------------------------------
562
563 'P': function() {
564 if (this._P == null) {
565 this._P = this.hash()(new Clipperz.ByteArray(this.user().passphrase() + this.user().username())).toHexString().substring(2);
566 }
567
568 return this._P;
569 },
570
571 //-----------------------------------------------------------------------------
572
573 'hash': function() {
574 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash;
575 },
576
577 //-----------------------------------------------------------------------------
578 __syntaxFix__: "syntax fix"
579
580});
581
582Clipperz.PM.Connection.exception = {
583 WrongChecksum: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue")
584};