
    `fD                     j   d dl Z d dlmZ d dlmZ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 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 d dlmZ  e            Z d Z! G d dej"                  Z# G d dej$                  Z% G d dej&                  Z' G d dej(                  Z) G d de)          Z* G d dej(                  Z+ G d dej,                  Z- G d d ej,                  Z. G d! d"ej,                  Z/ G d# d$e/          Z0 G d% d&ej,                  Z1dS )'    N)forms)authenticateget_user_modelpassword_validation)UNUSABLE_PASSWORD_PREFIXidentify_hasher)User)default_token_generator)get_current_site)ValidationError)EmailMultiAlternatives)loader)force_bytes)urlsafe_base64_encode)capfirst)gettext)gettext_lazyc                     t          j        d|                                           t          j        d|                                          k    S )z
    Perform case-insensitive comparison of two identifiers, using the
    recommended algorithm from Unicode Technical Report 36, section
    2.11.2(B)(2).
    NFKC)unicodedata	normalizecasefold)s1s2s     K/var/www/html/env/lib/python3.11/site-packages/django/contrib/auth/forms.py_unicode_ci_comparer      sF     	fb))2244 ,,5577	8    c                   ,     e Zd ZdZdZ fdZd Z xZS )ReadOnlyPasswordHashWidgetz)auth/widgets/read_only_password_hash.htmlTc                    t                                          |||          }g }|r|                    t                    r%|                    dt          d          i           n	 t          |          }|                    |                                          D ]*\  }}|                    t          |          |d           +n4# t          $ r' |                    dt          d          i           Y nw xY w||d<   |S )NlabelzNo password set.)r!   valuez5Invalid password format or unknown hashing algorithm.summary)
superget_context
startswithr   appendr   r   safe_summaryitems
ValueError)
selfnamer"   attrscontextr#   hasherkeyvalue_	__class__s
            r   r%   z&ReadOnlyPasswordHashWidget.get_context%   s8   ''%%dE599 	M(()ABB 	MNNGW-?%@%@ABBBBM(// $*#6#6u#=#=#C#C#E#E M MKCNNWS\\F#K#KLLLLM    S" "     %	s   )C .C<;C<c                     d S N )r+   id_s     r   id_for_labelz'ReadOnlyPasswordHashWidget.id_for_label;   s    tr   )__name__
__module____qualname__template_name	read_onlyr%   r7   __classcell__r2   s   @r   r   r   !   sQ        ?MI    ,      r   r   c                   "     e Zd ZeZ fdZ xZS )ReadOnlyPasswordHashFieldc                     |                     dd           |                     dd            t                      j        |i | d S )NrequiredFdisabledT)
setdefaultr$   __init__r+   argskwargsr2   s      r   rE   z"ReadOnlyPasswordHashField.__init__B   sQ    *e,,,*d+++$)&)))))r   )r8   r9   r:   r   widgetrE   r=   r>   s   @r   r@   r@   ?   s=        'F* * * * * * * * *r   r@   c                   (     e Zd Z fdZ fdZ xZS )UsernameFieldc                     t                                          |          }| j        t          |          | j        k    r|S t	          j        d|          S )Nr   )r$   	to_python
max_lengthlenr   r   )r+   r"   r2   s     r   rM   zUsernameField.to_pythonI   sN    !!%((?&3u::+G+G L$VU333r   c                 T    i t                                          |          dddS )Nnoneusername)autocapitalizeautocomplete)r$   widget_attrs)r+   rI   r2   s     r   rU   zUsernameField.widget_attrsT   s<    
gg""6**
$&
 
 
 	
r   )r8   r9   r:   rM   rU   r=   r>   s   @r   rK   rK   H   sQ        	4 	4 	4 	4 	4
 
 
 
 
 
 
 
 
r   rK   c                   V    e Zd ZdZd ed          iZ ej         ed          d ej        ddi           e	j
                    	          Z ej         ed
           ej        ddi          d ed                    Z G d d          Z fdZd Z fdZd fd	Z xZS )BaseUserCreationFormzc
    A form that creates a user, with no privileges, from the given username and
    password.
    password_mismatch'   The two password fields didn’t match.PasswordFrT   new-passwordr-   )r!   striprI   	help_textzPassword confirmation4Enter the same password as before, for verification.r!   rI   r]   r^   c                       e Zd ZeZdZdeiZdS )BaseUserCreationForm.Meta)rR   rR   Nr8   r9   r:   r	   modelfieldsrK   field_classesr5   r   r   Metarb   r   s"        #]3r   rg   c                      t                      j        |i | | j        j        j        | j        v r+d| j        | j        j        j                 j        j        d<   d S d S )NT	autofocus)r$   rE   _metard   USERNAME_FIELDre   rI   r-   rF   s      r   rE   zBaseUserCreationForm.__init__w   sm    $)&))):*dk99  K
(78?E   :9r   c                     | j                             d          }| j                             d          }|r$|r"||k    rt          | j        d         d          |S N	password1	password2rX   code)cleaned_datagetr   error_messagesr+   rn   ro   s      r   clean_password2z$BaseUserCreationForm.clean_password2~   su    %))+66	%))+66	 	 	yI'='=!#$78(    r   c                    t                                                       | j                            d          }|rK	 t	          j        || j                   d S # t          $ r!}|                     d|           Y d }~d S d }~ww xY wd S )Nro   )	r$   _post_cleanrr   rs   r   validate_passwordinstancer   	add_error)r+   passworderrorr2   s      r   rx   z BaseUserCreationForm._post_clean   s     $((55 	33#5hNNNNN" 3 3 3{E2222222223	3 	3s   A 
B%BBTc                     t                                          d          }|                    | j        d                    |r8|                                 t	          | d          r|                                  |S )NF)commitrn   save_m2m)r$   saveset_passwordrr   hasattrr   )r+   r   userr2   s      r   r   zBaseUserCreationForm.save   so    ww||5|))$+K8999 	 IIKKKtZ((  r   T)r8   r9   r:   __doc___rt   r   	CharFieldPasswordInputr   "password_validators_help_text_htmlrn   ro   rg   rE   rv   rx   r   r=   r>   s   @r   rW   rW   \   si         	QQHIIN  a
mm"u"..)IJJJH%HJJ	  I  a'(("u"..)IJJJ!JKK	  I4 4 4 4 4 4 4 4
      	3 	3 	3 	3 	3         r   rW   c                       e Zd Zd ZdS )UserCreationFormc           	      @   | j                             d          }|r| j        j        j                            |                                          rJ|                     t          d| j	        
                    | j        j        dg          i                     dS |S )z*Reject usernames that differ only in case.rR   )username__iexactN)rr   rs   rj   rd   objectsfilterexists_update_errorsr   rz   unique_error_message)r+   rR   s     r   clean_usernamezUserCreationForm.clean_username   s    $((44	
 (///JJQQSS	 "DM$F$F J,zl% %      Or   N)r8   r9   r:   r   r5   r   r   r   r      s#            r   r   c                   v     e Zd Z e ed           ed                    Z G d d          Z fdZ xZS )UserChangeFormrZ   u   Raw passwords are not stored, so there is no way to see this user’s password, but you can change the password using <a href="{}">this form</a>.)r!   r^   c                       e Zd ZeZdZdeiZdS )UserChangeForm.Meta__all__rR   Nrc   r5   r   r   rg   r      s"        #]3r   rg   c                 F    t                      j        |i | | j                            d          }|r-|j                            d| j        j         d          |_        | j                            d          }|r!|j        	                    d          |_        d S d S )Nr|   z../../z
/password/user_permissionscontent_type)
r$   rE   re   rs   r^   formatrz   pkquerysetselect_related)r+   rG   rH   r|   r   r2   s        r   rE   zUserChangeForm.__init__   s    $)&)));??:.. 	!)!3!:!:5)555" "H  ;??+=>> 	(8(A(P(P) )%%%	 	r   )	r8   r9   r:   r@   r   r|   rg   rE   r=   r>   s   @r   r   r      s        ((a
mm!*
 
  H4 4 4 4 4 4 4 4
        r   r   c                        e Zd ZdZ e ej        ddi                    Z ej         e	d          d ej
        dd	i          
          Z e	d           e	d          dZd fd	Zd Zd Zd Zd Z xZS )AuthenticationFormzs
    Base class for authenticating users. Extend this to get a form that accepts
    username/password logins.
    ri   Tr\   )rI   rZ   FrT   current-passwordr!   r]   rI   z^Please enter a correct %(username)s and password. Note that both fields may be case-sensitive.zThis account is inactive.)invalid_logininactiveNc                    || _         d| _         t                      j        |i | t          j                            t          j                  | _        | j        j	        pd}|| j
        d         _	        || j
        d         j        j        d<   | j
        d         j        +t          | j        j                  | j
        d         _        dS dS )z
        The 'request' parameter is set for custom auth use by subclasses.
        The form data comes in via the standard 'data' kwarg.
        N   rR   	maxlength)request
user_cacher$   rE   	UserModelrj   	get_fieldrk   username_fieldrN   re   rI   r-   r!   r   verbose_name)r+   r   rG   rH   username_max_lengthr2   s        r   rE   zAuthenticationForm.__init__   s    
 $)&))) (o77	8PQQ"1<C-@J*<OJ&,[9;z"(0,4T5H5U,V,VDK
#))) 10r   c                 "   | j                             d          }| j                             d          }|S|rQt          | j        ||          | _        | j        |                                 |                     | j                   | j         S )NrR   r|   )rR   r|   )rr   rs   r   r   r   get_invalid_login_errorconfirm_login_allowed)r+   rR   r|   s      r   cleanzAuthenticationForm.clean   s    $((44$((44H*x(  DO &22444**4?;;;  r   c                 L    |j         st          | j        d         d          dS )a  
        Controls whether the given User may log in. This is a policy setting,
        independent of end-user authentication. This default behavior is to
        allow login by active users, and reject login by inactive users.

        If the given user cannot log in, this method should raise a
        ``ValidationError``.

        If the given user may log in, this method should return None.
        r   rp   N)	is_activer   rt   )r+   r   s     r   r   z(AuthenticationForm.confirm_login_allowed  s=     ~ 	!#J/   	 	r   c                     | j         S r4   )r   r+   s    r   get_userzAuthenticationForm.get_user  s
    r   c                 T    t          | j        d         dd| j        j        i          S )Nr   rR   )rq   params)r   rt   r   r   r   s    r   r   z*AuthenticationForm.get_invalid_login_error  s5    0  3 @A
 
 
 	
r   r4   )r8   r9   r:   r   rK   r   	TextInputrR   r   r   r   r|   rt   rE   r   r   r   r   r=   r>   s   @r   r   r      s"        
 }OEO;:M$N$N$NOOOHua
mm"u".:L)MNNN  H ,
 
 A122 NW W W W W W"! ! !  "  
 
 
 
 
 
 
r   r   c            	           e Zd Z ej         ed          d ej        ddi                    Z	 ddZd	 Z	dd
dde
ddddf	dZdS )PasswordResetFormEmailr   rT   emailr\   )r!   rN   rI   Nc                 P   t          j        ||          }d                    |                                          }t          j        ||          }t	          ||||g          }	|+t          j        ||          }
|	                    |
d           |	                                 dS )zO
        Send a django.core.mail.EmailMultiAlternatives to `to_email`.
         Nz	text/html)r   render_to_stringjoin
splitlinesr   attach_alternativesend)r+   subject_template_nameemail_template_namer.   
from_emailto_emailhtml_email_template_namesubjectbodyemail_message
html_emails              r   	send_mailzPasswordResetForm.send_mail'  s     )*?II''',,..//&':GDD.wj8*UU#/01I7SSJ,,ZEEEr   c                     t                                           t          j        j        di dz  ddi}fd|D             S )a  Given an email, return matching user(s) who should receive a reset.

        This allows subclasses to more easily customize the default policies
        that prevent inactive users and users with unusable passwords from
        resetting their password.
        z
%s__iexactr   Tc              3      K   | ]8}|                                 t          t          |                    4|V  9d S r4   )has_usable_passwordr   getattr).0ur   email_field_names     r   	<genexpr>z.PasswordResetForm.get_users.<locals>.<genexpr>M  sh       
 
$$&&
 $E716F+G+GHH	

 
 
 
 
 
r   r5   )r   get_email_field_name_default_managerr   )r+   r   active_usersr   s    ` @r   	get_userszPasswordResetForm.get_users?  s|     %99;; 18 
 
//T
 

 
 
 
 
!
 
 
 	
r   z'registration/password_reset_subject.txtz&registration/password_reset_email.htmlFc
           	         | j         d         }
|st          |          }|j        }|j        }n|x}}t                                          }|                     |
          D ]q}t          ||          }|||t          t          |j
                            ||                    |          |rdndd|	pi }|                     ||||||           rdS )zf
        Generate a one-use only link for resetting password and send it to the
        user.
        r   httpshttp)r   domain	site_nameuidr   tokenprotocol)r   N)rr   r   r,   r   r   r   r   r   r   r   r   
make_tokenr   )r+   domain_overrider   r   	use_httpstoken_generatorr   r   r   extra_email_contextr   current_siter   r   r   r   
user_emailr.   s                     r   r   zPasswordResetForm.saveT  s     !'* 	1+G44L$)I!(FF!00I$99;;NN5)) 	 	D '788J# &,[-A-ABB(33D99'0<GGf	 	 ',"	G NN%#)A     	 	r   r4   )r8   r9   r:   r   
EmailFieldr   
EmailInputr   r   r   r
   r   r5   r   r   r   r      s        Eajju~w&?@@@  E "&   0
 
 
. GD/!% + + + + + +r   r   c                       e Zd ZdZd ed          iZ ej         ed           ej        ddi          d e	j
                    	          Z ej         ed
          d ej        ddi                    Z fdZd ZddZ xZS )SetPasswordFormzZ
    A form that lets a user set their password without entering the old
    password
    rX   rY   zNew passwordrT   r[   r\   Fr`   zNew password confirmationr   c                 H    || _          t                      j        |i | d S r4   r   r$   rE   r+   r   rG   rH   r2   s       r   rE   zSetPasswordForm.__init__  ,    	$)&)))))r   c                     | j                             d          }| j                             d          }|r$|r"||k    rt          | j        d         d          t	          j        || j                   |S )Nnew_password1new_password2rX   rp   rr   rs   r   rt   r   ry   r   ru   s      r   clean_new_password2z#SetPasswordForm.clean_new_password2  s    %))/::	%))/::	 	 	yI'='=!#$78(    	-iCCCr   Tc                     | j         d         }| j                            |           |r| j                                         | j        S )Nr   rr   r   r   r   r+   r   r|   s      r   r   zSetPasswordForm.save  sG    $_5	x((( 	INNyr   r   )r8   r9   r:   r   r   rt   r   r   r   r   r   r   r   rE   r   r   r=   r>   s   @r   r   r     s         	QQHIIN $EOa"u"..)IJJJH%HJJ	  M $EOa+,,"u"..)IJJJ  M* * * * *	 	 	       r   r   c            	           e Zd ZdZi ej        d ed          iZ ej         ed          d ej	        ddd	          
          Z
g dZd ZdS )PasswordChangeFormz[
    A form that lets a user change their password by entering their old
    password.
    password_incorrectzAYour old password was entered incorrectly. Please enter it again.zOld passwordFr   TrT   ri   r\   r   )old_passwordr   r   c                     | j         d         }| j                            |          st          | j        d         d          |S )zB
        Validate that the old_password field is correct.
        r  r   rp   )rr   r   check_passwordr   rt   )r+   r  s     r   clean_old_passwordz%PasswordChangeForm.clean_old_password  sW     (8y''55 	!#$89)    r   N)r8   r9   r:   r   r   rt   r   r   r   r   r  field_orderr  r5   r   r   r   r     s         


(aaO
 
 N #5?a"u"#5DII
 
 
  L EDDK
 
 
 
 
r   r   c                   N    e Zd ZdZd ed          iZdZ ej         ed           ej	        ddd	          d
 e
j                              Z ej         ed           ej	        ddi	          d
 ed                    Z fdZd ZddZe fd            Z xZS )AdminPasswordChangeFormzN
    A form used to change the password of a user in the admin interface.
    rX   rY   rB   rZ   r[   Tr   r\   Fr`   zPassword (again)rT   r_   c                 H    || _          t                      j        |i | d S r4   r   r   s       r   rE   z AdminPasswordChangeForm.__init__  r   r   c                     | j                             d          }| j                             d          }|r$|r"||k    rt          | j        d         d          t	          j        || j                   |S rm   r   ru   s      r   rv   z'AdminPasswordChangeForm.clean_password2  s    %))+66	%))+66	 	 	yI'='=!#$78(    	-iCCCr   c                     | j         d         }| j                            |           |r| j                                         | j        S )zSave the new password.rn   r   r   s      r   r   zAdminPasswordChangeForm.save  sG    $[1	x((( 	INNyr   c                 T    t                      j        }| j        D ]
}||vrg c S dgS )Nr|   )r$   changed_datare   )r+   datar,   r2   s      r   r  z$AdminPasswordChangeForm.changed_data   sA    ww#K 	 	D4			  |r   r   )r8   r9   r:   r   r   rt   required_css_classr   r   r   r   r   rn   ro   rE   rv   r   propertyr  r=   r>   s   @r   r  r    sU        
 	QQHIIN $a
mm"u"#1EE
 
 
 H%HJJ  I  a"##"u"..)IJJJ!JKK	  I* * * * *	 	 	        X    r   r  )2r   djangor   django.contrib.authr   r   r   django.contrib.auth.hashersr   r   django.contrib.auth.modelsr	   django.contrib.auth.tokensr
   django.contrib.sites.shortcutsr   django.core.exceptionsr   django.core.mailr   django.templater   django.utils.encodingr   django.utils.httpr   django.utils.textr   django.utils.translationr   r   r   r   r   Widgetr   Fieldr@   r   rK   	ModelFormrW   r   r   Formr   r   r   r   r  r5   r   r   <module>r!     s;             Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q + + + + + + > > > > > > ; ; ; ; ; ; 2 2 2 2 2 2 3 3 3 3 3 3 " " " " " " - - - - - - 3 3 3 3 3 3 & & & & & & , , , , , , 6 6 6 6 6 6N		 	 	       <* * * * * * * *
 
 
 
 
EO 
 
 
(> > > > >5? > > >B    +   *    U_   :N
 N
 N
 N
 N
 N
 N
 N
b_ _ _ _ _
 _ _ _D) ) ) ) )ej ) ) )X               F5 5 5 5 5ej 5 5 5 5 5r   