o
    >hD"                     @   s*  d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZ edZd	ZG d
d deZG dd deZdd Zdd Zdd Zdd Zd*ddZdd Zd+ddZG dd dZdd ed!fd"d#Zdd eddfd$d%ZG d&d' d'Z G d(d) d)e Z!dS ),a_  
Functions for creating and restoring url-safe signed JSON objects.

The format used looks like this:

>>> signing.dumps("hello")
'ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv422nZA4sgmk'

There are two components here, separated by a ':'. The first component is a
URLsafe base64 encoded JSON of the object passed to dumps(). The second
component is a base64 encoded hmac/SHA-256 hash of "$first_component:$secret"

signing.loads(s) checks the signature and returns the deserialized object.
If the signature fails, a BadSignature exception is raised.

>>> signing.loads("ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv422nZA4sgmk")
'hello'
>>> signing.loads("ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv42-modified")
...
BadSignature: Signature "ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv42-modified" does not match

You can optionally compress the JSON prior to base64 encoding it to save
space, using the compress=True argument. This checks if compression actually
helps and only applies compression if the result is a shorter string:

>>> signing.dumps(list(range(1, 20)), compress=True)
'.eJwFwcERACAIwLCF-rCiILN47r-GyZVJsNgkxaFxoDgxcOHGxMKD_T7vhAml:1QaUaL:BA0thEZrp4FQVXIXuOvYJtLJSrQ'

The fact that the string is compressed is signalled by the prefixed '.' at the
start of the base64 JSON.

There are 65 url-safe characters: the 64 used by url-safe base64 and the ':'.
These functions make use of all of them.
    N)settings)constant_time_comparesalted_hmacforce_bytes)import_string)_lazy_re_compilez^[A-z0-9-_=]*$>0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzc                   @      e Zd ZdZdS )BadSignaturezSignature does not match.N__name__
__module____qualname____doc__ r   r   s/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/django/core/signing.pyr   4       r   c                   @   r
   )SignatureExpiredz3Signature timestamp is older than required max_age.Nr   r   r   r   r   r   :   r   r   c                 C   sZ   | dkrdS | dk rdnd}t | } d}| dkr)t| d\} }t| | }| dks|| S )Nr   0- >   )absdivmodBASE62_ALPHABET)ssignencoded	remainderr   r   r   
b62_encode@   s   r    c                 C   sT   | dkrdS d}| d dkr| dd  } d}d}| D ]}|d t | }q|| S )Nr   r      r   r   )r   index)r   r   decodeddigitr   r   r   
b62_decodeL   s   r&   c                 C   s   t | dS )N   =)base64urlsafe_b64encodestrip)r   r   r   r   
b64_encodeY      r+   c                 C   s    dt |  d  }t| | S )Nr'      )lenr(   urlsafe_b64decode)r   padr   r   r   
b64_decode]   s   r1   sha1c                 C   s   t t| |||d  S )N	algorithm)r+   r   digestdecode)saltvaluekeyr4   r   r   r   base64_hmacb   s
   r:   c                 C   s   dt |  S )Ns   django.http.cookiesr   )r9   r   r   r   _cookie_signer_keyh   s   r;   %django.core.signing.get_cookie_signerc                 C   s&   t tj}|ttjtttj| dS )N)r9   fallback_keysr7   )r   r   SIGNING_BACKENDr;   
SECRET_KEYmapSECRET_KEY_FALLBACKS)r7   Signerr   r   r   get_cookie_signerm   s   

rC   c                   @   s    e Zd ZdZdd Zdd ZdS )JSONSerializerzW
    Simple wrapper around json to be used in signing.dumps and
    signing.loads.
    c                 C   s   t j|dddS )N),:)
separatorslatin-1)jsondumpsencode)selfobjr   r   r   rJ   |   s   zJSONSerializer.dumpsc                 C   s   t |dS )NrH   )rI   loadsr6   )rL   datar   r   r   rN      r,   zJSONSerializer.loadsN)r   r   r   r   rJ   rN   r   r   r   r   rD   v   s    rD   zdjango.core.signingFc                 C   s   t ||dj| ||dS )a  
    Return URL-safe, hmac signed base64 compressed JSON string. If key is
    None, use settings.SECRET_KEY instead. The hmac algorithm is the default
    Signer algorithm.

    If compress is True (not the default), check if compressing using zlib can
    save some space. Prepend a '.' to signify compression. This is included
    in the signature, to protect against zip bombs.

    Salt can be used to namespace the hash, so that a signed string is
    only valid for a given namespace. Leaving this at the default
    value or re-using a salt value across different parts of your
    application without good cause is a security risk.

    The serializer is expected to return a bytestring.
    )r9   r7   )
serializercompress)TimestampSignersign_object)rM   r9   r7   rP   rQ   r   r   r   rJ      s   rJ   c                 C   s   t |||dj| ||dS )z|
    Reverse of dumps(), raise BadSignature if signature fails.

    The serializer is expected to accept a bytestring.
    )r9   r7   r=   )rP   max_age)rR   unsign_object)r   r9   r7   rP   rT   r=   r   r   r   rN      s   rN   c                   @   sV   e Zd ZddddddddZdddZdd	 Zd
d ZedfddZefddZ	dS )rB   NrF   )r9   sepr7   r4   r=   c                C   sf   |pt j| _|d ur|nt j| _|| _|pd| jj| jjf | _	|p#d| _
t| jr1td| d S )Nz%s.%ssha256zJUnsafe Signer separator: %r (cannot be empty or consist of only A-z0-9-_=))r   r?   r9   rA   r=   rV   	__class__r   r   r7   r4   _SEP_UNSAFEmatch
ValueError)rL   r9   rV   r7   r4   r=   r   r   r   __init__   s$   
zSigner.__init__c                 C   s"   |p| j }t| jd ||| jdS )Nsignerr3   )r9   r:   r7   r4   )rL   r8   r9   r   r   r   	signature   s   
zSigner.signaturec                 C   s   d|| j | |f S Nz%s%s%s)rV   r^   rL   r8   r   r   r   r      s   zSigner.signc                 C   sd   | j |vrtd| j  || j d\}}| jg| jD ]}t|| ||r+|  S qtd| )NzNo "%s" found in valuer!   zSignature "%s" does not match)rV   r   rsplitr9   r=   r   r^   )rL   signed_valuer8   sigr9   r   r   r   unsign   s   
zSigner.unsignFc                 C   s\   |  |}d}|rt|}t|t|d k r|}d}t| }|r)d| }| |S )ae  
        Return URL-safe, hmac signed base64 compressed JSON string.

        If compress is True (not the default), check if compressing using zlib
        can save some space. Prepend a '.' to signify compression. This is
        included in the signature, to protect against zip bombs.

        The serializer is expected to return a bytestring.
        Fr!   T.)rJ   zlibrQ   r.   r+   r6   r   )rL   rM   rP   rQ   rO   is_compressed
compressedbase64dr   r   r   rS      s   


zSigner.sign_objectc                 K   sX   | j |fi | }|d d dk}|r|dd  }t|}|r&t|}| |S )Nr!      .)rd   rK   r1   rf   
decompressrN   )rL   
signed_objrP   kwargsri   rk   rO   r   r   r   rU      s   
zSigner.unsign_objectN)
r   r   r   r\   r^   r   rd   rD   rS   rU   r   r   r   r   rB      s    

	rB   c                       s2   e Zd Zdd Z fddZd fdd	Z  ZS )	rR   c                 C   s   t tt S rn   )r    inttime)rL   r   r   r   	timestamp   r,   zTimestampSigner.timestampc                    s    d|| j |  f }t |S r_   )rV   rq   superr   r`   rX   r   r   r     s   zTimestampSigner.signNc                    sj   t  |}|| jd\}}t|}|dur3t|tjr!| }t		 | }||kr3t
d||f |S )zk
        Retrieve original value and check it wasn't signed more
        than max_age seconds ago.
        r!   NzSignature age %s > %s seconds)rr   rd   ra   rV   r&   
isinstancedatetime	timedeltatotal_secondsrp   r   )rL   r8   rT   resultrq   agers   r   r   rd     s   zTimestampSigner.unsignrn   )r   r   r   rq   r   rd   __classcell__r   r   rs   r   rR      s    rR   )r2   )r<   )"r   r(   ru   rI   rp   rf   django.confr   django.utils.cryptor   r   django.utils.encodingr   django.utils.module_loadingr   django.utils.regex_helperr   rY   r   	Exceptionr   r   r    r&   r+   r1   r:   r;   rC   rD   rJ   rN   rB   rR   r   r   r   r   <module>   sB    #

	

M