
    GWPih%                     R   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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 ddlmZ  ed	      Zd
Z G d de      Z G d de      Zd Zd Zd Zd Zd dZd Zd!dZ G d d      Z dde dfdZ!dde ddfdZ" G d d      Z# G d de#      Z$y)"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)RemovedInDjango51Warningforce_bytes)import_string)_lazy_re_compilez^[A-z0-9-_=]*$>0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzc                       e Zd ZdZy)BadSignaturezSignature does not match.N__name__
__module____qualname____doc__     I/root/twitch_bot/venv/lib/python3.12/site-packages/django/core/signing.pyr   r   6   s    #r   r   c                       e Zd ZdZy)SignatureExpiredz3Signature timestamp is older than required max_age.Nr   r   r   r   r   r   <   s    =r   r   c                     | dk(  ry| dk  rdnd}t        |       } d}| dkD  r!t        | d      \  } }t        |   |z   }| dkD  r!||z   S )Nr   0- >   )absdivmodBASE62_ALPHABET)ssignencoded	remainders       r   
b62_encoder$   B   sa    Ava%3RDAAG
a%a}9!),w6 a% '>r   c                     | dk(  ryd}| d   dk(  r| dd  } d}d}| D ]  }|dz  t         j                  |      z   } ||z  S )Nr   r      r   r   )r   index)r    r!   decodeddigits       r   
b62_decoder+   N   sc    CxDts{abEG >B,!6!6u!==>'>r   c                 J    t        j                  |       j                  d      S )N   =)base64urlsafe_b64encodestrip)r    s    r   
b64_encoder1   [   s    ##A&,,T22r   c                 V    dt        |        dz  z  }t        j                  | |z         S )Nr-      )lenr.   urlsafe_b64decode)r    pads     r   
b64_decoder7   _   s+    
3q6'A+
C##AG,,r   c                 j    t        t        | |||      j                               j                         S )N	algorithm)r1   r   digestdecode)saltvaluekeyr:   s       r   base64_hmacr@   d   s-    D%	:AACfhr   c                     dt        |       z   S )Ns   django.http.cookiesr   )r?   s    r   _cookie_signer_keyrB   j   s    !K$444r   c                     t        t        j                        } |t        t        j                        t        t        t        j                        |       S )N)r?   fallback_keysr=   )r	   r   SIGNING_BACKENDrB   
SECRET_KEYmapSECRET_KEY_FALLBACKS)r=   Signers     r   get_cookie_signerrJ   o   sA    8334Fx223,h.K.KL r   c                       e Zd ZdZd Zd Zy)JSONSerializerzW
    Simple wrapper around json to be used in signing.dumps and
    signing.loads.
    c                 N    t        j                  |d      j                  d      S )N),:)
separatorslatin-1)jsondumpsencode)selfobjs     r   rS   zJSONSerializer.dumps~   s    zz#*5<<YGGr   c                 J    t        j                  |j                  d            S )NrQ   )rR   loadsr<   )rU   datas     r   rX   zJSONSerializer.loads   s    zz$++i011r   N)r   r   r   r   rS   rX   r   r   r   rL   rL   x   s    
H2r   rL   zdjango.core.signingFc                 @    t        ||      j                  | ||      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.
    )r?   r=   )
serializercompress)TimestampSignersign_object)rV   r?   r=   r[   r\   s        r   rS   rS      s*    & s.::
X ;  r   c                 B    t        |||      j                  | ||      S )z|
    Reverse of dumps(), raise BadSignature if signature fails.

    The serializer is expected to accept a bytestring.
    )r?   r=   rD   )r[   max_age)r]   unsign_object)r    r?   r=   r[   r`   rD   s         r   rX   rX      s0     d-m	  r   c                   J    e Zd ZdddddddZddZd Zd Zedfd	Zefd
Z	y)rI   NrO   r?   sepr=   r:   rD   c                   |xs t         j                  | _        ||nt         j                  | _        || _        |xs/ | j                  j                  d| j                  j                  | _	        |xs d| _
        |r_t        j                  d| j                  j                   dt        d       t        |g d      D ]  \  }}|s|dk(  st        | ||        t         j#                  | j
                        rt%        d	|z        y )
N.sha256z Passing positional arguments to z is deprecated.   )
stacklevelrc   rd   zJUnsafe Signer separator: %r (cannot be empty or consist of only A-z0-9-_=))r   rF   r?   rH   rD   rd   	__class__r   r   r=   r:   warningswarnr   zipsetattr_SEP_UNSAFEmatch
ValueError)	rU   r?   rd   r=   r:   rD   argsargattrs	            r   __init__zSigner.__init__   s    -(-- ( .. 	
  
NN%%NN##
	 #.hMM24>>3J3J2K L (	 !J -	T $%-D$,	-
 TXX&"$'(  'r   c                 n    |xs | j                   }t        | j                  dz   ||| j                        S )Nsignerr9   )r?   r@   r=   r:   )rU   r>   r?   s      r   	signaturezSigner.signature   s-    oTXX499x/t~~VVr   c                 D    || j                   | j                  |      S N)rd   rx   )rU   r>   s     r   r!   zSigner.sign   s     $((DNN5,ABBr   c                 $   | j                   |vrt        d| j                   z        |j                  | j                   d      \  }}| j                  g| j                  D ]"  }t        || j                  ||            s |c S  t        d|z        )NzNo "%s" found in valuer&   zSignature "%s" does not match)rd   r   rsplitr?   rD   r   rx   )rU   signed_valuer>   sigr?   s        r   unsignzSigner.unsign   s    88<'7$((BCC!((15
sHH2t112 	C$S$..*DE	 :S@AAr   Fc                      |       j                  |      }d}|r3t        j                  |      }t        |      t        |      dz
  k  r|}d}t	        |      j                         }|rd|z   }| j                  |      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&   Trf   )rS   zlibr\   r4   r1   r<   r!   )rU   rV   r[   r\   rY   is_compressed
compressedbase64ds           r   r^   zSigner.sign_object   sx     |!!#&t,J:#d)a-0! $T"))+GmGyy!!r   c                      | j                   |fi |j                         }|d d dk(  }|r|dd  }t        |      }|rt        j                  |      } |       j                  |      S )Nr&      .)r   rT   r7   r   
decompressrX   )rU   
signed_objr[   kwargsr   r   rY   s          r   ra   zSigner.unsign_object	  sn     $++j3F3::<Ra[D(
abkG'"??4(D|!!$''r   rz   )
r   r   r   ru   rx   r!   r   rL   r^   ra   r   r   r   rI   rI      sB     &PWCB +95 "2 4B (r   rI   c                   0     e Zd Zd Z fdZd fd	Z xZS )r]   c                 N    t        t        t        j                                     S rz   )r$   inttime)rU   s    r   	timestampzTimestampSigner.timestamp  s    #diik*++r   c                 b    || j                   | j                         }t        |   |      S rz   )rd   r   superr!   )rU   r>   rj   s     r   r!   zTimestampSigner.sign  s)    !488T^^-=>w|E""r   c                 .   t         |   |      }|j                  | j                  d      \  }}t	        |      }|Xt        |t        j                        r|j                         }t        j                         |z
  }||kD  rt        d|d|d      |S )zk
        Retrieve original value and check it wasn't signed more
        than max_age seconds ago.
        r&   zSignature age z > z seconds)r   r   r|   rd   r+   
isinstancedatetime	timedeltatotal_secondsr   r   )rU   r>   r`   resultr   agerj   s         r   r   zTimestampSigner.unsign  s    
 &!==15yy)	'8#5#56!//1))+	)CW}&#w'WXXr   rz   )r   r   r   r   r!   r   __classcell__)rj   s   @r   r]   r]     s    ,# r   r]   )sha1)z%django.core.signing.get_cookie_signer)%r   r.   r   rR   r   rk   r   django.confr   django.utils.cryptor   r   django.utils.deprecationr   django.utils.encodingr   django.utils.module_loadingr	   django.utils.regex_helperr
   ro   r   	Exceptionr   r   r$   r+   r1   r7   r@   rB   rJ   rL   rS   rX   rI   r]   r   r   r   <module>r      s   !F         B = - 5 601R	9 		| 		
3-
5

2 
2 -.SX4 		,a( a(Hf r   