Ë
    ¹ûà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__© ó    úQ/var/www/skyplay_api_hub/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   € ØˆA‚vØØ�a’%‰3˜R€DÜˆ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   € ØˆC‚xØØ€DØˆ�tˆs‚{ØˆaˆbˆEˆØˆØ€GØò >ˆØ˜B‘,¤×!6Ñ!6°uÓ!=Ñ=‰ð>à�'‰>Ð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+   € Ø
”3�q“6�'˜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óç�fƒhð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Ó4€FÙÜœ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   € Ü�z‰z˜#¨*Ô5×<Ñ<¸YÓGÐGr   c                 óJ   — t        j                  |j                  d«      «      S )NrP   )rQ   Úloadsr;   )rT   Údatas     r   rW   zJSONSerializer.loads   s   € Ü�z‰z˜$Ÿ+™+ 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§   € ð Ò-œ(×-Ñ-ˆŒð Ð(ñ ä×.Ñ.ð 	Ôð
 ˆŒØò 
Ø�N‰N×%Ó%Ø�N‰N×#Ò#ð
ˆŒ	ð #Ò. hˆŒÜ×Ñ˜TŸX™XÔ&Üð"Ø$'ñ(óð ð '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-   € ØŠo�T—X‘XˆÜ˜4Ÿ9™9 xÑ/°¸ÀtÇ~Á~ÔVÐVr   c                 óD   — |›| j                   ›| j                  |«      ›�S ©N)rb   rm   )rT   r=   s     r   r    zSigner.signË   s   € Ù  $§(¢(¨D¯N©N¸5Ô,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‹   € Ø�8‰8˜<Ñ'ÜÐ7¸$¿(¹(ÑBÓCÐCØ!×(Ñ(¨¯©°1Ó5‰
ˆˆsØ—H‘HÐ2˜t×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Ó"×)Ñ)Ó+ˆÙØ˜G‘mˆGØ�y‰y˜Ó!Ð!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Ñ3¨FÑ3×:Ñ:Ó<ˆØ˜R˜a�[ DÑ(ˆ
Ùà˜a˜b�kˆGÜ˜'Ó"ˆÙÜ—?‘? 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ð +9À5ó "ð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   € Üœ#œdŸi™i›kÓ*Ó+Ð+r   c                 ób   •— |›| j                   ›| j                  «       ›�}t        ‰| �  |«      S ro   )rb   rƒ   Úsuperr    )rT   r=   rf   s     €r   r    zTimestampSigner.sign  s)   ø€ Ù! 4§8¢8¨T¯^©^Ô-=Ð>ˆÜ‰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   