o
    q>e$                     @   s   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
 ejeef Zeje Zejeje ef ZG dd	 d	ZG d
d deZG dd deZdedeje fddZG dd dZdS )    N   )_base64_alphabet)base64_decode)base64_encode
want_bytes)BadSignaturec                   @   s@   e Zd ZdZdededefddZdedededefdd	Zd
S )SigningAlgorithmzgSubclasses must implement :meth:`get_signature` to provide
    signature generation functionality.
    keyvaluereturnc                 C   s   t  )z2Returns the signature for the given key and value.)NotImplementedErrorselfr
   r    r   T/var/www/bmteknikk.ddns.net/venv/lib/python3.10/site-packages/itsdangerous/signer.pyget_signature   s   zSigningAlgorithm.get_signaturesigc                 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__bytesr   boolr   r   r   r   r   r	      s    r	   c                   @   s&   e Zd ZdZdededefddZdS )NoneAlgorithmz`Provides an algorithm that does not perform any signing and
    returns an empty signature.
    r
   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   r       s    r   c                   @   sN   e Zd ZU dZeejZej	e
d< ddej	fddZdeded	efd
dZdS )HMACAlgorithmz*Provides signature generation using HMACs.default_digest_methodNdigest_methodc                 C   s   |d u r| j }|| _d S N)r    r!   )r   r!   r   r   r   __init__1   s   
zHMACAlgorithm.__init__r
   r   r   c                 C   s   t j||| jd}| S )N)msg	digestmod)r   newr!   digest)r   r
   r   macr   r   r   r   7   s   zHMACAlgorithm.get_signaturer"   )r   r   r   r   staticmethodhashlibsha1r    _tAny__annotations__r#   r   r   r   r   r   r   r   )   s
   
 r   
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>@   s    z#_make_keys_list.<locals>.<listcomp>)
isinstancestrr   r   )r/   r   r   r   _make_keys_list<   s   
r5   c                   @   s   e Zd ZU dZeejZej	e
d< dZee
d< 					d"ded	ed
edeje dejej	 deje fddZedefddZd#dedefddZdedefddZdedefddZdededefddZdedefddZdedef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    django-concatdefault_key_derivation   itsdangerous.Signer   .Nr/   saltsepkey_derivationr!   	algorithmc                 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.r9   )r5   secret_keysr   r<   r   
ValueErrorr;   r8   r=   r    r!   r   r>   )r   r/   r;   r<   r=   r!   r>   r   r   r   r#   x   s&   





zSigner.__init__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.
        )r?   )r   r   r   r   r/      s   
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.
        NrA   concatr7   s   signerr   )r%   nonezUnknown key derivation method)r?   r   r=   r,   castr   r!   r;   r'   r   r&   update	TypeError)r   r/   r(   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   rG   r>   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   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   reversedr?   rG   r>   r   )r   r   r   r/   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   r<   r   rsplitr   )r   rK   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)rN   r   )r   rK   r   r   r   validate   s   
zSigner.validate)r9   r:   NNNr"   )r   r   r   r   r)   r*   r+   r    r,   r-   r.   r8   r4   _t_secret_key_t_opt_str_bytes_t_str_bytesOptionalr	   r#   propertyr   r/   rG   r   rH   r   r   rN   rO   r   r   r   r   r6   C   s<   
 +

.!r6   )r*   r   typingr,   encodingr   r   r   r   excr   Unionr4   r   rR   rS   rQ   IterablerP   r	   r   r   Listr5   r6   r   r   r   r   <module>   s     
	