B
    ¦0H[?  ã               @   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	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)Ú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__© újC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\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                s–   t |tƒrr|rr|d tjkr`t|ƒdkr8t|dd … Ž S |d rPt|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Úvalue)r   r   r   ú
<dictcomp>+   s   z3MessageDecoder.process_messages.<locals>.<dictcomp>)	r   Úlistr
   r   Úlenr   r	   ÚdictÚitems)r   r   r   )r   r   r        s    

zMessageDecoder.process_messagesc                s   t ƒ j|f|Ž}|  |¡S )N)r   Údecoder    )r   ÚsÚkwargsÚdecoded)r   r   r   r+   /   s    zMessageDecoder.decode)r   r   r   r   r    r+   r   r   r   )r   r   r      s   r   c               @   sP   e Zd ZdZdZdZdZdd„ Zdd„ Zdd
d„Z	dd„ Z
ddd„Zdd„ ZdS )ÚCookieStoragez%
    Store messages in a cookie.
    Úmessagesi   Z__messagesnotfinished__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   Úargsr-   Údatar0   Zall_retrievedr   r   r   Ú_get?   s    
zCookieStorage._getc             C   s@   |r*|j | j|tjtjpdtjp"dd� n|j| 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)r;   )Ú
set_cookier4   r   ZSESSION_COOKIE_DOMAINZSESSION_COOKIE_SECUREZSESSION_COOKIE_HTTPONLYZdelete_cookie)r   Úencoded_dataÚresponser   r   r   Ú_update_cookieN   s    zCookieStorage._update_cookieTc       	         sŠ   g }|   |¡}| jrztƒ ‰ ‡ fdd„}xR|rx||ƒ| jkrx|rP| | d¡¡ n| d| ¡ ¡ | j || jg |d�}q(W |  ||¡ |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   )r(   Úvalue_encode)Úval)Úcookier   r   Ústored_lengthm   s    z+CookieStorage._store.<locals>.stored_lengthr   )Úencode_empty)Ú_encodeÚmax_cookie_sizer   r   r7   Úinsertr6   rA   )	r   r0   r@   Zremove_oldestr8   r-   Zunstored_messagesr?   rE   r   )rD   r   Ú_store]   s    	
zCookieStorage._storec             C   s   d}t ||ƒ ¡ S )zŸ
        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.
        zdjango.contrib.messages)r   Ú	hexdigest)r   r%   Zkey_saltr   r   r   Ú_hashz   s    zCookieStorage._hashFc             C   s2   |s|r.t dd�}| |¡}d|  |¡|f 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.
        )ú,ú:)Ú
separatorsz%s$%sN)r
   ÚencoderL   )r   r0   rF   Úencoderr%   r   r   r   rG   ‚   s    

zCookieStorage._encodec             C   sf   |sdS |  dd¡}t|ƒdkr\|\}}t||  |¡ƒr\ytj|td�S  tk
rZ   Y nX 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ú$r   r   )ÚclsT)	Úsplitr(   r   rL   ÚjsonÚloadsr   Ú
ValueErrorÚused)r   r9   ÚbitsÚhashr%   r   r   r   r5   �   s    zCookieStorage._decodeN)T)F)r   r   r   r   r4   rH   r6   r:   rA   rJ   rL   rG   r5   r   r   r   r   r/   4   s   

r/   )rU   Zdjango.confr   Z$django.contrib.messages.storage.baser   r   Zdjango.httpr   Zdjango.utils.cryptor   r   Zdjango.utils.safestringr   r	   ÚJSONEncoderr
   ÚJSONDecoderr   r/   r   r   r   r   Ú<module>   s   