U
    öÕ/e  ã                   @  sÀ   d Z ddlmZ ddlZe e¡ZddlmZ ddl	m
Z
 ddlmZmZmZ ddlmZmZmZmZ dd	lmZ er¦d
dlmZ ddlmZ ddlmZ ddlmZ dZG dd„ deeƒZdS )z9 Abstract request handler that handles bokeh-session-id

é    )ÚannotationsN)ÚTYPE_CHECKING)ÚHTTPServerRequest)Ú	HTTPErrorÚRequestHandlerÚauthenticated)Úcheck_token_signatureÚgenerate_jwt_tokenÚgenerate_session_idÚget_session_idé   )Ú	AuthMixiné   )ÚIDé   )ÚApplicationContext)ÚServerSession)ÚBokehTornado)ÚSessionHandlerc                      sv   e Zd ZU dZded< ded< ded< ded	< dd
dœ‡ fdd„Zdd„ Zeddœdd„ƒZe	j
Z
e	jZe	jZ‡  ZS )r   zD Implements a custom Tornado handler for document display page

    r   Úapplicationr   Úrequestr   Úapplication_contextÚstrÚbokeh_websocket_pathÚNone)Útornado_appÚreturnc                   s,   |d | _ |d | _tƒ j|f|ž|Ž d S )Nr   r   )r   r   ÚsuperÚ__init__)Úselfr   ÚargsÚkw©Ú	__class__© úF/tmp/pip-unpacked-wheel-f5fndrjf/bokeh/server/views/session_handler.pyr   J   s    

zSessionHandler.__init__c                 O  s   d S )Nr$   )r   r    r!   r$   r$   r%   Ú
initializeP   s    zSessionHandler.initializer   )r   c                 ƒ  s  | j }| jdd d}| jdd d}d| jjkrZ|d k	rLt d¡ tddd‚| jj d¡}|d k	rŠ|d k	r€t d	¡ tdd
d‚t|ƒ}n6|d krÀ|j	rªt
|j|jd}nt d¡ tddd‚|d krÆ|jd krö|jpÜg ‰‡fdd„| jjD ƒ‰n|j‰‡fdd„| jj ¡ D ƒ}|jd krF|jp,g ‰‡fdd„| jjD ƒ‰ n|j‰ ‡ fdd„| jj ¡ D ƒ}|rŽd|krŽd|jp‚g krŽ|d= ||dœ}| | jj  | j¡¡ t||j|j|j|d}t||j|jdsòt d|¡ tddd‚| j || j|¡I d H }|S )Nzbokeh-token)Údefaultzbokeh-session-idzBokeh-Session-IdzLServer received session ID in request argument and header, expected only onei“  z1session ID was provided as an argument and header)Ústatus_codeÚreasonz<Server received both token and session ID, expected only onez'Both token and session ID were provided)Ú
secret_keyÚsignedzCServer configured not to generate session IDs and none was providedzNo bokeh-session-id providedc                   s   g | ]}|ˆ kr|‘qS r$   r$   )Ú.0Úheader)Úexcluded_headersr$   r%   Ú
<listcomp>n   s    ÿz.SessionHandler.get_session.<locals>.<listcomp>c                   s   i | ]\}}|ˆ kr||“qS r$   r$   ©r,   ÚkÚv)Úallowed_headersr$   r%   Ú
<dictcomp>r   s    ÿ z.SessionHandler.get_session.<locals>.<dictcomp>c                   s   g | ]}|ˆ kr|‘qS r$   r$   )r,   Úcookie)Úexcluded_cookiesr$   r%   r/   w   s    ÿc                   s    i | ]\}}|ˆ kr||j “qS r$   )Úvaluer0   )Úallowed_cookiesr$   r%   r4   {   s    ÿ ÚCookie)ÚheadersÚcookies)r*   r+   Z
expirationZextra_payloadz$Session id had invalid signature: %rzInvalid token or session ID)r   Zget_argumentr   r:   ÚlogÚdebugr   Úgetr   Zgenerate_session_idsr
   r*   Zsign_sessionsZinclude_headersZexclude_headersÚitemsZinclude_cookiesZexclude_cookiesr;   Úupdater   Úprocess_requestr	   Zsession_token_expirationr   ÚerrorZcreate_session_if_needed)r   ZappÚtokenZ
session_idr:   r;   ÚpayloadÚsessionr$   )r8   r3   r6   r.   r%   Úget_sessionS   sb    


ÿ



"
üþzSessionHandler.get_session)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r&   r   rF   r   Zget_login_urlZget_current_userÚprepareÚ__classcell__r$   r$   r"   r%   r   ?   s   
Br   ) rJ   Ú
__future__r   ÚloggingÚ	getLoggerrG   r<   Útypingr   Ztornado.httputilr   Ztornado.webr   r   r   Zbokeh.util.tokenr   r	   r
   r   Z
auth_mixinr   Z
core.typesr   Zcontextsr   rE   r   Ztornador   Ú__all__r   r$   r$   r$   r%   Ú<module>   s   
