a
    ai%                     @  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ddZG dd deZdddddZG dd dZdS )    )annotationsN   )_base64_alphabet)base64_decode)base64_encode
want_bytes)BadSignaturec                   @  s6   e Zd ZdZddddddZddddddd	Zd
S )SigningAlgorithmzgSubclasses must implement :meth:`get_signature` to provide
    signature generation functionality.
    byteskeyvaluereturnc                 C  s
   t  dS )z2Returns the signature for the given key and value.N)NotImplementedErrorselfr   r    r   M/var/www/html/SiteWeb/venv/lib/python3.9/site-packages/itsdangerous/signer.pyget_signature   s    zSigningAlgorithm.get_signaturebool)r   r   sigr   c                 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)__name__
__module____qualname____doc__r   r   r   r   r   r   r
      s   r
   c                   @  s"   e Zd ZdZddddddZdS )NoneAlgorithmz`Provides an algorithm that does not perform any signing and
    returns an empty signature.
    r   r   c                 C  s   dS )N    r   r   r   r   r   r   $   s    zNoneAlgorithm.get_signatureN)r   r   r   r   r   r   r   r   r   r      s   r   r    r   t.Any)stringr   c                 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(   s    r%   c                   @  sD   e Zd ZU dZeeZded< dddddZddd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   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_signature)N)
r   r   r   r   staticmethodr%   r'   __annotations__r)   r   r   r   r   r   r&   0   s   
r&   7str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes]zlist[bytes]
secret_keyr   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   r    z#_make_keys_list.<locals>.<listcomp>)
isinstancestrr   r   )r3   r   r   r   _make_keys_listC   s    
r9   c                   @  s   e Zd ZU dZeeZded< dZded< d(d
ddddddddZ	e
ddddZd)dddddZdddddZdddddZdddd d!d"Zddd#d$d%Zddd#d&d'Zd	S )*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-concatr8   default_key_derivation   itsdangerous.Signer   .Nr1   zstr | bytes | Nonezstr | bytesz
str | Nonezt.Any | NonezSigningAlgorithm | None)r3   saltsepkey_derivationr(   	algorithmc                 C  s   t || _t|| _| jtv r&td|d ur8t|}nd}|| _|d u rP| j}|| _|d u rd| 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=   )r9   secret_keysr   r@   r   
ValueErrorr?   r<   rA   r'   r(   r&   rB   )r   r3   r?   r@   rA   r(   rB   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.
        )rC   )r   r   r   r   r3      s    zSigner.secret_keyr2   c                 C  s   |du r| j d }nt|}| jdkrBtt| | j|  S | jdkrltt| | jd |  S | jdkrt	j
|| jd}|| j | S | jdkr|S td	dS )
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.
        NrE   concatr;   s   signerr   )r+   nonezUnknown key derivation method)rC   r   rA   tcastr   r(   r?   r-   r   r,   update	TypeError)r   r3   r.   r   r   r   
derive_key   s     



zSigner.derive_key)r   r   c                 C  s&   t |}|  }| j||}t|S )z*Returns the signature for the given value.)r   rL   rB   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   r@   r   )r   r   r   r   r   sign   s    zSigner.signr   )r   r   r   c                 C  s^   zt |}W n ty    Y dS 0 t|}t| jD ]$}| |}| j|||r4 dS q4dS )z+Verifies the signature for the given value.FT)r   	Exceptionr   reversedrC   rL   rB   r   )r   r   r   r3   r   r   r   r   r      s    
zSigner.verify_signature)signed_valuer   c                 C  s^   t |}| j|vr$td| jd|| jd\}}| ||rF|S td|d|ddS )zUnsigns the given string.zNo z found in valuer   z
Signature z does not match)payloadN)r   r@   r	   rsplitr   )r   rP   r   r   r   r   r   unsign   s    
zSigner.unsignc                 C  s*   z|  | W dS  ty$   Y dS 0 dS )znOnly validates the given signed value. Returns ``True`` if
        the signature exists and is valid.
        TFN)rS   r	   )r   rP   r   r   r   validate  s
    
zSigner.validate)r=   r>   NNN)N)r   r   r   r   r/   r%   r'   r0   r<   r)   propertyr3   rL   r   rM   r   rS   rT   r   r   r   r   r:   L   s"   
+     .!r:   )r    )
__future__r   collections.abcabcZcabcr#   r   typingrH   encodingr   r   r   r   excr	   r
   r   r%   r&   r9   r:   r   r   r   r   <module>   s   		