
    i[f&                         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 )    )default_json_headers)	JoseError   )ClientMetadataClaims)scope_to_list)AccessDeniedError)InvalidClientError)InvalidRequestError)UnauthorizedClientError)InvalidClientMetadataErrorc                       e Zd ZdZe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 Zd ZdS )ClientConfigurationEndpointclient_configurationc                     || _         d S N)server)selfr   s     S/var/www/piapp/venv/lib/python3.11/site-packages/authlib/oauth2/rfc7592/endpoint.py__init__z$ClientConfigurationEndpoint.__init__   s        c                 ,    |                      |          S r   )create_configuration_responser   requests     r   __call__z$ClientConfigurationEndpoint.__call__   s    11':::r   c                    |                      |          }|st                      ||_        |                     |          }|s&|                     ||           t          d          |                     ||          st          d          ||_        |j	        dk    r| 
                    ||          S |j	        dk    r|                     ||          S |j	        dk    r|                     ||          S d S )Ni  )status_codei  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0 	&#%%%"))'22 	6 $$We444$5555$$VW55 	; *c::::>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_request7   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_response?   s4    67+++)"
 Br   c                    d}|D ]}||j         v rt                      |j                             d          }|st                      ||                                k    rt                      d|j         v r.|                    |j         d                   st                      |                     |          }|                     |||          }|                     ||          S )N)registration_access_tokenregistration_client_uriclient_secret_expires_atclient_id_issued_at	client_idclient_secret)datar
   getget_client_idcheck_client_secretextract_client_metadataupdate_clientr(   )r   r&   r   must_not_includekr@   client_metadatas          r   r*   z9ClientConfigurationEndpoint.create_update_client_responseG   s    
 " 	, 	,AGL  )+++ ! L$$[11	 	(%''',,....%'''
 gl**--gl?.KLL ,)+++66w??##FOWEE//@@@r   c                 P   |j                                         }|                                 }|                     |i ||                                           }	 |                                 n&# t          $ r}t          |j                  d }~ww xY w|	                                S r   )
rB   copyget_claims_optionsclaims_classget_server_metadatavalidater   r   descriptionget_registered_claims)r   r   	json_dataoptionsclaimserrors         r   rF   z3ClientConfigurationEndpoint.extract_client_metadatag   s    L%%''	))++""9b'4;S;S;U;UVV	@OO 	@ 	@ 	@,U->???	@++---s   A. .
B8BBc                   	 |                                  }|si S |                    d          	|                    d          |                    d          |                    d          }i }	t          	          		fd}d|i|d<   t                    fd}d|i|d	<   t                    fd
}d|i|d<   |d|i|d<   |S )Nscopes_supportedresponse_types_supportedgrant_types_supported%token_endpoint_auth_methods_supportedc                 n    |sdS t          t          |                    }                    |          S )NT)setr   
issuperset)rU   valuescopesrX   s      r   _validate_scopezGClientConfigurationEndpoint.get_claims_options.<locals>._validate_scope   s9      4]51122'226:::r   rP   scopec                 H                         t          |                    S r   r^   r]   )rU   r_   rY   s     r   _validate_response_typeszPClientConfigurationEndpoint.get_claims_options.<locals>._validate_response_types   s    /::3u::FFFr   response_typesc                 H                         t          |                    S r   rd   )rU   r_   rZ   s     r   _validate_grant_typeszMClientConfigurationEndpoint.get_claims_options.<locals>._validate_grant_types   s    ,77E

CCCr   grant_typesvaluestoken_endpoint_auth_method)rO   rC   r]   )
r   metadataauth_methods_supportedrT   ra   re   rh   rZ   rY   rX   s
          @@@r   rM   z.ClientConfigurationEndpoint.get_claims_optionsr   sZ   ++-- 	I#<<(:;;#+<<0J#K#K  (-D E E!).U!V!V'"#344; ; ; ; ; !+O<GG#/'*+C'D'D$G G G G G *45M(NG$% ,$'(=$>$>!D D D D D '12G%HGM"!-5=?U4VG01r   c                 "    i |j         |j        S r   )client_inforJ   )r   r&   s     r   r1   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   r3   z=ClientConfigurationEndpoint.generate_client_registration_info   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
        rq   r   s     r   r!   z.ClientConfigurationEndpoint.authenticate_token        "###r   c                     t                      )a4  Read a client from the request payload.
        Developers MUST implement this method in subclass::

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

        :return: client instance
        rq   r   s     r   r#   z/ClientConfigurationEndpoint.authenticate_client   ru   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()

        rq   )r   r+   r   s      r   r$   z/ClientConfigurationEndpoint.revoke_access_token        "###r   c                     t                      )a  Checks wether 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
        rq   rs   s      r   r%   z,ClientConfigurationEndpoint.check_permission   rx   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
        rq   rs   s      r   r9   z)ClientConfigurationEndpoint.delete_client   ru   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
        rq   )r   r&   rJ   r   s       r   rG   z)ClientConfigurationEndpoint.update_client   s     "###r   c                     t                      )zeReturn server metadata which includes supported grant types,
        response types and etc.
        rq   )r   s    r   rO   z/ClientConfigurationEndpoint.get_server_metadata   s     "###r   N)__name__
__module____qualname__ENDPOINT_NAMEr   rN   r   r   r   r.   r(   r)   r*   rF   rM   r1   r3   r!   r#   r$   r%   r9   rG   rO    r   r   r   r      s9       *M (L  ; ; ;G G G>8 8 8/ / /
     A A A@	. 	. 	.( ( (T@ @ @$ $ $$
$ 
$ 
$
$ 
$ 
$	$ 	$ 	$	$ 	$ 	$
$ 
$ 
$$ $ $"$ $ $ $ $r   r   N)authlib.constsr   authlib.joser   rfc7591.claimsr   rfc6749r   r   r	   r
   r   rfc7591r   r   r   r   r   <module>r      s    / / / / / / " " " " " " 1 1 1 1 1 1 # # # # # # ' ' ' ' ' ' ( ( ( ( ( ( ) ) ) ) ) ) - - - - - - 0 0 0 0 0 0t$ t$ t$ t$ t$ t$ t$ t$ t$ t$r   