o
    bO%                     @   sP   d dl Z d dlmZ d dlmZ ddlmZ dgZe e	Z
G dd deZdS )    N)generate_token)default_user_agent   )MismatchingStateErrorBaseAppc                   @   s   e Zd ZdZdZ							dddZd ddZdd Zd	d
 Zd!ddZ	dd Z
edd Zd!ddZdd Zdd Zdd Zdd Zdd Zdd ZdS )"r   a  The remote application for OAuth 1 and OAuth 2. It is used together
    with OAuth registry.

    :param name: The name of the OAuth client, like: github, twitter
    :param fetch_token: A function to fetch access token from database
    :param update_token: A function to update access token to database
    :param client_id: Client key of OAuth 1, or Client ID of OAuth 2
    :param client_secret: Client secret of OAuth 2, or Client Secret of OAuth 2
    :param request_token_url: Request Token endpoint for OAuth 1
    :param request_token_params: Extra parameters for Request Token endpoint
    :param access_token_url: Access Token endpoint for OAuth 1 and OAuth 2
    :param access_token_params: Extra parameters for Access Token endpoint
    :param authorize_url: Endpoint for user authorization of OAuth 1 or OAuth 2
    :param authorize_params: Extra parameters for Authorization Endpoint
    :param api_base_url: The base API endpoint to make requests simple
    :param client_kwargs: Extra keyword arguments for session
    :param server_metadata_url: Discover server metadata from this URL
    :param user_agent: Define a custom user agent to be used in HTTP request
    :param kwargs: Extra server metadata

    Create an instance of ``RemoteApp``. If ``request_token_url`` is configured,
    it would be an OAuth 1 instance, otherwise it is OAuth 2 instance::

        oauth1_client = RemoteApp(
            client_id='Twitter Consumer Key',
            client_secret='Twitter Consumer Secret',
            request_token_url='https://api.twitter.com/oauth/request_token',
            access_token_url='https://api.twitter.com/oauth/access_token',
            authorize_url='https://api.twitter.com/oauth/authenticate',
            api_base_url='https://api.twitter.com/1.1/',
        )

        oauth2_client = RemoteApp(
            client_id='GitHub Client ID',
            client_secret='GitHub Client Secret',
            api_base_url='https://api.github.com/',
            access_token_url='https://github.com/login/oauth/access_token',
            authorize_url='https://github.com/login/oauth/authorize',
            client_kwargs={'scope': 'user:email'},
        )
    Nc                 K   s~   || _ || _|| _|| _|| _|| _|	| _|
| _|| _|| _	|| _
|p$i | _|| _|| _|| _|| _|p5t| _|| _|| _d S N)	frameworkname	client_idclient_secretrequest_token_urlrequest_token_paramsaccess_token_urlaccess_token_paramsauthorize_urlauthorize_paramsapi_base_urlclient_kwargscompliance_fixclient_auth_methodsZ_fetch_tokenZ_update_tokenr   _user_agentZ_server_metadata_urlZserver_metadata)selfr   r	   Zfetch_tokenupdate_tokenr
   r   r   r   r   r   r   r   r   r   Zserver_metadata_urlr   r   
user_agentkwargs r   h/var/www/secure340b-portal/env/lib/python3.10/site-packages/authlib/integrations/base_client/base_app.py__init__:   s&   	


zBaseApp.__init__c                 C      t  r   NotImplementedError)r   tokenZrefresh_tokenZaccess_tokenr   r   r   _on_update_tokenY      zBaseApp._on_update_tokenc                 K   s   i }| | j | | | jr| jj| j| jfi |}n6| jr&| j|d< | jr.| j|d< | jj	d| j| j| j
d|}| jrL| jD ]}|| qD| jrT| | | j|jd< |S )Nauthorization_endpointZtoken_endpoint)r
   r   r   z
User-Agentr   )updater   r   r   Zoauth1_client_clsr
   r   r   r   Zoauth2_client_clsr"   r   Zregister_client_auth_methodr   r   headers)r   r   r   sessionfr   r   r   _get_oauth_client\   s6   




zBaseApp._get_oauth_clientc                 C   sF   | dd }| j|d}||krt | j|d}|r!||d< |S )Nstatecode_verifier)popr   get_session_datar   )r   requestparamsZrequest_stater*   r+   r   r   r   $_retrieve_oauth2_access_token_paramsz   s   z,BaseApp._retrieve_oauth2_access_token_paramsc                 C   sp   | j | j|}| jr|du r| j |d}||d< n| ||}| j |d}|r.||d< td| |S )zRetrieve parameters for fetching access token, those parameters come
        from request and previously saved temporary data in session.
        Nrequest_tokenredirect_urizRetrieve temporary data: {!r})r   Zgenerate_access_token_paramsr   r-   r0   logdebugformat)r   r.   r1   r/   r2   r   r   r   retrieve_access_token_params   s   
z$BaseApp.retrieve_access_token_paramsc                 K   sB   t d| g d}|D ]}||v r| j||||  qdS )zSave temporary data into session for the authorization step. These
        data can be retrieved later when fetching access token.
        zSaving authorize data: {!r})r2   r1   r*   r+   nonceN)r3   r4   r5   r   Zset_session_data)r   r.   r   keyskr   r   r   save_authorize_data   s   zBaseApp.save_authorize_datac           	      K   s   i }| j r |d}|std}||d< ||d< td| |d| j}|rA|drA|d}|s=td}||d< ||d< | j|fi |\}}||d< ||d	< |S )
Nr+   0   zUsing code_verifier: {!r}scopeZopenidr7      urlr*   )	Zcode_challenge_methodgetr   r3   r4   r5   r<   
startswithZcreate_authorization_url)	clientr$   r   rvr+   r<   r7   r>   r*   r   r   r    _create_oauth2_authorization_url   s.   


z(BaseApp._create_oauth2_authorization_urlc                 K   r   r   r   )r   methodr>   r!   r   r   r   r   r.      r#   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   r?         zBaseApp.getc                 K   rE   )zInvoke POST http request.

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

            client.post('timeline', json={'text': 'Hi'})
        POSTrG   rH   r   r   r   post   rI   zBaseApp.postc                 K   rE   )zInvoke PATCH http request.

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

            client.patch('profile', json={'name': 'Hsiaoming Yang'})
        PATCHrG   rH   r   r   r   patch   rI   zBaseApp.patchc                 K   rE   )zInvoke PUT http request.

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

            client.put('profile', json={'name': 'Hsiaoming Yang'})
        PUTrG   rH   r   r   r   put   rI   zBaseApp.putc                 K   rE   )zInvoke DELETE http request.

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

            client.delete('posts/123')
        DELETErG   rH   r   r   r   delete   rI   zBaseApp.deletec                 C   sD   |   }|jd|dd}| W  d    S 1 sw   Y  d S )NrF   T)Zwithhold_token)r)   r.   json)r   r>   r'   respr   r   r   _fetch_server_metadata   s   
$zBaseApp._fetch_server_metadata)NNNNNNNNNNNNNNNNN)NNr   )__name__
__module____qualname____doc__ZOAUTH_APP_CONFIGr   r"   r)   r0   r6   r:   staticmethodrC   r.   r?   rK   rM   rO   rQ   rT   r   r   r   r   r      s2    )




					)loggingZauthlib.common.securityr   Zauthlib.constsr   errorsr   __all__	getLoggerrU   r3   objectr   r   r   r   r   <module>   s    
