o
    ßý°jþ  ã                   @  sÊ   U d dl mZ d dlZd dlZd dlZd dlZd dlZdZdZe	dd„ ej
ejfD ƒƒZded< d	d
ddhdd„ dD ƒ£dd„ dD ƒ£d’d’Zd,dd„Zd-dd„Z	d.d/d!d"„Zd0d%d&„Zd1d*d+„ZdS )2é    )ÚannotationsNÚ>abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789i@B c                 c  s$   � | ]}|d ur|dkr|V  qd S )Nú/© ©Ú.0Úsepr   r   ú„/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/werkzeug/security.pyÚ	<genexpr>   s   € ÿr
   z	list[str]Ú_os_alt_sepsÚAUXÚCONzCONIN$zCONOUT$c                 c  ó   � | ]}d |› �V  qdS )ÚCOMNr   ©r   Úcr   r   r	   r
      ó   € u   123456789Â¹Â²Â³c                 c  r   )ÚLPTNr   r   r   r   r	   r
      r   ÚNULÚPRNÚlengthÚintÚreturnÚstrc                 C  s(   | dkrt dƒ‚d dd„ t| ƒD ƒ¡S )zAGenerate a random string of SALT_CHARS with specified ``length``.r   zSalt length must be at least 1.Ú c                 s  s   � | ]}t  t¡V  qd S ©N)ÚsecretsÚchoiceÚ
SALT_CHARS)r   Ú_r   r   r	   r
   !   r   zgen_salt.<locals>.<genexpr>)Ú
ValueErrorÚjoinÚrange)r   r   r   r	   Úgen_salt   s   r#   ÚmethodÚsaltÚpasswordútuple[str, str]c                 C  s8  |   d¡^} }| ¡ }| ¡ }| dkrS|sd}d}d}nz
tt|ƒ\}}}W n ty2   tdƒd ‚w d| | | }	tj||||||	d� ¡ d	|› d|› d|› �fS | d
kr”t|ƒ}
|
dkrdd}t	}n|
dkro|d }t	}n|
dkr~|d }t|d ƒ}ntdƒ‚t 
||||¡ ¡ d|› d|› �fS td| › d�ƒ‚)Nú:Úscrypti €  é   é   z'scrypt' takes 3 arguments.é„   )r%   ÚnÚrÚpÚmaxmemzscrypt:Úpbkdf2r   Úsha256é   z'pbkdf2' takes 2 arguments.zpbkdf2:zInvalid hash method 'z'.)ÚsplitÚencodeÚmapr   r    Úhashlibr)   ÚhexÚlenÚDEFAULT_PBKDF2_ITERATIONSÚpbkdf2_hmac)r$   r%   r&   ÚargsÚ
salt_bytesÚpassword_bytesr-   r.   r/   r0   Úlen_argsÚ	hash_nameÚ
iterationsr   r   r	   Ú_hash_internal$   sN   
ÿÿüÿürB   r)   é   Úsalt_lengthc                 C  s,   t |ƒ}t||| ƒ\}}|› d|› d|› �S )aD  Securely hash a password for storage. A password can be compared to a stored hash
    using :func:`check_password_hash`.

    The following methods are supported:

    -   ``scrypt``, the default. The parameters are ``n``, ``r``, and ``p``, the default
        is ``scrypt:32768:8:1``. See :func:`hashlib.scrypt`.
    -   ``pbkdf2``, less secure. The parameters are ``hash_method`` and ``iterations``,
        the default is ``pbkdf2:sha256:600000``. See :func:`hashlib.pbkdf2_hmac`.

    Default parameters may be updated to reflect current guidelines, and methods may be
    deprecated and removed if they are no longer considered secure. To migrate old
    hashes, you may generate a new hash when checking an old hash, or you may contact
    users with a link to reset their password.

    :param password: The plaintext password.
    :param method: The key derivation function and parameters.
    :param salt_length: The number of characters to generate for the salt.

    .. versionchanged:: 3.1
        The default iterations for pbkdf2 was increased to 1,000,000.

    .. versionchanged:: 2.3
        Scrypt support was added.

    .. versionchanged:: 2.3
        The default iterations for pbkdf2 was increased to 600,000.

    .. versionchanged:: 2.3
        All plain hashes are deprecated and will not be supported in Werkzeug 3.0.
    ú$)r#   rB   )r&   r$   rD   r%   ÚhÚactual_methodr   r   r	   Úgenerate_password_hashT   s   "rH   ÚpwhashÚboolc                 C  sD   z|   dd¡\}}}W n
 ty   Y dS w t t|||ƒd |¡S )aA  Securely check that the given stored password hash, previously generated using
    :func:`generate_password_hash`, matches the given password.

    Methods may be deprecated and removed if they are no longer considered secure. To
    migrate old hashes, you may generate a new hash when checking an old hash, or you
    may contact users with a link to reset their password.

    :param pwhash: The hashed password.
    :param password: The plaintext password.

    .. versionchanged:: 2.3
        All plain hashes are deprecated and will not be supported in Werkzeug 3.0.
    rE   r3   Fr   )r4   r    ÚhmacÚcompare_digestrB   )rI   r&   r$   r%   Úhashvalr   r   r	   Úcheck_password_hash{   s   ÿrN   Ú	directoryÚ	untrustedú
str | Nonec                   s¢   | sd} | g}|D ]B‰ ˆ sq	t  ˆ ¡‰ tj ˆ ¡sCˆ  d¡sCˆ dksCˆ  d¡sCt‡ fdd„tD ƒƒsCtjdkrFtdd„ ˆ  	d¡D ƒƒrF d	S | 
ˆ ¡ q	t j|Ž S )
aœ  Safely join zero or more untrusted path components to a trusted base
    directory to avoid escaping the base directory.

    The untrusted path is assumed to be from/for a URL, such as for serving
    files. Therefore, it should only use the forward slash ``/`` path separator,
    and will be joined using that separator. On Windows, the backslash ``\``
    separator is not allowed.

    :param directory: The trusted base directory.
    :param untrusted: The untrusted path components relative to the
        base directory.
    :return: A safe path, otherwise ``None``.

    .. versionchanged:: 3.1.6
        Special device names in multi-segment paths are not allowed on Windows.

    .. versionchanged:: 3.1.5
        More special device names, regardless of extension or trailing spaces,
        are not allowed on Windows.

    .. versionchanged:: 3.1.4
        Special device names are not allowed on Windows.
    Ú.r   z..z../c                 3  s   � | ]}|ˆ v V  qd S r   r   r   ©Úpartr   r	   r
   ¼   s   € zsafe_join.<locals>.<genexpr>Úntc                 s  s*   � | ]}|  d ¡d  ¡  ¡ tv V  qdS )rR   r   N)Ú	partitionÚstripÚupperÚ_windows_device_files)r   r/   r   r   r	   r
   ¿   s
   € ÿ
ÿN)Ú	posixpathÚnormpathÚosÚpathÚisabsÚ
startswithÚanyr   Únamer4   Úappendr!   )rO   rP   Úpartsr   rS   r	   Ú	safe_join‘   s0   

ÿýÿþ
þÿ
rd   )r   r   r   r   )r$   r   r%   r   r&   r   r   r'   )r)   rC   )r&   r   r$   r   rD   r   r   r   )rI   r   r&   r   r   rJ   )rO   r   rP   r   r   rQ   )Ú
__future__r   r7   rK   r\   rZ   r   r   r:   Úlistr   Úaltsepr   Ú__annotations__rY   r#   rB   rH   rN   rd   r   r   r   r	   Ú<module>   s<    
ÿüûúùø

1ÿ
'