
    k7iT"                     x    S SK Jr  S SKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SS	KJr   " S
 S5      rg)    )default_json_headers)	JoseError   )AccessDeniedError)InvalidClientError)InvalidRequestError)UnauthorizedClientError)InvalidClientMetadataError)ClientMetadataClaimsc                       \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rS rS rS rS rS rSrg)ClientConfigurationEndpoint   client_configurationNc                 :    Xl         U=(       d    [        /U l        g N)serverr   claims_classes)selfr   r   s      Y/home/james-whalen/.local/lib/python3.13/site-packages/authlib/oauth2/rfc7592/endpoint.py__init__$ClientConfigurationEndpoint.__init__   s    ,F1E0F    c                 $    U R                  U5      $ r   )create_configuration_responser   requests     r   __call__$ClientConfigurationEndpoint.__call__   s    11'::r   c                    U R                  U5      nU(       d
  [        5       eX!l        U R                  U5      nU(       d  U R	                  X5        [        SSS9eU R                  X15      (       d
  [        SSS9eX1l        UR                  S:X  a  U R                  X15      $ UR                  S:X  a  U R                  X15      $ UR                  S:X  a  U R                  X15      $ g )	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   9ClientConfigurationEndpoint.create_configuration_response   s     ''0#%%"))'2 $$W4$-X  $$V55 *U 
  >>U"33FDD^^x'55fFF^^u$55fFF %r   c                 8    U R                   R                  U5      $ r   )r   create_json_requestr   s     r   create_endpoint_request3ClientConfigurationEndpoint.create_endpoint_request:   s    {{..w77r   c                 v    U R                  U5      nUR                  U R                  X5      5        SU[        4$ )N   )introspect_clientupdate!generate_client_registration_infor   )r   r*   r   bodys       r   r,   7ClientConfigurationEndpoint.create_read_client_response=   s7    %%f-D::6KLD...r   c                 6    U R                  X5        SS/nSSU4$ )N)zCache-Controlzno-store)Pragmazno-cache    )delete_client)r   r*   r   headerss       r   r-   9ClientConfigurationEndpoint.create_delete_client_responseB   s,    6+)"
 Br   c                    SnU H&  nXBR                   R                  ;   d  M  [        5       e   UR                   R                  R                  S5      nU(       d
  [        5       eXQR	                  5       :w  a
  [        5       eSUR                   R                  ;   a7  UR                  UR                   R                  S   5      (       d
  [        5       eU R                  U5      nU R                  XU5      nU R                  X5      $ )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krH   client_metadatas          r   r.   9ClientConfigurationEndpoint.create_update_client_responseJ   s    
 "AOO((()++ "
 OO((,,[9	%'',,..%''
 goo222--goo.B.B?.STT)++66w?##FWE//@@r   c                    UR                   R                  R                  5       n0 nU R                  5       nU R                   Hi  n[        US5      (       a  U(       a  UR                  U5      O0 nU" U0 Xd5      n UR                  5         UR                  " S0 UR                  5       D6  Mk     U$ ! [         a  n[        UR                  5      UeS nAff = f)Nget_claims_options )rJ   rK   copyget_server_metadatar   hasattrrV   validater   r
   r!   r8   get_registered_claims)	r   r   	json_datarS   server_metadataclaims_classoptionsclaimserrors	            r   rO   3ClientConfigurationEndpoint.extract_client_metadataj   s    OO((--/	224 //L <)=>>? //@ 
 ")RJFO! ""DV%A%A%CD 0 	  O01B1BCNOs   <B22
C<CCc                 6    0 UR                   EUR                  E$ r   )client_inforS   )r   r*   s     r   r7   -ClientConfigurationEndpoint.introspect_client}   s    ?&$$?(>(>??r   c                     [        5       e)aX  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   r9   =ClientConfigurationEndpoint.generate_client_registration_info         "##r   c                     [        5       e)a  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
rh   r   s     r   r%   .ClientConfigurationEndpoint.authenticate_token        "##r   c                     [        5       e)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
rh   r   s     r   r'   /ClientConfigurationEndpoint.authenticate_client   ro   r   c                     [        5       e)zRevoke 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()

rh   )r   r/   r   s      r   r(   /ClientConfigurationEndpoint.revoke_access_token        "##r   c                     [        5       e)zChecks 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
rh   rj   s      r   r)   ,ClientConfigurationEndpoint.check_permission   rt   r   c                     [        5       e)a  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
rh   rj   s      r   r@   )ClientConfigurationEndpoint.delete_client   ro   r   c                     [        5       e)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
rh   )r   r*   rS   r   s       r   rP   )ClientConfigurationEndpoint.update_client   rl   r   c                     [        5       e)zUReturn server metadata which includes supported grant types,
response types and etc.
rh   )r   s    r   rY   /ClientConfigurationEndpoint.get_server_metadata   s     "##r   )r   r   )NN)__name__
__module____qualname____firstlineno__ENDPOINT_NAMEr   r   r   r3   r,   r-   r.   rO   r7   r9   r%   r'   r(   r)   r@   rP   rY   __static_attributes__rW   r   r   r   r      sb    *MG;"GH8/
 A@&@$$
$
$	$	$
$$$$r   r   N)authlib.constsr   authlib.joser   rfc6749r   r   r   r	   rfc7591r
   rfc7591.claimsr   r   rW   r   r   <module>r      s)    / " ' ( ) - 0 1V$ V$r   