o
    'h%                     @  s   d dl mZ d dlmZ d dlZd dlZd dl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 G d	d
 d
ZG dd deZddddZG dd deZdddZG dd dZdS )     )annotationsN   )_base64_alphabet)base64_decode)base64_encode
want_bytes)BadSignaturec                   @  s$   e Zd ZdZdddZdd
dZdS )SigningAlgorithmzgSubclasses must implement :meth:`get_signature` to provide
    signature generation functionality.
    keybytesvaluereturnc                 C  s   t  )z2Returns the signature for the given key and value.)NotImplementedErrorselfr   r    r   O/var/www/html/olx_land/venv/lib/python3.10/site-packages/itsdangerous/signer.pyget_signature   s   zSigningAlgorithm.get_signaturesigboolc                 C  s   t || ||S )zMVerifies the given signature matches the expected
        signature.
        )hmaccompare_digestr   )r   r   r   r   r   r   r   verify_signature   s   z!SigningAlgorithm.verify_signatureNr   r   r   r   r   r   )r   r   r   r   r   r   r   r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r
      s    
r
   c                   @  s   e Zd ZdZd	ddZdS )
NoneAlgorithmz`Provides an algorithm that does not perform any signing and
    returns an empty signature.
    r   r   r   r   c                 C  s   dS )N    r   r   r   r   r   r   $   s   zNoneAlgorithm.get_signatureNr   )r   r   r   r   r   r   r   r   r   r      s    r   r    stringr   r   t.Anyc                 C  s
   t | S )zDon't access ``hashlib.sha1`` until runtime. FIPS builds may not include
    SHA-1, in which case the import and use as a default would fail before the
    developer can configure something else.
    )hashlibsha1)r!   r   r   r   
_lazy_sha1(      
r%   c                   @  s8   e Zd ZU dZeeZded< ddddZdddZ	dS )HMACAlgorithmz*Provides signature generation using HMACs.r"   default_digest_methodNdigest_methodc                 C  s   |d u r| j }|| _d S N)r(   r)   )r   r)   r   r   r   __init__8   s   
zHMACAlgorithm.__init__r   r   r   r   c                 C  s   t j||| jd}| S )N)msg	digestmod)r   newr)   digest)r   r   r   macr   r   r   r   >   s   zHMACAlgorithm.get_signaturer*   )r)   r"   r   )
r   r   r   r   staticmethodr%   r(   __annotations__r+   r   r   r   r   r   r'   0   s
   
 r'   
secret_key7str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes]list[bytes]c                 C  s&   t | ttfrt| gS dd | D S )Nc                 S  s   g | ]}t |qS r   r   ).0sr   r   r   
<listcomp>I   s    z#_make_keys_list.<locals>.<listcomp>)
isinstancestrr   r   )r3   r   r   r   _make_keys_listC   s   
r;   c                   @  s   e Zd ZU dZeeZded< dZded< 								d,d-ddZ	e
d.ddZd/d0ddZd1dd Zd1d!d"Zd2d%d&Zd3d(d)Zd4d*d+Zd	S )5Signera  A signer securely signs bytes, then unsigns them to verify that
    the value hasn't been changed.

    The secret key should be a random string of ``bytes`` and should not
    be saved to code or version control. Different salts should be used
    to distinguish signing in different contexts. See :doc:`/concepts`
    for information about the security of the secret key and salt.

    :param secret_key: The secret key to sign and verify with. Can be a
        list of keys, oldest to newest, to support key rotation.
    :param salt: Extra key to combine with ``secret_key`` to distinguish
        signatures in different contexts.
    :param sep: Separator between the signature and value.
    :param key_derivation: How to derive the signing key from the secret
        key and salt. Possible values are ``concat``, ``django-concat``,
        or ``hmac``. Defaults to :attr:`default_key_derivation`, which
        defaults to ``django-concat``.
    :param digest_method: Hash function to use when generating the HMAC
        signature. Defaults to :attr:`default_digest_method`, which
        defaults to :func:`hashlib.sha1`. Note that the security of the
        hash alone doesn't apply when used intermediately in HMAC.
    :param algorithm: A :class:`SigningAlgorithm` instance to use
        instead of building a default :class:`HMACAlgorithm` with the
        ``digest_method``.

    .. versionchanged:: 2.0
        Added support for key rotation by passing a list to
        ``secret_key``.

    .. versionchanged:: 0.18
        ``algorithm`` was added as an argument to the class constructor.

    .. versionchanged:: 0.14
        ``key_derivation`` and ``digest_method`` were added as arguments
        to the class constructor.
    r"   r(   django-concatr:   default_key_derivation   itsdangerous.Signer   .Nr3   r4   saltstr | bytes | Nonesepstr | byteskey_derivation
str | Noner)   t.Any | None	algorithmSigningAlgorithm | Nonec                 C  s   t || _t|| _| jtv rtd|d urt|}nd}|| _|d u r(| j}|| _|d u r2| j	}|| _
|d u r>t| j
}|| _d S )NzThe given separator cannot be used because it may be contained in the signature itself. ASCII letters, digits, and '-_=' must not be used.r?   )r;   secret_keysr   rC   r   
ValueErrorrA   r>   rE   r(   r)   r'   rH   )r   r3   rA   rC   rE   r)   rH   r   r   r   r+      s&   





zSigner.__init__r   r   c                 C  s
   | j d S )zThe newest (last) entry in the :attr:`secret_keys` list. This
        is for compatibility from before key rotation support was added.
        )rJ   )r   r   r   r   r3      r&   zSigner.secret_keyc                 C  s   |du r
| j d }nt|}| jdkr!tt| | j|  S | jdkr6tt| | jd |  S | jdkrMt	j
|| jd}|| j | S | jdkrT|S td	)
a  This method is called to derive the key. The default key
        derivation choices can be overridden here. Key derivation is not
        intended to be used as a security method to make a complex key
        out of a short password. Instead you should use large random
        secret keys.

        :param secret_key: A specific secret key to derive from.
            Defaults to the last item in :attr:`secret_keys`.

        .. versionchanged:: 2.0
            Added the ``secret_key`` parameter.
        NrL   concatr=   s   signerr   )r-   nonezUnknown key derivation method)rJ   r   rE   tcastr   r)   rA   r/   r   r.   update	TypeError)r   r3   r0   r   r   r   
derive_key   s    



zSigner.derive_keyr   c                 C  s&   t |}|  }| j||}t|S )z*Returns the signature for the given value.)r   rS   rH   r   r   )r   r   r   r   r   r   r   r      s   zSigner.get_signaturec                 C  s   t |}|| j | | S )zSigns the given string.)r   rC   r   )r   r   r   r   r   sign   s   zSigner.signr   r   c                 C  s^   zt |}W n
 ty   Y dS w t|}t| jD ]}| |}| j|||r, dS qdS )z+Verifies the signature for the given value.FT)r   	Exceptionr   reversedrJ   rS   rH   r   )r   r   r   r3   r   r   r   r   r      s   
zSigner.verify_signaturesigned_valuec                 C  sZ   t |}| j|vrtd| jd|| jd\}}| ||r#|S td|d|d)zUnsigns the given string.zNo z found in valuer   z
Signature z does not match)payload)r   rC   r	   rsplitr   )r   rW   r   r   r   r   r   unsign   s   
zSigner.unsignc                 C  s&   z|  | W dS  ty   Y dS w )znOnly validates the given signed value. Returns ``True`` if
        the signature exists and is valid.
        TF)rZ   r	   )r   rW   r   r   r   validate  s   
zSigner.validate)r?   r@   NNN)r3   r4   rA   rB   rC   rD   rE   rF   r)   rG   rH   rI   )r   r   r*   )r3   rB   r   r   )r   rD   r   r   )r   rD   r   rD   r   r   )rW   rD   r   r   )rW   rD   r   r   )r   r   r   r   r1   r%   r(   r2   r>   r+   propertyr3   rS   r   rT   r   rZ   r[   r   r   r   r   r<   L   s$   
 +.
!


r<   )r    )r!   r   r   r"   )r3   r4   r   r5   )
__future__r   collections.abcabccabcr#   r   typingrO   encodingr   r   r   r   excr	   r
   r   r%   r'   r;   r<   r   r   r   r   <module>   s     	
	