U
    Ha4                     @   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/m0Z0 d dl1m2Z2 e Z3G dd dZ4G dd de4e2Z5G dd de4e0Z6d.ddZ7defddZ8G dd  d Z9G d!d" d"e9e2Z:d#Z;G d$d% d%e9e0Z<G d&d' d'e9e2Z=G d(d) d)e9e0Z>G d*d+ d+e9e2Z?G d,d- d-e9e0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  h| jS N)requestget_hostsuccess_url_allowed_hostsself r&   =/tmp/pip-unpacked-wheel-3jxiddxt/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  ZS )	LoginViewz=
    Display the login form and handle the login action.
    Nzregistration/login.htmlFc                    sH   | j r4| jjjr4|  }|| jjkr,tdt|S t j	|f||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'   r5   3   s    zLoginView.dispatchc                 C   s   |   }|pttjS r    )get_redirect_urlr   r   ZLOGIN_REDIRECT_URL)r%   urlr&   r&   r'   r1   A   s    zLoginView.get_success_urlc                 C   sD   | j j| j| j j| jd}t||  | j  d}|r@|S dS )z6Return the user-originating redirect URL if it's safe. r<   Zallowed_hostsZrequire_https)r!   POSTgetredirect_field_nameGETr   r(   	is_secure)r%   r8   url_is_safer&   r&   r'   r;   E   s    zLoginView.get_redirect_urlc                 C   s   | j p
| jS r    )authentication_form
form_classr$   r&   r&   r'   get_form_classR   s    zLoginView.get_form_classc                    s   t   }| j|d< |S )Nr!   )r4   get_form_kwargsr!   r%   r7   r9   r&   r'   rH   U   s    

zLoginView.get_form_kwargsc                 C   s   t | j|  t|  S )z)Security check complete. Log the user in.)
auth_loginr!   get_userr   r1   r%   formr&   r&   r'   
form_validZ   s    zLoginView.form_validc                    sD   t  jf |}t| j}|| j|  d|d|ji| jp:i  |S )Nsite	site_name)	r4   get_context_datar   r!   updaterA   r;   nameextra_contextr%   r7   contextZcurrent_siter9   r&   r'   rQ   _   s    
   zLoginView.get_context_data)r)   r*   r+   __doc__r   rF   rE   r   rA   template_namer.   rT   r   r   r   r   r5   r1   r;   rG   rH   rN   rQ   __classcell__r&   r&   r9   r'   r-   (   s"   r-   c                       sT   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  ZS )
LogoutViewzH
    Log out the user and display the 'You are logged out' message.
    Nzregistration/logged_out.htmlc                    s0   t | |  }|rt|S t j|f||S r    )auth_logoutget_next_pager   r4   r5   )r%   r!   r6   r7   	next_pager9   r&   r'   r5   t   s
    zLogoutView.dispatchc                 O   s   | j |f||S )zLogout may be done via POST.)r@   )r%   r!   r6   r7   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sJ| j| jjkr| jj| j| jj| j}t	|| 
 | j d}|s| jj}|S )Nr>   )r]   r   r   ZLOGOUT_REDIRECT_URLrA   r!   r?   rB   r@   r   r(   rC   r2   )r%   r]   rD   r&   r&   r'   r\      s(    
zLogoutView.get_next_pagec                    s>   t  jf |}t| j}|||jtdd| jp4i  |S )Nz
Logged out)rO   rP   title)r4   rQ   r   r!   rR   rS   _rT   rU   r9   r&   r'   rQ      s    
zLogoutView.get_context_data)r)   r*   r+   rW   r]   r   rA   rX   rT   r   r   r5   r^   r\   rQ   rY   r&   r&   r9   r'   rZ   k   s   rZ   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.
    )r]   )r   r   	LOGIN_URLrZ   Zas_view)r!   	login_urlr&   r&   r'   logout_then_login   s    rc   c                 C   sR   t |p
tj}tt|}|rFt|d dd}| ||< |jdd|d< tt|S )zM
    Redirect the user to the login page, passing the given 'next' page.
       T)Zmutable/)safe)	r   r   ra   listr   r   	urlencoder   r   )nextrb   rA   Zresolved_urlZlogin_url_partsZquerystringr&   r&   r'   redirect_to_login   s    rj   c                       s    e Zd ZdZ fddZ  ZS )PasswordContextMixinNc                    s,   t  jf |}|d| ji| jp"i  |S )Nr_   )r4   rQ   rR   r_   rT   r%   r7   rV   r9   r&   r'   rQ      s     z%PasswordContextMixin.get_context_data)r)   r*   r+   rT   rQ   rY   r&   r&   r9   r'   rk      s   rk   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  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 r    r4   r5   r%   r6   r7   r9   r&   r'   r5      s    zPasswordResetView.dispatchc              	      sB   | j  | j| j| j| j| j | j| jd}|jf | t	 
|S )N)Z	use_httpstoken_generator
from_emailemail_template_namesubject_template_namer!   html_email_template_nameextra_email_context)r!   rC   rp   rq   rr   rs   rt   ru   saver4   rN   )r%   rM   optsr9   r&   r'   rN      s    
zPasswordResetView.form_valid)r)   r*   r+   rr   ru   r   rF   rq   rt   rs   r   success_urlrX   r`   r_   r   rp   r   r   r5   rN   rY   r&   r&   r9   r'   rm      s   rm   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+   rX   r`   r_   r&   r&   r&   r'   ry      s   ry   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  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| _| |d | _| jd k	r|d }|| jkrz| jjt}| j	
| j|rd| _t j||S n6| j	
| j|r|| jjt< | jj|| j}t|S | |  S )Nuidb64tokenFT)AssertionError	validlinkrK   r/   reset_url_tokenr!   sessionr@   INTERNAL_RESET_SESSION_TOKENrp   Zcheck_tokenr4   r5   r2   replacer   Zrender_to_responserQ   )r%   r6   r7   r|   Zsession_tokenZredirect_urlr9   r&   r'   r5     s    

z!PasswordResetConfirmView.dispatchc                 C   sH   zt | }tjj|d}W n$ ttttjt	fk
rB   d }Y nX |S )N)pk)
r   decode	UserModelZ_default_managerr@   	TypeErrorr3   OverflowErrorZDoesNotExistr   )r%   r{   uidr/   r&   r&   r'   rK     s    
z!PasswordResetConfirmView.get_userc                    s   t   }| j|d< |S Nr/   )r4   rH   r/   rI   r9   r&   r'   rH   '  s    

z(PasswordResetConfirmView.get_form_kwargsc                    s4   |  }| jjt= | jr(t| j|| j t |S r    )	rv   r!   r   r   post_reset_loginrJ   post_reset_login_backendr4   rN   )r%   rM   r/   r9   r&   r'   rN   ,  s
    
z#PasswordResetConfirmView.form_validc                    s8   t  jf |}| jrd|d< n|d tddd |S )NTr~   zPassword reset unsuccessfulF)rM   r_   r~   )r4   rQ   r~   rR   r`   rl   r9   r&   r'   rQ   3  s    
z)PasswordResetConfirmView.get_context_data)r)   r*   r+   r   rF   r   r   r   r   rx   rX   r`   r_   r   rp   r   r   r   r5   rK   rH   rN   rQ   rY   r&   r&   r9   r'   rz      s   	rz   c                       s(   e Zd ZdZedZ fddZ  ZS )PasswordResetCompleteViewz)registration/password_reset_complete.htmlzPassword reset completec                    s    t  jf |}ttj|d< |S )Nrb   )r4   rQ   r   r   ra   rl   r9   r&   r'   rQ   D  s    z*PasswordResetCompleteView.get_context_data)r)   r*   r+   rX   r`   r_   rQ   rY   r&   r&   r9   r'   r   @  s   r   c                       sf   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  ZS )
PasswordChangeViewZpassword_change_donez&registration/password_change_form.htmlzPassword changec                    s   t  j||S r    rn   ro   r9   r&   r'   r5   P  s    zPasswordChangeView.dispatchc                    s   t   }| jj|d< |S r   )r4   rH   r!   r/   rI   r9   r&   r'   rH   V  s    
z"PasswordChangeView.get_form_kwargsc                    s"   |   t| j|j t |S r    )rv   r	   r!   r/   r4   rN   rL   r9   r&   r'   rN   [  s    zPasswordChangeView.form_valid)r)   r*   r+   r   rF   r   rx   rX   r`   r_   r   r   r   r
   r5   rH   rN   rY   r&   r&   r9   r'   r   J  s   r   c                       s0   e Zd ZdZedZee fddZ  Z	S )PasswordChangeDoneViewz&registration/password_change_done.htmlzPassword change successfulc                    s   t  j||S r    rn   ro   r9   r&   r'   r5   g  s    zPasswordChangeDoneView.dispatch)
r)   r*   r+   rX   r`   r_   r   r
   r5   rY   r&   r&   r9   r'   r   c  s   r   )N)Aurllib.parser   r   Zdjango.confr   Zdjango.contrib.authr   r   r   rJ   r   r[   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-   rZ   rc   rj   rk   rm   r   ry   rz   r   r   r   r&   r&   r&   r'   <module>   s@   C;
I
