Ë
    ¦#ijz%  ã                   ó\  — 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d%d„Zdddœ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__© ó    úM/var/www/html/office/venv/lib/python3.12/site-packages/django/core/signing.pyr   r   5   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#   A   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*   M   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   Z   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?   c   s-   € ÜÜ�D˜% °	Ô:×AÑAÓCóç�fƒhðr   c                 ó   — dt        | «      z   S )Ns   django.http.cookiesr   )r>   s    r   Ú_cookie_signer_keyrA   i   s   € à!¤K°Ó$4Ñ4Ð4r   r   c                 ó(   — dt        |«      › d|› | › �S )Nzdjango.http.cookies.v2:ú:)r3   ©Úcookie_namer<   s     r   Ú_cookie_signer_saltrF   n   s   € à$¤S¨£Y K¨q°°°{°mÐDÐDr   c                 ó   — | |z   S ©Nr   rD   s     r   Ú_cookie_signer_legacy_saltrI   s   s   € Ø˜ÑÐr   )r<   Úmax_agec                ó  — 	 t        t        ||«      ¬«      j                  | |¬«      S # t        $ rR}t        j
                  r<t        |t        «      s,t        t        ||«      ¬«      j                  | |¬«      cY d }~S ‚ d }~ww xY w)N)r<   )rJ   )	Úget_cookie_signerrF   Úunsignr   r   Ú"SIGNED_COOKIE_LEGACY_SALT_FALLBACKÚ
isinstancer   rI   )Úsigned_valuerE   r<   rJ   Úexcs        r   Ú_unsign_cookierR   w   s‡   € ðÜ Ô&9¸+ÀtÓ&LÔM×TÑTØ 'ð Uó 
ð 	
øô ò Ü×6Ò6¼zØÔ!ô@
ô %Ü/°¸TÓBôç‰f�\¨7ˆfÓ3õ4ð 	ûðús!   ‚&) ©	B²AA?Á8BÁ>A?Á?B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   rL   rL   †   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)ú,rC   )Ú
separatorsúlatin-1)ÚjsonÚdumpsÚencode)ÚselfÚobjs     r   ra   zJSONSerializer.dumps•   s   € Ü�z‰z˜#¨*Ô5×<Ñ<¸YÓGÐGr   c                 óJ   — t        j                  |j                  d«      «      S )Nr_   )r`   Úloadsr;   )rc   Údatas     r   rf   zJSONSerializer.loads˜   s   € Ü�z‰z˜$Ÿ+™+ iÓ0Ó1Ð1r   N)r   r   r   r   ra   rf   r   r   r   r[   r[   �   s   „ ñò
Hó2r   r[   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)rd   r>   r<   ri   rj   s        r   ra   ra   œ   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<   rT   )ri   rJ   )rk   Úunsign_object)r   r>   r<   ri   rJ   rT   s         r   rf   rf   ´   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)rY   NrC   )r>   Úsepr<   r9   rT   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   rV   r>   rX   rT   rp   Ú	__class__r   r   r<   r9   Ú_SEP_UNSAFEÚmatchÚ
ValueError)rc   r>   rp   r<   r9   rT   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   )rc   r=   r>   s      r   Ú	signaturezSigner.signatureà   s-   € ØŠo�T—X‘XˆÜ˜4Ÿ9™9 xÑ/°¸ÀtÇ~Á~ÔVÐVr   c                 óD   — |›| j                   ›| j                  |«      ›�S rH   )rp   r{   )rc   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)rp   r   Úrsplitr>   rT   r   r{   )rc   rP   r=   Úsigr>   s        r   rM   z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%   Trr   )ra   Úzlibrj   r3   r0   r;   r    )rc   rd   ri   rj   rg   Úis_compressedÚ
compressedÚbase64ds           r   rl   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%   ó   .)rM   rb   r6   r�   Ú
decompressrf   )rc   Ú
signed_objri   Úkwargsr„   r‡   rg   s          r   rn   zSigner.unsign_object	  sn   € ð �$—+‘+˜jÑ3¨FÑ3×:Ñ:Ó<ˆØ˜R˜a�[ DÑ(ˆ
Ùà˜a˜b�kˆGÜ˜'Ó"ˆÙÜ—?‘? 4Ó(ˆDÙ‹|×!Ñ! $Ó'Ð'r   rH   )
r   r   r   rx   r{   r    rM   r[   rl   rn   r   r   r   rY   rY   Ê   s;   „ à˜s¨¸ÈTôó*WòCòBð +9À5ó "ð2 4Bô (r   rY   c                   ó0   ‡ — e Zd Zd„ Zˆ fd„Zdˆ fd„	Zˆ xZS )rk   c                 óN   — t        t        t        j                  «       «      «      S rH   )r#   ÚintÚtime)rc   s    r   Ú	timestampzTimestampSigner.timestamp  s   € Üœ#œdŸi™i›kÓ*Ó+Ð+r   c                 ób   •— |›| j                   ›| j                  «       ›�}t        ‰| �  |«      S rH   )rp   rŽ   Úsuperr    )rc   r=   rt   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�   rM   r~   rp   r*   rO   ÚdatetimeÚ	timedeltaÚtotal_secondsr�   r   )rc   r=   rJ   ÚresultrŽ   Úagert   s         €r   rM   zTimestampSigner.unsign  s†   ø€ ô
 ‘‘ Ó&ˆØ!Ÿ=™=¨¯©°1Ó5ÑˆˆyÜ˜yÓ)ˆ	ØÐÜ˜'¤8×#5Ñ#5Ô6Ø!×/Ñ/Ó1�ä—)‘)“+ 	Ñ)ˆCØ�WŠ}Ý&Ê#ÊwÐ'WÓXÐXØˆr   rH   )r   r   r   rŽ   r    rM   Ú__classcell__)rt   s   @r   rk   rk     s   ø„ ò,ô#÷ñ r   rk   )Úsha1)r   )z%django.core.signing.get_cookie_signer)%r   r-   r’   r`   r�   r�   Údjango.confr   Údjango.utils.cryptor   r   Údjango.utils.encodingr   Údjango.utils.module_loadingr   Údjango.utils.regex_helperr	   ru   r   Ú	Exceptionr   r   r#   r*   r0   r6   r?   rA   rF   rI   rR   rL   r[   ra   rf   rY   rk   r   r   r   ú<module>rŸ      sØ   ðñ"óH Û Û Û Û å  ß BÝ -Ý 5Ý 6áÐ0Ó1€ØR€ô	�9ô 	ô	�|ô 	ò	ò
ò3ò-ó
ò5ó
Eó
ð 79À$ô ó÷
2ñ 
2ð Ð-¸.ÐSXóð4 	Ø	ØØØó÷,J(ñ J(ôZ�fõ r   