Commit e14cb6d2 by James Henstridge

Apply django_openidconsummer_r19_2.diff from

http://code.google.com/p/django-openid/issues/detail?id=10.
parent 739309c5
from django.db import models from django.db import models
class Nonce(models.Model): class Nonce(models.Model):
nonce = models.CharField(maxlength=8) server_url = models.CharField(maxlength=255)
expires = models.IntegerField() timestamp = models.IntegerField()
def __str__(self): salt = models.CharField(max_length=40)
return "Nonce: %s" % self.nonce
def __unicode__(self):
return u"Nonce: %s" % self.id
class Association(models.Model): class Association(models.Model):
server_url = models.TextField(maxlength=2047) server_url = models.TextField(maxlength=2047)
handle = models.CharField(maxlength=255) handle = models.CharField(maxlength=255)
...@@ -13,5 +16,7 @@ class Association(models.Model): ...@@ -13,5 +16,7 @@ class Association(models.Model):
issued = models.IntegerField() issued = models.IntegerField()
lifetime = models.IntegerField() lifetime = models.IntegerField()
assoc_type = models.TextField(maxlength=64) assoc_type = models.TextField(maxlength=64)
def __str__(self):
return "Association: %s, %s" % (self.server_url, self.handle) def __unicode__(self):
return u"Association: %s, %s" % (self.server_url, self.handle)
{% load i18n %}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"> "http://www.w3.org/TR/html4/strict.dtd">
<html> <html>
...@@ -13,10 +15,24 @@ input.openid { ...@@ -13,10 +15,24 @@ input.openid {
</head> </head>
<body> <body>
<h1>Sign in with your OpenID</h1> <h1>Sign in with your OpenID</h1>
{% if form.errors %}
<form action="{{ action }}" method="post"> <p class="errors">{% trans "Please correct errors below:" %}<br />
<p><input class="openid" type="text" name="openid_url"> <input type="submit" value="Sign in"></p> {% if form.openid_url.errors %}
</form> <span class="error">{{ form.openid_url.errors|join:", " }}</span>
{% endif %}
{% if form.next.errors %}
<span class="error">{{ form.next.errors|join:", " }}</span>
{% endif %}
</p>
{% endif %}
<form name="fopenid" action="{{ action }}" method="post">
{{ form.next }}
<fieldset>
<legend>{% trans "Sign In Using Your OpenID" %}</legend>
<div class="form-row"><label for="id_openid_ul">{% trans "OpenId URL :" %}</label><br />{{ form.openid_url }}</div>
<div class="submit-row "><input name="bsignin" type="submit" value="{% trans "Sign in with OPENID" %}"></div>
</fieldset>
</form>
</body> </body>
</html> </html>
from openid.store.interface import OpenIDStore from openid.store.interface import OpenIDStore
from openid.association import Association as OIDAssociation from openid.association import Association as OIDAssociation
from yadis import xri from django.db.models.query import Q
from django.conf import settings
import time, base64, md5 import openid.store
# needed for some linux distributions like debian
try:
from openid.yadis import xri
except:
from yadis import xri
import time, base64, md5, operator
from django.conf import settings
from models import Association, Nonce from models import Association, Nonce
class OpenID: class OpenID:
...@@ -70,27 +78,37 @@ class DjangoOpenIDStore(OpenIDStore): ...@@ -70,27 +78,37 @@ class DjangoOpenIDStore(OpenIDStore):
for assoc in assocs: for assoc in assocs:
assoc.delete() assoc.delete()
return assocs_exist return assocs_exist
def storeNonce(self, nonce): def useNonce(self, server_url, timestamp, salt):
nonce, created = Nonce.objects.get_or_create( if abs(timestamp - time.time()) > openid.store.nonce.SKEW:
nonce = nonce, defaults={'expires': int(time.time())} return False
)
query =[
def useNonce(self, nonce): Q(server_url__exact=server_url),
Q(timestamp__exact=timestamp),
Q(salt__exact=salt),
]
try: try:
nonce = Nonce.objects.get(nonce = nonce) ononce = Nonce.objects.get(reduce(operator.and_, query))
except Nonce.DoesNotExist: except Nonce.DoesNotExist:
return 0 ononce = Nonce(
server_url=server_url,
timestamp=timestamp,
salt=salt
);
ononce.save()
return True
# Now check nonce has not expired ononce.delete()
nonce_age = int(time.time()) - nonce.expires
if nonce_age > self.max_nonce_age: return False
present = 0
else: def cleanupNonce(self):
present = 1 Nonce.objects.filter(timestamp<int(time.time()) - nonce.SKEW).delete()
nonce.delete()
return present def cleaupAssociations(self):
Association.objects.extra(where=['issued + lifetimeint<(%s)' % time.time()]).delete()
def getAuthKey(self): def getAuthKey(self):
# Use first AUTH_KEY_LEN characters of md5 hash of SECRET_KEY # Use first AUTH_KEY_LEN characters of md5 hash of SECRET_KEY
return md5.new(settings.SECRET_KEY).hexdigest()[:self.AUTH_KEY_LEN] return md5.new(settings.SECRET_KEY).hexdigest()[:self.AUTH_KEY_LEN]
...@@ -101,6 +119,6 @@ class DjangoOpenIDStore(OpenIDStore): ...@@ -101,6 +119,6 @@ class DjangoOpenIDStore(OpenIDStore):
def from_openid_response(openid_response): def from_openid_response(openid_response):
issued = int(time.time()) issued = int(time.time())
return OpenID( return OpenID(
openid_response.identity_url, issued, openid_response.signed_args, openid_response.identity_url, issued, openid_response.signed_fields,
openid_response.extensionResponse('sreg') openid_response.extensionResponse('sreg', False)
) )
...@@ -2,15 +2,24 @@ from django.http import HttpResponse, HttpResponseRedirect, get_host ...@@ -2,15 +2,24 @@ from django.http import HttpResponse, HttpResponseRedirect, get_host
from django.shortcuts import render_to_response as render from django.shortcuts import render_to_response as render
from django.template import RequestContext from django.template import RequestContext
from django.conf import settings from django.conf import settings
from django.utils.http import urlquote_plus, urlquote
import md5, re, time, urllib import md5, re, time, urllib
from openid.consumer.consumer import Consumer, \ from openid.consumer.consumer import Consumer, \
SUCCESS, CANCEL, FAILURE, SETUP_NEEDED SUCCESS, CANCEL, FAILURE, SETUP_NEEDED
from openid.consumer.discover import DiscoveryFailure from openid.consumer.discover import DiscoveryFailure
from yadis import xri
# needed for some linux distributions like debian
try:
from openid.yadis import xri
except:
from yadis import xriœ
from util import OpenID, DjangoOpenIDStore, from_openid_response from util import OpenID, DjangoOpenIDStore, from_openid_response
from forms import OpenidSigninForm
from django.utils.html import escape from django.utils.html import escape
def get_url_host(request): def get_url_host(request):
...@@ -42,67 +51,67 @@ def begin(request, sreg=None, extension_args=None, redirect_to=None, ...@@ -42,67 +51,67 @@ def begin(request, sreg=None, extension_args=None, redirect_to=None,
on_failure=None): on_failure=None):
on_failure = on_failure or default_on_failure on_failure = on_failure or default_on_failure
if request.GET.get('logo'):
# Makes for a better demo
return logo(request)
extension_args = extension_args or {} extension_args = extension_args or {}
if sreg:
extension_args['sreg.optional'] = sreg
trust_root = getattr(
settings, 'OPENID_TRUST_ROOT', get_url_host(request) + '/'
)
redirect_to = redirect_to or getattr(
settings, 'OPENID_REDIRECT_TO',
# If not explicitly set, assume current URL with complete/ appended
get_full_url(request).split('?')[0] + 'complete/'
)
# In case they were lazy...
if not redirect_to.startswith('http://'):
redirect_to = get_url_host(request) + redirect_to
if request.GET.get('next') and is_valid_next_url(request.GET['next']): next = ''
if '?' in redirect_to: if request.GET.get('next'):
join = '&' next = urllib.urlencode({
else:
join = '?'
redirect_to += join + urllib.urlencode({
'next': request.GET['next'] 'next': request.GET['next']
}) })
user_url = request.POST.get('openid_url', None)
if not user_url:
request_path = request.path
if request.GET.get('next'):
request_path += '?' + urllib.urlencode({
'next': request.GET['next']
})
return render('openid_signin.html', {
'action': request_path, form_signin = OpenidSigninForm(initial={'next':next})
'logo': request.path + '?logo=1', if request.POST:
}) form_signin = OpenidSigninForm(request.POST)
if form_signin.is_valid():
if xri.identifierScheme(user_url) == 'XRI' and getattr( consumer = Consumer(request.session, DjangoOpenIDStore())
settings, 'OPENID_DISALLOW_INAMES', False try:
): auth_request = consumer.begin(form_signin.cleaned_data['openid_url'])
return on_failure(request, 'i-names are not supported') except DiscoveryFailure:
return on_failure(request, "The OpenID was invalid")
consumer = Consumer(request.session, DjangoOpenIDStore())
try: if sreg:
auth_request = consumer.begin(user_url) extension_args['sreg.optional'] = sreg
except DiscoveryFailure:
return on_failure(request, "The OpenID was invalid") trust_root = getattr(
settings, 'OPENID_TRUST_ROOT', get_url_host(request) + '/'
)
redirect_to = redirect_to or getattr(
settings, 'OPENID_REDIRECT_TO',
# If not explicitly set, assume current URL with complete/ appended
get_full_url(request).split('?')[0] + 'complete/'
)
# TODO: add redirect_to in form
if not redirect_to.startswith('http://'):
redirect_to = get_url_host(request) + redirect_to
if 'next' in form_signin.cleaned_data and next != "":
if '?' in redirect_to:
join = '&'
else:
join = '?'
redirect_to += join + urllib.urlencode({
'next': form_signin.cleaned_data['next']
})
# Add extension args (for things like simple registration) # Add extension args (for things like simple registration)
for name, value in extension_args.items(): for name, value in extension_args.items():
namespace, key = name.split('.', 1) namespace, key = name.split('.', 1)
auth_request.addExtensionArg(namespace, key, value) auth_request.addExtensionArg(namespace, key, value)
redirect_url = auth_request.redirectURL(trust_root, redirect_to) redirect_url = auth_request.redirectURL(trust_root, redirect_to)
return HttpResponseRedirect(redirect_url) return HttpResponseRedirect(redirect_url)
return render('openid_signin.html', {
'form': form_signin,
'action': request.path,
'logo': request.path + 'logo/',
'openids': request.session['openids'],
})
def complete(request, on_success=None, on_failure=None): def complete(request, on_success=None, on_failure=None):
on_success = on_success or default_on_success on_success = on_success or default_on_success
on_failure = on_failure or default_on_failure on_failure = on_failure or default_on_failure
......
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