author | Giulio Cesare Solaroli <giulio.cesare@clipperz.com> | 2011-10-06 00:36:10 (UTC) |
---|---|---|
committer | Giulio Cesare Solaroli <giulio.cesare@clipperz.com> | 2011-10-06 00:36:10 (UTC) |
commit | 6ba274c79e60e417132b260bd0117c5a68121387 (patch) (unidiff) | |
tree | 57c1f95d0fbf9b80312c5c6b6f4a4f951e31c770 /backend | |
parent | 13ebf1b1987a1566d081ff1ba89b4dca197b7d2e (diff) | |
download | clipperz-6ba274c79e60e417132b260bd0117c5a68121387.zip clipperz-6ba274c79e60e417132b260bd0117c5a68121387.tar.gz clipperz-6ba274c79e60e417132b260bd0117c5a68121387.tar.bz2 |
Fixed the copyright headers
-rw-r--r-- | backend/python/src/clipperz.py | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/backend/python/src/clipperz.py b/backend/python/src/clipperz.py index c8d91de..bd5d030 100644 --- a/backend/python/src/clipperz.py +++ b/backend/python/src/clipperz.py | |||
@@ -1,708 +1,705 @@ | |||
1 | # | 1 | # |
2 | #Copyright 2008-2011 Clipperz Srl | 2 | #Copyright 2008-2011 Clipperz Srl |
3 | # | 3 | # |
4 | #This file is part of Clipperz's Javascript Crypto Library. | 4 | #This file is part of Clipperz Community Edition. |
5 | #Javascript Crypto Library provides web developers with an extensive | 5 | #Clipperz Community Edition is an online password manager. |
6 | #and efficient set of cryptographic functions. The library aims to | ||
7 | #obtain maximum execution speed while preserving modularity and | ||
8 | #reusability. | ||
9 | #For further information about its features and functionalities please | 6 | #For further information about its features and functionalities please |
10 | #refer to http://www.clipperz.com | 7 | #refer to http://www.clipperz.com. |
11 | # | 8 | # |
12 | #* Javascript Crypto Library is free software: you can redistribute | 9 | #* Clipperz Community Edition is free software: you can redistribute |
13 | # it and/or modify it under the terms of the GNU Affero General Public | 10 | # it and/or modify it under the terms of the GNU Affero General Public |
14 | # License as published by the Free Software Foundation, either version | 11 | # License as published by the Free Software Foundation, either version |
15 | # 3 of the License, or (at your option) any later version. | 12 | # 3 of the License, or (at your option) any later version. |
16 | # | 13 | # |
17 | #* Javascript Crypto Library is distributed in the hope that it will | 14 | #* Clipperz Community Edition is distributed in the hope that it will |
18 | # be useful, but WITHOUT ANY WARRANTY; without even the implied | 15 | # be useful, but WITHOUT ANY WARRANTY; without even the implied |
19 | # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 16 | # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
20 | # See the GNU Affero General Public License for more details. | 17 | # See the GNU Affero General Public License for more details. |
21 | # | 18 | # |
22 | #* You should have received a copy of the GNU Affero General Public | 19 | #* You should have received a copy of the GNU Affero General Public |
23 | # License along with Javascript Crypto Library. If not, see | 20 | # License along with Clipperz Community Edition. If not, see |
24 | # <http://www.gnu.org/licenses/>. | 21 | # <http://www.gnu.org/licenses/>. |
25 | # | 22 | # |
26 | 23 | ||
27 | import os | 24 | import os |
28 | import cgi | 25 | import cgi |
29 | import wsgiref.handlers | 26 | import wsgiref.handlers |
30 | 27 | ||
31 | import datetime | 28 | import datetime |
32 | import uuid | 29 | import uuid |
33 | import random | 30 | import random |
34 | import hashlib | 31 | import hashlib |
35 | 32 | ||
36 | import logging | 33 | import logging |
37 | 34 | ||
38 | from google.appengine.api import users | 35 | from google.appengine.api import users |
39 | from google.appengine.ext import webapp | 36 | from google.appengine.ext import webapp |
40 | from google.appengine.ext import db | 37 | from google.appengine.ext import db |
41 | from google.appengine.ext.webapp import template | 38 | from google.appengine.ext.webapp import template |
42 | 39 | ||
43 | from django.utils import simplejson | 40 | from django.utils import simplejson |
44 | 41 | ||
45 | #============================================================================== | 42 | #============================================================================== |
46 | 43 | ||
47 | sessionTimeout = datetime.timedelta(minutes=-2) | 44 | sessionTimeout = datetime.timedelta(minutes=-2) |
48 | 45 | ||
49 | def randomSeed(): | 46 | def randomSeed(): |
50 | return hex(random.getrandbits(32*8))[2:-1] | 47 | return hex(random.getrandbits(32*8))[2:-1] |
51 | 48 | ||
52 | def clipperzHash(aString): | 49 | def clipperzHash(aString): |
53 | #logging.info(">>> string: " + aString) | 50 | #logging.info(">>> string: " + aString) |
54 | firstRound = hashlib.sha256() | 51 | firstRound = hashlib.sha256() |
55 | firstRound.update(aString) | 52 | firstRound.update(aString) |
56 | #logging.info("firstRound: " + firstRound.hexdigest() + " - " + firstRound.digest()) | 53 | #logging.info("firstRound: " + firstRound.hexdigest() + " - " + firstRound.digest()) |
57 | result = hashlib.sha256() | 54 | result = hashlib.sha256() |
58 | result.update(firstRound.digest()) | 55 | result.update(firstRound.digest()) |
59 | #logging.info("<<< finalResul: " + result.hexdigest()) | 56 | #logging.info("<<< finalResul: " + result.hexdigest()) |
60 | 57 | ||
61 | return result.hexdigest() | 58 | return result.hexdigest() |
62 | 59 | ||
63 | #============================================================================== | 60 | #============================================================================== |
64 | 61 | ||
65 | class User(db.Model): | 62 | class User(db.Model): |
66 | username= db.StringProperty() | 63 | username= db.StringProperty() |
67 | srp_s = db.StringProperty() | 64 | srp_s = db.StringProperty() |
68 | srp_v = db.StringProperty() | 65 | srp_v = db.StringProperty() |
69 | header = db.TextProperty() | 66 | header = db.TextProperty() |
70 | statistics= db.TextProperty() | 67 | statistics= db.TextProperty() |
71 | auth_version= db.StringProperty() | 68 | auth_version= db.StringProperty() |
72 | version = db.StringProperty() | 69 | version = db.StringProperty() |
73 | lock = db.StringProperty() | 70 | lock = db.StringProperty() |
74 | 71 | ||
75 | def updateCredentials(self, someCredentials): | 72 | def updateCredentials(self, someCredentials): |
76 | self.username = someCredentials['C'] | 73 | self.username = someCredentials['C'] |
77 | self.srp_s = someCredentials['s'] | 74 | self.srp_s = someCredentials['s'] |
78 | self.srp_v = someCredentials['v'] | 75 | self.srp_v = someCredentials['v'] |
79 | self.auth_version= someCredentials['version'] | 76 | self.auth_version= someCredentials['version'] |
80 | 77 | ||
81 | def update(self, someData): | 78 | def update(self, someData): |
82 | self.header = someData['header'] | 79 | self.header = someData['header'] |
83 | self.statistics= someData['statistics'] | 80 | self.statistics= someData['statistics'] |
84 | self.version= someData['version'] | 81 | self.version= someData['version'] |
85 | self.lock = someData['lock'] | 82 | self.lock = someData['lock'] |
86 | 83 | ||
87 | #------------------------------------------------------------------------------ | 84 | #------------------------------------------------------------------------------ |
88 | 85 | ||
89 | class Record(db.Model): | 86 | class Record(db.Model): |
90 | user = db.ReferenceProperty(User) | 87 | user = db.ReferenceProperty(User) |
91 | reference = db.StringProperty() | 88 | reference = db.StringProperty() |
92 | data = db.TextProperty() | 89 | data = db.TextProperty() |
93 | version = db.StringProperty() | 90 | version = db.StringProperty() |
94 | creation_date= db.DateTimeProperty(auto_now_add=True) | 91 | creation_date= db.DateTimeProperty(auto_now_add=True) |
95 | update_date = db.DateTimeProperty(auto_now_add=True) | 92 | update_date = db.DateTimeProperty(auto_now_add=True) |
96 | access_date = db.DateTimeProperty(auto_now_add=True) | 93 | access_date = db.DateTimeProperty(auto_now_add=True) |
97 | 94 | ||
98 | #------------------------------------------------------------------------------ | 95 | #------------------------------------------------------------------------------ |
99 | 96 | ||
100 | class RecordVersion(db.Model): | 97 | class RecordVersion(db.Model): |
101 | record = db.ReferenceProperty(Record) | 98 | record = db.ReferenceProperty(Record) |
102 | reference = db.StringProperty() | 99 | reference = db.StringProperty() |
103 | header = db.TextProperty() | 100 | header = db.TextProperty() |
104 | data = db.TextProperty() | 101 | data = db.TextProperty() |
105 | version = db.StringProperty() | 102 | version = db.StringProperty() |
106 | previousVersionKey= db.StringProperty() | 103 | previousVersionKey= db.StringProperty() |
107 | previousVersion = db.SelfReferenceProperty() | 104 | previousVersion = db.SelfReferenceProperty() |
108 | creation_date = db.DateTimeProperty(auto_now_add=True) | 105 | creation_date = db.DateTimeProperty(auto_now_add=True) |
109 | update_date = db.DateTimeProperty(auto_now_add=True) | 106 | update_date = db.DateTimeProperty(auto_now_add=True) |
110 | access_date = db.DateTimeProperty(auto_now_add=True) | 107 | access_date = db.DateTimeProperty(auto_now_add=True) |
111 | 108 | ||
112 | def update(self, someData): | 109 | def update(self, someData): |
113 | recordData = someData['record']; | 110 | recordData = someData['record']; |
114 | self.parent().reference =recordData['reference'] | 111 | self.parent().reference =recordData['reference'] |
115 | self.parent().data = recordData['data'] | 112 | self.parent().data = recordData['data'] |
116 | self.parent().version = recordData['version'] | 113 | self.parent().version = recordData['version'] |
117 | self.parent().update_date =datetime.datetime.now() | 114 | self.parent().update_date =datetime.datetime.now() |
118 | 115 | ||
119 | recordVersionData = someData['currentRecordVersion']; | 116 | recordVersionData = someData['currentRecordVersion']; |
120 | self.reference = recordVersionData ['reference'] | 117 | self.reference = recordVersionData ['reference'] |
121 | self.data = recordVersionData ['data'] | 118 | self.data = recordVersionData ['data'] |
122 | self.version = recordVersionData ['version'] | 119 | self.version = recordVersionData ['version'] |
123 | #self.previous_version =#recordVersionData ['previousVersion'] | 120 | #self.previous_version =#recordVersionData ['previousVersion'] |
124 | self.previous_version_key =recordVersionData ['previousVersionKey'] | 121 | self.previous_version_key =recordVersionData ['previousVersionKey'] |
125 | self.update_date = datetime.datetime.now() | 122 | self.update_date = datetime.datetime.now() |
126 | 123 | ||
127 | #------------------------------------------------------------------------------ | 124 | #------------------------------------------------------------------------------ |
128 | 125 | ||
129 | class OneTimePassword(db.Model): | 126 | class OneTimePassword(db.Model): |
130 | user = db.ReferenceProperty(User) | 127 | user = db.ReferenceProperty(User) |
131 | status = db.StringProperty() | 128 | status = db.StringProperty() |
132 | reference = db.StringProperty() | 129 | reference = db.StringProperty() |
133 | keyValue = db.StringProperty() | 130 | keyValue = db.StringProperty() |
134 | keyChecksum = db.StringProperty() | 131 | keyChecksum = db.StringProperty() |
135 | data = db.TextProperty() | 132 | data = db.TextProperty() |
136 | version = db.StringProperty() | 133 | version = db.StringProperty() |
137 | creation_date= db.DateTimeProperty(auto_now_add=True) | 134 | creation_date= db.DateTimeProperty(auto_now_add=True) |
138 | request_date= db.DateTimeProperty() | 135 | request_date= db.DateTimeProperty() |
139 | usage_date = db.DateTimeProperty() | 136 | usage_date = db.DateTimeProperty() |
140 | 137 | ||
141 | def update(self, someParameters, aStatus): | 138 | def update(self, someParameters, aStatus): |
142 | self.reference = someParameters['reference'] | 139 | self.reference = someParameters['reference'] |
143 | self.keyValue = someParameters['key'] | 140 | self.keyValue = someParameters['key'] |
144 | self.keyChecksum = someParameters['keyChecksum'] | 141 | self.keyChecksum = someParameters['keyChecksum'] |
145 | self.data = someParameters['data'] | 142 | self.data = someParameters['data'] |
146 | self.version = someParameters['version'] | 143 | self.version = someParameters['version'] |
147 | self.status = aStatus | 144 | self.status = aStatus |
148 | 145 | ||
149 | def reset(self, aStatus): | 146 | def reset(self, aStatus): |
150 | self.data = "" | 147 | self.data = "" |
151 | self.status =aStatus | 148 | self.status =aStatus |
152 | 149 | ||
153 | return self | 150 | return self |
154 | 151 | ||
155 | #------------------------------------------------------------------------------ | 152 | #------------------------------------------------------------------------------ |
156 | 153 | ||
157 | class Session(db.Expando): | 154 | class Session(db.Expando): |
158 | sessionId= db.StringProperty() | 155 | sessionId= db.StringProperty() |
159 | access_date= db.DateTimeProperty() | 156 | access_date= db.DateTimeProperty() |
160 | 157 | ||
161 | #============================================================================== | 158 | #============================================================================== |
162 | 159 | ||
163 | class MainPage(webapp.RequestHandler): | 160 | class MainPage(webapp.RequestHandler): |
164 | def get(self): | 161 | def get(self): |
165 | path = os.path.join(os.path.dirname(__file__), 'static%s' % self.request.path) | 162 | path = os.path.join(os.path.dirname(__file__), 'static%s' % self.request.path) |
166 | self.response.out.write(template.render(path, {})) | 163 | self.response.out.write(template.render(path, {})) |
167 | 164 | ||
168 | #============================================================================== | 165 | #============================================================================== |
169 | 166 | ||
170 | class XHR(webapp.RequestHandler): | 167 | class XHR(webapp.RequestHandler): |
171 | 168 | ||
172 | #========================================================================== | 169 | #========================================================================== |
173 | 170 | ||
174 | def get(self): | 171 | def get(self): |
175 | logging.info("self.request.path: " + self.request.path) | 172 | logging.info("self.request.path: " + self.request.path) |
176 | if self.request.path == "/dump": | 173 | if self.request.path == "/dump": |
177 | session = self.getSession() | 174 | session = self.getSession() |
178 | userData = {} | 175 | userData = {} |
179 | offline_data_placeholder = "" | 176 | offline_data_placeholder = "" |
180 | 177 | ||
181 | user = db.Query(User).filter('username =', session.C).get() | 178 | user = db.Query(User).filter('username =', session.C).get() |
182 | 179 | ||
183 | userData['users'] = { | 180 | userData['users'] = { |
184 | 'catchAllUser': { | 181 | 'catchAllUser': { |
185 | '__masterkey_test_value__': 'masterkey', | 182 | '__masterkey_test_value__': 'masterkey', |
186 | 's': '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', | 183 | 's': '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', |
187 | 'v': '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' | 184 | 'v': '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' |
188 | } | 185 | } |
189 | } | 186 | } |
190 | 187 | ||
191 | records = {} | 188 | records = {} |
192 | for currentRecord in db.Query(Record).ancestor(user): | 189 | for currentRecord in db.Query(Record).ancestor(user): |
193 | versions = {} | 190 | versions = {} |
194 | for currentVersion in db.Query(RecordVersion).ancestor(currentRecord): | 191 | for currentVersion in db.Query(RecordVersion).ancestor(currentRecord): |
195 | versions[currentVersion.reference] ={ | 192 | versions[currentVersion.reference] ={ |
196 | 'header': currentVersion.header, | 193 | 'header': currentVersion.header, |
197 | 'data': currentVersion.data, | 194 | 'data': currentVersion.data, |
198 | 'version': currentVersion.version, | 195 | 'version': currentVersion.version, |
199 | 'creationDate':str(currentVersion.creation_date), | 196 | 'creationDate':str(currentVersion.creation_date), |
200 | 'updateDate':str(currentVersion.update_date), | 197 | 'updateDate':str(currentVersion.update_date), |
201 | 'accessDate':str(currentVersion.access_date) | 198 | 'accessDate':str(currentVersion.access_date) |
202 | } | 199 | } |
203 | 200 | ||
204 | records[currentRecord.reference] = { | 201 | records[currentRecord.reference] = { |
205 | 'data': currentRecord.data, | 202 | 'data': currentRecord.data, |
206 | 'version': currentRecord.version, | 203 | 'version': currentRecord.version, |
207 | 'creationDate': str(currentRecord.creation_date), | 204 | 'creationDate': str(currentRecord.creation_date), |
208 | 'updateDate': str(currentRecord.update_date), | 205 | 'updateDate': str(currentRecord.update_date), |
209 | 'accessDate': str(currentRecord.access_date), | 206 | 'accessDate': str(currentRecord.access_date), |
210 | 'currentVersion':currentVersion.reference, | 207 | 'currentVersion':currentVersion.reference, |
211 | 'versions': versions | 208 | 'versions': versions |
212 | } | 209 | } |
213 | 210 | ||
214 | userData['users'][user.username] = { | 211 | userData['users'][user.username] = { |
215 | 's': user.srp_s, | 212 | 's': user.srp_s, |
216 | 'v': user.srp_v, | 213 | 'v': user.srp_v, |
217 | 'version': user.auth_version, | 214 | 'version': user.auth_version, |
218 | 'maxNumberOfRecords':'100', | 215 | 'maxNumberOfRecords':'100', |
219 | 'userDetails': user.header, | 216 | 'userDetails': user.header, |
220 | 'statistics': user.statistics, | 217 | 'statistics': user.statistics, |
221 | 'userDetailsVersion':user.version, | 218 | 'userDetailsVersion':user.version, |
222 | 'records': records | 219 | 'records': records |
223 | } | 220 | } |
224 | 221 | ||
225 | offline_data_placeholder = offline_data_placeholder + "_clipperz_dump_data_ = " + simplejson.dumps(userData, indent=4) + "\n" | 222 | offline_data_placeholder = offline_data_placeholder + "_clipperz_dump_data_ = " + simplejson.dumps(userData, indent=4) + "\n" |
226 | offline_data_placeholder = offline_data_placeholder + "Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.Offline();" + "\n" | 223 | offline_data_placeholder = offline_data_placeholder + "Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.Offline();" + "\n" |
227 | offline_data_placeholder = offline_data_placeholder + "Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();" + "\n" | 224 | offline_data_placeholder = offline_data_placeholder + "Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();" + "\n" |
228 | 225 | ||
229 | path = os.path.join(os.path.dirname(__file__), 'static/dump.html') | 226 | path = os.path.join(os.path.dirname(__file__), 'static/dump.html') |
230 | 227 | ||
231 | self.response.headers.add_header('Content-Type', 'text/html') | 228 | self.response.headers.add_header('Content-Type', 'text/html') |
232 | self.response.headers.add_header('Content-Disposition', 'attachment', filename='Clipperz.html') | 229 | self.response.headers.add_header('Content-Disposition', 'attachment', filename='Clipperz.html') |
233 | self.response.out.write(template.render(path, {'offline_data_placeholder': offline_data_placeholder})) | 230 | self.response.out.write(template.render(path, {'offline_data_placeholder': offline_data_placeholder})) |
234 | 231 | ||
235 | #========================================================================== | 232 | #========================================================================== |
236 | 233 | ||
237 | def post(self): | 234 | def post(self): |
238 | method = self.request.get('method') | 235 | method = self.request.get('method') |
239 | parameters = simplejson.loads(self.request.get('parameters')) | 236 | parameters = simplejson.loads(self.request.get('parameters')) |
240 | session = self.getSession() | 237 | session = self.getSession() |
241 | result = {}; | 238 | result = {}; |
242 | 239 | ||
243 | #---------------------------------------------------------------------- | 240 | #---------------------------------------------------------------------- |
244 | 241 | ||
245 | if method == 'registration': | 242 | if method == 'registration': |
246 | message = parameters['message']; | 243 | message = parameters['message']; |
247 | 244 | ||
248 | if message == 'completeRegistration': | 245 | if message == 'completeRegistration': |
249 | user = User() | 246 | user = User() |
250 | 247 | ||
251 | user.updateCredentials(parameters['credentials']) | 248 | user.updateCredentials(parameters['credentials']) |
252 | user.update(parameters['user']) | 249 | user.update(parameters['user']) |
253 | user.put() | 250 | user.put() |
254 | 251 | ||
255 | result['lock'] = user.lock | 252 | result['lock'] = user.lock |
256 | result['result'] = "done" | 253 | result['result'] = "done" |
257 | 254 | ||
258 | #---------------------------------------------------------------------- | 255 | #---------------------------------------------------------------------- |
259 | 256 | ||
260 | elif method == 'handshake': | 257 | elif method == 'handshake': |
261 | srp_g = 2L | 258 | srp_g = 2L |
262 | srp_n = long("0x%s" % "115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16) | 259 | srp_n = long("0x%s" % "115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16) |
263 | 260 | ||
264 | message = parameters['message']; | 261 | message = parameters['message']; |
265 | 262 | ||
266 | #------------------------------------------------------------------ | 263 | #------------------------------------------------------------------ |
267 | 264 | ||
268 | if message == 'connect': | 265 | if message == 'connect': |
269 | session.C = parameters['parameters']['C'] | 266 | session.C = parameters['parameters']['C'] |
270 | session.A = parameters['parameters']['A'] | 267 | session.A = parameters['parameters']['A'] |
271 | 268 | ||
272 | user = db.Query(User).filter('username =', session.C).get() | 269 | user = db.Query(User).filter('username =', session.C).get() |
273 | 270 | ||
274 | if user != None: | 271 | if user != None: |
275 | try: | 272 | try: |
276 | optId = session.otpId | 273 | optId = session.otpId |
277 | 274 | ||
278 | oneTimePassword = db.Query(OneTimePassword).filter('keyValue =', optId).get() | 275 | oneTimePassword = db.Query(OneTimePassword).filter('keyValue =', optId).get() |
279 | 276 | ||
280 | if oneTimePassword.parent().username != user.username: | 277 | if oneTimePassword.parent().username != user.username: |
281 | oneTimePassword.reset('DISABLED').put() | 278 | oneTimePassword.reset('DISABLED').put() |
282 | raise Exception, "User missmatch between the current session and 'One Time Password' user" | 279 | raise Exception, "User missmatch between the current session and 'One Time Password' user" |
283 | elif oneTimePassword.status != 'REQUESTED': | 280 | elif oneTimePassword.status != 'REQUESTED': |
284 | oneTimePassword.reset('DISABLED').put() | 281 | oneTimePassword.reset('DISABLED').put() |
285 | raise Exception, "Tring to use an 'One Time Password' in the wrong state" | 282 | raise Exception, "Tring to use an 'One Time Password' in the wrong state" |
286 | 283 | ||
287 | oneTimePassword.reset("USED").put() | 284 | oneTimePassword.reset("USED").put() |
288 | 285 | ||
289 | result['oneTimePassword'] = oneTimePassword.reference | 286 | result['oneTimePassword'] = oneTimePassword.reference |
290 | 287 | ||
291 | except Exception, detail: | 288 | except Exception, detail: |
292 | logging.error("connect.optId: " + str(detail)) | 289 | logging.error("connect.optId: " + str(detail)) |
293 | 290 | ||
294 | session.s = user.srp_s | 291 | session.s = user.srp_s |
295 | session.v = user.srp_v | 292 | session.v = user.srp_v |
296 | else: | 293 | else: |
297 | session.s = "112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00" | 294 | session.s = "112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00" |
298 | session.v = "112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00" | 295 | session.v = "112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00" |
299 | 296 | ||
300 | session.b = randomSeed() | 297 | session.b = randomSeed() |
301 | session.B = hex(long("0x%s" % session.v, 16) + pow(srp_g, long("0x%s" %session.b, 16), srp_n))[2:-1] | 298 | session.B = hex(long("0x%s" % session.v, 16) + pow(srp_g, long("0x%s" %session.b, 16), srp_n))[2:-1] |
302 | 299 | ||
303 | result['s'] = session.s | 300 | result['s'] = session.s |
304 | result['B'] = session.B | 301 | result['B'] = session.B |
305 | 302 | ||
306 | #------------------------------------------------------------------ | 303 | #------------------------------------------------------------------ |
307 | 304 | ||
308 | elif message == 'credentialCheck': | 305 | elif message == 'credentialCheck': |
309 | B = long("0x%s" % session.B, 16) | 306 | B = long("0x%s" % session.B, 16) |
310 | b = long("0x%s" % session.b, 16) | 307 | b = long("0x%s" % session.b, 16) |
311 | A = long("0x%s" % session.A, 16) | 308 | A = long("0x%s" % session.A, 16) |
312 | v = long("0x%s" % session.v, 16) | 309 | v = long("0x%s" % session.v, 16) |
313 | u = long("0x%s" % clipperzHash(str(B)), 16) | 310 | u = long("0x%s" % clipperzHash(str(B)), 16) |
314 | n = srp_n | 311 | n = srp_n |
315 | 312 | ||
316 | S = pow((A * pow(v, u, n)), b, n) | 313 | S = pow((A * pow(v, u, n)), b, n) |
317 | K = clipperzHash(str(S)) | 314 | K = clipperzHash(str(S)) |
318 | M1 = clipperzHash(str(A) + str(B) + K) | 315 | M1 = clipperzHash(str(A) + str(B) + K) |
319 | 316 | ||
320 | if M1 == parameters['parameters']['M1']: | 317 | if M1 == parameters['parameters']['M1']: |
321 | session.K = K | 318 | session.K = K |
322 | M2 = clipperzHash(str(A) + M1 + K) | 319 | M2 = clipperzHash(str(A) + M1 + K) |
323 | 320 | ||
324 | result['M2'] = M2 | 321 | result['M2'] = M2 |
325 | result["connectionId"] = "" | 322 | result["connectionId"] = "" |
326 | result["loginInfo"] = {} | 323 | result["loginInfo"] = {} |
327 | result["loginInfo"]["latest"] = {} | 324 | result["loginInfo"]["latest"] = {} |
328 | result["loginInfo"]["current"] = {} | 325 | result["loginInfo"]["current"] = {} |
329 | result["offlineCopyNeeded"] = "false"; | 326 | result["offlineCopyNeeded"] = "false"; |
330 | result["lock"] = "----"; | 327 | result["lock"] = "----"; |
331 | else: | 328 | else: |
332 | result['error'] = "?" | 329 | result['error'] = "?" |
333 | 330 | ||
334 | #------------------------------------------------------------------ | 331 | #------------------------------------------------------------------ |
335 | 332 | ||
336 | elif message == 'oneTimePassword': | 333 | elif message == 'oneTimePassword': |
337 | oneTimePassword = db.Query(OneTimePassword).filter("keyValue =", parameters["parameters"]["oneTimePasswordKey"]).get() | 334 | oneTimePassword = db.Query(OneTimePassword).filter("keyValue =", parameters["parameters"]["oneTimePasswordKey"]).get() |
338 | 335 | ||
339 | if oneTimePassword != None: | 336 | if oneTimePassword != None: |
340 | if oneTimePassword.status == 'ACTIVE': | 337 | if oneTimePassword.status == 'ACTIVE': |
341 | if oneTimePassword.keyChecksum == parameters['parameters']['oneTimePasswordKeyChecksum']: | 338 | if oneTimePassword.keyChecksum == parameters['parameters']['oneTimePasswordKeyChecksum']: |
342 | #session.userId =str(oneTimePassword.parent().username) | 339 | #session.userId =str(oneTimePassword.parent().username) |
343 | session.otpId = str(oneTimePassword.keyValue) | 340 | session.otpId = str(oneTimePassword.keyValue) |
344 | 341 | ||
345 | result['data'] = oneTimePassword.data | 342 | result['data'] = oneTimePassword.data |
346 | result['version'] = oneTimePassword.version | 343 | result['version'] = oneTimePassword.version |
347 | 344 | ||
348 | oneTimePassword.reset('REQUESTED').put() | 345 | oneTimePassword.reset('REQUESTED').put() |
349 | 346 | ||
350 | else: | 347 | else: |
351 | oneTimePassword.reset('DISABLED').put() | 348 | oneTimePassword.reset('DISABLED').put() |
352 | raise Exception, "The requested One Time Password has been disabled, due to a wrong keyChecksum" | 349 | raise Exception, "The requested One Time Password has been disabled, due to a wrong keyChecksum" |
353 | else: | 350 | else: |
354 | raise Exception, "The requested One Time Password was not active" | 351 | raise Exception, "The requested One Time Password was not active" |
355 | else: | 352 | else: |
356 | raise Exception, "The requested One Time Password has not been found" | 353 | raise Exception, "The requested One Time Password has not been found" |
357 | 354 | ||
358 | #---------------------------------------------------------------------- | 355 | #---------------------------------------------------------------------- |
359 | 356 | ||
360 | elif method == 'message': | 357 | elif method == 'message': |
361 | if parameters['srpSharedSecret'] == session.K: | 358 | if parameters['srpSharedSecret'] == session.K: |
362 | message = parameters['message'] | 359 | message = parameters['message'] |
363 | 360 | ||
364 | if message == 'getUserDetails': | 361 | if message == 'getUserDetails': |
365 | #{"message":"getUserDetails", "srpSharedSecret":"f18e5cf7c3a83b67d4db9444af813ee48c13daf4f8f6635397d593e52ba89a08", "parameters":{}} | 362 | #{"message":"getUserDetails", "srpSharedSecret":"f18e5cf7c3a83b67d4db9444af813ee48c13daf4f8f6635397d593e52ba89a08", "parameters":{}} |
366 | user = db.Query(User).filter('username =', session.C).get() | 363 | user = db.Query(User).filter('username =', session.C).get() |
367 | 364 | ||
368 | result['header'] = user.header; | 365 | result['header'] = user.header; |
369 | result['statistics'] =user.statistics; | 366 | result['statistics'] =user.statistics; |
370 | result['version'] = user.version; | 367 | result['version'] = user.version; |
371 | 368 | ||
372 | elif message == "addNewRecords": | 369 | elif message == "addNewRecords": |
373 | user = db.Query(User).filter('username =', session.C).get() | 370 | user = db.Query(User).filter('username =', session.C).get() |
374 | result = db.run_in_transaction(self.addNewRecords, session, user, parameters) | 371 | result = db.run_in_transaction(self.addNewRecords, session, user, parameters) |
375 | 372 | ||
376 | """ | 373 | """ |
377 | user = db.Query(User).filter('username =', session.C).get() | 374 | user = db.Query(User).filter('username =', session.C).get() |
378 | user.update(parameters['parameters']['user']) | 375 | user.update(parameters['parameters']['user']) |
379 | 376 | ||
380 | for recordParameter in parameters['parameters']['records']: | 377 | for recordParameter in parameters['parameters']['records']: |
381 | record = Record(parent=user) | 378 | record = Record(parent=user) |
382 | record.put() | 379 | record.put() |
383 | recordVersion = RecordVersion(parent=record) | 380 | recordVersion = RecordVersion(parent=record) |
384 | recordVersion.put() | 381 | recordVersion.put() |
385 | 382 | ||
386 | recordVersion.update(recordParameter) | 383 | recordVersion.update(recordParameter) |
387 | 384 | ||
388 | record.put() | 385 | record.put() |
389 | recordVersion.put() | 386 | recordVersion.put() |
390 | 387 | ||
391 | user.put(); | 388 | user.put(); |
392 | 389 | ||
393 | result['lock'] = user.lock | 390 | result['lock'] = user.lock |
394 | result['result'] = 'done' | 391 | result['result'] = 'done' |
395 | """ | 392 | """ |
396 | 393 | ||
397 | elif message == 'getRecordDetail': | 394 | elif message == 'getRecordDetail': |
398 | record = db.Query(Record).ancestor(db.Query(User).filter('username =', session.C).get()).filter('reference =', parameters["parameters"]["reference"]).get() | 395 | record = db.Query(Record).ancestor(db.Query(User).filter('username =', session.C).get()).filter('reference =', parameters["parameters"]["reference"]).get() |
399 | recordVersion = db.Query(RecordVersion).ancestor(record).get() | 396 | recordVersion = db.Query(RecordVersion).ancestor(record).get() |
400 | 397 | ||
401 | result['currentVersion'] = {} | 398 | result['currentVersion'] = {} |
402 | result['currentVersion']['reference'] = recordVersion.reference | 399 | result['currentVersion']['reference'] = recordVersion.reference |
403 | result['currentVersion']['data'] = recordVersion.data | 400 | result['currentVersion']['data'] = recordVersion.data |
404 | result['currentVersion']['header'] = recordVersion.header | 401 | result['currentVersion']['header'] = recordVersion.header |
405 | result['currentVersion']['version'] = recordVersion.version | 402 | result['currentVersion']['version'] = recordVersion.version |
406 | result['currentVersion']['creationDate'] =str(recordVersion.creation_date) | 403 | result['currentVersion']['creationDate'] =str(recordVersion.creation_date) |
407 | result['currentVersion']['updateDate'] =str(recordVersion.update_date) | 404 | result['currentVersion']['updateDate'] =str(recordVersion.update_date) |
408 | result['currentVersion']['accessDate'] =str(recordVersion.access_date) | 405 | result['currentVersion']['accessDate'] =str(recordVersion.access_date) |
409 | 406 | ||
410 | result['reference'] = record.reference | 407 | result['reference'] = record.reference |
411 | result['data'] = record.data | 408 | result['data'] = record.data |
412 | result['version'] = record.version | 409 | result['version'] = record.version |
413 | result['creationDate'] = str(record.creation_date) | 410 | result['creationDate'] = str(record.creation_date) |
414 | result['updateDate'] = str(record.update_date) | 411 | result['updateDate'] = str(record.update_date) |
415 | result['accessDate'] = str(record.access_date) | 412 | result['accessDate'] = str(record.access_date) |
416 | result['oldestUsedEncryptedVersion'] = "---" | 413 | result['oldestUsedEncryptedVersion'] = "---" |
417 | 414 | ||
418 | elif message == 'updateData': | 415 | elif message == 'updateData': |
419 | user = db.Query(User).filter('username =', session.C).get() | 416 | user = db.Query(User).filter('username =', session.C).get() |
420 | user.update(parameters['parameters']['user']) | 417 | user.update(parameters['parameters']['user']) |
421 | 418 | ||
422 | for recordParameter in parameters['parameters']['records']: | 419 | for recordParameter in parameters['parameters']['records']: |
423 | logging.info('reference =' + recordParameter['record']['reference']) | 420 | logging.info('reference =' + recordParameter['record']['reference']) |
424 | record = db.Query(Record).ancestor(user).filter('reference =', recordParameter['record']['reference']).get() | 421 | record = db.Query(Record).ancestor(user).filter('reference =', recordParameter['record']['reference']).get() |
425 | recordVersion = db.Query(RecordVersion).ancestor(record).get() | 422 | recordVersion = db.Query(RecordVersion).ancestor(record).get() |
426 | 423 | ||
427 | recordVersion.update(recordParameter) | 424 | recordVersion.update(recordParameter) |
428 | 425 | ||
429 | recordVersion.put() | 426 | recordVersion.put() |
430 | recordVersion.parent().put() | 427 | recordVersion.parent().put() |
431 | 428 | ||
432 | user.put(); | 429 | user.put(); |
433 | 430 | ||
434 | result['lock'] = user.lock | 431 | result['lock'] = user.lock |
435 | result['result'] = 'done' | 432 | result['result'] = 'done' |
436 | 433 | ||
437 | elif message == 'deleteRecords': | 434 | elif message == 'deleteRecords': |
438 | user = db.Query(User).filter('username =', session.C).get() | 435 | user = db.Query(User).filter('username =', session.C).get() |
439 | user.update(parameters['parameters']['user']) | 436 | user.update(parameters['parameters']['user']) |
440 | 437 | ||
441 | for recordReference in parameters['parameters']['recordReferences']: | 438 | for recordReference in parameters['parameters']['recordReferences']: |
442 | record = db.Query(Record).ancestor(user).filter('reference =', recordReference).get() | 439 | record = db.Query(Record).ancestor(user).filter('reference =', recordReference).get() |
443 | #recordVersion = db.Query(RecordVersion).ancestor(record).get() | 440 | #recordVersion = db.Query(RecordVersion).ancestor(record).get() |
444 | 441 | ||
445 | db.delete(db.Query(RecordVersion).ancestor(record)) | 442 | db.delete(db.Query(RecordVersion).ancestor(record)) |
446 | record.delete() | 443 | record.delete() |
447 | 444 | ||
448 | user.put() | 445 | user.put() |
449 | 446 | ||
450 | result['lock'] = user.lock | 447 | result['lock'] = user.lock |
451 | result['result'] = 'done' | 448 | result['result'] = 'done' |
452 | 449 | ||
453 | elif message == 'deleteUser': | 450 | elif message == 'deleteUser': |
454 | user = db.Query(User).filter('username =', session.C).get() | 451 | user = db.Query(User).filter('username =', session.C).get() |
455 | db.delete(db.Query(RecordVersion).ancestor(user)) | 452 | db.delete(db.Query(RecordVersion).ancestor(user)) |
456 | db.delete(db.Query(Record).ancestor(user)) | 453 | db.delete(db.Query(Record).ancestor(user)) |
457 | user.delete() | 454 | user.delete() |
458 | 455 | ||
459 | elif message == 'addNewOneTimePassword': | 456 | elif message == 'addNewOneTimePassword': |
460 | user = db.Query(User).filter('username =', session.C).get() | 457 | user = db.Query(User).filter('username =', session.C).get() |
461 | user.update(parameters['parameters']['user']) | 458 | user.update(parameters['parameters']['user']) |
462 | 459 | ||
463 | oneTimePassword = OneTimePassword(parent=user) | 460 | oneTimePassword = OneTimePassword(parent=user) |
464 | oneTimePassword.update(parameters['parameters']['oneTimePassword'], "ACTIVE") | 461 | oneTimePassword.update(parameters['parameters']['oneTimePassword'], "ACTIVE") |
465 | oneTimePassword.put() | 462 | oneTimePassword.put() |
466 | 463 | ||
467 | user.put() | 464 | user.put() |
468 | 465 | ||
469 | result['lock'] = user.lock | 466 | result['lock'] = user.lock |
470 | result['result'] = 'done' | 467 | result['result'] = 'done' |
471 | 468 | ||
472 | elif message == 'updateOneTimePasswords': | 469 | elif message == 'updateOneTimePasswords': |
473 | user = db.Query(User).filter('username =', session.C).get() | 470 | user = db.Query(User).filter('username =', session.C).get() |
474 | user.update(parameters['parameters']['user']) | 471 | user.update(parameters['parameters']['user']) |
475 | 472 | ||
476 | validOtpReferences = parameters['parameters']['oneTimePasswords'] | 473 | validOtpReferences = parameters['parameters']['oneTimePasswords'] |
477 | for currentOtp in db.Query(OneTimePassword).ancestor(user): | 474 | for currentOtp in db.Query(OneTimePassword).ancestor(user): |
478 | if currentOtp.reference in validOtpReferences: | 475 | if currentOtp.reference in validOtpReferences: |
479 | pass | 476 | pass |
480 | else: | 477 | else: |
481 | currentOtp.delete() | 478 | currentOtp.delete() |
482 | 479 | ||
483 | user.put() | 480 | user.put() |
484 | 481 | ||
485 | result['result'] = user.lock | 482 | result['result'] = user.lock |
486 | 483 | ||
487 | elif message == 'getOneTimePasswordsDetails': | 484 | elif message == 'getOneTimePasswordsDetails': |
488 | pass | 485 | pass |
489 | 486 | ||
490 | elif message == 'getLoginHistory': | 487 | elif message == 'getLoginHistory': |
491 | result["result"] = [] | 488 | result["result"] = [] |
492 | 489 | ||
493 | elif message == 'upgradeUserCredentials': | 490 | elif message == 'upgradeUserCredentials': |
494 | user = db.Query(User).filter('username =', session.C).get() | 491 | user = db.Query(User).filter('username =', session.C).get() |
495 | 492 | ||
496 | user.updateCredentials(parameters['parameters']['credentials']) | 493 | user.updateCredentials(parameters['parameters']['credentials']) |
497 | user.update(parameters['parameters']['user']) | 494 | user.update(parameters['parameters']['user']) |
498 | 495 | ||
499 | for oneTimePasswordReference in parameters['parameters']['oneTimePasswords']: | 496 | for oneTimePasswordReference in parameters['parameters']['oneTimePasswords']: |
500 | oneTimePassword = db.Query(OneTimePassword).ancestor(user).filter("reference =", oneTimePasswordReference).get() | 497 | oneTimePassword = db.Query(OneTimePassword).ancestor(user).filter("reference =", oneTimePasswordReference).get() |
501 | 498 | ||
502 | if oneTimePassword != None: | 499 | if oneTimePassword != None: |
503 | oneTimePassword.data = parameters['parameters']['oneTimePasswords'][oneTimePasswordReference] | 500 | oneTimePassword.data = parameters['parameters']['oneTimePasswords'][oneTimePasswordReference] |
504 | oneTimePassword.put() | 501 | oneTimePassword.put() |
505 | 502 | ||
506 | user.put() | 503 | user.put() |
507 | 504 | ||
508 | result['lock'] = user.lock | 505 | result['lock'] = user.lock |
509 | result['result'] = 'done' | 506 | result['result'] = 'done' |
510 | 507 | ||
511 | """ | 508 | """ |
512 | $user = new user(); | 509 | $user = new user(); |
513 | $user->Get($_SESSION["userId"]); | 510 | $user->Get($_SESSION["userId"]); |
514 | 511 | ||
515 | $otp = new onetimepassword(); | 512 | $otp = new onetimepassword(); |
516 | 513 | ||
517 | updateUserCredentials($parameters["parameters"]["credentials"], $user); | 514 | updateUserCredentials($parameters["parameters"]["credentials"], $user); |
518 | updateUserData($parameters["parameters"]["user"], $user); | 515 | updateUserData($parameters["parameters"]["user"], $user); |
519 | 516 | ||
520 | $otpList = $parameters["parameters"]["oneTimePasswords"]; | 517 | $otpList = $parameters["parameters"]["oneTimePasswords"]; |
521 | foreach($otpList as $otpReference=>$otpData) { | 518 | foreach($otpList as $otpReference=>$otpData) { |
522 | $otpList = $otp->GetList(array(array("reference", "=", $otpReference))); | 519 | $otpList = $otp->GetList(array(array("reference", "=", $otpReference))); |
523 | $currentOtp = $otpList[0]; | 520 | $currentOtp = $otpList[0]; |
524 | $currentOtp->data = $otpData; | 521 | $currentOtp->data = $otpData; |
525 | $currentOtp->Save(); | 522 | $currentOtp->Save(); |
526 | } | 523 | } |
527 | 524 | ||
528 | $user->Save(); | 525 | $user->Save(); |
529 | 526 | ||
530 | $result["lock"] = $user->lock; | 527 | $result["lock"] = $user->lock; |
531 | $result["result"] = "done"; | 528 | $result["result"] = "done"; |
532 | """ | 529 | """ |
533 | 530 | ||
534 | #============================================================= | 531 | #============================================================= |
535 | 532 | ||
536 | """ | 533 | """ |
537 | java.util.Mapresult; | 534 | java.util.Mapresult; |
538 | 535 | ||
539 | try { | 536 | try { |
540 | java.util.Mapcredentials; | 537 | java.util.Mapcredentials; |
541 | 538 | ||
542 | if (someParameters.get("credentials") != null) { | 539 | if (someParameters.get("credentials") != null) { |
543 | credentials = (java.util.Map)someParameters.get("credentials"); | 540 | credentials = (java.util.Map)someParameters.get("credentials"); |
544 | } else { | 541 | } else { |
545 | credentials = someParameters; | 542 | credentials = someParameters; |
546 | } | 543 | } |
547 | 544 | ||
548 | aUser.setUsername((java.lang.String)credentials.get("C")); | 545 | aUser.setUsername((java.lang.String)credentials.get("C")); |
549 | aUser.setSrpS((java.lang.String)credentials.get("s")); | 546 | aUser.setSrpS((java.lang.String)credentials.get("s")); |
550 | aUser.setSrpV((java.lang.String)credentials.get("v")); | 547 | aUser.setSrpV((java.lang.String)credentials.get("v")); |
551 | aUser.setVersion((java.lang.String)credentials.get("version")); | 548 | aUser.setVersion((java.lang.String)credentials.get("version")); |
552 | 549 | ||
553 | if (someParameters.get("user") != null) { | 550 | if (someParameters.get("user") != null) { |
554 | com.clipperz.dataModel.EncoderHelper.updateWithMap(aUser, (java.util.Map)someParameters.get("user")); | 551 | com.clipperz.dataModel.EncoderHelper.updateWithMap(aUser, (java.util.Map)someParameters.get("user")); |
555 | } | 552 | } |
556 | 553 | ||
557 | if (someParameters.get("oneTimePasswords") != null) { | 554 | if (someParameters.get("oneTimePasswords") != null) { |
558 | java.util.MapupdatedOneTimePasswords; | 555 | java.util.MapupdatedOneTimePasswords; |
559 | java.util.ListusersOneTimePasswords; | 556 | java.util.ListusersOneTimePasswords; |
560 | int i,c; | 557 | int i,c; |
561 | 558 | ||
562 | updatedOneTimePasswords = (java.util.Map)someParameters.get("oneTimePasswords"); | 559 | updatedOneTimePasswords = (java.util.Map)someParameters.get("oneTimePasswords"); |
563 | usersOneTimePasswords = com.clipperz.dataModel.OneTimePassword.oneTimePasswordsForUser(this.user()); | 560 | usersOneTimePasswords = com.clipperz.dataModel.OneTimePassword.oneTimePasswordsForUser(this.user()); |
564 | c = usersOneTimePasswords.size(); | 561 | c = usersOneTimePasswords.size(); |
565 | for (i=0; i<c; i++) { | 562 | for (i=0; i<c; i++) { |
566 | com.clipperz.dataModel.OneTimePasswordcurrentOneTimePassword; | 563 | com.clipperz.dataModel.OneTimePasswordcurrentOneTimePassword; |
567 | 564 | ||
568 | currentOneTimePassword = (com.clipperz.dataModel.OneTimePassword)usersOneTimePasswords.get(i); | 565 | currentOneTimePassword = (com.clipperz.dataModel.OneTimePassword)usersOneTimePasswords.get(i); |
569 | 566 | ||
570 | if (updatedOneTimePasswords.get(currentOneTimePassword.getReference()) != null) { | 567 | if (updatedOneTimePasswords.get(currentOneTimePassword.getReference()) != null) { |
571 | currentOneTimePassword.setData((java.lang.String)updatedOneTimePasswords.get(currentOneTimePassword.getReference())); | 568 | currentOneTimePassword.setData((java.lang.String)updatedOneTimePasswords.get(currentOneTimePassword.getReference())); |
572 | } | 569 | } |
573 | } | 570 | } |
574 | } | 571 | } |
575 | 572 | ||
576 | result = new java.util.Hashtable(); | 573 | result = new java.util.Hashtable(); |
577 | this.dataContext().commitChanges(); | 574 | this.dataContext().commitChanges(); |
578 | result.put("lock", this.user().getNewLock()); | 575 | result.put("lock", this.user().getNewLock()); |
579 | result.put("result", "done"); | 576 | result.put("result", "done"); |
580 | } catch(java.lang.Exception exception) { | 577 | } catch(java.lang.Exception exception) { |
581 | this.dataContext().rollbackChanges(); | 578 | this.dataContext().rollbackChanges(); |
582 | logger.error(exception); | 579 | logger.error(exception); |
583 | throw exception; | 580 | throw exception; |
584 | } | 581 | } |
585 | 582 | ||
586 | return result; | 583 | return result; |
587 | """ | 584 | """ |
588 | 585 | ||
589 | elif message == 'echo': | 586 | elif message == 'echo': |
590 | result['result'] = parameters; | 587 | result['result'] = parameters; |
591 | 588 | ||
592 | else: | 589 | else: |
593 | result['error'] = "Wrong shared secret!" | 590 | result['error'] = "Wrong shared secret!" |
594 | 591 | ||
595 | #---------------------------------------------------------------------- | 592 | #---------------------------------------------------------------------- |
596 | 593 | ||
597 | elif method == 'logout': | 594 | elif method == 'logout': |
598 | result['method'] = 'logout' | 595 | result['method'] = 'logout' |
599 | 596 | ||
600 | #---------------------------------------------------------------------- | 597 | #---------------------------------------------------------------------- |
601 | 598 | ||
602 | else: | 599 | else: |
603 | result['method'] = 'PRRRRRR' | 600 | result['method'] = 'PRRRRRR' |
604 | 601 | ||
605 | #---------------------------------------------------------------------- | 602 | #---------------------------------------------------------------------- |
606 | 603 | ||
607 | self.saveSession(session) | 604 | self.saveSession(session) |
608 | self.response.out.write(simplejson.dumps(result)) | 605 | self.response.out.write(simplejson.dumps(result)) |
609 | 606 | ||
610 | #========================================================================== | 607 | #========================================================================== |
611 | 608 | ||
612 | def addNewRecords (self, aSession, aUser, someParameters): | 609 | def addNewRecords (self, aSession, aUser, someParameters): |
613 | result = {} | 610 | result = {} |
614 | 611 | ||
615 | #user = db.Query(User).filter('username =', aSession.C).get() | 612 | #user = db.Query(User).filter('username =', aSession.C).get() |
616 | aUser.update(someParameters['parameters']['user']) | 613 | aUser.update(someParameters['parameters']['user']) |
617 | 614 | ||
618 | for recordParameter in someParameters['parameters']['records']: | 615 | for recordParameter in someParameters['parameters']['records']: |
619 | record = Record(parent=aUser) | 616 | record = Record(parent=aUser) |
620 | record.put() | 617 | record.put() |
621 | recordVersion = RecordVersion(parent=record) | 618 | recordVersion = RecordVersion(parent=record) |
622 | recordVersion.put() | 619 | recordVersion.put() |
623 | 620 | ||
624 | recordVersion.update(recordParameter) | 621 | recordVersion.update(recordParameter) |
625 | 622 | ||
626 | record.put() | 623 | record.put() |
627 | recordVersion.put() | 624 | recordVersion.put() |
628 | 625 | ||
629 | aUser.put(); | 626 | aUser.put(); |
630 | 627 | ||
631 | result['lock'] = aUser.lock | 628 | result['lock'] = aUser.lock |
632 | result['result'] = 'done' | 629 | result['result'] = 'done' |
633 | 630 | ||
634 | return result | 631 | return result |
635 | 632 | ||
636 | #========================================================================== | 633 | #========================================================================== |
637 | 634 | ||
638 | def getSession(self): | 635 | def getSession(self): |
639 | #logging.info(">>> getSession (%d) => %s" % (db.Query(Session).count(), str(map(lambda v: v.sessionId, db.Query(Session).fetch(100)))) ) | 636 | #logging.info(">>> getSession (%d) => %s" % (db.Query(Session).count(), str(map(lambda v: v.sessionId, db.Query(Session).fetch(100)))) ) |
640 | result = None | 637 | result = None |
641 | try: | 638 | try: |
642 | sessionId = self.request.cookies['sessionId'] | 639 | sessionId = self.request.cookies['sessionId'] |
643 | except: | 640 | except: |
644 | sessionId = None | 641 | sessionId = None |
645 | 642 | ||
646 | #logging.info("wannabe sessionId: " + str(sessionId)) | 643 | #logging.info("wannabe sessionId: " + str(sessionId)) |
647 | 644 | ||
648 | if sessionId != None: | 645 | if sessionId != None: |
649 | #query = db.Query(Session) | 646 | #query = db.Query(Session) |
650 | #query.filter('sessionId =', sessionId) | 647 | #query.filter('sessionId =', sessionId) |
651 | 648 | ||
652 | #result = query.get() | 649 | #result = query.get() |
653 | 650 | ||
654 | #result = db.Query(Session).filter('sessionId =', str(sessionId)).filter('access_date >', (datetime.datetime.utcnow() - sessionTimeout)).get() | 651 | #result = db.Query(Session).filter('sessionId =', str(sessionId)).filter('access_date >', (datetime.datetime.utcnow() - sessionTimeout)).get() |
655 | result = db.Query(Session).filter('sessionId =', str(sessionId)).get() | 652 | result = db.Query(Session).filter('sessionId =', str(sessionId)).get() |
656 | #logging.info("searching session on datastore. Found: " + str(result)) | 653 | #logging.info("searching session on datastore. Found: " + str(result)) |
657 | 654 | ||
658 | if result == None: | 655 | if result == None: |
659 | sessionId = str(uuid.uuid4()) | 656 | sessionId = str(uuid.uuid4()) |
660 | #logging.info("creating a new session with sessionId=" + str(sessionId)) | 657 | #logging.info("creating a new session with sessionId=" + str(sessionId)) |
661 | result = Session(sessionId=sessionId) | 658 | result = Session(sessionId=sessionId) |
662 | 659 | ||
663 | result.access_date = datetime.datetime.utcnow() | 660 | result.access_date = datetime.datetime.utcnow() |
664 | result.put() | 661 | result.put() |
665 | 662 | ||
666 | #logging.info("<<< getSession (%d)" % db.Query(Session).count()) | 663 | #logging.info("<<< getSession (%d)" % db.Query(Session).count()) |
667 | 664 | ||
668 | return result | 665 | return result |
669 | 666 | ||
670 | #========================================================================== | 667 | #========================================================================== |
671 | 668 | ||
672 | def saveSession(self, aSession): | 669 | def saveSession(self, aSession): |
673 | #logging.info(">>> saveSession (%d)" % db.Query(Session).count()) | 670 | #logging.info(">>> saveSession (%d)" % db.Query(Session).count()) |
674 | #self.response.set_cookie('sessionId', aSession.sessionId, max_age=360, path='/', domain='example.org', secure=True) | 671 | #self.response.set_cookie('sessionId', aSession.sessionId, max_age=360, path='/', domain='example.org', secure=True) |
675 | aSession.put() | 672 | aSession.put() |
676 | self.response.headers.add_header('Set-Cookie', 'sessionId=' + str(aSession.sessionId), path='/') | 673 | self.response.headers.add_header('Set-Cookie', 'sessionId=' + str(aSession.sessionId), path='/') |
677 | self.cleanOldSessions() | 674 | self.cleanOldSessions() |
678 | #logging.info("<<< saveSession (%d)" % db.Query(Session).count()) | 675 | #logging.info("<<< saveSession (%d)" % db.Query(Session).count()) |
679 | 676 | ||
680 | #========================================================================== | 677 | #========================================================================== |
681 | 678 | ||
682 | def cleanOldSessions(self): | 679 | def cleanOldSessions(self): |
683 | query = db.Query(Session).filter('accessDate <', (datetime.datetime.utcnow() - sessionTimeout)) | 680 | query = db.Query(Session).filter('accessDate <', (datetime.datetime.utcnow() - sessionTimeout)) |
684 | 681 | ||
685 | expiredSessions = query.count(); | 682 | expiredSessions = query.count(); |
686 | if expiredSessions != 0: | 683 | if expiredSessions != 0: |
687 | #logging.info("deleting %d sessions" % expiredSessions) | 684 | #logging.info("deleting %d sessions" % expiredSessions) |
688 | pass | 685 | pass |
689 | 686 | ||
690 | """ | 687 | """ |
691 | try: | 688 | try: |
692 | db.delete(query) | 689 | db.delete(query) |
693 | except Exception, exception: | 690 | except Exception, exception: |
694 | logging.error("some issues raised while deleting the expired sessions") | 691 | logging.error("some issues raised while deleting the expired sessions") |
695 | logging.error("exception type: " + str(type(exception))) | 692 | logging.error("exception type: " + str(type(exception))) |
696 | logging.error("exception: " + str(exception)) | 693 | logging.error("exception: " + str(exception)) |
697 | """ | 694 | """ |
698 | pass | 695 | pass |
699 | 696 | ||
700 | #============================================================================== | 697 | #============================================================================== |
701 | 698 | ||
702 | def main(): | 699 | def main(): |
703 | application = webapp.WSGIApplication([('/xhr', XHR), ('/dump', XHR), ('/.*', MainPage)], debug=True) | 700 | application = webapp.WSGIApplication([('/xhr', XHR), ('/dump', XHR), ('/.*', MainPage)], debug=True) |
704 | wsgiref.handlers.CGIHandler().run(application) | 701 | wsgiref.handlers.CGIHandler().run(application) |
705 | 702 | ||
706 | if __name__ == "__main__": | 703 | if __name__ == "__main__": |
707 | main() | 704 | main() |
708 | 705 | ||