o
    {,h                     @   sP   d dl 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)settings)constant_time_comparesalted_hmac)base36_to_intint_to_base36c                   @   s   e Zd ZdZdZdZdZdZdd Zdd Z	dd	 Z
ee	e
Zd
d Zdd ZeeeZdd Zdd Z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d| _ d S )Nsha256)	algorithmself r   P/var/www/html/rh/venv/lib/python3.10/site-packages/django/contrib/auth/tokens.py__init__   s   z$PasswordResetTokenGenerator.__init__c                 C   s   | j ptjS N)_secretr   
SECRET_KEYr   r   r   r   _get_secret   s   z'PasswordResetTokenGenerator._get_secretc                 C   
   || _ d S r   )r   )r   secretr   r   r   _set_secret      
z'PasswordResetTokenGenerator._set_secretc                 C   s   | j d u rtjS | j S r   )_secret_fallbacksr   SECRET_KEY_FALLBACKSr   r   r   r   _get_fallbacks   s   
z*PasswordResetTokenGenerator._get_fallbacksc                 C   r   r   )r   )r   	fallbacksr   r   r   _set_fallbacks#   r   z*PasswordResetTokenGenerator._set_fallbacksc                 C   s   |  || |  | 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_nowr   )r   userr   r   r   
make_token(   s
   z&PasswordResetTokenGenerator.make_tokenc                 C   s   |r|sdS z	| d\}}W n
 ty   Y dS w zt|}W n
 ty*   Y dS w | jg| jD ]}t| ||||r@ nq2dS | |  | t	j
krQdS dS )zP
        Check that a password reset token is correct for a given user.
        F-T)split
ValueErrorr   r   secret_fallbacksr   r   r   r   r   PASSWORD_RESET_TIMEOUT)r   r    tokents_b36_tsr   r   r   r   check_token3   s.   z'PasswordResetTokenGenerator.check_tokenc                 C   s>   t |}t| j| |||| jd d d d }d||f S )N)r   r
      z%s-%s)r   r   key_salt_make_hash_valuer
   	hexdigest)r   r    	timestampr   r(   hash_stringr   r   r   r   T   s   
z6PasswordResetTokenGenerator._make_token_with_timestampc                 C   sR   |j du rdn|j jddd}| }t||dpd}|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)
last_loginreplaceget_email_field_namegetattrpkpassword)r   r    r0   login_timestampemail_fieldemailr   r   r   r.   b   s   
z,PasswordResetTokenGenerator._make_hash_valuec                 C   s   t |tddd  S )Ni     )intr   total_seconds)r   dtr   r   r   r   |   s   z(PasswordResetTokenGenerator._num_secondsc                 C   s   t  S r   )r   nowr   r   r   r   r      s   z PasswordResetTokenGenerator._now)__name__
__module____qualname____doc__r-   r
   r   r   r   r   r   propertyr   r   r   r%   r!   r+   r   r.   r   r   r   r   r   r   r      s&    

!r   N)r   django.confr   django.utils.cryptor   r   django.utils.httpr   r   r   default_token_generatorr   r   r   r   <module>   s    
|