U
    ·ë]j“  ã                   @   sÎ   d dl mZ d dlmZmZmZmZmZmZm	Z	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mZ edd	„ ƒZeddd„ƒZedd„ ƒZdd„ ZG dd„ deƒZG dd„ deƒZdd„ Zd
S )é    )Úsettings)ÚBACKEND_SESSION_KEYÚHASH_SESSION_KEYÚSESSION_KEYÚ_get_backendsÚget_user_modelÚload_backendÚuser_logged_inÚuser_logged_out)Úconstant_time_compare)Ú
LazyObject)Údatabase_sync_to_async)ÚBaseMiddleware)ÚCookieMiddlewareÚSessionMiddlewarec           	      C   s®   ddl m} d| krtdƒ‚| d }d}zt|ƒ}|t }W n tk
rP   Y nTX |tjkr¤t|ƒ}| 	|¡}t
|dƒr¤| t¡}|o’t|| ¡ ƒ}|s¤| ¡  d}|p¬|ƒ S )z�
    Return the user model instance associated with the given scope.
    If no user is retrieved, return an instance of `AnonymousUser`.
    r   ©ÚAnonymousUserÚsessionúQCannot find session in scope. You should wrap your consumer in SessionMiddleware.NÚget_session_auth_hash)Údjango.contrib.auth.modelsr   Ú
ValueErrorÚ_get_user_session_keyr   ÚKeyErrorr   ZAUTHENTICATION_BACKENDSr   Úget_userÚhasattrÚgetr   r   r   Úflush)	Úscoper   r   ÚuserZuser_idÚbackend_pathÚbackendZsession_hashZsession_hash_verified© r"   úVc:\users\psant\downloads\hotstarbackend\school\venv\Lib\site-packages\channels/auth.pyr      s2    ÿ



 ÿr   Nc                 C   s   d| krt dƒ‚| d }d}|dkr0|  dd¡}|dkr@t dƒ‚t|dƒrR| ¡ }t|krˆt|ƒ|jks~|r�t| td¡|ƒs�| 	¡  n| 
¡  z|pš|j}W n@ tk
rÞ   tdd	�}t|ƒd
krÒ|d \}}nt dƒ‚Y nX |jj |¡|t< ||t< ||t< || d< tj|jd|d� dS )zÚ
    Persist a user id and a backend in the request.
    This way a user doesn't have to re-authenticate on every request.
    Note that data set during the anonymous session is retained when the user
    logs in.
    r   r   Ú Nr   zCUser must be passed as an argument or must be present in the scope.r   T)Zreturn_tuplesé   r   z’You have multiple authentication backends configured and therefore must provide the `backend` argument or set the `backend` attribute on the user.©ZsenderÚrequestr   )r   r   r   r   r   r   Úpkr   r   r   Z	cycle_keyr!   ÚAttributeErrorr   ÚlenÚ_metaZvalue_to_stringr   r	   ÚsendÚ	__class__)r   r   r!   r   Zsession_auth_hashÚbackendsÚ_r"   r"   r#   Úlogin:   sN    ÿÿ
ÿ
 ÿþ	

ÿ
r0   c                 C   s|   ddl m} d| krtdƒ‚| d }|  dd¡}t|dƒrD|jsDd}|dk	r^tj|jd|d� | 	¡  d| krx|ƒ | d< dS )	z_
    Remove the authenticated user's ID from the request and flush their session
    data.
    r   r   r   zWLogin cannot find session in scope. You should wrap your consumer in SessionMiddleware.r   NÚis_authenticatedr&   )
r   r   r   r   r   r1   r
   r,   r-   r   )r   r   r   r   r"   r"   r#   Úlogoutr   s    ÿr2   c                 C   s   t ƒ jj | t ¡S ©N)r   r+   r(   Z	to_pythonr   )r   r"   r"   r#   r   Ž   s    r   c                   @   s   e Zd ZdZdd„ ZdS )ÚUserLazyObjectzc
    Throw a more useful error message when scope['user'] is accessed before
    it's resolved
    c                 C   s   t dƒ‚d S )Nz(Accessing scope user before it is ready.)r   )Úselfr"   r"   r#   Ú_setupš   s    zUserLazyObject._setupN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r6   r"   r"   r"   r#   r4   ”   s   r4   c                       s0   e Zd ZdZdd„ Zdd„ Z‡ fdd„Z‡  ZS )ÚAuthMiddlewarezu
    Middleware which populates scope["user"] from a Django session.
    Requires SessionMiddleware to function.
    c                 C   s&   d|krt dƒ‚d|kr"tƒ |d< d S )Nr   zPAuthMiddleware cannot find session in scope. SessionMiddleware must be above it.r   )r   r4   ©r5   r   r"   r"   r#   Úpopulate_scope¤   s    ÿzAuthMiddleware.populate_scopec                 Ã   s   t |ƒI d H |d _d S )Nr   )r   Z_wrappedr<   r"   r"   r#   Úresolve_scope¯   s    zAuthMiddleware.resolve_scopec                 ƒ   s8   t |ƒ}|  |¡ |  |¡I d H  tƒ  |||¡I d H S r3   )Údictr=   r>   ÚsuperÚ__call__)r5   r   Zreceiver,   ©r-   r"   r#   rA   ²   s    
zAuthMiddleware.__call__)r7   r8   r9   r:   r=   r>   rA   Ú__classcell__r"   r"   rB   r#   r;   ž   s   r;   c                 C   s   t tt| ƒƒƒS r3   )r   r   r;   )Úinnerr"   r"   r#   ÚAuthMiddlewareStack½   s    rE   )N)Zdjango.confr   Zdjango.contrib.authr   r   r   r   r   r   r	   r
   Zdjango.utils.cryptor   Zdjango.utils.functionalr   Zchannels.dbr   Zchannels.middlewarer   Zchannels.sessionsr   r   r   r0   r2   r   r4   r;   rE   r"   r"   r"   r#   Ú<module>   s    (

%7

