U
    [+dn8                     @   s  d dl Z d dlmZ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mZmZmZmZ d d
lmZ d dlmZ d dlmZ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'm(Z(m)Z) d dl*m+Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 e Z7G dd dZ8G dd de8e6Z9G dd de8e4Z:d2dd Z;defd!d"Z<G d#d$ d$Z=G d%d& d&e=e6Z>d'Z?G d(d) d)e=e4Z@G d*d+ d+e=e6ZAG d,d- d-e=e4ZBG d.d/ d/e=e6ZCG d0d1 d1e=e4ZDdS )3    N)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)ImproperlyConfiguredValidationError)HttpResponseRedirect	QueryDict)resolve_url)reverse_lazy)method_decorator)RemovedInDjango50Warning)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dZeZe Zdd Zdd Z	dd Z
dd	 ZdS )
RedirectURLMixinNc                 C   s   |   p|  S N)get_redirect_urlget_default_redirect_urlself r'   =/tmp/pip-unpacked-wheel-n7e__lmp/django/contrib/auth/views.pyget_success_url*   s    z RedirectURLMixin.get_success_urlc                 C   sB   | j j| j| j j| j}t||  | j  d}|r>|S dS )z6Return the user-originating redirect URL if it's safe.)urlZallowed_hostsZrequire_https )requestPOSTgetredirect_field_nameGETr   get_success_url_allowed_hosts	is_secure)r&   redirect_toZurl_is_safer'   r'   r(   r#   -   s     z!RedirectURLMixin.get_redirect_urlc                 C   s   | j  h| jS r"   )r,   get_hostsuccess_url_allowed_hostsr%   r'   r'   r(   r1   9   s    z.RedirectURLMixin.get_success_url_allowed_hostsc                 C   s   | j rt| j S tddS ) Return the default redirect URL.z+No URL to redirect to. Provide a next_page.N)	next_pager   r   r%   r'   r'   r(   r$   <   s    
z)RedirectURLMixin.get_default_redirect_url)__name__
__module____qualname__r7   r   r/   setr5   r)   r#   r1   r$   r'   r'   r'   r(   r!   %   s   r!   c                       s~   e Zd ZdZeZdZdZdZdZ	e
e e
ee
e f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_authenticatedr)   path
ValueErrorr   superdispatchr&   r,   argskwargsr3   	__class__r'   r(   rC   N   s    zLoginView.dispatchc                 C   s   | j rt| j S ttjS dS r6   N)r7   r   r   ZLOGIN_REDIRECT_URLr%   r'   r'   r(   r$   \   s    
z"LoginView.get_default_redirect_urlc                 C   s   | j p
| jS r"   )authentication_form
form_classr%   r'   r'   r(   get_form_classc   s    zLoginView.get_form_classc                    s   t   }| j|d< |S )Nr,   )rB   get_form_kwargsr,   r&   rF   rG   r'   r(   rM   f   s    

zLoginView.get_form_kwargsc                 C   s   t | j|  t|  S )z)Security check complete. Log the user in.)
auth_loginr,   get_userr   r)   r&   formr'   r'   r(   
form_validk   s    zLoginView.form_validc                    sD   t  jf |}t| j}|| j|  d|d|ji| jp:i  |S )Nsite	site_name)	rB   get_context_datar   r,   updater/   r#   nameextra_contextr&   rF   contextZcurrent_siterG   r'   r(   rV   p   s    
   zLoginView.get_context_data)r8   r9   r:   __doc__r   rK   rJ   template_namer=   rY   r   r   r   r   rC   r$   rL   rM   rS   rV   __classcell__r'   r'   rG   r(   r<   C   s   r<   c                       sh   e Zd ZdZddddgZdZdZee fdd	Z	ee
 fd
dZeZdd Z fddZ  ZS )
LogoutViewzH
    Log out the user and display the 'You are logged out' message.
    r.   headpostoptionszregistration/logged_out.htmlNc                    s.   |j  dkrtdt t j|f||S )Nr.   zlLog out via GET requests is deprecated and will be removed in Django 5.0. Use POST requests for logging out.)methodlowerwarningswarnr   rB   rC   )r&   r,   rE   rF   rG   r'   r(   rC      s    zLogoutView.dispatchc                    s8   t | |  }|| kr$t|S t j|f||S )zLogout may be done via POST.)auth_logoutr)   Zget_full_pathr   rB   r.   rD   rG   r'   r(   ra      s
    zLogoutView.postc                 C   s,   | j rt| j S tjr ttjS | jjS dS rI   )r7   r   r   ZLOGOUT_REDIRECT_URLr,   r@   r%   r'   r'   r(   r$      s
    

z#LogoutView.get_default_redirect_urlc                    s@   t  jf |}t| j}|||jtdd d| jp6i  |S )Nz
Logged out)rT   rU   titlesubtitle)rB   rV   r   r,   rW   rX   _rY   rZ   rG   r'   r(   rV      s    
	zLogoutView.get_context_data)r8   r9   r:   r\   Zhttp_method_namesr]   rY   r   r   rC   r   ra   r.   r$   rV   r^   r'   r'   rG   r(   r_   ~   s   	
	r_   c                 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.
    )r7   )r   r   	LOGIN_URLr_   Zas_view)r,   	login_urlr'   r'   r(   logout_then_login   s    rm   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   rk   listr   r   	urlencoder   r   )nextrl   r/   Zresolved_urlZlogin_url_partsZquerystringr'   r'   r(   redirect_to_login   s    rt   c                       s    e Zd ZdZ fddZ  ZS )PasswordContextMixinNc                    s.   t  jf |}|| jd d| jp$i  |S )N)rh   ri   )rB   rV   rW   rh   rY   r&   rF   r[   rG   r'   r(   rV      s
    z%PasswordContextMixin.get_context_data)r8   r9   r:   rY   rV   r^   r'   r'   rG   r(   ru      s   ru   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"   rB   rC   r&   rE   rF   rG   r'   r(   rC      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,   r2   rz   r{   r|   r}   r~   r   saverB   rS   )r&   rR   optsrG   r'   r(   rS      s    
zPasswordResetView.form_valid)r8   r9   r:   r|   r   r   rK   r{   r~   r}   r   success_urlr]   rj   rh   r   rz   r   r   rC   rS   r^   r'   r'   rG   r(   rw      s   rw   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)r8   r9   r:   r]   rj   rh   r'   r'   r'   r(   r     s   r   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sd|krt dd| _| |d | _| jd k	r|d }|| jkr~| jjt}| j	
| j|rd| _t j||S n6| j	
| j|r|| jjt< | jj|| j}t|S | |  S )Nuidb64tokenz:The URL path must contain 'uidb64' and 'token' parameters.FT)r   	validlinkrP   r>   reset_url_tokenr,   sessionr.   INTERNAL_RESET_SESSION_TOKENrz   Zcheck_tokenrB   rC   r@   replacer   Zrender_to_responserV   )r&   rE   rF   r   Zsession_tokenZredirect_urlrG   r'   r(   rC     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.   	TypeErrorrA   OverflowErrorZDoesNotExistr   )r&   r   uidr>   r'   r'   r(   rP   7  s    
z!PasswordResetConfirmView.get_userc                    s   t   }| j|d< |S Nr>   )rB   rM   r>   rN   rG   r'   r(   rM   F  s    

z(PasswordResetConfirmView.get_form_kwargsc                    s4   |  }| jjt= | jr(t| j|| j t |S r"   )	r   r,   r   r   post_reset_loginrO   post_reset_login_backendrB   rS   )r&   rR   r>   rG   r'   r(   rS   K  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)rR   rh   r   )rB   rV   r   rW   rj   rv   rG   r'   r(   rV   R  s    
z)PasswordResetConfirmView.get_context_data)r8   r9   r:   r   rK   r   r   r   r   r   r]   rj   rh   r   rz   r   r   r   rC   rP   rM   rS   rV   r^   r'   r'   rG   r(   r     s    r   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 )Nrl   )rB   rV   r   r   rk   rv   rG   r'   r(   rV   e  s    z*PasswordResetCompleteView.get_context_data)r8   r9   r:   r]   rj   rh   rV   r^   r'   r'   rG   r(   r   a  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"   rx   ry   rG   r'   r(   rC   q  s    zPasswordChangeView.dispatchc                    s   t   }| jj|d< |S r   )rB   rM   r,   r>   rN   rG   r'   r(   rM   w  s    
z"PasswordChangeView.get_form_kwargsc                    s"   |   t| j|j t |S r"   )r   r	   r,   r>   rB   rS   rQ   rG   r'   r(   rS   |  s    zPasswordChangeView.form_valid)r8   r9   r:   r   rK   r   r   r]   rj   rh   r   r   r   r
   rC   rM   rS   r^   r'   r'   rG   r(   r   k  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"   rx   ry   rG   r'   r(   rC     s    zPasswordChangeDoneView.dispatch)
r8   r9   r:   r]   rj   rh   r   r
   rC   r^   r'   r'   rG   r(   r     s   r   )N)Ere   urllib.parser   r   Zdjango.confr   Zdjango.contrib.authr   r   r   rO   r   rg   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   r   Zdjango.httpr   r   Zdjango.shortcutsr   Zdjango.urlsr   Zdjango.utils.decoratorsr   Zdjango.utils.deprecationr   Zdjango.utils.httpr   r   Zdjango.utils.translationr   rj   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<   r_   rm   rt   ru   rw   r   r   r   r   r   r   r'   r'   r'   r(   <module>   sJ   ;<
V
