summaryrefslogtreecommitdiff
path: root/backend/python
Unidiff
Diffstat (limited to 'backend/python') (more/less context) (ignore whitespace changes)
-rw-r--r--backend/python/src/clipperz.py22
1 files changed, 10 insertions, 12 deletions
diff --git a/backend/python/src/clipperz.py b/backend/python/src/clipperz.py
index bd5d030..5476b4b 100644
--- a/backend/python/src/clipperz.py
+++ b/backend/python/src/clipperz.py
@@ -1,213 +1,211 @@
1# 1#
2 #Copyright 2008-2011 Clipperz Srl 2 #Copyright 2008-2013 Clipperz Srl
3 # 3 #
4 #This file is part of Clipperz Community Edition. 4 #This file is part of Clipperz, the online password manager.
5 #Clipperz Community Edition is an online password manager.
6 #For further information about its features and functionalities please 5 #For further information about its features and functionalities please
7 #refer to http://www.clipperz.com. 6 #refer to http://www.clipperz.com.
8 # 7 #
9 #* Clipperz Community Edition is free software: you can redistribute 8 #* Clipperz is free software: you can redistribute it and/or modify it
10 # it and/or modify it under the terms of the GNU Affero General Public 9# under the terms of the GNU Affero General Public License as published
11 # License as published by the Free Software Foundation, either version 10# by the Free Software Foundation, either version 3 of the License, or
12 # 3 of the License, or (at your option) any later version. 11# (at your option) any later version.
13 # 12 #
14 #* Clipperz Community Edition is distributed in the hope that it will 13 #* Clipperz is distributed in the hope that it will be useful, but
15 # be useful, but WITHOUT ANY WARRANTY; without even the implied 14# WITHOUT ANY WARRANTY; without even the implied warranty of
16 # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 # See the GNU Affero General Public License for more details. 16 # See the GNU Affero General Public License for more details.
18 # 17 #
19 #* You should have received a copy of the GNU Affero General Public 18 #* You should have received a copy of the GNU Affero General Public
20 # License along with Clipperz Community Edition. If not, see 19 # License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21 # <http://www.gnu.org/licenses/>.
22# 20#
23 21
24import os 22import os
25import cgi 23import cgi
26import wsgiref.handlers 24import wsgiref.handlers
27 25
28import datetime 26import datetime
29import uuid 27import uuid
30import random 28import random
31import hashlib 29import hashlib
32 30
33import logging 31import logging
34 32
35from google.appengine.api import users 33from google.appengine.api import users
36from google.appengine.ext import webapp 34from google.appengine.ext import webapp
37from google.appengine.ext import db 35from google.appengine.ext import db
38from google.appengine.ext.webapp import template 36from google.appengine.ext.webapp import template
39 37
40from django.utils import simplejson 38from django.utils import simplejson
41 39
42#============================================================================== 40#==============================================================================
43 41
44sessionTimeout = datetime.timedelta(minutes=-2) 42sessionTimeout = datetime.timedelta(minutes=-2)
45 43
46def randomSeed(): 44def randomSeed():
47 return hex(random.getrandbits(32*8))[2:-1] 45 return hex(random.getrandbits(32*8))[2:-1]
48 46
49def clipperzHash(aString): 47def clipperzHash(aString):
50 #logging.info(">>> string: " + aString) 48 #logging.info(">>> string: " + aString)
51 firstRound = hashlib.sha256() 49 firstRound = hashlib.sha256()
52 firstRound.update(aString) 50 firstRound.update(aString)
53 #logging.info("firstRound: " + firstRound.hexdigest() + " - " + firstRound.digest()) 51 #logging.info("firstRound: " + firstRound.hexdigest() + " - " + firstRound.digest())
54 result = hashlib.sha256() 52 result = hashlib.sha256()
55 result.update(firstRound.digest()) 53 result.update(firstRound.digest())
56 #logging.info("<<< finalResul: " + result.hexdigest()) 54 #logging.info("<<< finalResul: " + result.hexdigest())
57 55
58 return result.hexdigest() 56 return result.hexdigest()
59 57
60#============================================================================== 58#==============================================================================
61 59
62class User(db.Model): 60class User(db.Model):
63 username= db.StringProperty() 61 username= db.StringProperty()
64 srp_s = db.StringProperty() 62 srp_s = db.StringProperty()
65 srp_v = db.StringProperty() 63 srp_v = db.StringProperty()
66 header = db.TextProperty() 64 header = db.TextProperty()
67 statistics= db.TextProperty() 65 statistics= db.TextProperty()
68 auth_version= db.StringProperty() 66 auth_version= db.StringProperty()
69 version = db.StringProperty() 67 version = db.StringProperty()
70 lock = db.StringProperty() 68 lock = db.StringProperty()
71 69
72 def updateCredentials(self, someCredentials): 70 def updateCredentials(self, someCredentials):
73 self.username = someCredentials['C'] 71 self.username = someCredentials['C']
74 self.srp_s = someCredentials['s'] 72 self.srp_s = someCredentials['s']
75 self.srp_v = someCredentials['v'] 73 self.srp_v = someCredentials['v']
76 self.auth_version= someCredentials['version'] 74 self.auth_version= someCredentials['version']
77 75
78 def update(self, someData): 76 def update(self, someData):
79 self.header = someData['header'] 77 self.header = someData['header']
80 self.statistics= someData['statistics'] 78 self.statistics= someData['statistics']
81 self.version= someData['version'] 79 self.version= someData['version']
82 self.lock = someData['lock'] 80 self.lock = someData['lock']
83 81
84#------------------------------------------------------------------------------ 82#------------------------------------------------------------------------------
85 83
86class Record(db.Model): 84class Record(db.Model):
87 user = db.ReferenceProperty(User) 85 user = db.ReferenceProperty(User)
88 reference = db.StringProperty() 86 reference = db.StringProperty()
89 data = db.TextProperty() 87 data = db.TextProperty()
90 version = db.StringProperty() 88 version = db.StringProperty()
91 creation_date= db.DateTimeProperty(auto_now_add=True) 89 creation_date= db.DateTimeProperty(auto_now_add=True)
92 update_date = db.DateTimeProperty(auto_now_add=True) 90 update_date = db.DateTimeProperty(auto_now_add=True)
93 access_date = db.DateTimeProperty(auto_now_add=True) 91 access_date = db.DateTimeProperty(auto_now_add=True)
94 92
95#------------------------------------------------------------------------------ 93#------------------------------------------------------------------------------
96 94
97class RecordVersion(db.Model): 95class RecordVersion(db.Model):
98 record = db.ReferenceProperty(Record) 96 record = db.ReferenceProperty(Record)
99 reference = db.StringProperty() 97 reference = db.StringProperty()
100 header = db.TextProperty() 98 header = db.TextProperty()
101 data = db.TextProperty() 99 data = db.TextProperty()
102 version = db.StringProperty() 100 version = db.StringProperty()
103 previousVersionKey= db.StringProperty() 101 previousVersionKey= db.StringProperty()
104 previousVersion = db.SelfReferenceProperty() 102 previousVersion = db.SelfReferenceProperty()
105 creation_date = db.DateTimeProperty(auto_now_add=True) 103 creation_date = db.DateTimeProperty(auto_now_add=True)
106 update_date = db.DateTimeProperty(auto_now_add=True) 104 update_date = db.DateTimeProperty(auto_now_add=True)
107 access_date = db.DateTimeProperty(auto_now_add=True) 105 access_date = db.DateTimeProperty(auto_now_add=True)
108 106
109 def update(self, someData): 107 def update(self, someData):
110 recordData = someData['record']; 108 recordData = someData['record'];
111 self.parent().reference =recordData['reference'] 109 self.parent().reference =recordData['reference']
112 self.parent().data = recordData['data'] 110 self.parent().data = recordData['data']
113 self.parent().version = recordData['version'] 111 self.parent().version = recordData['version']
114 self.parent().update_date =datetime.datetime.now() 112 self.parent().update_date =datetime.datetime.now()
115 113
116 recordVersionData = someData['currentRecordVersion']; 114 recordVersionData = someData['currentRecordVersion'];
117 self.reference = recordVersionData ['reference'] 115 self.reference = recordVersionData ['reference']
118 self.data = recordVersionData ['data'] 116 self.data = recordVersionData ['data']
119 self.version = recordVersionData ['version'] 117 self.version = recordVersionData ['version']
120 #self.previous_version =#recordVersionData ['previousVersion'] 118 #self.previous_version =#recordVersionData ['previousVersion']
121 self.previous_version_key =recordVersionData ['previousVersionKey'] 119 self.previous_version_key =recordVersionData ['previousVersionKey']
122 self.update_date = datetime.datetime.now() 120 self.update_date = datetime.datetime.now()
123 121
124#------------------------------------------------------------------------------ 122#------------------------------------------------------------------------------
125 123
126class OneTimePassword(db.Model): 124class OneTimePassword(db.Model):
127 user = db.ReferenceProperty(User) 125 user = db.ReferenceProperty(User)
128 status = db.StringProperty() 126 status = db.StringProperty()
129 reference = db.StringProperty() 127 reference = db.StringProperty()
130 keyValue = db.StringProperty() 128 keyValue = db.StringProperty()
131 keyChecksum = db.StringProperty() 129 keyChecksum = db.StringProperty()
132 data = db.TextProperty() 130 data = db.TextProperty()
133 version = db.StringProperty() 131 version = db.StringProperty()
134 creation_date= db.DateTimeProperty(auto_now_add=True) 132 creation_date= db.DateTimeProperty(auto_now_add=True)
135 request_date= db.DateTimeProperty() 133 request_date= db.DateTimeProperty()
136 usage_date = db.DateTimeProperty() 134 usage_date = db.DateTimeProperty()
137 135
138 def update(self, someParameters, aStatus): 136 def update(self, someParameters, aStatus):
139 self.reference = someParameters['reference'] 137 self.reference = someParameters['reference']
140 self.keyValue = someParameters['key'] 138 self.keyValue = someParameters['key']
141 self.keyChecksum = someParameters['keyChecksum'] 139 self.keyChecksum = someParameters['keyChecksum']
142 self.data = someParameters['data'] 140 self.data = someParameters['data']
143 self.version = someParameters['version'] 141 self.version = someParameters['version']
144 self.status = aStatus 142 self.status = aStatus
145 143
146 def reset(self, aStatus): 144 def reset(self, aStatus):
147 self.data = "" 145 self.data = ""
148 self.status =aStatus 146 self.status =aStatus
149 147
150 return self 148 return self
151 149
152#------------------------------------------------------------------------------ 150#------------------------------------------------------------------------------
153 151
154class Session(db.Expando): 152class Session(db.Expando):
155 sessionId= db.StringProperty() 153 sessionId= db.StringProperty()
156 access_date= db.DateTimeProperty() 154 access_date= db.DateTimeProperty()
157 155
158#============================================================================== 156#==============================================================================
159 157
160class MainPage(webapp.RequestHandler): 158class MainPage(webapp.RequestHandler):
161 def get(self): 159 def get(self):
162 path = os.path.join(os.path.dirname(__file__), 'static%s' % self.request.path) 160 path = os.path.join(os.path.dirname(__file__), 'static%s' % self.request.path)
163 self.response.out.write(template.render(path, {})) 161 self.response.out.write(template.render(path, {}))
164 162
165#============================================================================== 163#==============================================================================
166 164
167class XHR(webapp.RequestHandler): 165class XHR(webapp.RequestHandler):
168 166
169 #========================================================================== 167 #==========================================================================
170 168
171 def get(self): 169 def get(self):
172 logging.info("self.request.path: " + self.request.path) 170 logging.info("self.request.path: " + self.request.path)
173 if self.request.path == "/dump": 171 if self.request.path == "/dump":
174 session = self.getSession() 172 session = self.getSession()
175 userData = {} 173 userData = {}
176 offline_data_placeholder = "" 174 offline_data_placeholder = ""
177 175
178 user = db.Query(User).filter('username =', session.C).get() 176 user = db.Query(User).filter('username =', session.C).get()
179 177
180 userData['users'] = { 178 userData['users'] = {
181 'catchAllUser': { 179 'catchAllUser': {
182 '__masterkey_test_value__': 'masterkey', 180 '__masterkey_test_value__': 'masterkey',
183 's': '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 181 's': '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
184 'v': '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 182 'v': '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
185 } 183 }
186 } 184 }
187 185
188 records = {} 186 records = {}
189 for currentRecord in db.Query(Record).ancestor(user): 187 for currentRecord in db.Query(Record).ancestor(user):
190 versions = {} 188 versions = {}
191 for currentVersion in db.Query(RecordVersion).ancestor(currentRecord): 189 for currentVersion in db.Query(RecordVersion).ancestor(currentRecord):
192 versions[currentVersion.reference] ={ 190 versions[currentVersion.reference] ={
193 'header': currentVersion.header, 191 'header': currentVersion.header,
194 'data': currentVersion.data, 192 'data': currentVersion.data,
195 'version': currentVersion.version, 193 'version': currentVersion.version,
196 'creationDate':str(currentVersion.creation_date), 194 'creationDate':str(currentVersion.creation_date),
197 'updateDate':str(currentVersion.update_date), 195 'updateDate':str(currentVersion.update_date),
198 'accessDate':str(currentVersion.access_date) 196 'accessDate':str(currentVersion.access_date)
199 } 197 }
200 198
201 records[currentRecord.reference] = { 199 records[currentRecord.reference] = {
202 'data': currentRecord.data, 200 'data': currentRecord.data,
203 'version': currentRecord.version, 201 'version': currentRecord.version,
204 'creationDate': str(currentRecord.creation_date), 202 'creationDate': str(currentRecord.creation_date),
205 'updateDate': str(currentRecord.update_date), 203 'updateDate': str(currentRecord.update_date),
206 'accessDate': str(currentRecord.access_date), 204 'accessDate': str(currentRecord.access_date),
207 'currentVersion':currentVersion.reference, 205 'currentVersion':currentVersion.reference,
208 'versions': versions 206 'versions': versions
209 } 207 }
210 208
211 userData['users'][user.username] = { 209 userData['users'][user.username] = {
212 's': user.srp_s, 210 's': user.srp_s,
213 'v': user.srp_v, 211 'v': user.srp_v,