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    