
    &^gD"                     >   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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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__     W/var/www/html/webapps/promises/venv/lib/python3.12/site-packages/django/core/signing.pyr   r   4   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#   @   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*   L   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_encoder0   Y   s    ##A&,,T22r   c                 V    dt        |        dz  z  }t        j                  | |z         S )Nr,      )lenr-   urlsafe_b64decode)r   pads     r   
b64_decoder6   ]   s+    
3q6'A+
C##AG,,r   c                 j    t        t        | |||      j                               j                         S )N	algorithm)r0   r   digestdecode)saltvaluekeyr9   s       r   base64_hmacr?   b   s-    D%	:AACfhr   c                     dt        |       z   S )Ns   django.http.cookiesr   )r>   s    r   _cookie_signer_keyrA   h   s    !K$444r   c                     t        t        j                        } |t        t        j                        t        t        t        j                        |       S )N)r>   fallback_keysr<   )r   r   SIGNING_BACKENDrA   
SECRET_KEYmapSECRET_KEY_FALLBACKS)r<   Signers     r   get_cookie_signerrI   m   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   rR   zJSONSerializer.dumps|   s    zz#*5<<YGGr   c                 J    t        j                  |j                  d            S )NrP   )rQ   loadsr;   )rT   datas     r   rW   zJSONSerializer.loads   s    zz$++i011r   N)r   r   r   r   rR   rW   r   r   r   rK   rK   v   s    
H2r   rK   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)rU   r>   r<   rZ   r[   s        r   rR   rR      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<   rC   )rZ   max_age)r\   unsign_object)r   r>   r<   rZ   r_   rC   s         r   rW   rW      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)rH   NrN   )r>   sepr<   r9   rC   c                V   |xs t         j                  | _        ||nt         j                  | _        || _        |xs/ | j                  j                  d| j                  j                  | _	        |xs d| _
        t        j                  | j
                        rt        d|z        y )N.sha256zJUnsafe Signer separator: %r (cannot be empty or consist of only A-z0-9-_=))r   rE   r>   rG   rC   rb   	__class__r   r   r<   r9   _SEP_UNSAFEmatch
ValueError)rT   r>   rb   r<   r9   rC   s         r   __init__zSigner.__init__   s     -(-- ( .. 	
  
NN%%NN##
	 #.hTXX&"$'(  'r   c                 n    |xs | j                   }t        | j                  dz   ||| j                        S )Nsignerr8   )r>   r?   r<   r9   )rT   r=   r>   s      r   	signaturezSigner.signature   s-    oTXX499x/t~~VVr   c                 D    || j                   | j                  |      S N)rb   rm   )rT   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)rb   r   rsplitr>   rC   r   rm   )rT   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%   Trd   )rR   zlibr[   r3   r0   r;   r    )rT   rU   rZ   r[   rX   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%      .)rt   rS   r6   rv   
decompressrW   )rT   
signed_objrZ   kwargsry   r|   rX   s          r   r`   zSigner.unsign_object   sn     $++j3F3::<Ra[D(
abkG'"??4(D|!!$''r   ro   )
r   r   r   rj   rm   r    rt   rK   r]   r`   r   r   r   rH   rH      s;    sT*WCB +95 "2 4B (r   rH   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 ro   )r#   inttime)rT   s    r   	timestampzTimestampSigner.timestamp   s    #diik*++r   c                 b    || j                   | j                         }t        |   |      S ro   )rb   r   superr    )rT   r=   rf   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   rt   rq   rb   r*   
isinstancedatetime	timedeltatotal_secondsr   r   )rT   r=   r_   resultr   agerf   s         r   rt   zTimestampSigner.unsign  s    
 &!==15yy)	'8#5#56!//1))+	)CW}&#w'WXXr   ro   )r   r   r   r   r    rt   __classcell__)rf   s   @r   r\   r\      s    ,# r   r\   )sha1)z%django.core.signing.get_cookie_signer)"r   r-   r   rQ   r   rv   django.confr   django.utils.cryptor   r   django.utils.encodingr   django.utils.module_loadingr   django.utils.regex_helperr	   rg   r   	Exceptionr   r   r#   r*   r0   r6   r?   rA   rI   rK   rR   rW   rH   r\   r   r   r   <module>r      s   !F        B - 5 601R	9 		| 		
3-
5

2 
2 -.SX4 		,J( J(Zf r   