§
    ŸjD"  ã                   ód  — 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!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©Ú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__© ó    ú`/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/django/core/signing.pyr   r   4   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#   @   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*   L   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_encoder0   Y   s!   € ÝÔ# AÑ&Ô&×,Ò,¨TÑ2Ô2Ð2r   c                 ó\   — dt          | ¦  «         dz  z  }t          j        | |z   ¦  «        S )Nr,   é   )Úlenr-   Úurlsafe_b64decode)r   Úpads     r   Ú
b64_decoder6   ]   s-   € Ø
•3�q‘6”6�'˜A‘+Ñ
€CÝÔ# A¨¡GÑ,Ô,Ð,r   Úsha1c                 óŠ   — t          t          | |||¬¦  «                             ¦   «         ¦  «                             ¦   «         S )N©Ú	algorithm)r0   r   ÚdigestÚdecode)ÚsaltÚvalueÚkeyr:   s       r   Úbase64_hmacr@   b   s=   € ÝÝ�D˜% °	Ð:Ñ:Ô:×AÒAÑCÔCñô ç‚f�h„hðr   c                 ó&   — dt          | ¦  «        z   S )Ns   django.http.cookiesr   )r?   s    r   Ú_cookie_signer_keyrB   h   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_BACKENDrB   Ú
SECRET_KEYÚmapÚSECRET_KEY_FALLBACKS)r=   ÚSigners     r   Úget_cookie_signerrK   m   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   rT   zJSONSerializer.dumps|   s%   € ÝŒz˜#¨*Ð5Ñ5Ô5×<Ò<¸YÑGÔGÐGr   c                 óP   — t          j        |                     d¦  «        ¦  «        S )NrR   )rS   Úloadsr<   )rV   Údatas     r   rY   zJSONSerializer.loads   s   € ÝŒz˜$Ÿ+š+ iÑ0Ô0Ñ1Ô1Ð1r   N)r   r   r   r   rT   rY   r   r   r   rM   rM   v   s?   € € € € € ðð ð
Hð Hð Hð2ð 2ð 2ð 2ð 2r   rM   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)rW   r?   r=   r\   r]   s        r   rT   rT   ƒ   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=   rE   )r\   Úmax_age)r^   Úunsign_object)r   r?   r=   r\   ra   rE   s         r   rY   rY   ›   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 )rJ   NrP   )r?   Úsepr=   r:   rE   c                ó  — |pt           j        | _        |�|nt           j        | _        || _        |p| j        j        ›d| j        j        ›�| _	        |pd| _
        t                               | j        ¦  «        rt          d|z  ¦  «        ‚d S )Nú.Úsha256zJUnsafe Signer separator: %r (cannot be empty or consist of only A-z0-9-_=))r   rG   r?   rI   rE   rd   Ú	__class__r   r   r=   r:   Ú_SEP_UNSAFEÚmatchÚ
ValueError)rV   r?   rd   r=   r:   rE   s         r   Ú__init__zSigner.__init__²   s²   € ð Ð-�(Ô-ˆŒð Ð(ð ˆMåÔ.ð 	Ôð
 ˆŒØð 
ØŒNÔ%Ð%Ð%ØŒNÔ#Ð#ð
ˆŒ	ð #Ð. hˆŒÝ×Ò˜TœXÑ&Ô&ð 	Ýð"Ø$'ñ(ñô ð ð	ð 	r   c                 óT   — |p| j         }t          | j        dz   ||| j        ¬¦  «        S )NÚsignerr9   )r?   r@   r=   r:   )rV   r>   r?   s      r   Ú	signaturezSigner.signatureÇ   s-   € Øˆo�T”XˆÝ˜4œ9 xÑ/°¸ÀtÄ~ÐVÑVÔVÐVr   c                 óB   — |›| j         ›|                      |¦  «        ›�S ©N)rd   ro   )rV   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)rd   r   Úrsplitr?   rE   r   ro   )rV   Ú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%   Trf   )rT   Úzlibr]   r3   r0   r<   r    )rV   rW   r\   r]   rZ   Ú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%   ó   .)rv   rU   r6   rx   Ú
decompressrY   )rV   Ú
signed_objr\   Úkwargsr{   r~   rZ   s          r   rb   zSigner.unsign_objectð   sŽ   € ð �$”+˜jÐ3Ð3¨FÐ3Ð3×:Ò:Ñ<Ô<ˆØ˜R˜a˜R”[ DÒ(ˆ
Øð 	"à˜a˜b˜b”kˆGÝ˜'Ñ"Ô"ˆØð 	)Ý”? 4Ñ(Ô(ˆDØˆz‰|Œ|×!Ò! $Ñ'Ô'Ð'r   rq   )
r   r   r   rl   ro   r    rv   rM   r_   rb   r   r   r   rJ   rJ   ±   s©   € € € € € à˜s¨¸ÈTðð ð ð ð ð*Wð Wð Wð WðCð Cð CðBð Bð Bð +9À5ð "ð "ð "ð "ð2 4Bð (ð (ð (ð (ð (ð (r   rJ   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 rq   )r#   ÚintÚtime)rV   s    r   Ú	timestampzTimestampSigner.timestampÿ   s   € Ý�#�dœi™kœkÑ*Ô*Ñ+Ô+Ð+r   c                 ó„   •— |›| j         ›|                      ¦   «         ›�}t          ¦   «                              |¦  «        S rq   )rd   r…   Úsuperr    )rV   r>   rh   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‡   rv   rs   rd   r*   Ú
isinstanceÚdatetimeÚ	timedeltaÚtotal_secondsr„   r   )rV   r>   ra   Úresultr…   Úagerh   s         €r   rv   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   rq   )r   r   r   r…   r    rv   Ú__classcell__)rh   s   @r   r^   r^   þ   se   ø€ € € € € ð,ð ,ð ,ð#ð #ð #ð #ð #ðð ð ð ð ð ð ð ð ð r   r^   )r7   )rC   )"r   r-   rŠ   rS   r„   rx   Údjango.confr   Údjango.utils.cryptor   r   Údjango.utils.encodingr   Údjango.utils.module_loadingr   Údjango.utils.regex_helperr	   ri   r   Ú	Exceptionr   r   r#   r*   r0   r6   r@   rB   rK   rM   rT   rY   rJ   r^   r   r   r   ú<module>r–      sO  ðð!ð !ð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 	Ø	ØØØðð ð ð ð,J(ð J(ð J(ð J(ð J(ñ J(ô J(ð J(ðZð ð ð ð �fñ ô ð ð ð r   