3 # Copyright (C) 2014 Ipsilon project Contributors, for licensee see COPYING
5 from ipsilon.util.data import Store
7 from openid import oidutil
8 from openid.association import Association
9 from openid.store.nonce import SKEW as NonceSKEW
10 from openid.store.interface import OpenIDStore as OpenIDStoreInterface
14 class OpenIDStore(Store, OpenIDStoreInterface):
15 def __init__(self, database_url):
16 Store.__init__(self, database_url=database_url)
18 def storeAssociation(self, server_url, assoc):
19 iden = '%s-%s' % (server_url, assoc.handle)
20 datum = {'secret': oidutil.toBase64(assoc.secret),
21 'issued': str(assoc.issued),
22 'lifetime': str(assoc.lifetime),
23 'assoc_type': assoc.assoc_type}
26 self.save_unique_data('association', data)
28 def getAssociation(self, server_url, handle=None):
29 iden = '%s-%s' % (server_url, handle)
30 data = self.get_unique_data('association', iden)
36 assoc = Association(handle,
37 oidutil.fromBase64(datum['secret']),
39 int(datum['lifetime']),
42 if assoc.expiresIn == 0:
43 self.del_unique_data('association', iden)
48 def removeAssociation(self, server_url, handle):
49 iden = '%s-%s' % (server_url, handle)
50 self.del_unique_data('association', iden)
52 def useNonce(self, server_url, timestamp, salt):
53 if abs(timestamp - time()) > NonceSKEW:
56 iden = '%s-%s-%s' % (server_url, timestamp, salt)
57 data = self.get_unique_data('nonce', iden)
60 # This server_url, timestamp, salt combination is already seen
63 datum = {'timestamp': timestamp}
65 self.save_unique_data('nonce', data)
69 def cleanupNonces(self):
70 nonces = self.get_unique_data('nonce')
72 if nonces[iden]['timestamp'] < (time() - NonceSKEW):
73 self.del_unique_data('nonce', iden)
75 def cleanupAssociations(self):
76 assocs = self.get_unique_data('association')
78 if ((int(assocs[iden]['issued']) + int(assocs[iden]['lifetime']))
80 self.del_unique_data('association', iden)