o
    —¨Êhn8  ã                   @   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'   úK/var/www/html/env/lib/python3.10/site-packages/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.)ÚurlÚallowed_hostsÚrequire_httpsÚ )ÚrequestÚPOSTÚgetÚredirect_field_nameÚGETr   Úget_success_url_allowed_hostsÚ	is_secure)r&   Úredirect_toÚ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(   r3   9   s   z.RedirectURLMixin.get_success_url_allowed_hostsc                 C   s   | j rt| j ƒS tdƒ‚)ú Return the default redirect URL.z+No URL to redirect to. Provide a next_page.)Ú	next_pager   r   r%   r'   r'   r(   r$   <   s   
z)RedirectURLMixin.get_default_redirect_url)Ú__name__Ú
__module__Ú__qualname__r:   r   r1   Úsetr8   r)   r#   r3   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                    sN   | j r| jjjr|  ¡ }|| jjkrtdƒ‚t|ƒS tƒ j	|g|¢R i |¤Ž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Úkwargsr5   ©Ú	__class__r'   r(   rF   N   s   ÿzLoginView.dispatchc                 C   s   | j rt| j ƒS ttjƒS ©r9   )r:   r   r   Ú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                    ó   t ƒ  ¡ }| j|d< |S )Nr.   )rE   Úget_form_kwargsr.   ©r&   rI   rJ   r'   r(   rR   f   ó   

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                    sH   t ƒ jdi |¤Ž}t| jƒ}| | j|  ¡ d|d|ji| jpi ¥¡ |S )NÚsiteÚ	site_namer'   )	rE   Úget_context_datar   r.   Úupdater1   r#   ÚnameÚextra_context©r&   rI   ÚcontextÚcurrent_siterJ   r'   r(   r\   p   s   

ýüÿzLoginView.get_context_data)r;   r<   r=   Ú__doc__r   rO   rN   Útemplate_namer@   r_   r   r   r   r   rF   r$   rP   rR   rY   r\   Ú__classcell__r'   r'   rJ   r(   r?   C   s     r?   c                       sd   e Zd ZdZg d¢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.
    )r0   ÚheadÚpostÚoptionszregistration/logged_out.htmlNc                    s4   |j  ¡ dkrt dt¡ tƒ j|g|¢R i |¤ŽS )Nr0   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   rE   rF   )r&   r.   rH   rI   rJ   r'   r(   rF   ‹   s   ýzLogoutView.dispatchc                    s>   t |ƒ |  ¡ }|| ¡ krt|ƒS tƒ j|g|¢R i |¤ŽS )zLogout may be done via POST.)Úauth_logoutr)   Úget_full_pathr   rE   r0   rG   rJ   r'   r(   rh   •   s
   zLogoutView.postc                 C   s(   | j rt| j ƒS tjrttjƒS | jjS rL   )r:   r   r   ÚLOGOUT_REDIRECT_URLr.   rC   r%   r'   r'   r(   r$   ¢   s
   

z#LogoutView.get_default_redirect_urlc                    sD   t ƒ jdi |¤Ž}t| jƒ}| ||jtdƒd dœ| jpi ¥¡ |S )Nz
Logged out)rZ   r[   ÚtitleÚsubtitler'   )rE   r\   r   r.   r]   r^   Ú_r_   r`   rJ   r'   r(   r\   «   s   
üûÿ	zLogoutView.get_context_data)r;   r<   r=   rc   Úhttp_method_namesrd   r_   r   r   rF   r   rh   r0   r$   r\   re   r'   r'   rJ   r(   rf   ~   s    	
	rf   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.
    )r:   )r   r   Ú	LOGIN_URLrf   Úas_view)r.   Ú	login_urlr'   r'   r(   Úlogout_then_loginº   s   rx   c                 C   sR   t |ptjƒ}tt|ƒƒ}|r#t|d dd�}| ||< |jdd�|d< tt|ƒƒS )zM
    Redirect the user to the login page, passing the given 'next' page.
    é   T)Úmutableú/)Úsafe)	r   r   ru   Úlistr   r   Ú	urlencoder   r   )Únextrw   r1   Úresolved_urlÚlogin_url_partsÚquerystringr'   r'   r(   Úredirect_to_loginÂ   s   rƒ   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚPasswordContextMixinNc                    s2   t ƒ jdi |¤Ž}| | jd dœ| jpi ¥¡ |S )N)rq   rr   r'   )rE   r\   r]   rq   r_   ©r&   rI   ra   rJ   r'   r(   r\   Ü   s
   ÿz%PasswordContextMixin.get_context_data)r;   r<   r=   r_   r\   re   r'   r'   rJ   r(   r„   Ù   s    r„   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.txtÚpassword_reset_donez%registration/password_reset_form.htmlzPassword resetc                    ó   t ƒ j|i |¤ŽS r"   ©rE   rF   ©r&   rH   rI   rJ   r'   r(   rF   ð   ó   zPasswordResetView.dispatchc              	      sF   | j  ¡ | j| j| j| j| j | j| jdœ}|jdi |¤Ž t	ƒ  
|¡S )N)Ú	use_httpsÚtoken_generatorÚ
from_emailÚemail_template_nameÚsubject_template_namer.   Úhtml_email_template_nameÚextra_email_contextr'   )r.   r4   r�   rŽ   r�   r�   r‘   r’   ÚsaverE   rY   )r&   rX   ÚoptsrJ   r'   r(   rY   ô   s   ø
zPasswordResetView.form_valid)r;   r<   r=   r�   r’   r   rO   rŽ   r‘   r�   r   Úsuccess_urlrd   rs   rq   r   r�   r   r   rF   rY   re   r'   r'   rJ   r(   r†   ä   s    r†   Ú_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=   rd   rs   rq   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-passwordÚpassword_reset_completez(registration/password_reset_confirm.htmlzEnter new passwordc                    sÆ   d|vsd|vrt dƒ‚d| _|  |d ¡| _| jd ur\|d }|| jkrA| jj t¡}| j	 
| j|¡r@d| _tƒ j|i |¤ŽS n| 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   Ú	validlinkrV   rA   Úreset_url_tokenr.   Úsessionr0   ÚINTERNAL_RESET_SESSION_TOKENr�   Úcheck_tokenrE   rF   rC   Úreplacer   Úrender_to_responser\   )r&   rH   rI   r›   Úsession_tokenÚredirect_urlrJ   r'   r(   rF     s*   ÿ

ýÿz!PasswordResetConfirmView.dispatchc                 C   sF   zt |ƒ ¡ }tjj|d�}W |S  ttttjt	fy"   d }Y |S w )N)Úpk)
r   ÚdecodeÚ	UserModelÚ_default_managerr0   Ú	TypeErrorrD   ÚOverflowErrorÚDoesNotExistr   )r&   rš   ÚuidrA   r'   r'   r(   rV   7  s   	ø
ûøz!PasswordResetConfirmView.get_userc                    rQ   ©NrA   )rE   rR   rA   rS   rJ   r'   r(   rR   F  rT   z(PasswordResetConfirmView.get_form_kwargsc                    s4   |  ¡ }| jjt= | jrt| j|| jƒ tƒ  |¡S r"   )	r“   r.   rž   rŸ   Úpost_reset_loginrU   Úpost_reset_login_backendrE   rY   )r&   rX   rA   rJ   r'   r(   rY   K  s
   
z#PasswordResetConfirmView.form_validc                    s>   t ƒ jdi |¤Ž}| jrd|d< |S | d tdƒddœ¡ |S )NTrœ   zPassword reset unsuccessfulF)rX   rq   rœ   r'   )rE   r\   rœ   r]   rs   r…   rJ   r'   r(   r\   R  s   	ùýÿz)PasswordResetConfirmView.get_context_data)r;   r<   r=   r   rO   r®   r¯   r�   r   r•   rd   rs   rq   r   r�   r   r   r   rF   rV   rR   rY   r\   re   r'   r'   rJ   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di |¤Ž}ttjƒ|d< |S )Nrw   r'   )rE   r\   r   r   ru   r…   rJ   r'   r(   r\   e  s   z*PasswordResetCompleteView.get_context_data)r;   r<   r=   rd   rs   rq   r\   re   r'   r'   rJ   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 )
ÚPasswordChangeViewÚpassword_change_donez&registration/password_change_form.htmlzPassword changec                    rˆ   r"   r‰   rŠ   rJ   r'   r(   rF   q  s   zPasswordChangeView.dispatchc                    s   t ƒ  ¡ }| jj|d< |S r­   )rE   rR   r.   rA   rS   rJ   r'   r(   rR   w  s   
z"PasswordChangeView.get_form_kwargsc                    s"   |  ¡  t| j|jƒ tƒ  |¡S r"   )r“   r	   r.   rA   rE   rY   rW   rJ   r'   r(   rY   |  s   zPasswordChangeView.form_valid)r;   r<   r=   r   rO   r   r•   rd   rs   rq   r   r   r   r
   rF   rR   rY   re   r'   r'   rJ   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                    rˆ   r"   r‰   rŠ   rJ   r'   r(   rF   ˆ  r‹   zPasswordChangeDoneView.dispatch)
r;   r<   r=   rd   rs   rq   r   r
   rF   re   r'   r'   rJ   r(   r³   „  s
    r³   r"   )Erl   Úurllib.parser   r   Údjango.confr   Údjango.contrib.authr   r   r   rU   r   rn   r	   Údjango.contrib.auth.decoratorsr
   Údjango.contrib.auth.formsr   r   r   r   Údjango.contrib.auth.tokensr   Údjango.contrib.sites.shortcutsr   Údjango.core.exceptionsr   r   Údjango.httpr   r   Údjango.shortcutsr   Údjango.urlsr   Údjango.utils.decoratorsr   Údjango.utils.deprecationr   Údjango.utils.httpr   r   Údjango.utils.translationr   rs   Údjango.views.decorators.cacher   Údjango.views.decorators.csrfr   Údjango.views.decorators.debugr   Údjango.views.generic.baser   Údjango.views.generic.editr    r§   r!   r?   rf   rx   rƒ   r„   r†   rŸ   r—   r˜   r°   r±   r³   r'   r'   r'   r(   Ú<module>   sL    ;
<V
