
v^                 @   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 d  Z d d d d  Z d d d  Z d d d  Z e e e  Z  Gd d   d  Z! Gd d   d  Z" Gd d   d  Z# Gd 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   I/tmp/pip-build-8lau8j11/django/django/contrib/auth/password_validation.pyget_default_password_validators   s    r   c             C   s}   g  } xp |  D]h } y t  | d  } Wn, t k
 rU d } t | | d   Yn X| j | | j d i      q W| 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   s   g  } | d k r t    } xW | D]O } y | j |  |  Wq" t k
 rp } z | j |  WYd d } ~ Xq" Xq" W| r t |   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   sO   | d k r t    } x3 | D]+ } t | d d d    } | |  |  q Wd 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)Nr   )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   sC   g  } |  d k r t    }  x! |  D] } | j | j    q" W| 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   sB   t  |   } t d d d d   | D  } | r> t d |  Sd 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)Nr   ).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)N)
min_length)selfr0   r   r   r   __init___   s    zMinimumLengthValidator.__init__Nc             C   sI   t  |  |  j k  rE t t d d |  j  d d d d |  j i  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.codeZpassword_too_shortparamsr0   )lenr0   r   r   )r1   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.r0   )r   r0   )r1   r   r   r   r&   n   s
    	z$MinimumLengthValidator.get_help_text)__name__
__module____qualname____doc__r2   r   r&   r   r   r   r   r.   [   s   r.   c               @   sI   e  Z d  Z d Z d Z e d 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.
    username
first_name	last_nameemailgffffff?c             C   s   | |  _  | |  _ d  S)N)user_attributesmax_similarity)r1   r?   r@   r   r   r   r2      s    	z)UserAttributeSimilarityValidator.__init__Nc             C   s  | s
 d  Sx |  j  D] } t | | d   } | s t | t  rF q t j d |  | g } x | D] } t d | j   d | j    j   |  j	 k rf y t | j
 j |  j  } Wn t k
 r | } Yn Xt t d  d d d d | i  qf Wq Wd  S)	Nz\W+r#   bz4The password is too similar to the %(verbose_name)s.r3   Zpassword_too_similarr4   verbose_name)r?   r%   
isinstancestrresplitr   lowerZquick_ratior@   Z_meta	get_fieldrB   r   r   _)r1   r   r   Zattribute_namevalueZvalue_partsZ
value_partrB   r   r   r   r      s"    0z)UserAttributeSimilarityValidator.validatec             C   s
   t  d  S)NuH   Your password can’t be too similar to your other personal information.)rI   )r1   r   r   r   r&      s    z.UserAttributeSimilarityValidator.get_help_text)zusernamer<   r=   zemail)r6   r7   r8   r9   ZDEFAULT_USER_ATTRIBUTESr2   r   r&   r   r   r   r   r:   v   s
   
r:   c               @   sY   e  Z d  Z d Z e e  j   j d Z e 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   y< t  j | d d d  } d d   | D |  _ Wd  QRXWn> t k
 r| t |   } d d   | D |  _ Wd  QRXYn Xd  S)Nrtencodingzutf-8c             S   s   h  |  ] } | j     q Sr   )strip)r*   xr   r   r   	<setcomp>   s   	 z3CommonPasswordValidator.__init__.<locals>.<setcomp>c             S   s   h  |  ] } | j     q Sr   )rN   )r*   rO   r   r   r   rP      s   	 )gzipopen	passwordsOSError)r1   Zpassword_list_pathfr   r   r   r2      s    !z CommonPasswordValidator.__init__Nc             C   s7   | j    j   |  j k r3 t t d  d d  d  S)NzThis password is too common.r3   Zpassword_too_common)rG   rN   rS   r   rI   )r1   r   r   r   r   r   r      s    z CommonPasswordValidator.validatec             C   s
   t  d  S)Nu2   Your password can’t be a commonly used password.)rI   )r1   r   r   r   r&      s    z%CommonPasswordValidator.get_help_text)r6   r7   r8   r9   r   __file__resolveparentZDEFAULT_PASSWORD_LIST_PATHr2   r   r&   r   r   r   r   rK      s
   	rK   c               @   s1   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(   | j    r$ t t d  d d  d  S)Nz"This password is entirely numeric.r3   Zpassword_entirely_numeric)isdigitr   rI   )r1   r   r   r   r   r   r      s    z!NumericPasswordValidator.validatec             C   s
   t  d  S)Nu*   Your password can’t be entirely numeric.)rI   )r1   r   r   r   r&      s    z&NumericPasswordValidator.get_help_text)r6   r7   r8   r9   r   r&   r   r   r   r   rY      s   rY   )%	functoolsrQ   rE   difflibr   Z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   rI   r   	lru_cacher   r   r!   r"   r(   r-   rD   Z"password_validators_help_text_htmlr.   r:   rK   rY   r   r   r   r   <module>   s*   
*