datatracker/ietf/ietfauth/views.py
Bill Fenner 473b2bdc60 Merge auth branch.
- Legacy-Id: 1149
2008-04-04 05:07:51 +00:00

102 lines
4 KiB
Python

# Copyright The IETF Trust 2007, All Rights Reserved
from django.conf import settings
from django.shortcuts import render_to_response
from django.template.context import RequestContext
from django.http import HttpResponseRedirect
from django.contrib.sites.models import Site
from django.contrib.auth.models import User
from ietf.idtracker.models import PersonOrOrgInfo
from ietf.ietfauth.models import UserMap
from ietf.ietfauth.forms import EmailForm, ChallengeForm, PWForm, FirstLastForm, email_hash
from ietf.ietfauth.auth import set_password
from ietf.utils.mail import send_mail
from ietf.utils.users import create_user
from ietf.utils.log import log
import time
def password_request(request):
if request.method == 'POST':
form = EmailForm(request.POST)
if form.is_valid():
timestamp = int(time.time())
email = form.clean_data['email']
hash = email_hash(email, timestamp)
site = Site.objects.get_current()
context = {'timestamp': timestamp, 'email': email, 'hash': hash, 'days': settings.PASSWORD_DAYS, 'site': site}
send_mail(request, email, None, 'IETF Datatracker Password',
'registration/password_email.txt', context, toUser=True)
return render_to_response('registration/challenge_sent.html', context,
context_instance=RequestContext(request))
else:
form = EmailForm()
return render_to_response('registration/password_request.html', {'form': form},
context_instance=RequestContext(request))
def password_return(request):
form = ChallengeForm(request.REQUEST)
if form.is_valid():
email = form.clean_data['email']
method = request.method
try:
# Is there a django user?
user = User.objects.get(email__iexact=email)
try:
usermap = UserMap.objects.get(user=user)
person = usermap.person
except UserMap.DoesNotExist:
person = None
except User.DoesNotExist:
# Is there an IETF person, and a usermap to a django user,
# e.g., the django user table has the wrong email address?
user = None
try:
person = PersonOrOrgInfo.objects.distinct().get(emailaddress__address__iexact=email)
try:
usermap = UserMap.objects.get(person=person)
user = usermap.user
except UserMap.DoesNotExist:
pass
except PersonOrOrgInfo.DoesNotExist:
person = None
if person is None:
# If there's no IETF person, try creating one.
if method == 'POST':
flform = FirstLastForm(request.POST)
if flform.is_valid():
person = PersonOrOrgInfo( first_name=flform.clean_data['first'], last_name=flform.clean_data['last'], created_by='SelfSvc' )
person.save()
person.emailaddress_set.create( type='INET', priority=1, address=email, comment='Created with SelfService' )
# fall through to "if user or person"
# hack:
# pretend to the fall-through form that we used GET.
method = 'GET'
else:
flform = FirstLastForm()
return render_to_response('registration/new_person_form.html', {'form': form, 'flform': flform},
context_instance=RequestContext(request))
if user or person:
# form to get a password, either for reset or new user
if method == 'POST':
pwform = PWForm(request.POST)
if pwform.is_valid():
pw = pwform.clean_data['password']
if user:
set_password(user, pw)
user.save()
return HttpResponseRedirect('changed/')
else:
create_user(None, email, person, pw=pw)
return HttpResponseRedirect('created/')
else:
pwform = PWForm()
return render_to_response('registration/password_form.html', {'u': user, 'person': person, 'form': form, 'pwform': pwform},
context_instance=RequestContext(request))
else:
# We shouldn't get here.
return render_to_response('registration/generic_failure.html', {},
context_instance=RequestContext(request))
else:
log("bad challenge for %s: %s" % (form.data.get('email', '<None>'), form.errors.as_text().replace('\n', ' ').replace(' *', ':')))
return render_to_response('registration/bad_challenge.html', {'form': form, 'days': settings.PASSWORD_DAYS},
context_instance=RequestContext(request))