
    ~hT"                     x    d dl mZ d dlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 dd	lmZ  G d
 d      Zy)    )default_json_headers)	JoseError   )AccessDeniedError)InvalidClientError)InvalidRequestError)UnauthorizedClientError)InvalidClientMetadataError)ClientMetadataClaimsc                   x    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)ClientConfigurationEndpointclient_configurationNc                 2    || _         |xs t        g| _        y N)serverr   claims_classes)selfr   r   s      [/opt/mcp/mcp-sentiment/venv/lib/python3.12/site-packages/authlib/oauth2/rfc7592/endpoint.py__init__z$ClientConfigurationEndpoint.__init__   s    ,F1E0F    c                 $    | j                  |      S r   )create_configuration_responser   requests     r   __call__z$ClientConfigurationEndpoint.__call__   s    11'::r   c                    | j                  |      }|s
t               ||_        | j                  |      }|s| j	                  ||       t        dd      | j                  ||      st        dd      ||_        |j                  dk(  r| j                  ||      S |j                  dk(  r| j                  ||      S |j                  dk(  r| j                  ||      S y )	Ni  z)The client does not exist on this server.)status_codedescriptioni  z7The client does not have permission to read its record.GETDELETEPUT)authenticate_tokenr   
credentialauthenticate_clientrevoke_access_tokenr   check_permissionr	   clientmethodcreate_read_client_responsecreate_delete_client_responsecreate_update_client_response)r   r   tokenr'   s       r   r   z9ClientConfigurationEndpoint.create_configuration_response   s     ''0#%%"))'2 $$We4$-X  $$VW5 *U 
  >>U"33FGDD^^x'55fgFF^^u$55fgFF %r   c                 8    | j                   j                  |      S r   )r   create_json_requestr   s     r   create_endpoint_requestz3ClientConfigurationEndpoint.create_endpoint_request:   s    {{..w77r   c                 x    | j                  |      }|j                  | j                  ||             d|t        fS )N   )introspect_clientupdate!generate_client_registration_infor   )r   r'   r   bodys       r   r)   z7ClientConfigurationEndpoint.create_read_client_response=   s9    %%f-D::67KLD...r   c                 8    | j                  ||       ddg}dd|fS )N)zCache-Controlzno-store)Pragmazno-cache    )delete_client)r   r'   r   headerss       r   r*   z9ClientConfigurationEndpoint.create_delete_client_responseB   s.    67+)"
 Br   c                    d}|D ]$  }||j                   j                  v st                |j                   j                  j                  d      }|s
t               ||j	                         k7  r
t               d|j                   j                  v r2|j                  |j                   j                  d         s
t               | j                  |      }| j                  |||      }| j                  ||      S )N)registration_access_tokenregistration_client_uriclient_secret_expires_atclient_id_issued_at	client_idclient_secret)	payloaddatar   getget_client_idcheck_client_secretextract_client_metadataupdate_clientr)   )r   r'   r   must_not_includekrA   client_metadatas          r   r+   z9ClientConfigurationEndpoint.create_update_client_responseJ   s    
 " 	,AGOO((()++	,
 OO((,,[9	%'',,..%''
 goo222--goo.B.B?.ST)++66w?##FOWE//@@r   c                    |j                   j                  j                         }i }| j                         }| j                  D ]_  }t        |d      r|r|j                  |      ni } ||i ||      }	 |j                           |j                  di |j                          a |S # t        $ r}t        |j                        |d }~ww xY w)Nget_claims_options )rC   rD   copyget_server_metadatar   hasattrrN   validater   r
   r   r3   get_registered_claims)	r   r   	json_datarL   server_metadataclaims_classoptionsclaimserrors	            r   rH   z3ClientConfigurationEndpoint.extract_client_metadataj   s    OO((--/	224 // 	EL <)=>? //@ 
 ")R/JFO! #O""DV%A%A%CD	E 	  O01B1BCNOs   3B''	C0CCc                 6    i |j                   |j                  S r   )client_inforL   )r   r'   s     r   r2   z-ClientConfigurationEndpoint.introspect_client}   s    ?&$$?(>(>??r   c                     t               )a  Generate ```registration_client_uri`` and ``registration_access_token``
        for RFC7592. By default this method returns the values sent in the current
        request. Developers MUST rewrite this method to return different registration
        information.::

            def generate_client_registration_info(self, client, request):{
                access_token = request.headers['Authorization'].split(' ')[1]
                return {
                    'registration_client_uri': request.uri,
                    'registration_access_token': access_token,
                }

        :param client: the instance of OAuth client
        :param request: formatted request instance
        NotImplementedErrorr   r'   r   s      r   r4   z=ClientConfigurationEndpoint.generate_client_registration_info         "##r   c                     t               )aL  Authenticate current credential who is requesting to register a client.
        Developers MUST implement this method in subclass::

            def authenticate_token(self, request):
                auth = request.headers.get("Authorization")
                return get_token_by_auth(auth)

        :return: token instance
        r^   r   s     r   r"   z.ClientConfigurationEndpoint.authenticate_token        "##r   c                     t               )a<  Read a client from the request payload.
        Developers MUST implement this method in subclass::

            def authenticate_client(self, request):
                client_id = request.payload.data.get("client_id")
                return Client.get(client_id=client_id)

        :return: client instance
        r^   r   s     r   r$   z/ClientConfigurationEndpoint.authenticate_client   rc   r   c                     t               )a  Revoke a token access in case an invalid client has been requested.
        Developers MUST implement this method in subclass::

            def revoke_access_token(self, token, request):
                token.revoked = True
                token.save()

        r^   )r   r,   r   s      r   r%   z/ClientConfigurationEndpoint.revoke_access_token        "##r   c                     t               )a  Checks whether the current client is allowed to be accessed, edited
        or deleted. Developers MUST implement it in subclass, e.g.::

            def check_permission(self, client, request):
                return client.editable

        :return: boolean
        r^   r`   s      r   r&   z,ClientConfigurationEndpoint.check_permission   rf   r   c                     t               )a2  Delete authorization code from database or cache. Developers MUST
        implement it in subclass, e.g.::

            def delete_client(self, client, request):
                client.delete()

        :param client: the instance of OAuth client
        :param request: formatted request instance
        r^   r`   s      r   r:   z)ClientConfigurationEndpoint.delete_client   rc   r   c                     t               )a:  Update the client in the database. Developers MUST implement this method
        in subclass::

            def update_client(self, client, client_metadata, request):
                client.set_client_metadata(
                    {**client.client_metadata, **client_metadata}
                )
                client.save()
                return client

        :param client: the instance of OAuth client
        :param client_metadata: a dict of the client claims to update
        :param request: formatted request instance
        :return: client instance
        r^   )r   r'   rL   r   s       r   rI   z)ClientConfigurationEndpoint.update_client   ra   r   c                     t               )zeReturn server metadata which includes supported grant types,
        response types and etc.
        r^   )r   s    r   rQ   z/ClientConfigurationEndpoint.get_server_metadata   s     "##r   )NN)__name__
__module____qualname__ENDPOINT_NAMEr   r   r   r/   r)   r*   r+   rH   r2   r4   r"   r$   r%   r&   r:   rI   rQ   rO   r   r   r   r      sb    *MG;"GH8/
 A@&@$$
$
$	$	$
$$$$r   r   N)authlib.constsr   authlib.joser   rfc6749r   r   r   r	   rfc7591r
   rfc7591.claimsr   r   rO   r   r   <module>rt      s)    / " ' ( ) - 0 1V$ V$r   