Commit 0936a94a by James Henstridge

Clean up util.py a bit.

parent e75a086e
from openid.store.interface import OpenIDStore import base64
from openid.association import Association as OIDAssociation import md5
import operator
import time
from django.db.models.query import Q from django.db.models.query import Q
from django.conf import settings from django.conf import settings
import openid.store from openid.association import Association as OIDAssociation
from openid.store.interface import OpenIDStore
from openid.store.nonce import SKEW
from openid.yadis import xri from openid.yadis import xri
import time, base64, md5, operator
from models import Association, Nonce from models import Association, Nonce
class OpenID: class OpenID:
def __init__(self, openid, issued, attrs=None, sreg=None): def __init__(self, openid, issued, attrs=None, sreg=None):
self.openid = openid self.openid = openid
...@@ -17,99 +21,98 @@ class OpenID: ...@@ -17,99 +21,98 @@ class OpenID:
self.attrs = attrs or {} self.attrs = attrs or {}
self.sreg = sreg or {} self.sreg = sreg or {}
self.is_iname = (xri.identifierScheme(openid) == 'XRI') self.is_iname = (xri.identifierScheme(openid) == 'XRI')
def __repr__(self): def __repr__(self):
return '<OpenID: %s>' % self.openid return '<OpenID: %s>' % self.openid
def __str__(self): def __str__(self):
return self.openid return self.openid
class DjangoOpenIDStore(OpenIDStore): class DjangoOpenIDStore(OpenIDStore):
def __init__(self): def __init__(self):
self.max_nonce_age = 6 * 60 * 60 # Six hours self.max_nonce_age = 6 * 60 * 60 # Six hours
def storeAssociation(self, server_url, association): def storeAssociation(self, server_url, association):
assoc = Association( assoc = Association(
server_url = server_url, server_url=server_url,
handle = association.handle, handle=association.handle,
secret = base64.encodestring(association.secret), secret=base64.encodestring(association.secret),
issued = association.issued, issued=association.issued,
lifetime = association.issued, lifetime=association.issued,
assoc_type = association.assoc_type assoc_type=association.assoc_type)
)
assoc.save() assoc.save()
def getAssociation(self, server_url, handle=None): def getAssociation(self, server_url, handle=None):
assocs = [] assocs = []
if handle is not None: if handle is not None:
assocs = Association.objects.filter( assocs = Association.objects.filter(
server_url = server_url, handle = handle server_url=server_url, handle=handle)
)
else: else:
assocs = Association.objects.filter( assocs = Association.objects.filter(server_url=server_url)
server_url = server_url
)
if not assocs:
return None
associations = [] associations = []
expired = []
for assoc in assocs: for assoc in assocs:
association = OIDAssociation( association = OIDAssociation(
assoc.handle, base64.decodestring(assoc.secret), assoc.issued, assoc.handle, base64.decodestring(assoc.secret), assoc.issued,
assoc.lifetime, assoc.assoc_type assoc.lifetime, assoc.assoc_type
) )
if association.getExpiresIn() == 0: if association.getExpiresIn() == 0:
self.removeAssociation(server_url, assoc.handle) expired.append(assoc)
else: else:
associations.append((association.issued, association)) associations.append((association.issued, association))
for assoc in expired:
assoc.delete()
if not associations: if not associations:
return None return None
associations.sort()
return associations[-1][1] return associations[-1][1]
def removeAssociation(self, server_url, handle): def removeAssociation(self, server_url, handle):
assocs = list(Association.objects.filter( assocs = list(Association.objects.filter(
server_url = server_url, handle = handle server_url=server_url, handle=handle))
))
assocs_exist = len(assocs) > 0 assocs_exist = len(assocs) > 0
for assoc in assocs: for assoc in assocs:
assoc.delete() assoc.delete()
return assocs_exist return assocs_exist
def useNonce(self, server_url, timestamp, salt): def useNonce(self, server_url, timestamp, salt):
if abs(timestamp - time.time()) > openid.store.nonce.SKEW: if abs(timestamp - time.time()) > SKEW:
return False return False
query =[
Q(server_url__exact=server_url),
Q(timestamp__exact=timestamp),
Q(salt__exact=salt),
]
try: try:
ononce = Nonce.objects.get(reduce(operator.and_, query)) ononce = Nonce.objects.get(
server_url__exact=server_url,
timestamp__exact=timestamp,
salt__exact=salt)
except Nonce.DoesNotExist: except Nonce.DoesNotExist:
ononce = Nonce( ononce = Nonce(
server_url=server_url, server_url=server_url,
timestamp=timestamp, timestamp=timestamp,
salt=salt salt=salt)
);
ononce.save() ononce.save()
return True return True
ononce.delete()
return False return False
def cleanupNonce(self): def cleanupNonces(self):
Nonce.objects.filter(timestamp<int(time.time()) - nonce.SKEW).delete() now = int(time.time())
expired = Nonce.objects.filter(
Q(timestamp__lt=now - SKEW) | Q(timestamp__gt=now + SKEW))
count = expired.count()
if count:
expired.delete()
return count
def cleaupAssociations(self): def cleaupAssociations(self):
Association.objects.extra(where=['issued + lifetimeint<(%s)' % time.time()]).delete() now = int(time.time())
expired = Association.objects.extra(
where=['issued + lifetime < %d' % now])
count = expired.count()
if count:
expired.delete()
return count
def getAuthKey(self):
# Use first AUTH_KEY_LEN characters of md5 hash of SECRET_KEY
return md5.new(settings.SECRET_KEY).hexdigest()[:self.AUTH_KEY_LEN]
def isDumb(self):
return False
def from_openid_response(openid_response): def from_openid_response(openid_response):
issued = int(time.time()) issued = int(time.time())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment