
    MfV'                        d dl 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 	 d dlmZ n# e$ r	 d dlmZ Y nw xY w G d d          Z G d d          Z G d d          Zd ZdS )    N)import_module)settings)UpdateError)SuspiciousOperation)parse_cookie)SimpleCookie)timezone)	force_str)
LazyObject)database_sync_to_async)	http_date)cookie_datec                   ^    e Zd ZdZd Zd Ze	 	 	 	 	 	 	 	 dd	            Ze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                     || _         d S Ninnerselfr   s     P/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/channels/sessions.py__init__zCookieMiddleware.__init__       


    c                   K   d|vrt          d          |                    dg           D ]/\  }}|dk    r$t          |                    d                    } n0i }|                     t          ||          ||           d {V 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   s          r   __call__zCookieMiddleware.__call__   s      E!!P  
 !99Y33 	 	KD%y  &u||H'='=>> !
 GZZUG < < <gtLLLLLLLLLr    N/Flaxc           	         t          |          }t                      }|||<   |t          |t          j                  rt	          j        |          rt	          j        |t          j                  }||                                z
  }|t          j	        d          z   }d}t          d|j        dz  |j        z             }n|||         d<   nd||         d<   |9|||         d<   |s,t          t          j                    |z             ||         d<   ||||         d	<   ||||         d
<   |rd||         d<   |	rd||         d<   |
+|
                                dv s
J d            |
||         d<   |                                D ]b}|                    dg                               dt'          |                    d                                          d          f           cd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/   r0   r1   r2   r3   r6   r   deltacs                 r   
set_cookiezCookieMiddleware.set_cookie1   s4   . %  ..'8#455 2$W-- I&1'8<HHG'.."2"22  21 = = ==ae!3em!CDD*1Y''&(GCL#&-GCL# K*3DIKK'4I*J*JY'#'GCL %+GCL" 	*%)GCL" 	,'+GCL$>>## (    C	  
 (0GCL$!! 	 	Ay"--44ahhbh&9&9&?&?&A&AG T T TU   	 	r   c                 8    |                      ||d||d          S )z1
        Deletes a cookie in a response.
        r   zThu, 01-Jan-1970 00:00:00 GMT)rM   r0   r1   r/   )rP   )rJ   rK   rL   r0   r1   s        r   delete_cookiezCookieMiddleware.delete_cookieu   s1    
 ~~3  
 
 	
r   )r)   NNr*   NFFr+   )r*   N)	__name__
__module____qualname____doc__r   r(   classmethodrP   rR    r   r   r   r      s         
  M M M$ 
 A A A [AF 
 
 
 [
 
 
r   r   c                   6    e Zd ZdZdgZdgZd Zd Zd Zd Z	dS )InstanceSessionWrapperzf
    Populates the session in application instance scope, and wraps send to save
    the session.
    zhttp.response.startc                 0   t           j        | _        t          t           j                  j        | _        t          |          | _        d| j        v rd| _	        n5d| 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%   s      r   r   zInstanceSessionWrapper.__init__   s    #7*8+BCCP%[[

"" #DNN 
** 2  
 %/LLDJy!!DN r   c                    K   | j         d                             | j                  } t          | j                  |           d {V | j         d         _        d S )Nr   r\   )r#   r    r^   r   ra   _wrapped)r   session_keys     r   resolve_sessionz&InstanceSessionWrapper.resolve_session   sx      j+//0@AA0
/E0
 0

0 0 * * * * * *
9&&&r   c                   K   | j         r| j        d         j        }| j        d                                         }|d         | j        v r|                    dd          dk    rp|st          j        ra t          | j	                               d{V  |d         | j
        v r/|rVt          j        | j        d         v r<t                              |t          j        t          j        t          j                   n| j        d                                         rd}d}nD| j        d                                         }t%          j                    |z   }t'          |          }t                              || j        | j        d         j        ||t          j        t          j        t          j        pdt          j        pdt          j        	
  
         |                     |           d{V S )
zG
        Overridden send that also does session saves/cookies.
        r\   typestatus   i  Nr   )r0   r1   )rM   r/   r1   r0   r2   r3   r6   )rb   r#   modifiedis_emptysave_message_typesr    r   SESSION_SAVE_EVERY_REQUESTr   save_sessioncookie_response_message_typesr]   r   rR   SESSION_COOKIE_PATHSESSION_COOKIE_DOMAINget_expire_at_browser_closeget_expiry_agerB   r   rP   r^   rf   SESSION_COOKIE_SECURESESSION_COOKIE_HTTPONLYSESSION_COOKIE_SAMESITErc   )r   rK   rl   emptyrM   r/   expires_times          r   r%   zInstanceSessionWrapper.send   s     
 > -	z),5HJy)2244E
 4#:::KK#..#55 6!)!D 6 @,T->??AAAAAAAAA 6?d&HHH #74:i;PPP,:: ' ( <%-%A'/'E	 ;     :i0LLNN >&*G&*GG&*j&;&J&J&L&LG+/9;;+@L&/&=&=G(33# , Jy1=$+$+#+#A!)!=#+#A#IT%-%E%M%-%E 4    ^^G,,,,,,,,,r   c                     	 | j         d                                          dS # t          $ r t          d          w xY w)z,
        Saves the current session.
        r\   zThe request's session was deleted before the request completed. The user may have logged out in a concurrent request, for example.N)r#   saver   r   )r   s    r   rp   z#InstanceSessionWrapper.save_session   sX    	Jy!&&((((( 	 	 	%<  	s   # =N)
rS   rT   rU   rV   rn   rq   r   rg   r%   rp   rX   r   r   rZ   rZ      sq          00 &;$;!  0  4- 4- 4-l    r   rZ   c                       e Zd ZdZd Z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                     || _         d S r   r   r   s     r   r   zSessionMiddleware.__init__   r   r   c                    K   t          ||          }|                                 d{V  |                     |j        ||j                   d{V S )z{
        Instantiate a session wrapper for this scope, resolve the session and
        call the inner application.
        N)rZ   rg   r   r#   r%   )r   r#   r$   r%   wrappers        r   r(   zSessionMiddleware.__call__   sg      
 )55%%'''''''''ZZwEEEEEEEEEr   N)rS   rT   rU   rV   r   r(   rX   r   r   r~   r~      sA           	F 	F 	F 	F 	Fr   r~   c                 :    t          t          |                     S r   )r   r~   r   s    r   SessionMiddlewareStackr     s    -e44555r   )r:   rB   	importlibr   django.confr   %django.contrib.sessions.backends.baser   django.core.exceptionsr   django.httpr   django.http.cookier   django.utilsr	   django.utils.encodingr
   django.utils.functionalr   channels.dbr   django.utils.httpr   ImportErrorr   r   rZ   r~   r   rX   r   r   <module>r      s     # # # # # #             = = = = = = 6 6 6 6 6 6 $ $ $ $ $ $ + + + + + + ! ! ! ! ! ! + + + + + + . . . . . . . . . . . .;+++++++ ; ; ;::::::::;k
 k
 k
 k
 k
 k
 k
 k
\k k k k k k k k\F F F F F F F F26 6 6 6 6s   A AA