a
    xdb                     @   s   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mZ d dlmZmZ G dd	 d	e jZG d
d de jZG dd deZdS )    N)settings)BaseStorageMessage)signing)SimpleCookie)constant_time_comparesalted_hmac)SafeData	mark_safec                       s$   e Zd ZdZdZ fddZ  ZS )MessageEncoderzI
    Compactly serialize instances of the ``Message`` class as JSON.
    Z__json_messagec                    sR   t |trFt |jtrdnd}| j||j|jg}|jrB||j |S t 	|S )N   r   )

isinstancer   messager	   message_keylevelZ
extra_tagsappendsuperdefault)selfobjZis_safedatar   	__class__ ^/var/www/html/Ranjet/env/lib/python3.9/site-packages/django/contrib/messages/storage/cookie.pyr      s    
zMessageEncoder.default)__name__
__module____qualname____doc__r   r   __classcell__r   r   r   r   r      s   r   c                       s(   e Zd ZdZdd Z fddZ  ZS )MessageDecoderzE
    Decode JSON that includes serialized ``Message`` instances.
    c                    sz   t |trV|rV|d tjkrD|d r4t|d |d< t|dd   S  fdd|D S t |trv fdd| D S |S )	Nr   r         c                    s   g | ]}  |qS r   process_messages).0itemr   r   r   
<listcomp>'       z3MessageDecoder.process_messages.<locals>.<listcomp>c                    s   i | ]\}}|  |qS r   r"   )r$   keyvaluer&   r   r   
<dictcomp>)   s   z3MessageDecoder.process_messages.<locals>.<dictcomp>)r   listr   r   r
   r   dictitems)r   r   r   r&   r   r#   !   s    

zMessageDecoder.process_messagesc                    s   t  j|fi |}| |S )N)r   decoder#   )r   skwargsdecodedr   r   r   r/   -   s    zMessageDecoder.decode)r   r   r   r   r#   r/   r   r   r   r   r   r      s   r   c                       sl   e Zd ZdZdZdZdZdZ fddZdd	 Z	d
d Z
dddZdd ZdddZdd Zdd Z  ZS )CookieStoragez%
    Store messages in a cookie.
    messagesi   Z__messagesnotfinished__django.contrib.messagesc                    s&   t  j|i | tj| jd| _d S )N)Zsalt)r   __init__r   Zget_cookie_signerkey_saltsigner)r   argsr1   r   r   r   r6   >   s    zCookieStorage.__init__c                 O   sF   | j j| j}| |}|o*|d | jk }|r>|s>|  ||fS )a
  
        Retrieve a list of messages from the messages cookie. If the
        not_finished sentinel value is found at the end of the message list,
        remove it and return a result indicating that not all messages were
        retrieved by this storage.
        )requestZCOOKIESgetcookie_name_decodenot_finishedpop)r   r9   r1   datar4   Zall_retrievedr   r   r   _getB   s    
zCookieStorage._getc                 C   sH   |r.|j | j|tjtjpdtjp"dtjd n|j| jtjtjd dS )zz
        Either set the cookie with the encoded data if there is any data to
        store, or delete the cookie.
        N)domainsecurehttponlysamesite)rC   rF   )
set_cookier=   r   ZSESSION_COOKIE_DOMAINZSESSION_COOKIE_SECUREZSESSION_COOKIE_HTTPONLYZSESSION_COOKIE_SAMESITEZdelete_cookie)r   encoded_dataresponser   r   r   _update_cookieQ   s    zCookieStorage._update_cookieTc           	         s   g }|  |}| jrvt   fdd}|rv||| jkrv|rN||d n|d|  | j || jg |d}q&| || |S )aT  
        Store the messages to a cookie and return a list of any messages which
        could not be stored.

        If the encoded data is larger than ``max_cookie_size``, remove
        messages until the data fits (these are the messages which are
        returned), and add the not_finished sentinel value to indicate as much.
        c                    s   t  | d S )Nr   )lenvalue_encode)valcookier   r   stored_lengthu   s    z+CookieStorage._store.<locals>.stored_lengthr   )encode_empty)_encodemax_cookie_sizer   r   r@   insertr?   rJ   )	r   r4   rI   Zremove_oldestr9   r1   Zunstored_messagesrH   rP   r   rN   r   _storee   s    	
zCookieStorage._storec                 C   s   d}t || S )z
        # RemovedInDjango40Warning: pre-Django 3.1 hashes will be invalid.
        Create an HMAC/SHA1 hash based on the value and the project setting's
        SECRET_KEY, modified to make it unique for the present purpose.
        r5   )r   	hexdigest)r   r*   r7   r   r   r   _legacy_hash   s    	zCookieStorage._legacy_hashFc                 C   s,   |s|r(t dd}||}| j|S dS )a  
        Return an encoded version of the messages list which can be stored as
        plain text.

        Since the data will be retrieved from the client-side, the encoded data
        also contains a hash to ensure that the data was not tampered with.
        ),:)
separatorsN)r   encoder8   sign)r   r4   rQ   encoderr*   r   r   r   rR      s    

zCookieStorage._encodec                 C   sl   |sdS z| j |}W n tjy6   | |}Y n0 |rbztj|tdW S  tjy`   Y n0 d| _	dS )z
        Safely decode an encoded text stream back into a list of messages.

        If the encoded text stream contained an invalid hash or was in an
        invalid format, return None.
        N)clsT)
r8   Zunsignr   ZBadSignature_legacy_decodejsonloadsr   JSONDecodeErrorused)r   rA   r2   r   r   r   r>      s    zCookieStorage._decodec                 C   s8   | dd}t|dkr4|\}}t|| |r4|S d S )N$r   r!   )splitrK   r   rW   )r   rA   bitshash_r*   r   r   r   r_      s    zCookieStorage._legacy_decode)T)F)r   r   r   r   r=   rS   r?   r7   r6   rB   rJ   rU   rW   rR   r>   r_   r   r   r   r   r   r3   2   s   

r3   )r`   Zdjango.confr   Z$django.contrib.messages.storage.baser   r   Zdjango.corer   Zdjango.httpr   Zdjango.utils.cryptor   r   Zdjango.utils.safestringr	   r
   JSONEncoderr   JSONDecoderr   r3   r   r   r   r   <module>   s   