Django

Code

Show
Ignore:
Timestamp:
07/31/08 15:47:53 (5 months ago)
Author:
lukeplant
Message:

Fixed #7723 - implemented a secure password reset form that uses a token and prompts user for new password.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/contrib/auth/views.py

    r7967 r8162  
    22from django.contrib.auth.decorators import login_required 
    33from django.contrib.auth.forms import AuthenticationForm 
    4 from django.contrib.auth.forms import PasswordResetForm, PasswordChangeForm, AdminPasswordChangeForm 
     4from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm, PasswordChangeForm, AdminPasswordChangeForm 
     5from django.contrib.auth.tokens import default_token_generator 
    56from django.core.exceptions import PermissionDenied 
    67from django.shortcuts import render_to_response, get_object_or_404 
    78from django.contrib.sites.models import Site, RequestSite 
    8 from django.http import HttpResponseRedirect 
     9from django.http import HttpResponseRedirect, Http404 
    910from django.template import RequestContext 
    10 from django.utils.http import urlquote 
     11from django.utils.http import urlquote, base36_to_int 
    1112from django.utils.html import escape 
    1213from django.utils.translation import ugettext as _ 
     
    6667    return HttpResponseRedirect('%s?%s=%s' % (login_url, urlquote(redirect_field_name), urlquote(next))) 
    6768 
     69# 4 views for password reset: 
     70# - password_reset sends the mail 
     71# - password_reset_done shows a success message for the above 
     72# - password_reset_confirm checks the link the user clicked and  
     73#   prompts for a new password 
     74# - password_reset_complete shows a success message for the above 
     75 
    6876def password_reset(request, is_admin_site=False, template_name='registration/password_reset_form.html', 
    6977        email_template_name='registration/password_reset_email.html', 
    70         password_reset_form=PasswordResetForm): 
     78        password_reset_form=PasswordResetForm, token_generator=default_token_generator): 
    7179    if request.method == "POST": 
    7280        form = password_reset_form(request.POST) 
    7381        if form.is_valid(): 
     82            opts = {} 
     83            opts['use_https'] = request.is_secure() 
     84            opts['token_generator'] = token_generator 
    7485            if is_admin_site: 
    75                 form.save(domain_override=request.META['HTTP_HOST']) 
     86                opts['domain_override'] = request.META['HTTP_HOST'] 
    7687            else: 
    77                 if Site._meta.installed: 
    78                     form.save(email_template_name=email_template_name) 
    79                 else: 
    80                     form.save(domain_override=RequestSite(request).domain, email_template_name=email_template_name
     88                opts['email_template_name'] = email_template_name 
     89                if not Site._meta.installed: 
     90                    opts['domain_override'] = RequestSite(request).domain 
     91            form.save(**opts
    8192            return HttpResponseRedirect('%sdone/' % request.path) 
    8293    else: 
     
    8798 
    8899def password_reset_done(request, template_name='registration/password_reset_done.html'): 
     100    return render_to_response(template_name, context_instance=RequestContext(request)) 
     101 
     102def password_reset_confirm(request, uidb36=None, token=None, template_name='registration/password_reset_confirm.html', 
     103                           token_generator=default_token_generator, set_password_form=SetPasswordForm): 
     104    """ 
     105    View that checks the hash in a password reset link and presents a 
     106    form for entering a new password. 
     107    """ 
     108    assert uidb36 is not None and token is not None # checked by URLconf 
     109    try: 
     110        uid_int = base36_to_int(uidb36) 
     111    except ValueError: 
     112        raise Http404 
     113 
     114    user = get_object_or_404(User, id=uid_int) 
     115    context_instance = RequestContext(request) 
     116 
     117    if token_generator.check_token(user, token): 
     118        context_instance['validlink'] = True 
     119        if request.method == 'POST': 
     120            form = set_password_form(user, request.POST) 
     121            if form.is_valid(): 
     122                form.save() 
     123                return HttpResponseRedirect("../done/") 
     124        else: 
     125            form = set_password_form(None) 
     126    else: 
     127        context_instance['validlink'] = False 
     128        form = None 
     129    context_instance['form'] = form     
     130    return render_to_response(template_name, context_instance=context_instance) 
     131 
     132def password_reset_complete(request, template_name='registration/password_reset_complete.html'): 
    89133    return render_to_response(template_name, context_instance=RequestContext(request)) 
    90134