o
    uh                      @   s`   d dl Z d dlZd dlZd dlZd dlmZmZmZ ddlm	Z	 ddl
mZ G dd deZdS )    N)AnyOptionalUnion   )utils)OTPc                       s   e Zd ZdZ					ddedededee d	ee d
eddf fddZd de	ee
j
f dedefddZdefddZd!dedee
j
 dedefddZ	d"dee dee dee defddZde
j
defddZ  ZS )#TOTPz.
    Handler for time-based OTP counters.
       N   sdigitsdigestnameissuerintervalreturnc                    s.   |du rt j}|| _t j|||||d dS )a  
        :param s: secret in base32 format
        :param interval: the time interval in seconds for OTP. This defaults to 30.
        :param digits: number of integers in the OTP. Some apps expect this to be 6 digits, others support more.
        :param digest: digest function to use in the HMAC (expected to be SHA1)
        :param name: account name
        :param issuer: issuer
        N)r   r   r   r   r   )hashlibsha1r   super__init__)selfr   r   r   r   r   r   	__class__ =/var/www/html/venv/lib/python3.10/site-packages/pyotp/totp.pyr      s   zTOTP.__init__r   for_timecounter_offsetc                 C   s0   t |tjstjt|}| | || S )a  
        Accepts either a Unix timestamp integer or a datetime object.

        To get the time until the next timecode change (seconds until the current OTP expires), use this instead:

        .. code:: python

            totp = pyotp.TOTP(...)
            time_remaining = totp.interval - datetime.datetime.now().timestamp() % totp.interval

        :param for_time: the time to generate an OTP for
        :param counter_offset: the amount of ticks to add to the time counter
        :returns: OTP value
        )
isinstancedatetimefromtimestampintgenerate_otptimecode)r   r   r   r   r   r   at'   s   zTOTP.atc                 C   s   |  | tj S )zL
        Generate the current time OTP

        :returns: OTP value
        )r!   r"   r   now)r   r   r   r   r$   :   s   zTOTP.nowotpvalid_windowc              	   C   sl   |du r	t j  }|r)t| |d D ]}tt|t| ||r& dS qdS tt|t| |S )ah  
        Verifies the OTP passed in against the current time OTP.

        :param otp: the OTP to check against
        :param for_time: Time to check OTP at (defaults to now)
        :param valid_window: extends the validity to this many counter ticks before and after the current one
        :returns: True if verification succeeded, False otherwise
        Nr   TF)r   r$   ranger   strings_equalstrr#   )r   r%   r   r&   ir   r   r   verifyB   s   	
zTOTP.verifyissuer_nameimagec              	   C   s8   t j| j|r|n| j|r|n| j|  j| j| j|dS )a  
        Returns the provisioning URI for the OTP.  This can then be
        encoded in a QR Code and used to provision an OTP app like
        Google Authenticator.

        See also:
            https://github.com/google/google-authenticator/wiki/Key-Uri-Format

        )r   	algorithmr   periodr-   )r   	build_urisecretr   r   r   r   r   )r   r   r,   r-   r   r   r   provisioning_uriV   s   zTOTP.provisioning_uric                 C   s6   |j rtt| | j S tt| | j S )z
        Accepts either a timezone naive (`for_time.tzinfo is None`) or
        a timezone aware datetime as argument and returns the
        corresponding counter value (timecode).

        )	tzinfor    calendartimegmutctimetupler   timemktime	timetuple)r   r   r   r   r   r"   m   s   zTOTP.timecode)r	   NNNr
   )r   )Nr   )NNN)__name__
__module____qualname____doc__r)   r    r   r   r   r   r   r#   r$   boolr+   r2   r"   __classcell__r   r   r   r   r      sH    ""
r   )r4   r   r   r7   typingr   r   r    r   r%   r   r   r   r   r   r   <module>   s    