a
    Ô×0h¯%  ã                   @  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   úA/var/www/auris/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 )zÈDon'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 )NzŠThe 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ršt	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   		