
    lKj                         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 ddlmZ  G d d      Zy)    N)jwt)	JoseError)import_any_keygenerate_token)default_json_headers)	deprecate   )AccessDeniedError)InvalidRequestError   )ClientMetadataClaims)InvalidClientMetadataError)InvalidSoftwareStatementError) UnapprovedSoftwareStatementErrorc                   n    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y)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    || _         |xs t        g| _        y N)serverr   claims_classes)selfr   r   s      p/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/authlib/oauth2/rfc7591/endpoint.py__init__z#ClientRegistrationEndpoint.__init__    s    ,F1E0F    c                 $    | j                  |      S r   )create_registration_responser   requests     r   __call__z#ClientRegistrationEndpoint.__call__$   s    0099r   c                 X   | j                  |      }|s
t               ||_        | j                  |      }| j	                  |      }i }|j                  |       |j                  |       | j                  |||      }| j                  ||      }|r|j                  |       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#%%"66w?//8O$K !!+H BB67SKK)*D...r   c                 b   |j                   j                  s
t               |j                   j                  j                         }|j	                  dd       }|r/| j
                  r#| 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software_statementget_claims_options )payloaddatar   copypop'software_statement_alg_values_supportedextract_software_statementr(   get_server_metadatar   hasattrr3   validater   r   descriptionget_registered_claims)r   r    	json_datar2   r6   r,   server_metadataclaims_classoptionsclaimserrors              r   r&   z2ClientRegistrationEndpoint.extract_client_metadata9   s'   ##%''OO((--/	&]]+?F$"N"N223EwODT"224 //L <)=>? //@ 
 ")R/JFO! #O""DV%A%A%CD 0 	  O01B1BCNOs   D

	D.D))D.c                     | j                  |      }|s
t               	 t        |      }| j                  }t	        j
                  |||      }|j                  S # t        $ r}t               |d }~ww xY w)N)
algorithms)	resolve_public_keyr   r   r9   r   decoderD   r   r   )r   r2   r    keyrG   r+   excs          r   r:   z5ClientRegistrationEndpoint.extract_software_statementT   sp    %%g.244	; %CEEJJJ13:NE<< 	;/1s:	;s   :A 	A3#A..A3c                 V   	 | j                  |      }	 | j                  |      }t	        t        j
                               }d}t        ||||      S # t        $ r  | j                         }t        dd       Y hw xY w# t        $ r  | j                         }t        dd       Y w xY w)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    rN   rO   rP   rQ   s         r   r'   z/ClientRegistrationEndpoint.generate_client_infob   s    	//8I	 77@M "$))+.#$ ' 3%=	
 	
)  	//1I>	  	 779M>	s"   A A? &A<;A<?&B('B(c                      y)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.
        Nr4   )r   r/   r    s      r   r*   z<ClientRegistrationEndpoint.generate_client_registration_info   s    
 r   c                 8    | j                   j                  |      S r   )r   create_json_requestr   s     r   create_endpoint_requestz2ClientRegistrationEndpoint.create_endpoint_request   s    {{..w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   rR   z-ClientRegistrationEndpoint.generate_client_id   s     b!!r   c                 p    t        j                  t        j                  d            j	                  d      S )zGenerate ``client_secret`` value. Developers MAY rewrite this method
        to use their own way to generate ``client_secret``.
           ascii)binasciihexlifyosurandomrI   r   s     r   rT   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
        rf   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
        rf   r   s     r   rH   z-ClientRegistrationEndpoint.resolve_public_key   ri   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
        rf   )r   r-   r,   r    s       r   r)   z&ClientRegistrationEndpoint.save_client   s     "##r   )NN)__name__
__module____qualname____doc__ENDPOINT_NAMEr9   r   r!   r   r&   r:   r'   r*   r[   rR   rT   r;   r$   rH   r)   r4   r   r   r   r      s^     *M /3+G:/$6;
>8"@$
$
$$r   r   )ra   rc   rV   joserfcr   joserfc.errorsr   authlib._joserfc_helpersr   authlib.common.securityr   authlib.constsr   authlib.deprecater	   rfc6749r   r   rD   r   errorsr   r   r   r   r4   r   r   <module>ry      s>     	   $ 3 2 / ' ' ) ( . 1 4m$ m$r   