o
    b                     @   s   d dl Z d dlZd dlmZ d dlmZmZ d dlmZm	Z	m
Z
 ddlmZ ddlmZmZ dgZeeZG d	d deZdS )
    N)urlparse)JsonWebToken
JsonWebKey)UserInfoCodeIDTokenImplicitIDToken   )BaseApp)MissingRequestTokenErrorMissingTokenError	RemoteAppc                   @   s`   e Zd Zdd ZdddZdd Zddd	Zdd
dZdddZdddZ	dd Z
dddZdS )r   c                 C   s:   | j rd| jvr| | j }t |d< | j| | jS )NZ
_loaded_at)Z_server_metadata_urlserver_metadata_fetch_server_metadatatimeupdate)selfmetadata r   j/var/www/secure340b-portal/env/lib/python3.10/site-packages/authlib/integrations/base_client/remote_app.pyload_server_metadata   s
   zRemoteApp.load_server_metadataNc                 C   s0   t | jr| j|||d | jj|||d d S )N)refresh_tokenaccess_token)callableZ_update_token	frameworkZupdate_token)r   tokenr   r   r   r   r   _on_update_token   s   

zRemoteApp._on_update_tokenc                 K   sV   i }| j r|| j  |j| jfi |}td| |j|fi |}||dS )NzFetch request token: {!r})urlrequest_token)Zrequest_token_paramsr   Zfetch_request_tokenrequest_token_urllogdebugformatcreate_authorization_url)r   clientauthorization_endpointkwargsparamsr   r   r   r   r    _create_oauth1_authorization_url&   s   
z*RemoteApp._create_oauth1_authorization_urlc                 K   s   |   }| j}|s| js|d}|std| jr || j | jdi |)}||_| jr@| j	||fi |W  d   S | j
||fi |W  d   S 1 sTw   Y  dS )zGenerate the authorization url and state for HTTP redirect.

        :param redirect_uri: Callback or redirect URI for authorization.
        :param kwargs: Extra parameters to include.
        :return: dict
        r$   zMissing "authorize_url" valueNr   )r   Zauthorize_urlr   getRuntimeErrorZauthorize_paramsr   _get_oauth_clientredirect_urir'   Z _create_oauth2_authorization_url)r   r+   r%   r   r$   r#   r   r   r   r"   1   s.   

$z"RemoteApp.create_authorization_urlc           	      K   s   |   }| j}|s| js|d}| jdi |\}| jrL|dur$||_|du r+t i }|| || ||_| j	p>i }|j
|fi |}d|_n |durS||_i }| j	r^|| j	 || |j|fi |}|W  d   S 1 sxw   Y  dS )aS  Fetch access token in one step.

        :param redirect_uri: Callback or Redirect URI that is used in
                             previous :meth:`authorize_redirect`.
        :param request_token: A previous request token for OAuth 1.
        :param params: Extra parameters to fetch access token.
        :return: A token dict.
        token_endpointNr   )r   Zaccess_token_urlr   r(   r*   r+   r
   r   r   Zaccess_token_paramsfetch_access_tokenZfetch_token)	r   r+   r   r&   r   r,   r#   r   r%   r   r   r   r-   M   s4   	





$zRemoteApp.fetch_access_tokenc           	      K   s   | j r|dst| j |}|d}|s|  }ni }| jdi |C}|dd }|r?|j||fi |W  d    S |d u rM| j	rM|rM| 	|}|d u rTt
 ||_|j||fi |W  d    S 1 skw   Y  d S )N)zhttps://zhttp://withhold_tokenrequestr   )Zapi_base_url
startswithr   urljoinr(   r   r*   popr/   Z_fetch_tokenr   r   )	r   methodr   r   r%   r.   r   sessionr/   r   r   r   r/   s   s$   


$zRemoteApp.requestFc                 C   sL   |   }|d}|r|s|S |d}|std| |}|| jd< |S )NZjwksZjwks_urizMissing "jwks_uri" in metadata)r   r(   r)   r   r   )r   forcer   jwk_seturir   r   r   fetch_jwk_set   s   



zRemoteApp.fetch_jwk_setc                 K   sF   |   }| j|d fi |}| }|d}|r|| |}t|S )z+Fetch user info from ``userinfo_endpoint``.Zuserinfo_endpointZuserinfo_compliance_fix)r   r(   jsonr   )r   r%   r   respdataZcompliance_fixr   r   r   userinfo   s   

zRemoteApp.userinfox   c                    s   d|vrdS  fdd} j |d}t| jd}d|v r'|d |d< t}nt}  }	|du r>d|	v r>d	d
|	d gii}|	d}
|
sHdg}
t|
}|j	|d ||||d}|ddu rdd|j
d< |j|d t|S )z9Return an instance of UserInfo from token's ``id_token``.Zid_tokenNc                    sV   t   }z	|| dW S  ty*   t  jdd}|| d Y S w )NkidT)r5   )r   Zimport_key_setr8   Zfind_by_kidr(   
ValueError)headerpayloadr6   r   r   r   load_key   s   z+RemoteApp._parse_id_token.<locals>.load_keynonce)rD   	client_idr   ZissuerZissvaluesZ%id_token_signing_alg_values_supportedZRS256)key
claims_clsclaims_optionsclaims_paramsZnonce_supportedF)leeway)r   Zget_session_datadictrE   r   r   r   r(   r   decoder&   validater   )r   r/   r   rI   rK   rC   rD   rJ   rH   r   Z
alg_valuesZjwtZclaimsr   rB   r   _parse_id_token   s:   	

zRemoteApp._parse_id_token)NN)N)F)Nr=   )__name__
__module____qualname__r   r   r'   r"   r-   r/   r8   r<   rO   r   r   r   r   r      s    



&
)r   loggingZauthlib.common.urlsr   Zauthlib.joser   r   Zauthlib.oidc.corer   r   r   Zbase_appr	   errorsr
   r   __all__	getLoggerrP   r   r   r   r   r   r   <module>   s    
