o
    >hV'                     @   s   d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ G dd dZG dd dZG dd dZdd ZdS )    N)import_module)settings)UpdateError)SuspiciousOperation)parse_cookie)SimpleCookie)timezone)	force_str)
LazyObject)	http_date)database_sync_to_asyncc                   @   sL   e Zd ZdZdd Zdd Ze										
dddZedddZdS )CookieMiddlewarez
    Extracts cookies from HTTP or WebSocket-style scopes and adds them as a
    scope["cookies"] entry with the same format as Django's request.COOKIES.
    c                 C   
   || _ d S Ninnerselfr    r   q/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/channels/sessions.py__init__      
zCookieMiddleware.__init__c                    sb   d|vr	t d|dg D ]\}}|dkr t|d} nqi }| t||d||I d H S )NheaderszCookieMiddleware was passed a scope that did not have a headers key (make sure it is only passed HTTP or WebSocket connections)s   cookielatin1)cookies)
ValueErrorgetr   decoder   dict)r   scopereceivesendnamevaluer   r   r   r   __call__   s   zCookieMiddleware.__call__ N/Flaxc                 C   sp  t |}t }|||< |durDt|tjr=t|r!t|tj}||  }|tj	dd }d}t
d|jd |j }n||| d< nd|| d< |durb||| d< |sbtt | || d< |durl||| d	< |durv||| d
< |r~d|| d< |	rd|| d< |
dur|
 dv sJ d|
|| d< | D ]}|dg dt|jdd ddf qdS )aY  
        Sets a cookie in the passed HTTP response message.

        ``expires`` can be:
        - a string in the correct format,
        - a naive ``datetime.datetime`` object in UTC,
        - an aware ``datetime.datetime`` object in any time zone.
        If it is a ``datetime.datetime`` object then ``max_age`` will be calculated.
        N   )secondsr   iQ expiresr%   zmax-agepathdomainTsecurehttponly)strictr'   nonez1samesite must be either 'strict', 'lax' or 'none'samesiter   s
   Set-Cookie)headerzutf-8)encoding)r	   r   
isinstancedatetimer   is_aware
make_naiveutcutcnow	timedeltamaxdaysr)   r   timelowervalues
setdefaultappendbytesoutputstrip)clsmessagekeyr#   max_ager*   r+   r,   r-   r.   r1   r   deltacr   r   r   
set_cookie.   sF   
zCookieMiddleware.set_cookiec                 C   s   | j ||d||ddS )z1
        Deletes a cookie in a response.
        r   zThu, 01-Jan-1970 00:00:00 GMT)rH   r+   r,   r*   )rK   )rE   rF   rG   r+   r,   r   r   r   delete_cookier   s   zCookieMiddleware.delete_cookie)r%   NNr&   NFFr'   )r&   N)	__name__
__module____qualname____doc__r   r$   classmethodrK   rL   r   r   r   r   r      s     Cr   c                   @   s<   e Zd ZdZdgZdgZdd Zdd Zdd Zd	d
 Z	dS )InstanceSessionWrapperzf
    Populates the session in application instance scope, and wraps send to save
    the session.
    zhttp.response.startc                 C   s`   t j| _tt jj| _t|| _d| jv rd| _	nd| jvr"t
dt | jd< d| _	|| _d S )NsessionFr   zPNo cookies in scope - SessionMiddleware needs to run inside of CookieMiddleware.T)r   SESSION_COOKIE_NAMEcookie_namer   SESSION_ENGINESessionStoresession_storer   r   	activatedr   r
   	real_send)r   r   r!   r   r   r   r      s   



zInstanceSessionWrapper.__init__c                    s*   | j d | j}| || j d _d S )Nr   rS   )r   r   rU   rX   _wrapped)r   session_keyr   r   r   resolve_session   s   z&InstanceSessionWrapper.resolve_sessionc                    s  | j r| jd j}| jd  }|d | jv r|dddkr|s%tjr|  I dH  |d | j	v r|rJtj
| jd v rItj|tj
tjtjd n:| jd  rVd}d}n| jd  }t | }t|}tj|| j| jd j||tjtjtjp{dtjpdtjd	
 | |I dH S )
zG
        Overridden send that also does session saves/cookies.
        rS   typestatus   i  Nr   )r+   r,   )rH   r*   r,   r+   r-   r.   r1   )rY   r   modifiedis_emptysave_message_typesr   r   SESSION_SAVE_EVERY_REQUESTsave_sessioncookie_response_message_typesrT   r   rL   SESSION_COOKIE_PATHSESSION_COOKIE_DOMAINget_expire_at_browser_closeget_expiry_ager=   r   rK   rU   r\   SESSION_COOKIE_SECURESESSION_COOKIE_HTTPONLYSESSION_COOKIE_SAMESITErZ   )r   rF   ra   emptyrH   r*   expires_timer   r   r   r!      sP   
zInstanceSessionWrapper.sendc                    s\   z!t jdkr| jd  I dH  W dS t| jd j I dH  W dS  ty-   tdw )z,
        Saves the current session.
        )   r(   rS   NzThe request's session was deleted before the request completed. The user may have logged out in a concurrent request, for example.)djangoVERSIONr   asaver   saver   r   )r   r   r   r   re      s   
z#InstanceSessionWrapper.save_sessionN)
rM   rN   rO   rP   rc   rf   r   r]   r!   re   r   r   r   r   rR      s    6rR   c                   @   s    e Zd ZdZdd Zdd ZdS )SessionMiddlewarez
    Class that adds Django sessions (from HTTP cookies) to the
    scope. Works with HTTP or WebSocket protocol types (or anything that
    provides a "headers" entry in the scope).

    Requires the CookieMiddleware to be higher up in the stack.
    c                 C   r   r   r   r   r   r   r   r      r   zSessionMiddleware.__init__c                    s2   t ||}| I dH  | |j||jI dH S )z{
        Instantiate a session wrapper for this scope, resolve the session and
        call the inner application.
        N)rR   r]   r   r   r!   )r   r   r    r!   wrapperr   r   r   r$      s   
zSessionMiddleware.__call__N)rM   rN   rO   rP   r   r$   r   r   r   r   ru      s    ru   c                 C   s   t t| S r   )r   ru   r   r   r   r   SessionMiddlewareStack	  s   rw   )r5   r=   	importlibr   rq   django.confr   %django.contrib.sessions.backends.baser   django.core.exceptionsr   django.httpr   django.http.cookier   django.utilsr   django.utils.encodingr	   django.utils.functionalr
   django.utils.httpr   channels.dbr   r   rR   ru   rw   r   r   r   r   <module>   s$    no