o
    5h                     @   s   d Z ddlZeeZddlmZmZ ddlm	Z	 ddl
mZmZmZ ddlmZ ddlm  mZ g ZdZG dd	 d	ejejejejZdS )
zpasslib.handlers.sha1_crypt
    N)
safe_crypt
test_crypt)h64)uunicodeirange)compile_hmac    c                   @   s   e Zd ZdZd ZdZedZdZe	j
ZdZdZe	j
ZdZdZd	Zd
Zedd ZdddZdZedd Zdd Zedd Zdd Zg dZdS )
sha1_crypta&  This class implements the SHA1-Crypt password hash, and follows the :ref:`password-hash-api`.

    It supports a variable-length salt, and a variable number of rounds.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, an 8 character one will be autogenerated (this is recommended).
        If specified, it must be 0-64 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :type salt_size: int
    :param salt_size:
        Optional number of bytes to use when autogenerating new salts.
        Defaults to 8 bytes, but can be any value between 0 and 64.

    :type rounds: int
    :param rounds:
        Optional number of rounds to use.
        Defaults to 480000, must be between 1 and 4294967295, inclusive.

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include ``rounds``
        that are too small or too large, and ``salt`` strings that are too long.

        .. versionadded:: 1.6
    )salt	salt_sizeroundsz$sha1$      @   i S    l    linearc                 C   s&   t j|| j| d\}}}| |||dS )N)handler)r   r   checksum)uh	parse_mc3ident)clshashr   r   chk r   o/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/passlib/handlers/sha1_crypt.pyfrom_stringS   s   zsha1_crypt.from_stringFc                 C   s$   |rd n| j }t| j| j| j|S )N)r   r   
render_mc3r   r   r   )selfconfigr   r   r   r   	to_stringX   s   zsha1_crypt.to_string)os_cryptbuiltinc                 C   s   t ddr| | j dS dS )Ntestz-$sha1$1$Wq3GL2Vp$C8U25GvfHS8qGHimExLaiSFlGkAeTF)r   _set_calc_checksum_backend_calc_checksum_os_cryptr   r   r   r   _load_backend_os_cryptd   s   
z!sha1_crypt._load_backend_os_cryptc                 C   sb   | j dd}t||}|d u r| |S ||r#t|t|d kr+tj| |||dd  S )NT)r       i)r!   r   _calc_checksum_builtin
startswithlenr   excCryptBackendError)r   secretr    r   r   r   r   r&   m   s   

z"sha1_crypt._calc_checksum_os_cryptc                 C   s   |  | j dS )NT)r%   r*   r'   r   r   r   _load_backend_builtin{   s   z sha1_crypt._load_backend_builtinc                 C   sz   t |tr
|d}t|v rtj| | j}td| j	|f d}t
d|}t|D ]}||}q,t|| jdS )Nzutf-8z
%s$sha1$%sasciisha1)
isinstancer   encode_BNULLr   r-   NullPasswordErrorr   r   r   r   r   r   encode_transposed_bytes_chk_offsetsdecode)r   r/   r   result
keyed_hmac_r   r   r   r*      s   



z!sha1_crypt._calc_checksum_builtin)   r   r            r            
   	                     r         N)F)__name__
__module____qualname____doc__namesetting_kwdsr   r   checksum_sizer   HASH64_CHARSchecksum_charsdefault_salt_sizemax_salt_size
salt_charsdefault_rounds
min_rounds
max_roundsrounds_costclassmethodr   r!   backendsr(   r&   r0   r*   r8   r   r   r   r   r
      s2    %



r
   )rQ   logging	getLoggerrN   logpasslib.utilsr   r   passlib.utils.binaryr   passlib.utils.compatr   r   r   passlib.crypto.digestr   passlib.utils.handlersutilshandlersr   __all__r5   HasManyBackends	HasRoundsHasSaltGenericHandlerr
   r   r   r   r   <module>   s    "