o
    Zh                     @  s   d dl mZ d dlmZmZmZmZ d dlmZm	Z	m
Z
mZmZ d dlmZ d dlmZ er8d dlZd dlmZ G dd	 d	e
eeZG d
d de	ZdS )    )annotations)TYPE_CHECKINGAnyCallablecast)BaseApp	BaseOAuthOAuth2Mixin
OAuthErrorOpenIDMixin)OAuth2Session)TornadoIntegrationN)	AuthCachec                      sD   e Zd ZeZd fddZ	ddddZdddZdddZ  Z	S )TornadoOAuth2Appreturndict[str, Any]c                   s.   t dt  }d|dg v rd| jd< |S )zGWe enforce S256 code challenge method if it is supported by the server.r   S256 code_challenge_methods_supportedcode_challenge_method)r   superload_server_metadatagetclient_kwargs)selfresult	__class__ `/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/streamlit/web/server/oidc_mixin.pyr   +   s   
z%TornadoOAuth2App.load_server_metadataNrequest_handlertornado.web.RequestHandlerredirect_urir   kwargsNonec                 K  s<   | j |fi |}| jdd|i| |j|d dd dS )a(  Create a HTTP Redirect for Authorization Endpoint.

        :param request_handler: HTTP request instance from Tornado.
        :param redirect_uri: Callback or redirect URI for authorization.
        :param kwargs: Extra parameters to include.
        :return: A HTTP redirect response.
        r!   urli.  )statusNr   )create_authorization_url_save_authorize_dataredirect)r   r   r!   r"   auth_contextr   r   r   authorize_redirect2   s   z#TornadoOAuth2App.authorize_redirectc                 K  s   | dd}|r| dd}t||d| d| dd}d}|dd}| j||d}| j||d | ||}| jdi ||}	d	|	v red
|v re| j	|	|d
 |d}
i |	d|
i}	t
d|	S )zl
        :param request_handler: HTTP request instance from Tornado.
        :return: A token dict.
        errorNerror_description)r+   descriptioncodestate)r.   r/   claims_optionsid_tokennonce)r2   r0   userinfor   r   )get_argumentr
   pop	frameworkget_state_datar   clear_state_data_format_state_paramsfetch_access_tokenparse_id_tokenr   )r   r   r"   r+   r-   paramssessionr0   
state_datatokenr3   r   r   r   authorize_access_tokenC   s&   

z'TornadoOAuth2App.authorize_access_tokenc                 K  s0   | dd}|rd}| j||| dS td)zAuthlib underlying uses the concept of "session" to store state data.
        In Tornado, we don't have a session, so we use the framework's cache option.
        r/   NzMissing state value)r5   r6   set_state_dataRuntimeError)r   r"   r/   r=   r   r   r   r'   c   s
   z%TornadoOAuth2App._save_authorize_data)r   r   )N)r   r    r!   r   r"   r   r   r#   )r   r    r"   r   r   r   )r"   r   r   r#   )
__name__
__module____qualname__r   
client_clsr   r*   r@   r'   __classcell__r   r   r   r   r   (   s    

 r   c                      s0   e Zd ZeZeZ				dd fd	d
Z  ZS )TornadoOAuthNconfigdict[str, Any] | NonecacheAuthCache | Nonefetch_token1Callable[[dict[str, Any]], dict[str, Any]] | Noneupdate_tokenc                   s   t  j|||d || _d S )N)rK   rM   rO   )r   __init__rI   )r   rI   rK   rM   rO   r   r   r   rP   s   s   
zTornadoOAuth.__init__)NNNN)rI   rJ   rK   rL   rM   rN   rO   rN   )	rC   rD   rE   r   oauth2_client_clsr   framework_integration_clsrP   rG   r   r   r   r   rH   o   s    rH   )
__future__r   typingr   r   r   r    authlib.integrations.base_clientr   r   r	   r
   r   $authlib.integrations.requests_clientr   0streamlit.web.server.authlib_tornado_integrationr   tornado.webtornadostreamlit.auth_utilr   r   rH   r   r   r   r   <module>   s   G