o
    uähÐ  ã                   @   sÖ   d dl Z d dlmZ d dlmZmZmZ d dlmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ dedƒfdedee defdd„Zdedƒfdedee defdd„Zdedefdd„ZdS )é    N)Úsplit)ÚAnyÚDictÚSequence)Ú	parse_qslÚunquoteÚurlparseé   )Úcontrib)Úrandom)ÚHOTP)ÚOTP)ÚTOTPé    Ú ABCDEFGHIJKLMNOPQRSTUVWXYZ234567ÚlengthÚcharsÚreturnc                    s,   | dk rt dƒ‚d ‡ fdd„t| ƒD ƒ¡S )Nr   ú#Secrets should be at least 160 bitsÚ c                 3   s   � | ]}t  ˆ ¡V  qd S )N)r   Úchoice)Ú.0Ú_©r   © úA/var/www/html/venv/lib/python3.10/site-packages/pyotp/__init__.pyÚ	<genexpr>   s   € z random_base32.<locals>.<genexpr>)Ú
ValueErrorÚjoinÚrange©r   r   r   r   r   Úrandom_base32   s   r!   é(   ÚABCDEF0123456789c                 C   s   | dk rt dƒ‚t| |d�S )Nr"   r   r    )r   r!   r    r   r   r   Ú
random_hex   s   r$   Úuric           	      C   s  d}d}d}i }t t| ƒƒ}|jdkrtdƒ‚td|jdd… dd�}t|ƒdkr0|d |d< n|d |d	< |d |d< t|jƒD ]ƒ\}}|d
krL|}qA|d	krid	|v rd|d	 durd|d	 |krdtdƒ‚||d	< qA|dkr�|dkrwt	j
|d< qA|dkr�t	j|d< qA|dkr‹t	j|d< qAtdƒ‚|dkr–|}qA|dkr£t|ƒ}||d< qA|dkr®t|ƒ|d< qA|dkr¹t|ƒ|d< qA|dkrÄtd |¡ƒ‚qA|dkrÕ|durÕ|dvrÕtdƒ‚|sÛtdƒ‚|dkrètj|fi |¤ŽS |jdkrõt|fi |¤ŽS |jdk�rt|fi |¤ŽS td ƒ‚)!zð
    Parses the provisioning URI for the OTP; works for either TOTP or HOTP.

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

    :param uri: the hotp/totp URI to parse
    :returns: OTP object
    NÚotpauthzNot an otpauth URIz:|%3Ar	   )Úmaxsplitr   ÚnameÚissuerÚsecretzHIf issuer is specified in both label and parameters, it should be equal.Ú	algorithmÚSHA1ÚdigestÚSHA256ÚSHA512z;Invalid value for algorithm, must be SHA1, SHA256 or SHA512ÚencoderÚdigitsÚperiodÚintervalÚcounterÚinitial_countÚimagez{} is not a valid parameterÚsteam)é   é   é   zDigits may only be 6, 7, or 8zNo secret found in URIÚtotpÚhotpzNot a supported OTP type)r   r   Úschemer   r   ÚpathÚlenr   ÚqueryÚhashlibÚsha1Úsha256Úsha512ÚintÚformatr
   ÚSteamÚnetlocr   r   )	r%   r*   r0   r1   Úotp_dataÚ
parsed_uriÚaccountinfo_partsÚkeyÚvaluer   r   r   Ú	parse_uri   sf   
 

ÿ
rN   )rA   Úrer   Útypingr   r   r   Úurllib.parser   r   r   r   r
   Úcompatr   r<   r   Úotpr   r;   r   ÚlistrE   Ústrr!   r$   rN   r   r   r   r   Ú<module>   s    $$
