
    Hwg                         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  G d dej                        Z G d	 d
ej                         Z G d d      Z G d de      Zy)    N)settings)BaseStorageMessage)signing)SimpleCookie)SafeData	mark_safec                   &     e Zd ZdZdZ fdZ xZS )MessageEncoderzI
    Compactly serialize instances of the ``Message`` class as JSON.
    __json_messagec                    t        |t              rkt        |j                  t              rdnd}| j                  ||j
                  |j                  g}|j                  |j                  |j                         |S t        | %  |      S )N   r   )

isinstancer   messager   message_keylevel
extra_tagsappendsuperdefault)selfobjis_safedatar   	__class__s       ]/var/www/horilla/myenv/lib/python3.12/site-packages/django/contrib/messages/storage/cookie.pyr   zMessageEncoder.default   sk    c7#)#++x@!aK''ciiMG~~)s~~.Nws##    )__name__
__module____qualname____doc__r   r   __classcell__r   s   @r   r   r      s     #K$ $r   r   c                   (     e Zd ZdZd Z fdZ xZS )MessageDecoderzE
    Decode JSON that includes serialized ``Message`` instances.
    c                 r   t        |t              rX|rV|d   t        j                  k(  r!|d   rt	        |d         |d<   t        |dd   S |D cg c]  }| j                  |       c}S t        |t              r3|j                         D ci c]  \  }}|| j                  |       c}}S |S c c}w c c}}w )Nr   r         )	r   listr   r   r	   r   process_messagesdictitems)r   r   itemkeyvalues        r   r)   zMessageDecoder.process_messages"   s    c4 S1v333q6&s1v.CFAB((<?@DD))$/@@c4 HK		T*#uC..u55TT
 ATs   B.B3c                 F    t        |   |fi |}| j                  |      S )N)r   decoder)   )r   skwargsdecodedr   s       r   r0   zMessageDecoder.decode-   s'    '.-f-$$W--r   )r   r   r   r    r)   r0   r!   r"   s   @r   r$   r$      s    	. .r   r$   c                       e Zd Zd Zd Zy)MessageSerializerc                 X    t        j                  |dt              j                  d      S )N),:)
separatorsclslatin-1)jsondumpsr   encode)r   r   s     r   r=   zMessageSerializer.dumps3   s(    zz!
 &
		r   c                 V    t        j                  |j                  d      t              S )Nr;   )r:   )r<   loadsr0   r$   r   datas     r   r@   zMessageSerializer.loads:   s    zz$++i0nEEr   N)r   r   r   r=   r@    r   r   r5   r5   2   s    Fr   r5   c                   T     e Zd ZdZdZdZdZdZ fdZd Z	d Z
dd	Zdd
Zd Z xZS )CookieStoragez%
    Store messages in a cookie.
    messagesi   __messagesnotfinished__zdjango.contrib.messagesc                 n    t        |   |i | t        j                  | j                        | _        y )N)salt)r   __init__r   get_cookie_signerkey_saltsigner)r   argsr2   r   s      r   rJ   zCookieStorage.__init__K   s+    $)&)//T]]Cr   c                     | j                   j                  j                  | j                        }| j	                  |      }|xr |d   | j
                  k(   }|r|s|j                          ||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   rN   r2   rB   rF   all_retrieveds         r   _getzCookieStorage._getO   sg     ||##''(8(89<<%%K(2,$:K:K*KLMLLN&&r   c                 @   |rb|j                  | j                  |t        j                  t        j                  xs dt        j
                  xs dt        j                         y|j                  | j                  t        j                  t        j                         y)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)r[   r^   )
set_cookierT   r   SESSION_COOKIE_DOMAINSESSION_COOKIE_SECURESESSION_COOKIE_HTTPONLYSESSION_COOKIE_SAMESITEdelete_cookie)r   encoded_dataresponses      r   _update_cookiezCookieStorage._update_cookie^   s    
   5555=!99AT!99    ""  55!99 # r   c                   	 g }| j                  |      }| j                  rt               		fd}|r ||      | j                  kD  r||r!|j                  |j	                  d             n |j                  d|j	                                | j                  || j                  gz   |      }|r ||      | j                  kD  r|| j                  ||       |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                 >    t        j                  |       d         S )Nr   )lenvalue_encode)valcookies    r   stored_lengthz+CookieStorage._store.<locals>.stored_length   s    6..s3A677r   r   )encode_empty)_encodemax_cookie_sizer   r   rW   insertrV   rg   )
r   rF   rf   remove_oldestrN   r2   unstored_messagesre   rn   rm   s
            @r   _storezCookieStorage._stores   s     ||H- "^F8 =#>AUAU#U %,,X\\!_=%,,Q?#|| 1 122AR  ,   =#>AUAU#U 	L(3  r   c                 P    |s|r"| j                   j                  |t        d      S y)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)rM   sign_objectr5   )r   rF   ro   s      r   rp   zCookieStorage._encode   s2     |;;**%6 +   $r   c                     |sy	 | j                   j                  |t              S # t        j                  t
        j                  t        j                  f$ r
 Y d| _	        yw xY w)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)rw   T)
rM   unsign_objectr5   r   BadSignaturebinasciiErrorr<   JSONDecodeErrorusedrA   s     r   rU   zCookieStorage._decode   s_     	;;,,T>O,PP$$hnnd6J6JK 	 		s    & 2A"!A")T)F)r   r   r   r    rT   rq   rV   rL   rJ   rY   rg   ru   rp   rU   r!   r"   s   @r   rE   rE   >   s?     K O,L(HD'*!<r   rE   )r}   r<   django.confr   $django.contrib.messages.storage.baser   r   django.corer   django.httpr   django.utils.safestringr   r	   JSONEncoderr   JSONDecoderr$   r5   rE   rC   r   r   <module>r      sX        E  $ 7$T%% $$.T%% .*	F 	FpK pr   