
v^4                 @   s  d  d l  m Z m Z d  d l m Z d  d l m Z m Z m Z	 m
 Z m Z d  d l m Z d  d l m Z m Z m Z m Z d  d l m Z d  d l m Z d  d l m Z d  d	 l m Z m Z d  d
 l m Z d  d l m  Z  d  d l! m" Z" d  d l# m$ Z$ m% Z% d  d l& m' Z( d  d l) m* Z* d  d l+ m, Z, d  d l- m. Z. d  d l/ m0 Z0 d  d l1 m2 Z2 e   Z3 Gd d   d  Z4 Gd d   d e4 e2  Z5 Gd d   d e4 e0  Z6 d d d  Z7 d e d d  Z8 Gd d    d   Z9 Gd! d"   d" e9 e2  Z: d# Z; Gd$ d%   d% e9 e0  Z< Gd& d'   d' e9 e2  Z= Gd( d)   d) e9 e0  Z> Gd* d+   d+ e9 e2  Z? Gd, d-   d- e9 e0  Z@ d S).    )urlparse
urlunparse)settings)REDIRECT_FIELD_NAMEget_user_modelloginlogoutupdate_session_auth_hash)login_required)AuthenticationFormPasswordChangeFormPasswordResetFormSetPasswordForm)default_token_generator)get_current_site)ValidationError)HttpResponseRedirect	QueryDict)resolve_url)reverse_lazy)method_decorator)url_has_allowed_host_and_schemeurlsafe_base64_decode)gettext_lazy)never_cache)csrf_protect)sensitive_post_parameters)TemplateView)FormViewc               @   s%   e  Z d  Z e   Z d d   Z d S)SuccessURLAllowedHostsMixinc             C   s   |  j  j   h |  j  S)N)requestget_hostsuccess_url_allowed_hosts)self r$   ;/tmp/pip-build-8lau8j11/django/django/contrib/auth/views.pyget_success_url_allowed_hosts$   s    z9SuccessURLAllowedHostsMixin.get_success_url_allowed_hostsN)__name__
__module____qualname__setr"   r&   r$   r$   r$   r%   r   !   s   	r   c                   s   e  Z d  Z d Z e Z d Z e Z d Z	 d Z
 d Z e e    e e  e e    f d d      Z d d   Z d	 d
   Z d d   Z   f d d   Z d d   Z   f d d   Z   S)	LoginViewz=
    Display the login form and handle the login action.
    Nzregistration/login.htmlFc                sb   |  j  rL |  j j j rL |  j   } | |  j j k rB t d   t |  St   j	 | | |  S)NzsRedirection loop for authenticated user detected. Check that your LOGIN_REDIRECT_URL doesn't point to a login page.)
redirect_authenticated_userr    useris_authenticatedget_success_urlpath
ValueErrorr   superdispatch)r#   r    argskwargsredirect_to)	__class__r$   r%   r3   3   s    	
zLoginView.dispatchc             C   s   |  j    } | p t t j  S)N)get_redirect_urlr   r   ZLOGIN_REDIRECT_URL)r#   urlr$   r$   r%   r/   A   s    zLoginView.get_success_urlc             C   sh   |  j  j j |  j |  j  j j |  j d   } t d | d |  j   d |  j  j    } | rd | Sd S)z6Return the user-originating redirect URL if it's safe. r9   allowed_hostsrequire_https)r    POSTgetredirect_field_nameGETr   r&   	is_secure)r#   r6   url_is_safer$   r$   r%   r8   E   s    zLoginView.get_redirect_urlc             C   s   |  j  p |  j S)N)authentication_form
form_class)r#   r$   r$   r%   get_form_classR   s    zLoginView.get_form_classc                s    t    j   } |  j | d <| S)Nr    )r2   get_form_kwargsr    )r#   r5   )r7   r$   r%   rF   U   s    zLoginView.get_form_kwargsc             C   s&   t  |  j | j    t |  j    S)z)Security check complete. Log the user in.)
auth_loginr    get_userr   r/   )r#   formr$   r$   r%   
form_validZ   s    zLoginView.form_validc                s_   t    j |   } t |  j  } | j |  j |  j   d | d | j i |  j pT i    | S)Nsite	site_name)	r2   get_context_datar   r    updater?   r8   nameextra_context)r#   r5   contextcurrent_site)r7   r$   r%   rM   _   s    zLoginView.get_context_data)r'   r(   r)   __doc__r   rD   rC   r   r?   template_namer,   rP   r   r   r   r   r3   r/   r8   rE   rF   rJ   rM   r$   r$   )r7   r%   r+   (   s    	$r+   c                   sv   e  Z d  Z d Z d Z e Z d Z d Z e	 e
    f d d    Z d d   Z d d	   Z   f d
 d   Z   S)
LogoutViewzH
    Log out the user and display the 'You are logged out' message.
    Nzregistration/logged_out.htmlc                s<   t  |  |  j   } | r& t |  St   j | | |  S)N)auth_logoutget_next_pager   r2   r3   )r#   r    r4   r5   	next_page)r7   r$   r%   r3   t   s
    

zLogoutView.dispatchc             O   s   |  j  | | |  S)zLogout may be done via POST.)r>   )r#   r    r4   r5   r$   r$   r%   post}   s    zLogoutView.postc             C   s   |  j  d  k	 r! t |  j   } n$ t j r< t t j  } n	 |  j  } |  j |  j j k so |  j |  j j k r |  j j j |  j |  j j j |  j   } t	 d | d |  j
   d |  j j    } | s |  j j } | S)Nr9   r;   r<   )rX   r   r   ZLOGOUT_REDIRECT_URLr?   r    r=   r@   r>   r   r&   rA   r0   )r#   rX   rB   r$   r$   r%   rW      s"    		zLogoutView.get_next_pagec                s\   t    j |   } t |  j  } | j d | d | j d t d  i |  j pQ i    | S)NrK   rL   titlez
Logged out)r2   rM   r   r    rN   rO   _rP   )r#   r5   rQ   rR   )r7   r$   r%   rM      s    	zLogoutView.get_context_data)r'   r(   r)   rS   rX   r   r?   rT   rP   r   r   r3   rY   rW   rM   r$   r$   )r7   r%   rU   k   s   	rU   Nc             C   s+   t  | p t j  } t j d |  |   S)zR
    Log out the user if they are logged in. Then redirect to the login page.
    rX   )r   r   	LOGIN_URLrU   Zas_view)r    	login_urlr$   r$   r%   logout_then_login   s    r^   c             C   ss   t  | p t j  } t t |   } | rc t | d d d } |  | | <| j d d  | d <t t |   S)zM
    Redirect the user to the login page, passing the given 'next' page.
       ZmutableTsafe/)	r   r   r\   listr   r   	urlencoder   r   )nextr]   r?   Zresolved_urlZlogin_url_partsZquerystringr$   r$   r%   redirect_to_login   s    
re   c                   s(   e  Z d  Z d Z   f d d   Z   S)PasswordContextMixinNc                s;   t    j |   } | j d |  j i |  j p0 i    | S)NrZ   )r2   rM   rN   rZ   rP   )r#   r5   rQ   )r7   r$   r%   rM      s
    z%PasswordContextMixin.get_context_data)r'   r(   r)   rP   rM   r$   r$   )r7   r%   rf      s   rf   c                   s   e  Z d  Z d Z d Z e Z d Z d Z d Z	 e
 d  Z d Z e d  Z e Z e e    f d d    Z   f d	 d
   Z   S)PasswordResetViewz&registration/password_reset_email.htmlNz'registration/password_reset_subject.txtZpassword_reset_donez%registration/password_reset_form.htmlzPassword resetc                s   t    j | |   S)N)r2   r3   )r#   r4   r5   )r7   r$   r%   r3      s    zPasswordResetView.dispatchc                sq   d |  j  j   d |  j d |  j d |  j d |  j d |  j  d |  j d |  j i } | j |   t	   j
 |  S)	NZ	use_httpstoken_generator
from_emailemail_template_namesubject_template_namer    html_email_template_nameextra_email_context)r    rA   rh   ri   rj   rk   rl   rm   saver2   rJ   )r#   rI   opts)r7   r$   r%   rJ      s    						zPasswordResetView.form_valid)r'   r(   r)   rj   rm   r   rD   ri   rl   rk   r   success_urlrT   r[   rZ   r   rh   r   r   r3   rJ   r$   r$   )r7   r%   rg      s   rg   Z_password_reset_tokenc               @   s"   e  Z d  Z d Z e d  Z d S)PasswordResetDoneViewz%registration/password_reset_done.htmlzPassword reset sentN)r'   r(   r)   rT   r[   rZ   r$   r$   r$   r%   rq      s   rq   c                   s   e  Z d  Z e Z d Z d Z d Z e d  Z	 d Z
 e d  Z e Z e e    e e    f d d     Z d	 d
   Z   f d d   Z   f d d   Z   f d d   Z   S)PasswordResetConfirmViewFNzset-passwordZpassword_reset_completez(registration/password_reset_confirm.htmlzEnter new passwordc                s  d | k r d | k s t   d |  _ |  j | d  |  _ |  j d  k	 r | d } | |  j k r |  j j j t  } |  j	 j
 |  j |  r d |  _ t   j | |   SnM |  j	 j
 |  j |  r | |  j j t <|  j j j | |  j  } t |  S|  j |  j    S)Nuidb64tokenFT)AssertionError	validlinkrH   r-   reset_url_tokenr    sessionr>   INTERNAL_RESET_SESSION_TOKENrh   Zcheck_tokenr2   r3   r0   replacer   Zrender_to_responserM   )r#   r4   r5   rt   Zsession_tokenZredirect_url)r7   r$   r%   r3     s    	
	
z!PasswordResetConfirmView.dispatchc             C   s\   y+ t  |  j   } t j j d |  } Wn* t t t t j t	 f k
 rW d  } Yn X| S)Npk)
r   decode	UserModelZ_default_managerr>   	TypeErrorr1   OverflowErrorZDoesNotExistr   )r#   rs   uidr-   r$   r$   r%   rH     s    z!PasswordResetConfirmView.get_userc                s    t    j   } |  j | d <| S)Nr-   )r2   rF   r-   )r#   r5   )r7   r$   r%   rF   '  s    z(PasswordResetConfirmView.get_form_kwargsc                sH   | j    } |  j j t =|  j r8 t |  j | |  j  t   j |  S)N)	rn   r    rx   ry   post_reset_loginrG   post_reset_login_backendr2   rJ   )r#   rI   r-   )r7   r$   r%   rJ   ,  s
    	z#PasswordResetConfirmView.form_validc                sQ   t    j |   } |  j r( d | d <n% | j d d  d t d  d d i  | S)NTrv   rI   rZ   zPassword reset unsuccessfulF)r2   rM   rv   rN   r[   )r#   r5   rQ   )r7   r$   r%   rM   3  s    	z)PasswordResetConfirmView.get_context_data)r'   r(   r)   r   rD   r   r   rw   r   rp   rT   r[   rZ   r   rh   r   r   r   r3   rH   rF   rJ   rM   r$   r$   )r7   r%   rr      s   !	rr   c                   s4   e  Z d  Z d Z e d  Z   f d d   Z   S)PasswordResetCompleteViewz)registration/password_reset_complete.htmlzPassword reset completec                s)   t    j |   } t t j  | d <| S)Nr]   )r2   rM   r   r   r\   )r#   r5   rQ   )r7   r$   r%   rM   D  s    z*PasswordResetCompleteView.get_context_data)r'   r(   r)   rT   r[   rZ   rM   r$   r$   )r7   r%   r   @  s   r   c                   s   e  Z d  Z e Z e d  Z d Z e d  Z	 e
 e    e
 e  e
 e    f d d      Z   f d d   Z   f d d	   Z   S)
PasswordChangeViewZpassword_change_donez&registration/password_change_form.htmlzPassword changec                s   t    j | |   S)N)r2   r3   )r#   r4   r5   )r7   r$   r%   r3   P  s    zPasswordChangeView.dispatchc                s#   t    j   } |  j j | d <| S)Nr-   )r2   rF   r    r-   )r#   r5   )r7   r$   r%   rF   V  s    z"PasswordChangeView.get_form_kwargsc                s-   | j    t |  j | j  t   j |  S)N)rn   r	   r    r-   r2   rJ   )r#   rI   )r7   r$   r%   rJ   [  s    
zPasswordChangeView.form_valid)r'   r(   r)   r   rD   r   rp   rT   r[   rZ   r   r   r   r
   r3   rF   rJ   r$   r$   )r7   r%   r   J  s   	$r   c                   s@   e  Z d  Z d Z e d  Z e e    f d d    Z   S)PasswordChangeDoneViewz&registration/password_change_done.htmlzPassword change successfulc                s   t    j | |   S)N)r2   r3   )r#   r4   r5   )r7   r$   r%   r3   g  s    zPasswordChangeDoneView.dispatch)	r'   r(   r)   rT   r[   rZ   r   r
   r3   r$   r$   )r7   r%   r   c  s   r   )Aurllib.parser   r   Zdjango.confr   Zdjango.contrib.authr   r   r   rG   r   rV   r	   Zdjango.contrib.auth.decoratorsr
   Zdjango.contrib.auth.formsr   r   r   r   Zdjango.contrib.auth.tokensr   Zdjango.contrib.sites.shortcutsr   Zdjango.core.exceptionsr   Zdjango.httpr   r   Zdjango.shortcutsr   Zdjango.urlsr   Zdjango.utils.decoratorsr   Zdjango.utils.httpr   r   Zdjango.utils.translationr   r[   Zdjango.views.decorators.cacher   Zdjango.views.decorators.csrfr   Zdjango.views.decorators.debugr   Zdjango.views.generic.baser   Zdjango.views.generic.editr   r}   r   r+   rU   r^   re   rf   rg   ry   rq   rr   r   r   r   r$   r$   r$   r%   <module>   s@   ("	C;I
