o
    Df                      @   s   d dl Z d dlmZ d dlZd dl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mZ dd	lmZmZ d
dlmZmZmZmZ g dZG dd deeZG dd deeZG dd deejZG dd deejZdS )    N)asynccontextmanager)AuthRequestResponseUSE_CLIENT_DEFAULT)Lock)
url_decode)OAuth2Client)
ClientAuth	TokenAuth   )HTTPX_CLIENT_KWARGSbuild_request   )
OAuthErrorInvalidTokenErrorMissingTokenErrorUnsupportedTokenTypeError)
OAuth2AuthOAuth2ClientAuthAsyncOAuth2Clientr	   c                   @   s2   e Zd ZdZdZdedejeedf fddZ	dS )r   zFSign requests for OAuth 2.0, currently only bearer token is supported.TrequestreturnNc              
   c   sz    z#|  t|j|j|j\}}}tt||d< t||||dV  W d S  ty< } zdt| }t|dd }~ww )NContent-Lengthurlheadersbodyinitial_requestzUnsupported token_type: )description)	preparestrr   r   contentlenr   KeyErrorr   )selfr   r   r   r   errorr    r'   h/home/ubuntu/webapp/venv/lib/python3.10/site-packages/authlib/integrations/httpx_client/oauth2_client.py	auth_flow   s   

zOAuth2Auth.auth_flow)
__name__
__module____qualname____doc__requires_request_bodyr   typing	Generatorr   r)   r'   r'   r'   r(   r      s    "r   c                   @   s.   e Zd ZdZdedejeedf fddZdS )r   Tr   r   Nc                 c   sJ    |  |jt|j|j|j\}}}tt||d< t||||dV  d S )Nr   r   )r    methodr!   r   r   r"   r#   r   )r%   r   r   r   r   r'   r'   r(   r)   *   s   
zOAuth2ClientAuth.auth_flow)	r*   r+   r,   r.   r   r/   r0   r   r)   r'   r'   r'   r(   r   '   s    "r   c                       s   e Zd ZeZeZeZe	Z
						dddZdef fdd	Zedef fdd		Zd
d ZddedfddZdddefddZdedfddZ  ZS )r   Nheaderc
                 K   sR   |  |
}tjj| fi | t | _tj| fd |||||||||	d
|
 d S N)
session	client_idclient_secrettoken_endpoint_auth_methodrevocation_endpoint_auth_methodscoperedirect_uritokentoken_placementupdate_token)_extract_session_request_paramshttpxAsyncClient__init__r   _token_refresh_lock_OAuth2Clientr%   r5   r6   r7   r8   r9   r:   r;   r<   r=   kwargsclient_kwargsr'   r'   r(   rA   8   s    

zAsyncOAuth2Client.__init__Fc                    sR   |s|t u r| jst | | jI d H  | j}t j||fd|i|I d H S Nauth)r   r;   r   ensure_active_token
token_authsuperr   r%   r1   r   withhold_tokenrH   rE   	__class__r'   r(   r   Q   s   zAsyncOAuth2Client.requestc              	     s   |s|t u r| jst | | jI d H  | j}t j||fd|i|4 I d H }|V  W d   I d H  d S 1 I d H s?w   Y  d S rG   )r   r;   r   rI   rJ   rK   stream)r%   r1   r   rM   rH   rE   resprN   r'   r(   rP   ]   s    .zAsyncOAuth2Client.streamc              	      s   | j 4 I d H R | j rO|d}| jd}|r(|r(| j||dI d H  n'| jddkrL|d }| j|ddI d H }| jrK| j||dI d H  nt W d   I d H  d S 1 I d H s`w   Y  d S )	Nrefresh_tokentoken_endpointrR   
grant_typeclient_credentialsaccess_token)rU   )rW   )	rB   r;   
is_expiredgetmetadatarR   fetch_tokenr=   r   )r%   r;   rR   r   rW   	new_tokenr'   r'   r(   rI   k   s   

.z%AsyncOAuth2Client.ensure_active_token POSTc           	         s   |  dkr| j|ftt|||d|I d H }n"d|v r(d||g}nd||g}| j|f||d|I d H }| jd D ]}||}qC| |S )Nr^   datar   rH   ?&)r   rH   access_token_response)upperpostdictr   joinrY   compliance_hookparse_response_token)	r%   r   r   r   rH   r1   rE   rQ   hookr'   r'   r(   _fetch_tokenz   s"   

zAsyncOAuth2Client._fetch_tokenc           
         s   | j |ftt|||d|I d H }| jd D ]}||}q| |}	d|	vr/|| jd< | jr=| j| j|dI d H  | jS )Nr_   refresh_token_responserR   rT   )re   rf   r   rh   ri   r;   r=   )
r%   r   rR   r   r   rH   rE   rQ   rj   r;   r'   r'   r(   _refresh_token   s"   


z AsyncOAuth2Client._refresh_tokenc                 K   s"   | j |ftt|||d|S )Nr_   )re   rf   r   )r%   r   r   rH   r   rE   r'   r'   r(   
_http_post   s   
zAsyncOAuth2Client._http_post	NNNNNNNr2   N)r*   r+   r,   r   SESSION_REQUEST_PARAMSr   client_auth_classr   token_auth_classr   oauth_error_classrA   r   r   r   rP   rI   rk   rm   rn   __classcell__r'   r'   rN   r(   r   1   s.    


r   c                       sf   e Zd ZeZeZeZe	Z
						dddZedd Zdef fdd		Zdef fd
d	Z  ZS )r	   Nr2   c
                 K   sJ   |  |
}tjj| fi | tj| f| |||||||||	d
|
 d S r3   )r>   r?   ClientrA   rC   rD   r'   r'   r(   rA      s   

zOAuth2Client.__init__c                 C   s
   t | |)N)r   )
error_typeerror_descriptionr'   r'   r(   handle_error   s   
zOAuth2Client.handle_errorFc                    J   |s|t u r| jst | | jst | j}t j||fd|i|S rG   )r   r;   r   rI   r   rJ   rK   r   rL   rN   r'   r(   r         zOAuth2Client.requestc                    ry   rG   )r   r;   r   rI   r   rJ   rK   rP   rL   rN   r'   r(   rP      rz   zOAuth2Client.streamro   )r*   r+   r,   r   rp   r   rq   r   rr   r   rs   rA   staticmethodrx   r   r   rP   rt   r'   r'   rN   r(   r	      s     

r	   ) r/   
contextlibr   r?   r   r   r   r   anyior   authlib.common.urlsr   authlib.oauth2.clientr	   rC   authlib.oauth2.authr
   r   utilsr   r   base_clientr   r   r   r   __all__r   r   r@   r   ru   r'   r'   r'   r(   <module>   s    
s