o
    i                     @   s   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 dZdS )    Ngenerate_token)default_json_headers)	deprecate)	JoseError)JsonWebToken   )AccessDeniedError)InvalidRequestError   )ClientMetadataClaims)InvalidClientMetadataError)InvalidSoftwareStatementError) UnapprovedSoftwareStatementErrorc                   @   s   e Zd ZdZdZdZd ddZdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd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                 C   s   || _ |ptg| _d S N)serverr   claims_classes)selfr   r    r   e/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/authlib/oauth2/rfc7591/endpoint.py__init__   s   z#ClientRegistrationEndpoint.__init__c                 C   s
   |  |S r   )create_registration_responser   requestr   r   r   __call__"   s   
z#ClientRegistrationEndpoint.__call__c                 C   sx   |  |}|s
t ||_| |}| |}i }|| || | |||}| ||}|r7|| 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_infor   r   r   r   %   s   






z7ClientRegistrationEndpoint.create_registration_responsec                 C   s   |j jst |j j }|dd }|r#| jr#| ||}|| i }|  }| j	D ]:}t
|dr:|r:||ni }||i ||}	z|	  W n ty[ }
 zt|
j|
d }
~
ww |jdi |	  q,|S )Nsoftware_statementget_claims_optionsr   )payloaddatar
   copypop'software_statement_alg_values_supportedextract_software_statementr"   get_server_metadatar   hasattrr,   validater   r   descriptionget_registered_claims)r   r   	json_datar+   r.   r&   server_metadataclaims_classoptionsclaimserrorr   r   r   r    7   s2   


z2ClientRegistrationEndpoint.extract_client_metadatac              
   C   sR   |  |}|s
t zt| j}|||}|W S  ty( } zt |d }~ww r   )resolve_public_keyr   r   r1   decoder   r   )r   r+   r   keyjwtr<   excr   r   r   r2   R   s   

z5ClientRegistrationEndpoint.extract_software_statementc                 C   s   z|  |}W n ty   |   }tddd Y nw z| |}W n ty5   |  }tddd Y nw tt }d}t||||d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   rD   rE   rF   rG   r   r   r   r!   _   s4   

z/ClientRegistrationEndpoint.generate_client_infoc                 C   s   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.
        Nr   )r   r)   r   r   r   r   r$   ~   s   z<ClientRegistrationEndpoint.generate_client_registration_infoc                 C   s   | j |S r   )r   create_json_requestr   r   r   r   create_endpoint_request   s   z2ClientRegistrationEndpoint.create_endpoint_requestc                 C   s   t dS )zGenerate ``client_id`` value. Developers MAY rewrite this method
        to use their own way to generate ``client_id``.
        *   r   r   r   r   r   rH      s   z-ClientRegistrationEndpoint.generate_client_idc                 C   s   t t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urandomr?   r   r   r   r   rJ      s   z1ClientRegistrationEndpoint.generate_client_secretc                 C      t  )zeReturn server metadata which includes supported grant types,
        response types and etc.
        NotImplementedError)r   r   r   r   r3      s   z.ClientRegistrationEndpoint.get_server_metadatac                 C   rW   )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
        rX   r   r   r   r   r         
z-ClientRegistrationEndpoint.authenticate_tokenc                 C   rW   )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
        rX   r   r   r   r   r>      rZ   z-ClientRegistrationEndpoint.resolve_public_keyc                 C   rW   )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
        rX   )r   r'   r&   r   r   r   r   r#      s   z&ClientRegistrationEndpoint.save_client)NN)__name__
__module____qualname____doc__ENDPOINT_NAMEr1   r   r   r   r    r2   r!   r$   rO   rH   rJ   r3   r   r>   r#   r   r   r   r   r      s$    
r   )rS   rU   rL   authlib.common.securityr   authlib.constsr   authlib.deprecater   authlib.joser   r   rfc6749r	   r
   r<   r   errorsr   r   r   r   r   r   r   r   <module>   s    