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