o
    Dfx0                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZ ddlm	Z	m
Z
mZ eeZG dd dZG d	d
 d
ZG dd dZG dd deeZG dd dZG dd deeZdS )    N)urlparse)default_user_agent)generate_token   )MismatchingStateErrorMissingRequestTokenErrorMissingTokenErrorc                   @   sF   e Zd ZdZdZdddZdd Zdd Zdd	 Zd
d Z	dd Z
dS )BaseAppNc                 K      t  NNotImplementedError)selfmethodurltokenkwargs r   b/home/ubuntu/webapp/venv/lib/python3.10/site-packages/authlib/integrations/base_client/sync_app.pyrequest      zBaseApp.requestc                 K      | j d|fi |S )zInvoke GET http request.

        If ``api_base_url`` configured, shortcut is available::

            client.get('users/lepture')
        GETr   r   r   r   r   r   r   get      zBaseApp.getc                 K   r   )zInvoke POST http request.

        If ``api_base_url`` configured, shortcut is available::

            client.post('timeline', json={'text': 'Hi'})
        POSTr   r   r   r   r   post   r   zBaseApp.postc                 K   r   )zInvoke PATCH http request.

        If ``api_base_url`` configured, shortcut is available::

            client.patch('profile', json={'name': 'Hsiaoming Yang'})
        PATCHr   r   r   r   r   patch(   r   zBaseApp.patchc                 K   r   )zInvoke PUT http request.

        If ``api_base_url`` configured, shortcut is available::

            client.put('profile', json={'name': 'Hsiaoming Yang'})
        PUTr   r   r   r   r   put1   r   zBaseApp.putc                 K   r   )zInvoke DELETE http request.

        If ``api_base_url`` configured, shortcut is available::

            client.delete('posts/123')
        DELETEr   r   r   r   r   delete:   r   zBaseApp.deleter   )__name__
__module____qualname__
client_clsOAUTH_APP_CONFIGr   r   r   r    r"   r$   r   r   r   r   r	      s    
				r	   c                   @   s   e Zd Zdd Zdd ZdS )_RequestMixinc                 C   s   | j r
|r|  |S d S d S r   )_fetch_token)r   r   r   r   r   _get_requested_tokenE   s   

z"_RequestMixin._get_requested_tokenc                 C   s   | dd }|d}| jr|dst| j|}|r&|j||fi |S |d u r/| |}|d u r6t ||_	|j||fi |S )Nr   withhold_token)zhttps://zhttp://)
popr   api_base_url
startswithr   urljoinr   r,   r   r   )r   sessionr   r   r   r   r   r-   r   r   r   _send_token_requestI   s   

z!_RequestMixin._send_token_requestN)r%   r&   r'   r,   r3   r   r   r   r   r*   D   s    r*   c                   @   s.   e Zd ZdZ						dddZdd ZdS )
OAuth1BaseNc                 K   sf   || _ || _|| _|| _|| _|| _|| _|	| _|
| _|| _	|| _
|p$i | _|| _|p,t| _|| _d S r   )	frameworkname	client_idclient_secretrequest_token_urlrequest_token_paramsaccess_token_urlaccess_token_paramsauthorize_urlauthorize_paramsr/   client_kwargsr+   r   _user_agent_kwargs)r   r5   r6   fetch_tokenr7   r8   r9   r:   r;   r<   r=   r>   r/   r?   
user_agentr   r   r   r   __init___   s   


zOAuth1Base.__init__c                 C   s*   | j | j| jfi | j}| j|jd< |S )N
User-Agent)r(   r7   r8   r?   r@   headers)r   r2   r   r   r   _get_oauth_clientw   s   zOAuth1Base._get_oauth_client)NNNNNNNNNNNNN)r%   r&   r'   r(   rD   rG   r   r   r   r   r4   \   s    
r4   c                   @   s*   e Zd ZdddZdddZdddZdS )	OAuth1MixinNc                 K   s>   |   }| |||||W  d    S 1 sw   Y  d S r   )rG   r3   )r   r   r   r   r   r2   r   r   r   r   ~   s   
$zOAuth1Mixin.requestc                 K   s   | j std| jr|| j |  0}||_| jpi }|j| jfi |}t	
d| |j| j fi |}|d }W d   n1 sGw   Y  |||dS )Generate 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
        Missing "authorize_url" valuezFetch request token: oauth_tokenN)r   request_tokenstate)r=   RuntimeErrorr>   updaterG   redirect_urir:   fetch_request_tokenr9   logdebugcreate_authorization_url)r   rP   r   clientparamsrL   r   rM   r   r   r   rT      s   


z$OAuth1Mixin.create_authorization_urlc                 K   sx   |   .}|du rt i }|| || ||_| jpi }|j| jfi |}W d   |S 1 s5w   Y  |S )zFetch access token in one step.

        :param request_token: A previous request token for OAuth 1.
        :param kwargs: Extra parameters to fetch access token.
        :return: A token dict.
        N)rG   r   rO   r   r<   fetch_access_tokenr;   )r   rL   r   rU   r   rV   r   r   r   rW      s   






zOAuth1Mixin.fetch_access_tokenr   )r%   r&   r'   r   rT   rW   r   r   r   r   rH   }   s    

rH   c                   @   sP   e Zd ZdZ						dddZdddZdd Zedd	 Zed
d Z	dS )
OAuth2BaseNc                 K   sr   || _ || _|| _|| _|| _|| _|	| _|
| _|| _|pi | _	|| _
|| _|| _|| _|p/t| _|| _|| _d S r   )r5   r6   r7   r8   r;   r<   r=   r>   r/   r?   compliance_fixclient_auth_methodsr+   _update_tokenr   r@   _server_metadata_urlserver_metadata)r   r5   r6   rB   update_tokenr7   r8   r;   r<   r=   r>   r/   r?   server_metadata_urlrY   rZ   rC   r   r   r   r   rD      s"   


zOAuth2Base.__init__c                 C   r
   r   r   r   r   refresh_tokenaccess_tokenr   r   r   _on_update_token   r   zOAuth2Base._on_update_tokenc                 K   s   i }| | j | | | jr| j|d< | jr| j|d< | jd| j| j| jd|}| jr:| jD ]}|	| q2| j
rB| 
| | j|jd< |S )Nauthorization_endpointtoken_endpoint)r7   r8   r^   rE   r   )rO   r?   r=   r;   r(   r7   r8   rc   rZ   register_client_auth_methodrY   r@   rF   )r   metadatar?   r2   fr   r   r   rG      s*   




zOAuth2Base._get_oauth_clientc                 C   s>   | d u rt  | d}|r||d< | d}|r||d< |S )Ncode_verifierrP   )r   r   )
state_datarV   ri   rP   r   r   r   _format_state_params   s   

zOAuth2Base._format_state_paramsc           	      K   s   i }| j r |d}|std}||d< ||d< td| |d| j}|rBd| v rB|d}|s>td}||d< ||d< | j|fi |\}}||d< ||d	< |S )
Nri   0   zUsing code_verifier: scopeopenidnonce   r   rM   )code_challenge_methodr   r   rR   rS   rm   splitrT   )	rU   rd   r   rvri   rm   ro   r   rM   r   r   r    _create_oauth2_authorization_url   s.   


z+OAuth2Base._create_oauth2_authorization_url)NNNNNNNNNNNNNNNNN)
r%   r&   r'   r(   rD   rc   rG   staticmethodrk   rt   r   r   r   r   rX      s    


rX   c                   @   s<   e Zd ZdddZdddZdd Zddd	Zdd
dZdS )OAuth2MixinNc                 C   s0   t | jr| j|||d | jj|||d d S )N)ra   rb   )callabler[   r5   r^   r`   r   r   r   rc     s   

zOAuth2Mixin._on_update_tokenc                 K   sN   |   }| jdi |}| |||||W  d    S 1 s w   Y  d S )Nr   )load_server_metadatarG   r3   )r   r   r   r   r   rg   r2   r   r   r   r     s   $zOAuth2Mixin.requestc                 C   s   | j r>d| jvr>| jdi | j}|jd| j dd}|  | }W d    n1 s-w   Y  t |d< | j| | jS )N
_loaded_atr   T)r-   r   )	r\   r]   r(   r?   r   raise_for_statusjsontimerO   )r   r2   resprg   r   r   r   ry   #  s   
z OAuth2Mixin.load_server_metadatac                 K   s   |   }| jp|d}|std| jr|| j | jdi |}|dur+||_| j||fi |W  d   S 1 s?w   Y  dS )rI   rd   rJ   Nr   )	ry   r=   r   rN   r>   rO   rG   rP   rt   )r   rP   r   rg   rd   rU   r   r   r   rT   .  s   $z$OAuth2Mixin.create_authorization_urlc                 K   s   |   }| jp|d}| jdi |*}|dur||_i }| jr'|| j || |j|fi |}|W  d   S 1 sAw   Y  dS )a  Fetch access token in the final step.

        :param redirect_uri: Callback or Redirect URI that is used in
                             previous :meth:`authorize_redirect`.
        :param kwargs: Extra parameters to fetch access token.
        :return: A token dict.
        re   Nr   )ry   r;   r   rG   rP   r<   rO   rB   )r   rP   r   rg   re   rU   rV   r   r   r   r   rW   E  s   
$zOAuth2Mixin.fetch_access_tokenru   r   )r%   r&   r'   rc   r   ry   rT   rW   r   r   r   r   rw     s    


rw   )r}   loggingauthlib.common.urlsr   authlib.constsr   authlib.common.securityr   errorsr   r   r   	getLoggerr%   rR   r	   r*   r4   rH   rX   rw   r   r   r   r   <module>   s    
5!/d