
    !<i                         d dl Z 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
 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 )    Ngenerate_token)default_json_headers)	deprecate)	JoseError)JsonWebToken   )AccessDeniedError)InvalidRequestError   )ClientMetadataClaims)InvalidClientMetadataError)InvalidSoftwareStatementError) UnapprovedSoftwareStatementErrorc                   p    e Zd Zd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S )ClientRegistrationEndpointzThe client registration endpoint is an OAuth 2.0 endpoint designed to
    allow a client to be registered with the authorization server.
    client_registrationNc                 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/rfc7591/endpoint.py__init__z#ClientRegistrationEndpoint.__init__   s     ,F1E0F    c                 ,    |                      |          S r   )create_registration_responser   requests     r   __call__z#ClientRegistrationEndpoint.__call__"   s    00999r   c                    |                      |          }|st                      ||_        |                     |          }|                     |          }i }|                    |           |                    |           |                     |||          }|                     ||          }|r|                    |           d|t          fS )N   )	authenticate_tokenr
   
credentialextract_client_metadatagenerate_client_infoupdatesave_client!generate_client_registration_infor   )r   r   tokenclient_metadataclient_infobodyclientregistration_infos           r   r   z7ClientRegistrationEndpoint.create_registration_response%   s    ''00 	&#%%%"66w??//88O$$$K   !!+HH BB67SS 	+KK)***D...r   c                 p   |j         j        st                      |j         j                                        }|                    dd           }|r2| j        r+|                     ||          }|                    |           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software_statementget_claims_options )payloaddatar   copypop'software_statement_alg_values_supportedextract_software_statementr'   get_server_metadatar   hasattrr2   validater   r   descriptionget_registered_claims)r   r   	json_datar1   r5   r+   server_metadataclaims_classoptionsclaimserrors              r   r%   z2ClientRegistrationEndpoint.extract_client_metadata7   sz   # 	(%'''O(--//	&]]+?FF 	#$"N 	#223EwOODT"""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   C//
D9DDc                     |                      |          }|st                      	 t          | j                  }|                    ||          }|S # t
          $ r}t                      |d }~ww xY wr   )resolve_public_keyr   r   r8   decoder   r   )r   r1   r   keyjwtrC   excs          r   r9   z5ClientRegistrationEndpoint.extract_software_statementR   s    %%g.. 	52444	;tKLLCZZ 2C88FM 	; 	; 	;/11s:	;s   +A 
A1A,,A1c                    	 |                      |          }n5# t          $ r( |                                  }t          dd           Y nw xY w	 |                     |          }n5# t          $ r( |                                 }t          dd           Y nw xY wt	          t          j                              }d}t          ||||          S )Nz[generate_client_id takes a 'request' parameter. It will become mandatory in coming releasesz1.8)versionz_generate_client_secret takes a 'request' parameter. It will become mandatory in coming releasesr   )	client_idclient_secretclient_id_issued_atclient_secret_expires_at)generate_client_id	TypeErrorr   generate_client_secretinttimedict)r   r   rM   rN   rO   rP   s         r   r&   z/ClientRegistrationEndpoint.generate_client_info_   s   	//88II 	 	 	//11I>     		 77@@MM 	 	 	 7799M>     	 "$)++..#$ ' 3%=	
 
 
 	
s!    /A
	A
A$ $/BBc                     dS )zGenerate ```registration_client_uri`` and ``registration_access_token``
        for RFC7592. This method returns ``None`` by default. Developers MAY rewrite
        this method to return registration information.
        Nr3   )r   r.   r   s      r   r)   z<ClientRegistrationEndpoint.generate_client_registration_info~   s	    
 tr   c                 6    | j                             |          S r   )r   create_json_requestr   s     r   create_endpoint_requestz2ClientRegistrationEndpoint.create_endpoint_request   s    {..w777r   c                      t          d          S )zGenerate ``client_id`` value. Developers MAY rewrite this method
        to use their own way to generate ``client_id``.
        *   r   r   s     r   rQ   z-ClientRegistrationEndpoint.generate_client_id   s     b!!!r   c                 t    t          j        t          j        d                                        d          S )zGenerate ``client_secret`` value. Developers MAY rewrite this method
        to use their own way to generate ``client_secret``.
           ascii)binasciihexlifyosurandomrG   r   s     r   rS   z1ClientRegistrationEndpoint.generate_client_secret   s+     
2//66w???r   c                     t                      )zeReturn server metadata which includes supported grant types,
        response types and etc.
        NotImplementedError)r   s    r   r:   z.ClientRegistrationEndpoint.get_server_metadata   s     "###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
        re   r   s     r   r#   z-ClientRegistrationEndpoint.authenticate_token        "###r   c                     t                      )aI  Resolve a public key for decoding ``software_statement``. If
        ``enable_software_statement=True``, developers MUST implement this
        method in subclass::

            def resolve_public_key(self, request):
                return get_public_key_from_user(request.credential)

        :return: JWK or Key string
        re   r   s     r   rF   z-ClientRegistrationEndpoint.resolve_public_key   rh   r   c                     t                      )a  Save client into database. Developers MUST implement this method
        in subclass::

            def save_client(self, client_info, client_metadata, request):
                client = OAuthClient(
                    client_id=client_info['client_id'],
                    client_secret=client_info['client_secret'],
                    ...
                )
                client.save()
                return client
        re   )r   r,   r+   r   s       r   r(   z&ClientRegistrationEndpoint.save_client   s     "###r   )NN)__name__
__module____qualname____doc__ENDPOINT_NAMEr8   r   r    r   r%   r9   r&   r)   rZ   rQ   rS   r:   r#   rF   r(   r3   r   r   r   r      s         *M /3+G G G G: : :/ / /$  6; ; ;
 
 
>  8 8 8" " "@ @ @$ $ $
$ 
$ 
$
$ 
$ 
$$ $ $ $ $r   r   )r`   rb   rU   authlib.common.securityr   authlib.constsr   authlib.deprecater   authlib.joser   r   rfc6749r
   r   rC   r   errorsr   r   r   r   r3   r   r   <module>rv      s"    				  2 2 2 2 2 2 / / / / / / ' ' ' ' ' ' " " " " " " % % % % % % ' ' ' ' ' ' ) ) ) ) ) ) ( ( ( ( ( ( . . . . . . 1 1 1 1 1 1 4 4 4 4 4 4l$ l$ l$ l$ l$ l$ l$ l$ l$ l$r   