o
    b                     @   s  d dl Z d dlZd dl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 d dlmZ d dlmZmZ d dlmZ d d	lmZmZ e jdd
dd Zdd ZdddZdddZd ddZd ddZeeeZ G dd dZ!G dd dZ"G dd dZ#G dd dZ$dS )!    N)SequenceMatcher)Path)settings)FieldDoesNotExistImproperlyConfiguredValidationError)lazy)format_htmlformat_html_join)import_string)gettextngettext)maxsizec                   C   s
   t tjS N)get_password_validatorsr   ZAUTH_PASSWORD_VALIDATORS r   r   f/var/www/secure340b-portal/env/lib/python3.10/site-packages/django/contrib/auth/password_validation.pyget_default_password_validators   s   
r   c              
   C   sb   g }| D ]*}zt |d }W n ty   d}t||d  w ||di |di  q|S )NNAMEzZThe module in NAME could not be imported: %s. Check your AUTH_PASSWORD_VALIDATORS setting.OPTIONSr   )r   ImportErrorr   appendget)Zvalidator_configZ
validators	validatorklassmsgr   r   r   r      s   r   c                 C   sj   g }|du r	t  }|D ]!}z|| | W q ty, } z|| W Y d}~qd}~ww |r3t|dS )z
    Validate whether the password meets all validator requirements.

    If the password is valid, return ``None``.
    If the password is invalid, raise ValidationError with all error messages.
    N)r   validater   r   )passworduserpassword_validatorserrorsr   errorr   r   r   validate_password#   s   r"   c                 C   s6   |du rt  }|D ]}t|ddd }|| | q	dS )zy
    Inform all validators that have implemented a password_changed() method
    that the password has been changed.
    Npassword_changedc                  W   s   d S r   r   )ar   r   r   <lambda>>   s    z"password_changed.<locals>.<lambda>)r   getattr)r   r   r   r   r#   r   r   r   r#   6   s   r#   c                 C   s.   g }| du r	t  } | D ]	}||  q|S )zG
    Return a list of all help texts of all configured validators.
    N)r   r   get_help_text)r   
help_textsr   r   r   r   password_validators_help_textsB   s   r)   c                 C   s0   t | }tdddd |D }|rtd|S dS )z`
    Return an HTML string with all help texts of all configured validators
    in an <ul>.
     z<li>{}</li>c                 s   s    | ]}|fV  qd S r   r   ).0	help_textr   r   r   	<genexpr>T   s    z6_password_validators_help_text_html.<locals>.<genexpr>z<ul>{}</ul>)r)   r
   r	   )r   r(   Z
help_itemsr   r   r   #_password_validators_help_text_htmlN   s   r.   c                   @   s,   e Zd ZdZd
ddZdddZdd	 ZdS )MinimumLengthValidatorz?
    Validate whether the password is of a minimum length.
       c                 C   s
   || _ d S r   )
min_length)selfr1   r   r   r   __init___   s   
zMinimumLengthValidator.__init__Nc                 C   s0   t || jk rttdd| jdd| jidd S )NzNThis password is too short. It must contain at least %(min_length)d character.zOThis password is too short. It must contain at least %(min_length)d characters.Zpassword_too_shortr1   codeparams)lenr1   r   r   r2   r   r   r   r   r   r   b   s   zMinimumLengthValidator.validatec                 C   s   t dd| jd| ji S )Nz=Your password must contain at least %(min_length)d character.z>Your password must contain at least %(min_length)d characters.r1   )r   r1   r2   r   r   r   r'   n   s   z$MinimumLengthValidator.get_help_text)r0   r   )__name__
__module____qualname____doc__r3   r   r'   r   r   r   r   r/   [   s
    

r/   c                   @   s4   e Zd ZdZdZedfddZdddZd	d
 ZdS ) UserAttributeSimilarityValidatora  
    Validate whether the password is sufficiently different from the user's
    attributes.

    If no specific attributes are provided, look at a sensible list of
    defaults. Attributes that don't exist are ignored. Comparison is made to
    not only the full attribute value, but also its components, so that, for
    example, a password is validated against either part of an email address,
    as well as the full address.
    )usernameZ
first_name	last_nameemailgffffff?c                 C   s   || _ || _d S r   )user_attributesmax_similarity)r2   rB   rC   r   r   r   r3      s   
z)UserAttributeSimilarityValidator.__init__Nc              
   C   s   |sd S | j D ]O}t||d }|rt|tsqtd||g }|D ]3}t| | d | j	krUzt|j
|j}W n tyI   |}Y nw ttddd|idq"qd S )Nz\W+)r$   bz4The password is too similar to the %(verbose_name)s.Zpassword_too_similarverbose_namer4   )rB   r&   
isinstancestrresplitr   lowerZquick_ratiorC   _meta	get_fieldrE   r   r   _)r2   r   r   Zattribute_namevalueZvalue_partsZ
value_partrE   r   r   r   r      s,   
z)UserAttributeSimilarityValidator.validatec                 C      t dS )NuH   Your password can’t be too similar to your other personal information.rM   r9   r   r   r   r'         z.UserAttributeSimilarityValidator.get_help_textr   )r:   r;   r<   r=   ZDEFAULT_USER_ATTRIBUTESr3   r   r'   r   r   r   r   r>   v   s    

r>   c                   @   s@   e Zd ZdZee jd ZefddZ	d
ddZ
dd	 ZdS )CommonPasswordValidatora  
    Validate whether the password is a common password.

    The password is rejected if it occurs in a provided list of passwords,
    which may be gzipped. The list Django ships with contains 20000 common
    passwords (lowercased and deduplicated), created by Royce Williams:
    https://gist.github.com/roycewilliams/281ce539915a947a23db17137d91aeb7
    The password list must be lowercased to match the comparison in validate().
    zcommon-passwords.txt.gzc                 C   s   z%t j|ddd}dd |D | _W d    W d S 1 sw   Y  W d S  tyM   t|}dd |D | _W d    Y d S 1 sEw   Y  Y d S w )Nrtzutf-8)encodingc                 S      h | ]}|  qS r   stripr+   xr   r   r   	<setcomp>       z3CommonPasswordValidator.__init__.<locals>.<setcomp>c                 S   rU   r   rV   rX   r   r   r   rZ      r[   )gzipopen	passwordsOSError)r2   Zpassword_list_pathfr   r   r   r3      s   &
&z CommonPasswordValidator.__init__Nc                 C   s&   |   | jv rttdddd S )NzThis password is too common.Zpassword_too_commonr5   )rJ   rW   r^   r   rM   r8   r   r   r   r      s   z CommonPasswordValidator.validatec                 C   rO   )Nu2   Your password can’t be a commonly used password.rP   r9   r   r   r   r'      rQ   z%CommonPasswordValidator.get_help_textr   )r:   r;   r<   r=   r   __file__resolveparentZDEFAULT_PASSWORD_LIST_PATHr3   r   r'   r   r   r   r   rR      s    	
rR   c                   @   s"   e Zd ZdZdddZdd ZdS )NumericPasswordValidatorz8
    Validate whether the password is alphanumeric.
    Nc                 C   s   |  rttdddd S )Nz"This password is entirely numeric.Zpassword_entirely_numericra   )isdigitr   rM   r8   r   r   r   r      s   z!NumericPasswordValidator.validatec                 C   rO   )Nu*   Your password can’t be entirely numeric.rP   r9   r   r   r   r'      rQ   z&NumericPasswordValidator.get_help_textr   )r:   r;   r<   r=   r   r'   r   r   r   r   re      s    
re   )NNr   )%	functoolsr\   rH   difflibr   pathlibr   Zdjango.confr   Zdjango.core.exceptionsr   r   r   Zdjango.utils.functionalr   Zdjango.utils.htmlr	   r
   Zdjango.utils.module_loadingr   Zdjango.utils.translationr   rM   r   	lru_cacher   r   r"   r#   r)   r.   rG   Z"password_validators_help_text_htmlr/   r>   rR   re   r   r   r   r   <module>   s.    







*