o
    iW
                     @   s   d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
 ddlmZmZmZ er*ddlZeeZdddddedeee  d	e
eeegef f d
eeeeef ed gef  de	e f
ddZdS )zpA generic OAuth client that can be used to quickly create support for any OAuth provider
with close to no code.
    N)TYPE_CHECKINGAnyCallableDictListOptionalTypeUnion)DiscoveryDocumentOpenIDSSOBaseZgeneric)namedefault_scoperesponse_convertorr   r   discovery_documentr   httpx.AsyncClientreturnc                    s   G  fdddt }|S )a>  A factory to create a generic OAuth client usable with almost any OAuth provider.
    Returns a class.

    Args:
        name: Name of the provider
        default_scope: default list of scopes (can be overriden in constructor)
        discovery_document: a dictionary containing discovery document or a callable returning it
        response_convertor: a callable that will receive JSON response from the userinfo endpoint
            and should return OpenID object

    Example:
        ```python
        from fastapi_sso.sso.generic import create_provider

        discovery = {
            "authorization_endpoint": "http://localhost:9090/auth",
            "token_endpoint": "http://localhost:9090/token",
            "userinfo_endpoint": "http://localhost:9090/me",
        }

        SSOProvider = create_provider(name="oidc", discovery_document=discovery)
        sso = SSOProvider(
            client_id="test",
            client_secret="secret",
            redirect_uri="http://localhost:8080/callback",
            allow_insecure_http=True
            )
        ```

    c                       sP   e Zd ZdZZ pdgZdeffddZddede	d	 de
ffd
dZdS )z+create_provider.<locals>.GenericSSOProviderzSSO Provider Template.Zopenidr   c                    s   t  r	 | S  S )z#Get document containing handy urls.)callable)self)r    N/home/app/Keep/.python/lib/python3.10/site-packages/fastapi_sso/sso/generic.pyget_discovery_document<   s   zBcreate_provider.<locals>.GenericSSOProvider.get_discovery_documentNresponsesessionr   c                    s&    st d t| jdS  ||S )NzHNo response convertor was provided, returned OpenID will always be empty)provider)loggerwarningr   r   )r   r   r   )r   r   r   openid_from_responseB   s   

z@create_provider.<locals>.GenericSSOProvider.openid_from_response)N)__name__
__module____qualname____doc__r   scoper
   r   dictr   r   r   r   r   r   r   r   r   r   GenericSSOProvider6   s    
$r%   )r   )r   r   r   r   r%   r   r$   r   create_provider   s   &r&   )r!   loggingtypingr   r   r   r   r   r   r   r	   Zfastapi_sso.sso.baser
   r   r   Zhttpx	getLoggerr   r   strr&   r   r   r   r   <module>   s*    (

