
    GwgD                     z   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jD                        Z# G d dejH                        Z% G d dejL                        Z' G d dejP                        Z) G d de)      Z* G d dejP                        Z+ G d dejX                        Z- G d d ejX                        Z. G d! d"ejX                        Z/ G d# d$e/      Z0 G d% d&ejX                        Z1y)'    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|       j                         t        j                  d|      j                         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     P/var/www/horilla/myenv/lib/python3.12/site-packages/django/contrib/auth/forms.py_unicode_ci_comparer      s@     	fb)224  ,55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|j                  t              r|j	                  dt        d      i       nQ	 t        |      }|j                  |      j                         D ]"  \  }}|j	                  t        |      |d       $ 	 ||d<   |S # t        $ r |j	                  dt        d      i       Y .w xY w)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%   s    '%dE59(()ABNNGW-?%@ABM(/ $*#6#6u#=#C#C#E MKCNNWS\F#KLM$	  S"s   
B! !%C	C	c                      y N )r+   id_s     r   id_for_labelz'ReadOnlyPasswordHashWidget.id_for_label;   s    r   )__name__
__module____qualname__template_name	read_onlyr%   r7   __classcell__r2   s   @r   r   r   !   s    ?MI,r   r   c                   "     e Zd ZeZ fdZ xZS )ReadOnlyPasswordHashFieldc                 l    |j                  dd       |j                  dd       t        |   |i | y )NrequiredFdisabledT)
setdefaultr$   __init__r+   argskwargsr2   s      r   rE   z"ReadOnlyPasswordHashField.__init__B   s5    *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                  kD  r|S t	        j
                  d|      S )Nr   )r$   	to_python
max_lengthlenr   r   )r+   r"   r2   s     r   rM   zUsernameField.to_pythonI   sE    !%(??&3u:+G L$$VU33r   c                 0    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*    
g"6*
$&
 	
r   )r8   r9   r:   rM   rU   r=   r>   s   @r   rK   rK   H   s    	4
 
r   rK   c                   L    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y)BaseUserCreationForm.Meta)rR   rR   Nr8   r9   r:   r	   modelfieldsrK   field_classesr5   r   r   Metarb   r   s    #]3r   rg   c                    t        |   |i | | j                  j                  j                  | j
                  v rEd| j
                  | j                  j                  j                     j                  j                  d<   y y )NT	autofocus)r$   rE   _metard   USERNAME_FIELDre   rI   r-   rF   s      r   rE   zBaseUserCreationForm.__init__w   sm    $)&)::**dkk9  KK

((778??EE :r   c                     | j                   j                  d      }| j                   j                  d      }|r!|r||k7  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~   sa    %%))+6	%%))+6	yI'=!##$78(  r   c                     t         |           | j                  j                  d      }|r"	 t	        j
                  || j                         y y # t        $ r}| j                  d|       Y d }~y d }~ww xY w)Nro   )	r$   _post_cleanrr   rs   r   validate_passwordinstancer   	add_error)r+   passworderrorr2   s      r   rx   z BaseUserCreationForm._post_clean   sj     $$((53#55hN  # 3{E223s    A 	A5A00A5c                     t         |   d      }|j                  | j                  d          |r,|j                          t	        | d      r| j                          |S )NF)commitrn   save_m2m)r$   saveset_passwordrr   hasattrr   )r+   r   userr2   s      r   r   zBaseUserCreationForm.save   sP    w|5|)$++K89IIK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   \   s     	QHIN  
m"u""..)IJH%HHJ	I  '("u""..)IJJK	I4 4
	3 r   rW   c                       e Zd Zd Zy)UserCreationFormc           	      T   | j                   j                  d      }|r| j                  j                  j                  j                  |      j                         rL| j                  t        d| j                  j                  | j                  j                  dg      i             y|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

  ((///JQQS"DMM$F$F JJ,,zl% Or   N)r8   r9   r:   r   r5   r   r   r   r      s    r   r   c                   ^     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y)UserChangeForm.Meta__all__rR   Nrc   r5   r   r   rg   r      s    #]3r   rg   c                 J   t        |   |i | | j                  j                  d      }|r8|j                  j                  d| j                  j                   d      |_        | j                  j                  d      }|r!|j                  j                  d      |_        y y )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!3!:!:))**5"H  ;;??+=>(8(A(A(P(P)% r   )	r8   r9   r:   r@   r   r|   rg   rE   r=   r>   s   @r   r   r      s5    (
m*
H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inactivec                    || _         d| _        t        |   |i | t        j
                  j                  t        j                        | _        | j                  j                  xs d}|| j                  d   _	        || j                  d   j                  j                  d<   | j                  d   j                  2t        | j                  j                        | j                  d   _        yy)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    
 $)&) (oo77	8P8PQ"11<<C-@J*<OJ&&,,[9;;z"((0,4T5H5H5U5U,VDKK
#) 1r   c                 6   | j                   j                  d      }| j                   j                  d      }|V|rTt        | j                  ||      | _        | j                  | 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H*x(DO &2244**4??;   r   c                 P    |j                   st        | j                  d   d      y)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                 d    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  s4    0  3 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    
 OEOO;:M$NOHu
m"u"".:L)MNH ,
 12N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y)PasswordResetFormEmailr   rT   emailr\   )r!   rN   rI   Nc                 ,   t        j                  ||      }dj                  |j                               }t        j                  ||      }t	        ||||g      }	|(t        j                  ||      }
|	j                  |
d       |	j                          y)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''',,./&&':GD.wj8*U#/001I7SJ,,ZEr   c                     t         j                         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   n   K   | ],  }|j                         rt        t        |            r| . y wr4   )has_usable_passwordr   getattr).0ur   email_field_names     r   	<genexpr>z.PasswordResetForm.get_users.<locals>.<genexpr>M  s7      
$$&#E716F+GH 
s   25r5   )r   get_email_field_name_default_managerr   )r+   r   active_usersr   s    ` @r   	get_userszPasswordResetForm.get_users?  sV     %99; 1188 
//T

!
 	
r   z'registration/password_reset_subject.txtz&registration/password_reset_email.htmlFc
           	         | j                   d   }
|s$t        |      }|j                  }|j                  }n|x}}t        j                         }| j                  |
      D ]d  }t        ||      }|||t        t        |j                              ||j                  |      |rdndd|	xs i }| j                  ||||||       f y)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      !!'*+G4L$))I!((F!00I$99;NN5) 	D '78J# &,[-AB(33D9'0Gf	 ',"	G NN%#)A  	r   r4   )r8   r9   r:   r   
EmailFieldr   
EmailInputr   r   r   r
   r   r5   r   r   r   r      sd    Ej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                 2    || _         t        |   |i | y r4   r   r$   rE   r+   r   rG   rH   r2   s       r   rE   zSetPasswordForm.__init__      	$)&)r   c                     | j                   j                  d      }| j                   j                  d      }|r!|r||k7  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  su    %%))/:	%%))/:	yI'=!##$78(  	--iCr   c                     | j                   d   }| j                  j                  |       |r| j                  j                          | j                  S )Nr   rr   r   r   r   r+   r   r|   s      r   r   zSetPasswordForm.save  s?    $$_5		x(IINNyy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     	QHIN $EOO"u""..)IJH%HHJ	M $EOO+,"u""..)I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y)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                  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  sM     ((8yy''5!##$89)  r   N)r8   r9   r:   r   r   rt   r   r   r   r   r  field_orderr  r5   r   r   r   r     sp    


(
(aO
N #5??"u""#5DI
L EK
r   r   c                   D    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                 2    || _         t        |   |i | y r4   r   r   s       r   rE   z AdminPasswordChangeForm.__init__  r   r   c                     | j                   j                  d      }| j                   j                  d      }|r!|r||k7  rt        | j                  d   d      t	        j
                  || j                         |S rm   r   ru   s      r   rv   z'AdminPasswordChangeForm.clean_password2  su    %%))+6	%%))+6	yI'=!##$78(  	--iCr   c                     | j                   d   }| j                  j                  |       |r| j                  j                          | j                  S )zSave the new password.rn   r   r   s      r   r   zAdminPasswordChangeForm.save  s?    $$[1		x(IINNyyr   c                 P    t         |   }| j                  D ]
  }||vsg c S  dgS )Nr|   )r$   changed_datare   )r+   datar,   r2   s      r   r  z$AdminPasswordChangeForm.changed_data   s7    w#KK 	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    s    
 	QHIN $
m"u""#1E
 H%HHJI  "#"u""..)IJJK	I*	  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 + > ; 2 3 " - 3 & , 6		 <* *
EOO 
(>5?? >B+ *U__ :N
 N
b_

 _D)ejj )X   F5ejj 5r   