3
g                 @   sT   d dl m Z mZ d dlmZ d dlmZmZ d dlmZm	Z	 G dd dZ
e
 ZdS )    )datetimetime)settings)constant_time_comparesalted_hmac)base36_to_intint_to_base36c               @   sV   e Zd ZdZdZdZdZdd Zdd Zdd	 Z	dddZ
dd Zdd Zdd ZdS )PasswordResetTokenGeneratorza
    Strategy object used to generate and check tokens for the password
    reset mechanism.
    z6django.contrib.auth.tokens.PasswordResetTokenGeneratorNc             C   s    | j p
tj| _ | jptj| _d S )N)secretr   Z
SECRET_KEY	algorithmZDEFAULT_HASHING_ALGORITHM)self r   X/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/contrib/auth/tokens.py__init__   s    z$PasswordResetTokenGenerator.__init__c             C   s   | j || j| j S )zi
        Return a token that can be used once to do a password reset
        for the given user.
        )_make_token_with_timestamp_num_seconds_now)r   userr   r   r   
make_token   s    z&PasswordResetTokenGenerator.make_tokenc             C   s   |o|sdS y|j d\}}t|dk }W n tk
r>   dS X yt|}W n tk
r`   dS X t| j|||st| j||dd|sdS | j }|r|d	9 }|t|tj	|j
 tj j 7 }| j|| tjkrdS dS )
zP
        Check that a password reset token is correct for a given user.
        F-   T)legacy   <   i  iQ )splitlen
ValueErrorr   r   r   r   intr   combinedater   mintotal_secondsr   r   ZPASSWORD_RESET_TIMEOUT)r   r   tokents_b36_Zlegacy_tokentsnowr   r   r   check_token   s.    "z'PasswordResetTokenGenerator.check_tokenFc             C   sH   t |}t| j| j||| j|r$dn| jdj d d d }d||f S )Nsha1)r
   r      z%s-%s)r   r   key_salt_make_hash_valuer
   r   	hexdigest)r   r   	timestampr   r#   Zhash_stringr   r   r   r   H   s    
z6PasswordResetTokenGenerator._make_token_with_timestampc             C   sR   |j dkrdn|j jddd}|j }t||dp4d}|j |j | | | S )a  
        Hash the user's primary key, email (if available), and some user state
        that's sure to change after a password reset to produce a token that is
        invalidated when it's used:
        1. The password field will change upon a password reset (even if the
           same password is chosen, due to password salting).
        2. The last_login field will usually be updated very shortly after
           a password reset.
        Failing those things, settings.PASSWORD_RESET_TIMEOUT eventually
        invalidates the token.

        Running this data through salted_hmac() prevents password cracking
        attempts using the reset token, provided the secret isn't compromised.
        N r   )microsecondtzinfo)Z
last_loginreplaceZget_email_field_namegetattrpkpassword)r   r   r-   Zlogin_timestampZemail_fieldemailr   r   r   r+   W   s    z,PasswordResetTokenGenerator._make_hash_valuec             C   s   t |tddd j S )Ni     )r   r   r!   )r   dtr   r   r   r   m   s    z(PasswordResetTokenGenerator._num_secondsc             C   s   t j S )N)r   r&   )r   r   r   r   r   p   s    z PasswordResetTokenGenerator._now)F)__name__
__module____qualname____doc__r*   r   r
   r   r   r'   r   r+   r   r   r   r   r   r   r	      s   *
r	   N)r   r   Zdjango.confr   Zdjango.utils.cryptor   r   Zdjango.utils.httpr   r   r	   Zdefault_token_generatorr   r   r   r   <module>   s
   m