U
    8ÄT_Ž  ã                   @   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   úK/tmp/pip-unpacked-wheel-dv63caxw/django/contrib/auth/password_validation.pyÚget_default_password_validators   s    r   c              	   C   sd   g }| D ]V}zt |d ƒ}W n( tk
rD   d}t||d  ƒ‚Y nX | |f | di ¡Ž¡ q|S )NÚNAMEzZThe module in NAME could not be imported: %s. Check your AUTH_PASSWORD_VALIDATORS setting.ÚOPTIONS)r   ÚImportErrorr   ÚappendÚget)Zvalidator_configZ
validatorsÚ	validatorÚklassÚmsgr   r   r   r      s    r   c                 C   sj   g }|dkrt ƒ }|D ]B}z| | |¡ W q tk
rV } z| |¡ W 5 d}~X Y qX q|rft|ƒ‚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k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>>   ó    z"password_changed.<locals>.<lambda>)r   Úgetattr)r   r   r   r   r#   r   r   r   r#   6   s
    r#   c                 C   s.   g }| dk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)Úselfr2   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_shortr2   ©ÚcodeÚparams)Úlenr2   r   r   ©r3   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.r2   )r   r2   ©r3   r   r   r   r(   n   s    ýüz$MinimumLengthValidator.get_help_text)r1   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r4   r   r(   r   r   r   r   r0   [   s   

r0   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)r3   rC   rD   r   r   r   r4   ƒ   s    z)UserAttributeSimilarityValidator.__init__Nc              
   C   s´   |sd S | j D ] }t||d ƒ}|rt|tƒs.qt d|¡|g }|D ]h}t| ¡ | ¡ d� ¡ | j	krDzt|j
 |¡jƒ}W n tk
r”   |}Y nX ttdƒdd|id�‚qDqd S )Nz\W+)r$   Úbz4The password is too similar to the %(verbose_name)s.Zpassword_too_similarÚverbose_namer5   )rC   r'   Ú
isinstanceÚstrÚreÚsplitr   ÚlowerZquick_ratiorD   Z_metaÚ	get_fieldrF   r   r   Ú_)r3   r   r   Zattribute_nameÚvalueZvalue_partsZ
value_partrF   r   r   r   r   ‡   s$    

ýz)UserAttributeSimilarityValidator.validatec                 C   s   t dƒS )NuH   Your password canâ€™t be too similar to your other personal information.©rM   r:   r   r   r   r(   œ   s    z.UserAttributeSimilarityValidator.get_help_text)N)r;   r<   r=   r>   ZDEFAULT_USER_ATTRIBUTESr4   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   sn   z0t j|ddd��}dd„ |D ƒ| _W 5 Q R X W n8 tk
rh   t|ƒ�}dd„ |D ƒ| _W 5 Q R X Y nX d S )NÚrtzutf-8)Úencodingc                 S   s   h | ]}|  ¡ ’qS r   ©Ústrip©r,   Úxr   r   r   Ú	<setcomp>¯   s     z3CommonPasswordValidator.__init__.<locals>.<setcomp>c                 S   s   h | ]}|  ¡ ’qS r   rS   rU   r   r   r   rW   ²   s     )ÚgzipÚopenÚ	passwordsÚOSError)r3   Zpassword_list_pathÚfr   r   r   r4   ¬   s    
z CommonPasswordValidator.__init__Nc                 C   s&   |  ¡  ¡ | jkr"ttdƒdd�‚d S )NzThis password is too common.Zpassword_too_common©r6   )rK   rT   rZ   r   rM   r9   r   r   r   r   ´   s
    þz CommonPasswordValidator.validatec                 C   s   t dƒS )Nu2   Your password canâ€™t be a commonly used password.rO   r:   r   r   r   r(   »   s    z%CommonPasswordValidator.get_help_text)N)r;   r<   r=   r>   r   Ú__file__ÚresolveÚparentZDEFAULT_PASSWORD_LIST_PATHr4   r   r(   r   r   r   r   rP       s
   	
rP   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_numericr]   )Úisdigitr   rM   r9   r   r   r   r   Ã   s
    þz!NumericPasswordValidator.validatec                 C   s   t dƒS )Nu*   Your password canâ€™t be entirely numeric.rO   r:   r   r   r   r(   Ê   s    z&NumericPasswordValidator.get_help_text)N)r;   r<   r=   r>   r   r(   r   r   r   r   ra   ¿   s   
ra   )NN)NN)N)N)%Ú	functoolsrX   rI   Ú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/   rH   Z"password_validators_help_text_htmlr0   r?   rP   ra   r   r   r   r   Ú<module>   s,   







*