
    hV'                         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      Z G d d      Z G d d      Zd Zy)    N)import_module)settings)UpdateError)SuspiciousOperation)parse_cookie)SimpleCookie)timezone)	force_str)
LazyObject)	http_date)database_sync_to_asyncc                   P    e Zd ZdZd Zd Ze	 	 	 	 	 	 	 	 dd       Zedd       Zy)	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                     || _         y Ninnerselfr   s     M/var/www/Befach/backend/env/lib/python3.12/site-packages/channels/sessions.py__init__zCookieMiddleware.__init__   	    
    c                    K   d|vrt        d      |j                  dg       D ]&  \  }}|dk(  st        |j                  d            } n i }| j	                  t        ||      ||       d {   S 7 w)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   s          r   __call__zCookieMiddleware.__call__   s     E!P 
 !99Y3KD%y &u||H'=> 4 GZZUG <gtLLLLs   -A7A A70A51A7Nc           	      j   t        |      }t               }|||<   |t        |t        j                        rt	        j
                  |      r$t	        j                  |t        j                        }||j                         z
  }|t        j                  d      z   }d}t        d|j                  dz  |j                  z         }n|||   d<   nd||   d<   |0|||   d<   |s&t        t        j                         |z         ||   d<   ||||   d	<   ||||   d
<   |rd||   d<   |	rd||   d<   |
!|
j                         dv sJ d       |
||   d<   |j!                         D ]N  }|j#                  dg       j%                  dt'        |j)                  d      j+                         d      f       P y)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 expires zmax-agepathdomainTsecurehttponly)strictlax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/   r0   r4   r   deltacs                 r   
set_cookiezCookieMiddleware.set_cookie.   s   . % .'8#4#45$$W-&11'8<<HG'.."22  2 21 ==ae!3emm!CD*1Y'&(GCL#&-GCL#*3DIIK'4I*JY'#'GCL %+GCL"%)GCL"'+GCL$>># (  C C	C 
 (0GCL$!Ay"-44ahhbh&9&?&?&AG TU "r   c                 0    | j                  ||d||d      S )z1
        Deletes a cookie in a response.
        r   zThu, 01-Jan-1970 00:00:00 GMT)rK   r-   r.   r+   )rN   )rH   rI   rJ   r-   r.   s        r   delete_cookiezCookieMiddleware.delete_cookier   s,    
 ~~3  
 	
r   )r,   NN/NFFr2   )rQ   N)	__name__
__module____qualname____doc__r   r'   classmethodrN   rP    r   r   r   r      sW    
M$ 
 A AF 
 
r   r   c                   4    e Zd ZdZdgZdgZd Zd Zd Zd Z	y)InstanceSessionWrapperzf
    Populates the session in application instance scope, and wraps send to save
    the session.
    zhttp.response.startc                 T   t         j                  | _        t        t         j                        j
                  | _        t        |      | _        d| j                  v rd| _	        || _        y d| j                  vrt        d      t               | j                  d<   d| _	        || _        y )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$   s      r   r   zInstanceSessionWrapper.__init__   s    #77*8+B+BCPP%[


" #DN  

* 2 
 %/LDJJy!!DN r   c                    K   | j                   d   j                  | j                        }| j                  |      | j                   d   _        y w)Nr   r[   )r"   r   r]   r`   _wrapped)r   session_keys     r   resolve_sessionz&InstanceSessionWrapper.resolve_session   sA     jj+//0@0@A)-););K)H

9&s   AAc                 @  K   | j                   r| j                  d   j                  }| j                  d   j                         }|d   | j                  v r|j                  dd      dk7  r|st        j                  r| j                          d{    |d   | j                  v rU|rdt        j                  | j                  d   v r3t        j                  |t        j                  t        j                  t        j                         n| j                  d   j                         rd}d}n?| j                  d   j!                         }t#        j"                         |z   }t%        |      }t        j'                  || j(                  | j                  d   j*                  ||t        j                  t        j                  t        j,                  xs dt        j.                  xs dt        j0                  	
       | j3                  |       d{   S 7 7 w)
zG
        Overridden send that also does session saves/cookies.
        r[   typestatus   i  Nr   )r-   r.   )rK   r+   r.   r-   r/   r0   r4   )ra   r"   modifiedis_emptysave_message_typesr   r   SESSION_SAVE_EVERY_REQUESTsave_sessioncookie_response_message_typesr\   r   rP   SESSION_COOKIE_PATHSESSION_COOKIE_DOMAINget_expire_at_browser_closeget_expiry_ager@   r   rN   r]   re   SESSION_COOKIE_SECURESESSION_COOKIE_HTTPONLYSESSION_COOKIE_SAMESITErb   )r   rI   rk   emptyrK   r+   expires_times          r   r$   zInstanceSessionWrapper.send   s    
 >>zz),55HJJy)224E
 4#:#::KK#.#5!D!D''))) 6?d&H&HH#774::i;PP,:: ' ( < <%-%A%A'/'E'E	 ;   ::i0LLN&*G&*G&*jj&;&J&J&LG+/99;+@L&/&=G(33# ,, JJy1==$+$+#+#A#A!)!=!=#+#A#A#IT%-%E%E%M%-%E%E 4  ^^G,,,I *H -s%   BHHE?HHHHc                   K   	 t         j                  dk\  r&| j                  d   j                          d{    y t	        | j                  d   j
                                d{    y7 57 # t        $ r t        d      w xY ww)z,
        Saves the current session.
        )   r)   r[   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   s    r   ro   z#InstanceSessionWrapper.save_session   s~     
	~~'jj+11333H,TZZ	-B-G-GHJJJ 4J 	%< 	sH   B	3A1 A-A1 B	*A1 'A/(A1 ,B	-A1 /A1 1BB	N)
rR   rS   rT   rU   rm   rp   r   rf   r$   ro   rW   r   r   rY   rY      s3     00 &;$;!0I4-lr   rY   c                       e Zd ZdZd Zd Zy)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                     || _         y r   r   r   s     r   r   zSessionMiddleware.__init__   r   r   c                    K   t        ||      }|j                          d{    | j                  |j                  ||j                         d{   S 7 37 w)z{
        Instantiate a session wrapper for this scope, resolve the session and
        call the inner application.
        N)rY   rf   r   r"   r$   )r   r"   r#   r$   wrappers        r   r'   zSessionMiddleware.__call__   sM     
 )5%%'''ZZwEEE 	(Es!    AA.AAAAN)rR   rS   rT   rU   r   r'   rW   r   r   r   r      s    	Fr   r   c                 *    t        t        |             S r   )r   r   r   s    r   SessionMiddlewareStackr   	  s    -e455r   )r8   r@   	importlibr   r|   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   rY   r   r   rW   r   r   <module>r      sZ      #    = 6 $ + ! + . ' .k
 k
\l l^F F26r   