§
    Ï“Ùhh%  ã                   óx  — 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$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)ÚRemovedInDjango51Warning©Ú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/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/django/core/signing.pyr   r   6   s   € € € € € Ø#Ð#à€Dr   r   c                   ó   — e Zd ZdZdS )ÚSignatureExpiredz3Signature timestamp is older than required max_age.Nr   r   r   r   r   r   <   s   € € € € € Ø=Ð=à€Dr   r   c                 ó°   — | dk    rdS | dk     rdnd}t          | ¦  «        } d}| dk    r)t          | d¦  «        \  } }t          |         |z   }| dk    °)||z   S )Nr   Ú0ú-Ú é>   )ÚabsÚdivmodÚBASE62_ALPHABET)ÚsÚsignÚencodedÚ	remainders       r   Ú
b62_encoder$   B   sq   € ØˆA‚v€vØˆsØ�a’%�%ˆ3ˆ3˜R€DÝˆA‰Œ€AØ€GØ
ˆaŠ%ˆ%Ý˜a ‘}”}‰ˆˆ9Ý! )Ô,¨wÑ6ˆð ˆaŠ%ˆ%ð �'‰>Ðr   c                 óž   — | dk    rdS d}| d         dk    r| dd …         } d}d}| D ]"}|dz  t                                |¦  «        z   }Œ#||z  S )Nr   r   é   r   éÿÿÿÿr   )r   Úindex)r    r!   ÚdecodedÚdigits       r   Ú
b62_decoder+   N   sp   € ØˆC‚x€xØˆqØ€DØˆ„tˆs‚{€{ØˆaˆbˆbŒEˆØˆØ€GØð >ð >ˆØ˜B‘,¥×!6Ò!6°uÑ!=Ô!=Ñ=ˆˆØ�'‰>Ðr   c                 óP   — t          j        | ¦  «                             d¦  «        S )Nó   =)Úbase64Úurlsafe_b64encodeÚstrip)r    s    r   Ú
b64_encoder1   [   s!   € ÝÔ# AÑ&Ô&×,Ò,¨TÑ2Ô2Ð2r   c                 ó\   — dt          | ¦  «         dz  z  }t          j        | |z   ¦  «        S )Nr-   é   )Úlenr.   Úurlsafe_b64decode)r    Úpads     r   Ú
b64_decoder7   _   s-   € Ø
•3�q‘6”6�'˜A‘+Ñ
€CÝÔ# A¨¡GÑ,Ô,Ð,r   Úsha1c                 óŠ   — t          t          | |||¬¦  «                             ¦   «         ¦  «                             ¦   «         S )N©Ú	algorithm)r1   r   ÚdigestÚdecode)ÚsaltÚvalueÚkeyr;   s       r   Úbase64_hmacrA   d   s=   € ÝÝ�D˜% °	Ð:Ñ:Ô:×AÒAÑCÔCñô ç‚f�h„hðr   c                 ó&   — dt          | ¦  «        z   S )Ns   django.http.cookiesr   )r@   s    r   Ú_cookie_signer_keyrC   j   s   € à!¥K°Ñ$4Ô$4Ñ4Ð4r   ú%django.core.signing.get_cookie_signerc                 ó¸   — t          t          j        ¦  «        } |t          t          j        ¦  «        t          t          t          j        ¦  «        | ¬¦  «        S )N)r@   Úfallback_keysr>   )r	   r   ÚSIGNING_BACKENDrC   Ú
SECRET_KEYÚmapÚSECRET_KEY_FALLBACKS)r>   ÚSigners     r   Úget_cookie_signerrL   o   sM   € Ý�8Ô3Ñ4Ô4€FØˆ6Ý�xÔ2Ñ3Ô3ÝÕ,­hÔ.KÑLÔLØðñ ô ð r   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚJSONSerializerzW
    Simple wrapper around json to be used in signing.dumps and
    signing.loads.
    c                 óT   — t          j        |d¬¦  «                             d¦  «        S )N)ú,ú:)Ú
separatorsúlatin-1)ÚjsonÚdumpsÚencode)ÚselfÚobjs     r   rU   zJSONSerializer.dumps~   s%   € ÝŒz˜#¨*Ð5Ñ5Ô5×<Ò<¸YÑGÔGÐGr   c                 óP   — t          j        |                     d¦  «        ¦  «        S )NrS   )rT   Úloadsr=   )rW   Údatas     r   rZ   zJSONSerializer.loads�   s   € ÝŒz˜$Ÿ+š+ iÑ0Ô0Ñ1Ô1Ð1r   N)r   r   r   r   rU   rZ   r   r   r   rN   rN   x   s?   € € € € € ðð ð
Hð Hð Hð2ð 2ð 2ð 2ð 2r   rN   zdjango.core.signingFc                 óP   — t          ||¬¦  «                             | ||¬¦  «        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)rX   r@   r>   r]   r^   s        r   rU   rU   …   s5   € õ& ˜s¨Ð.Ñ.Ô.×:Ò:Ø˜
¨Xð ;ñ ô ð r   c                 óR   — t          |||¬¦  «                             | ||¬¦  «        S )z|
    Reverse of dumps(), raise BadSignature if signature fails.

    The serializer is expected to accept a bytestring.
    )r@   r>   rF   )r]   Úmax_age)r_   Úunsign_object)r    r@   r>   r]   rb   rF   s         r   rZ   rZ   �   s?   € õ Ø�d¨-ðñ ô ç‚mØ	ØØð ñ ô ðr   c                   óL   — 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	dS )rK   NrQ   ©r@   Úsepr>   r;   rF   c                óÖ  — |pt           j        | _        |�|nt           j        | _        || _        |p| j        j        ›d| j        j        ›�| _	        |pd| _
        |r[t          j        d| j        j        › d�t          d¬¦  «         t          |g d¢¦  «        D ]\  }}|s|dk    rt          | ||¦  «         Œt                                | j        ¦  «        rt%          d	|z  ¦  «        ‚d S )
Nú.Úsha256z Passing positional arguments to z is deprecated.é   )Ú
stacklevelre   rf   zJUnsafe Signer separator: %r (cannot be empty or consist of only A-z0-9-_=))r   rH   r@   rJ   rF   rf   Ú	__class__r   r   r>   r;   ÚwarningsÚwarnr   ÚzipÚsetattrÚ_SEP_UNSAFEÚmatchÚ
ValueError)	rW   r@   rf   r>   r;   rF   ÚargsÚargÚattrs	            r   Ú__init__zSigner.__init__¸   sD  € ð Ð-�(Ô-ˆŒð Ð(ð ˆMåÔ.ð 	Ôð
 ˆŒØð 
ØŒNÔ%Ð%Ð%ØŒNÔ#Ð#ð
ˆŒ	ð #Ð. hˆŒàð 	-ÝŒMð°4´>Ô3Jð ð ð å(Øð	ñ ô ð õ !ØÐJÐJÐJñô ð -ð -‘	��Tð ð -˜$ %š-˜-Ý˜D $¨Ñ,Ô,Ð,øÝ×Ò˜TœXÑ&Ô&ð 	Ýð"Ø$'ñ(ñô ð ð	ð 	r   c                 óT   — |p| j         }t          | j        dz   ||| j        ¬¦  «        S )NÚsignerr:   )r@   rA   r>   r;   )rW   r?   r@   s      r   Ú	signaturezSigner.signatureà   s-   € Øˆo�T”XˆÝ˜4œ9 xÑ/°¸ÀtÄ~ÐVÑVÔVÐVr   c                 óB   — |›| j         ›|                      |¦  «        ›�S ©N)rf   rz   )rW   r?   s     r   r!   zSigner.signä   s$   € Ø ˜5 $¤( (¨D¯NªN¸5Ñ,AÔ,AÐ,AÐBÐBr   c                 ó  — | j         |vrt          d| j         z  ¦  «        ‚|                     | j         d¦  «        \  }}| j        g| j        ¢D ]*}t          ||                      ||¦  «        ¦  «        r|c S Œ+t          d|z  ¦  «        ‚)NzNo "%s" found in valuer&   zSignature "%s" does not match)rf   r   Úrsplitr@   rF   r   rz   )rW   Úsigned_valuer?   Úsigr@   s        r   ÚunsignzSigner.unsignç   sž   € ØŒ8˜<Ð'Ð'ÝÐ7¸$¼(ÑBÑCÔCÐCØ!×(Ò(¨¬°1Ñ5Ô5‰
ˆˆsØ”HÐ2˜tÔ1Ð2ð 	ð 	ˆCÝ$ S¨$¯.ª.¸ÀÑ*DÔ*DÑEÔEð Ø���ðåÐ:¸SÑ@ÑAÔAÐAr   Fc                 ó4  —  |¦   «                               |¦  «        }d}|r;t          j        |¦  «        }t          |¦  «        t          |¦  «        dz
  k     r|}d}t	          |¦  «                             ¦   «         }|rd|z   }|                      |¦  «        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&   Trh   )rU   Úzlibr^   r4   r1   r=   r!   )rW   rX   r]   r^   r[   Úis_compressedÚ
compressedÚbase64ds           r   r`   zSigner.sign_objectð   sš   € ð ˆz‰|Œ|×!Ò! #Ñ&Ô&ˆàˆàð 	%åœ tÑ,Ô,ˆJÝ�:‰Œ¥# d¡)¤)¨a¡-Ò0Ð0Ø!�Ø $�Ý˜TÑ"Ô"×)Ò)Ñ+Ô+ˆØð 	$Ø˜G‘mˆGØ�yŠy˜Ñ!Ô!Ð!r   c                 óú   —  | j         |fi |¤Ž                     ¦   «         }|d d…         dk    }|r
|dd …         }t          |¦  «        }|rt          j        |¦  «        } |¦   «                              |¦  «        S )Nr&   ó   .)r�   rV   r7   rƒ   Ú
decompressrZ   )rW   Ú
signed_objr]   Úkwargsr†   r‰   r[   s          r   rc   zSigner.unsign_object	  sŽ   € ð �$”+˜jÐ3Ð3¨FÐ3Ð3×:Ò:Ñ<Ô<ˆØ˜R˜a˜R”[ DÒ(ˆ
Øð 	"à˜a˜b˜b”kˆGÝ˜'Ñ"Ô"ˆØð 	)Ý”? 4Ñ(Ô(ˆDØˆz‰|Œ|×!Ò! $Ñ'Ô'Ð'r   r|   )
r   r   r   rw   rz   r!   r�   rN   r`   rc   r   r   r   rK   rK   ³   s°   € € € € € ð ØØØØð&ð &ð &ð &ð &ðPWð Wð Wð WðCð Cð CðBð Bð Bð +9À5ð "ð "ð "ð "ð2 4Bð (ð (ð (ð (ð (ð (r   rK   c                   ó0   ‡ — e Zd Zd„ Zˆ fd„Zdˆ fd„	Zˆ xZS )r_   c                 ó\   — t          t          t          j        ¦   «         ¦  «        ¦  «        S r|   )r$   ÚintÚtime)rW   s    r   Ú	timestampzTimestampSigner.timestamp  s   € Ý�#�dœi™kœkÑ*Ô*Ñ+Ô+Ð+r   c                 ó„   •— |›| j         ›|                      ¦   «         ›�}t          ¦   «                              |¦  «        S r|   )rf   r�   Úsuperr!   )rW   r?   rl   s     €r   r!   zTimestampSigner.sign  s8   ø€ Ø!˜E 4¤8 8¨T¯^ª^Ñ-=Ô-=Ð-=Ð>ˆÝ‰wŒw�|Š|˜EÑ"Ô"Ð"r   Nc                 óh  •— t          ¦   «                              |¦  «        }|                     | j        d¦  «        \  }}t	          |¦  «        }|�`t          |t          j        ¦  «        r|                     ¦   «         }t          j	        ¦   «         |z
  }||k    rt          d|›d|›d�¦  «        ‚|S )zk
        Retrieve original value and check it wasn't signed more
        than max_age seconds ago.
        r&   NzSignature age z > z seconds)r’   r�   r~   rf   r+   Ú
isinstanceÚdatetimeÚ	timedeltaÚtotal_secondsr�   r   )rW   r?   rb   Úresultr�   Úagerl   s         €r   r�   zTimestampSigner.unsign  s©   ø€ õ
 ‘”—’ Ñ&Ô&ˆØ!Ÿ=š=¨¬°1Ñ5Ô5ÑˆˆyÝ˜yÑ)Ô)ˆ	ØÐÝ˜'¥8Ô#5Ñ6Ô6ð 2Ø!×/Ò/Ñ1Ô1�å”)‘+”+ 	Ñ)ˆCØ�WŠ}ˆ}Ý&Ð&È#È#È#ÈwÈwÈwÐ'WÑXÔXÐXØˆr   r|   )r   r   r   r�   r!   r�   Ú__classcell__)rl   s   @r   r_   r_     se   ø€ € € € € ð,ð ,ð ,ð#ð #ð #ð #ð #ðð ð ð ð ð ð ð ð ð r   r_   )r8   )rD   )%r   r.   r•   rT   r�   rm   rƒ   Údjango.confr   Údjango.utils.cryptor   r   Údjango.utils.deprecationr   Údjango.utils.encodingr   Údjango.utils.module_loadingr	   Údjango.utils.regex_helperr
   rq   r   Ú	Exceptionr   r   r$   r+   r1   r7   rA   rC   rL   rN   rU   rZ   rK   r_   r   r   r   ú<module>r¢      sj  ðð!ð !ðF €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø €€€à  Ð  Ð  Ð  Ð  Ð  Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ =Ð =Ð =Ð =Ð =Ð =Ø -Ð -Ð -Ð -Ð -Ð -Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6àÐÐ0Ñ1Ô1€ØR€ð	ð 	ð 	ð 	ð 	�9ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	�|ñ 	ô 	ð 	ð	ð 	ð 	ð
ð 
ð 
ð3ð 3ð 3ð-ð -ð -ð
ð ð ð ð5ð 5ð 5ð
ð ð ð ð
2ð 
2ð 
2ð 
2ð 
2ñ 
2ô 
2ð 
2ð Ð-¸.ÐSXðð ð ð ð4 	Ø	ØØØðð ð ð ð,a(ð a(ð a(ð a(ð a(ñ a(ô a(ð a(ðHð ð ð ð �fñ ô ð ð ð r   