3
g"                 @   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!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   e/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/contrib/auth/password_validation.pyget_default_password_validators   s    r   c             C   sh   g }x^| D ]V}yt |d }W n( tk
rF   d}t||d  Y nX |j|f |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   sn   g }|dkrt  }xJ|D ]B}y|j| | W q tk
rX } z|j| W Y dd}~X qX qW |rjt|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   s:   |dkrt  }x&|D ]}t|ddd }|| | qW 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 )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   s2   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   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 )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   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_shortr0   )codeparams)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)r/   )N)__name__
__module____qualname____doc__r2   r   r&   r   r   r   r   r.   [   s   

r.   c             C   s0   t | }|d | }t |}|d| ko.||k S )a  
    Test that value is within a reasonable range of password.

    The following ratio calculations are based on testing SequenceMatcher like
    this:

    for i in range(0,6):
      print(10**i, SequenceMatcher(a='A', b='A'*(10**i)).quick_ratio())

    which yields:

    1 1.0
    10 0.18181818181818182
    100 0.019801980198019802
    1000 0.001998001998001998
    10000 0.00019998000199980003
    100000 1.999980000199998e-05

    This means a length_ratio of 10 should never yield a similarity higher than
    0.2, for 100 this is down to 0.02 and for 1000 it is 0.002. This can be
    calculated via 2 / length_ratio. As a result we avoid the potentially
    expensive sequence matching.
       
   )r5   )r   max_similarityvalueZpwd_lenZlength_bound_similarityZ	value_lenr   r   r   exceeds_maximum_length_ratiov   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.
    username
first_name	last_nameemailgffffff?c             C   s    || _ |dk rtd|| _d S )Ng?z#max_similarity must be at least 0.1)user_attributes
ValueErrorr<   )r1   rD   r<   r   r   r   r2      s    z)UserAttributeSimilarityValidator.__init__Nc       	      C   s   |sd S |j  }x| jD ]}t||d }| st|t r<q|j  }tjd||g }xx|D ]p}t|| j|rpq\t	||dj
 | jkr\yt|jj|j}W n tk
r   |}Y nX ttddd|idq\W qW d S )Nz\W+)r#   bz4The password is too similar to the %(verbose_name)s.Zpassword_too_similarverbose_name)r3   r4   )lowerrD   r%   
isinstancestrresplitr>   r<   r   Zquick_ratioZ_meta	get_fieldrG   r   r   _)	r1   r   r   Zattribute_namer=   Zvalue_lowerZvalue_partsZ
value_partrG   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.)rN   )r1   r   r   r   r&      s    z.UserAttributeSimilarityValidator.get_help_text)r@   rA   rB   rC   )N)r6   r7   r8   r9   ZDEFAULT_USER_ATTRIBUTESr2   r   r&   r   r   r   r   r?      s
   

r?   c               @   s@   e Zd ZdZeej 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   y0t j|ddd}dd |D | _W d Q R X W n8 tk
rh   t|}dd |D | _W d Q R X Y nX d S )Nrtzutf-8)encodingc             S   s   h | ]}|j  qS r   )strip)r*   xr   r   r   	<setcomp>   s    z3CommonPasswordValidator.__init__.<locals>.<setcomp>c             S   s   h | ]}|j  qS r   )rR   )r*   rS   r   r   r   rT      s    )gzipopen	passwordsOSError)r1   Zpassword_list_pathfr   r   r   r2      s    
z CommonPasswordValidator.__init__Nc             C   s&   |j  j | jkr"ttdddd S )NzThis password is too common.Zpassword_too_common)r3   )rH   rR   rW   r   rN   )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.)rN   )r1   r   r   r   r&      s    z%CommonPasswordValidator.get_help_text)N)r6   r7   r8   r9   r   __file__resolveparentZDEFAULT_PASSWORD_LIST_PATHr2   r   r&   r   r   r   r   rO      s
   	
rO   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   |j  rttdddd S )Nz"This password is entirely numeric.Zpassword_entirely_numeric)r3   )isdigitr   rN   )r1   r   r   r   r   r   r      s    z!NumericPasswordValidator.validatec             C   s   t dS )Nu*   Your password can’t be entirely numeric.)rN   )r1   r   r   r   r&      s    z&NumericPasswordValidator.get_help_text)N)r6   r7   r8   r9   r   r&   r   r   r   r   r]      s   
r]   )NN)NN)N)N)&	functoolsrU   rK   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   rN   r   	lru_cacher   r   r!   r"   r(   r-   rJ   Z"password_validators_help_text_htmlr.   r>   r?   rO   r]   r   r   r   r   <module>   s,   





0