
    !<iT"                         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dS )    )default_json_headers)	JoseError   )AccessDeniedError)InvalidClientError)InvalidRequestError)UnauthorizedClientError)InvalidClientMetadataError)ClientMetadataClaimsc                   z    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dS )ClientConfigurationEndpointclient_configurationNc                 2    || _         |pt          g| _        d S N)serverr   claims_classes)selfr   r   s      /Users/kimhansen/Desktop/03 Workspace/ceo-agents/chl-effectiveness/mcp-servers/whoop/.venv/lib/python3.11/site-packages/authlib/oauth2/rfc7592/endpoint.py__init__z$ClientConfigurationEndpoint.__init__   s     ,F1E0F    c                 ,    |                      |          S r   )create_configuration_responser   requests     r   __call__z$ClientConfigurationEndpoint.__call__   s    11':::r   c                    |                      |          }|st                      ||_        |                     |          }|s'|                     ||           t          dd          |                     ||          st          dd          ||_        |j	        dk    r| 
                    ||          S |j	        dk    r|                     ||          S |j	        dk    r|                     ||          S d S )	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   s6    ''00 	&#%%%"))'22 	 $$We444$-X    $$VW55 	 *U   
  >U""33FGDDD^x''55fgFFF^u$$55fgFFF %$r   c                 6    | j                             |          S r   )r   create_json_requestr   s     r   create_endpoint_requestz3ClientConfigurationEndpoint.create_endpoint_request:   s    {..w777r   c                     |                      |          }|                    |                     ||                     d|t          fS )N   )introspect_clientupdate!generate_client_registration_infor   )r   r'   r   bodys       r   r)   z7ClientConfigurationEndpoint.create_read_client_response=   sE    %%f--D::67KKLLLD...r   c                 @    |                      ||           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   s4    67+++)"
 Br   c                    d}|D ]}||j         j        v rt                      |j         j                            d          }|st                      ||                                k    rt                      d|j         j        v r3|                    |j         j        d                   st                      |                     |          }|                     |||          }|                     ||          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GO((()+++ ) O(,,[99	 	(%''',,....%'''
 go222--go.B?.STT ,)+++66w??##FOWEE//@@@r   c                    |j         j                                        }i }|                                 }| j        D ]}t          |d          r|r|                    |          ni } ||i ||          }	 |                                 n'# t          $ r}t          |j
                  |d }~ww xY w |j        di |                                 |S )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   O(--//	2244 / 	E 	EL <)=>>CR//@@@ 
 "\)R/JJFO!!!! O O O01BCCNO #O"DDV%A%A%C%CDDDDs   6B
B/B**B/c                 "    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      s,       *MG G G G; ; ;"G "G "GH8 8 8/ / /
     A A A@  &@ @ @$ $ $$
$ 
$ 
$
$ 
$ 
$	$ 	$ 	$	$ 	$ 	$
$ 
$ 
$$ $ $$$ $ $ $ $r   r   N)authlib.constsr   authlib.joser   rfc6749r   r   r   r	   rfc7591r
   rfc7591.claimsr   r   rO   r   r   <module>rt      s    / / / / / / " " " " " " ' ' ' ' ' ' ( ( ( ( ( ( ) ) ) ) ) ) - - - - - - 0 0 0 0 0 0 1 1 1 1 1 1V$ V$ V$ V$ V$ V$ V$ V$ V$ V$r   