o
    ÿÑÐb…  ã                   @   sD   d dl mZ d dl mZ d dl mZ ddlmZ G dd„ deƒZdS )	é    )Úredirect)Úrequest)Ú_app_ctx_stacké   )Ú	RemoteAppc                       st   e Zd ZdZd‡ fdd„	Zd‡ fdd„	Zedd„ ƒZejd	d„ ƒZd‡ fd
d„	Z	ddd„Z
dd„ Zddd„Z‡  ZS )ÚFlaskRemoteAppz§Flask integrated RemoteApp of :class:`~authlib.client.OAuthClient`.
    It has built-in hooks for OAuthClient. The only required configuration
    is token model.
    Nc                    sD   |  dd ¡}|  dd ¡}tt| ƒj|||fi |¤Ž || _|| _d S )NÚfetch_request_tokenÚsave_request_token)ÚpopÚsuperr   Ú__init__Ú_fetch_request_tokenÚ_save_request_token)ÚselfZ	frameworkÚnameZfetch_tokenÚkwargsr   r	   ©Ú	__class__© úk/var/www/secure340b-portal/env/lib/python3.10/site-packages/authlib/integrations/flask_client/remote_app.pyr      s
   
zFlaskRemoteApp.__init__c                    s   || _ tt| ƒ |||¡ d S ©N)Útokenr   r   Ú_on_update_token)r   r   Zrefresh_tokenZaccess_tokenr   r   r   r      s   
ÿzFlaskRemoteApp._on_update_tokenc                 C   sB   t j}d | j¡}t||d ƒ}|r|S | jr|  ¡ }|| _|S d S ©Nzauthlib_oauth_token_{})r   ÚtopÚformatr   ÚgetattrZ_fetch_tokenr   )r   ÚctxÚattrr   r   r   r   r      s   ýzFlaskRemoteApp.tokenc                 C   s"   t j}d | j¡}t|||ƒ d S r   )r   r   r   r   Úsetattr)r   r   r   r   r   r   r   r   '   s   c                    s6   |d u r|  d¡s| j}tt| ƒj||fd|i|¤ŽS )NZwithhold_tokenr   )Úgetr   r   r   r   )r   ÚmethodÚurlr   r   r   r   r   r   -   s   
ÿÿÿzFlaskRemoteApp.requestc                 K   sP   | j |fi |¤Ž}| jr| dd¡}|  |¡ | jtfd|i|¤Ž t|d ƒS )zäCreate a HTTP Redirect for Authorization Endpoint.

        :param redirect_uri: Callback or redirect URI for authorization.
        :param kwargs: Extra parameters to include.
        :return: A HTTP redirect response.
        Úrequest_tokenNÚredirect_urir"   )Zcreate_authorization_urlÚrequest_token_urlr
   r   Zsave_authorize_dataÚ	flask_reqr   )r   r$   r   Úrvr#   r   r   r   Úauthorize_redirect3   s   
z!FlaskRemoteApp.authorize_redirectc                 K   sD   | j r|  ¡ }nd}|  t|¡}| |¡ | jdi |¤Ž}|| _|S )zAuthorize access token.Nr   )r%   r   Zretrieve_access_token_paramsr&   ÚupdateZfetch_access_tokenr   )r   r   r#   Úparamsr   r   r   r   Úauthorize_access_tokenC   s   

z%FlaskRemoteApp.authorize_access_tokenéx   c                 C   s   |   t|||¡S r   )Z_parse_id_tokenr&   )r   r   Zclaims_optionsZleewayr   r   r   Úparse_id_tokenP   s   zFlaskRemoteApp.parse_id_token)NNr   )Nr,   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Úpropertyr   Úsetterr   r(   r+   r-   Ú__classcell__r   r   r   r   r      s    


r   N)Zflaskr   r   r&   r   Zbase_clientr   r   r   r   r   r   Ú<module>   s
    