o
    ^"<f                     @   s   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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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.
    __json_messagec                    sR   t |tr#t |jtrdnd}| j||j|jg}|jr!||j |S t 	|S )N   r   )

isinstancer   messager	   message_keylevel
extra_tagsappendsuperdefault)selfobjis_safedatar   	__class__ ]/var/www/html/kck/venv/lib/python3.10/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r+|r+|d tjkr"|d rt|d |d< t|dd   S  fdd|D S t |tr; fdd| D S |S )	Nr   r         c                    s   g | ]}  |qS r   process_messages).0itemr   r   r   
<listcomp>(   s    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   r2   .   s   
zMessageDecoder.decode)r   r   r   r    r&   r2   r!   r   r   r   r   r"      s    r"   c                   @   s   e Zd Zdd Zdd ZdS )MessageSerializerc                 C   s   t j|dtddS )N),:)
separatorsclslatin-1)jsondumpsr   encoder1   r   r   r   r=   4   s   zMessageSerializer.dumpsc                 C   s   t j|dtdS )Nr;   r:   )r<   loadsr2   r"   )r   datar   r   r   r@   ;   s   zMessageSerializer.loadsN)r   r   r   r=   r@   r   r   r   r   r6   3   s    r6   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   __messagesnotfinished__django.contrib.messagesc                    s&   t  j|i | tj| jd| _d S )N)salt)r   __init__r   get_cookie_signerkey_saltsigner)r   argsr4   r   r   r   rG   K   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.
        )requestCOOKIESgetcookie_name_decodenot_finishedpop)r   rK   r4   rA   rC   all_retrievedr   r   r   _getO   s   
zCookieStorage._getc                 C   sJ   |r|j | j|tjtjpdtjpdtjd dS |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)rV   rY   )
set_cookierP   r   SESSION_COOKIE_DOMAINSESSION_COOKIE_SECURESESSION_COOKIE_HTTPONLYSESSION_COOKIE_SAMESITEdelete_cookie)r   encoded_dataresponser   r   r   _update_cookie^   s   

zCookieStorage._update_cookieTc           	         s   g }|  |}| jrCt   fdd}|rC||| jkrC|r'||d n|d|  | j || jg |d}|rC||| jks| || |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_length   s   z+CookieStorage._store.<locals>.stored_lengthr   )encode_empty)_encodemax_cookie_sizer   r   rS   insertrR   rb   )	r   rC   ra   remove_oldestrK   r4   unstored_messagesr`   rh   r   rf   r   _storer   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.
        rE   )r   	hexdigest)r   r,   rI   r   r   r   _legacy_hash   s   	zCookieStorage._legacy_hashFc                 C   s   |s|r| j j|tdd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.
        T)
serializercompressN)rJ   sign_objectr6   )r   rC   ri   r   r   r   rj      s   zCookieStorage._encodec              	   C   s   |sdS z	| j j|tdW S  tjy   | |}Y n tjtj	fy.   | j 
|}Y nw |rDztj|tdW S  tj	yC   Y nw 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)rr   r?   T)rJ   unsign_objectr6   r   BadSignature_legacy_decodebinasciiErrorr<   JSONDecodeErrorunsignr@   r"   used)r   rA   r5   r   r   r   rQ      s"   zCookieStorage._decodec                 C   s8   | dd}t|dkr|\}}t|| |r|S d S )N$r   r$   )splitrc   r   rq   )r   rA   bitshash_r,   r   r   r   rw      s   zCookieStorage._legacy_decode)T)F)r   r   r   r    rP   rk   rR   rI   rG   rU   rb   ro   rq   rj   rQ   rw   r!   r   r   r   r   rB   ?   s    

"rB   )rx   r<   django.confr   $django.contrib.messages.storage.baser   r   django.corer   django.httpr   django.utils.cryptor   r   django.utils.safestringr	   r
   JSONEncoderr   JSONDecoderr"   r6   rB   r   r   r   r   <module>   s    