Ë
    ”ÂiT"  ã                   óx   — 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)é    )Údefault_json_headers)Ú	JoseErroré   )ÚAccessDeniedError)ÚInvalidClientError)ÚInvalidRequestError)ÚUnauthorizedClientError)ÚInvalidClientMetadataError)ÚClientMetadataClaimsc                   óx   — e 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„ Zd„ Zd„ Zy)ÚClientConfigurationEndpointÚclient_configurationNc                 ó2   — || _         |xs t        g| _        y ©N)Úserverr   Úclaims_classes)Úselfr   r   s      úW/var/www/timesheet/venv/lib/python3.12/site-packages/authlib/oauth2/rfc7592/endpoint.pyÚ__init__z$ClientConfigurationEndpoint.__init__   s   € ØˆŒØ,ÒFÔ1EÐ0FˆÕó    c                 ó$   — | j                  |«      S r   )Úcreate_configuration_response©r   Úrequests     r   Ú__call__z$ClientConfigurationEndpoint.__call__   s   € Ø×1Ñ1°'Ó:Ð:r   c                 óÂ  — | j                  |«      }|s
t        «       ‚||_        | j                  |«      }|s| j	                  ||«       t        dd¬«      ‚| j                  ||«      st        dd¬«      ‚||_        |j                  dk(  r| j                  ||«      S |j                  dk(  r| j                  ||«      S |j                  dk(  r| j                  ||«      S y )	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   z9ClientConfigurationEndpoint.create_configuration_response   sò   € ð ×'Ñ'¨Ó0ˆÙÜ#Ó%Ð%à"ˆÔà×)Ñ)¨'Ó2ˆÙð ×$Ñ$ W¨eÔ4Ü$ØÐ-Xôð ð ×$Ñ$ V¨WÔ5ô *ØØUôð ð
  ˆŒà�>‰>˜UÒ"Ø×3Ñ3°F¸GÓDÐDØ�^‰^˜xÒ'Ø×5Ñ5°f¸gÓFÐFØ�^‰^˜uÒ$Ø×5Ñ5°f¸gÓFÐFð %r   c                 ó8   — | j                   j                  |«      S r   )r   Úcreate_json_requestr   s     r   Úcreate_endpoint_requestz3ClientConfigurationEndpoint.create_endpoint_request:   s   € Ø�{‰{×.Ñ.¨wÓ7Ð7r   c                 óx   — | j                  |«      }|j                  | j                  ||«      «       d|t        fS )NéÈ   )Úintrospect_clientÚupdateÚ!generate_client_registration_infor   )r   r'   r   Úbodys       r   r)   z7ClientConfigurationEndpoint.create_read_client_response=   s9   € Ø×%Ñ% fÓ-ˆØ�‰�D×:Ñ:¸6À7ÓKÔLØ�DÔ.Ð.Ð.r   c                 ó8   — | j                  ||«       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_responseB   s.   € Ø×Ñ˜6 7Ô+à)Ø"ð
ˆð �B˜ÐÐr   c                 óô  — d}|D ]$  }||j                   j                  v sŒt        «       ‚ |j                   j                  j                  d«      }|s
t        «       ‚||j	                  «       k7  r
t        «       ‚d|j                   j                  v r2|j                  |j                   j                  d   «      s
t        «       ‚| j                  |«      }| j                  |||«      }| j                  ||«      S )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ÚkrA   Úclient_metadatas          r   r+   z9ClientConfigurationEndpoint.create_update_client_responseJ   sé   € ð
Ðð "ò 	,ˆAØ�G—O‘O×(Ñ(Ò(Ü)Ó+Ð+ð	,ð
 —O‘O×(Ñ(×,Ñ,¨[Ó9ˆ	ÙÜ%Ó'Ð'Ø˜×,Ñ,Ó.Ò.Ü%Ó'Ð'ð
 ˜gŸo™o×2Ñ2Ñ2Ø×-Ñ-¨g¯o©o×.BÑ.BÀ?Ñ.SÔTÜ)Ó+Ð+à×6Ñ6°wÓ?ˆØ×#Ñ# F¨O¸WÓEˆØ×/Ñ/°¸Ó@Ð@r   c                 óœ  — |j                   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Úget_claims_options© )rC   rD   ÚcopyÚget_server_metadatar   ÚhasattrrN   Úvalidater   r
   r   r3   Úget_registered_claims)	r   r   Ú	json_datarL   Úserver_metadataÚclaims_classÚoptionsÚclaimsÚerrors	            r   rH   z3ClientConfigurationEndpoint.extract_client_metadataj   sÚ   € Ø—O‘O×(Ñ(×-Ñ-Ó/ˆ	ØˆØ×2Ñ2Ó4ˆØ ×/Ñ/ò 	EˆLô ˜<Ð)=Ô>Á?ð ×/Ñ/°Ô@àð ñ
 " )¨R°¸/ÓJˆFðOØ—‘Ô!ð #ˆO×"Ñ"ÑD V×%AÑ%AÓ%CÓDð	Eð Ðøô	 ò OÜ0°×1BÑ1BÓCÈÐNûðOús   Á3B'Â'	CÂ0CÃCc                 ó6   — i |j                   ¥|j                  ¥S r   )Úclient_inforL   )r   r'   s     r   r2   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   r4   z=ClientConfigurationEndpoint.generate_client_registration_info€   ó   € ô  "Ó#Ð#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
        r^   r   s     r   r"   z.ClientConfigurationEndpoint.authenticate_token’   ó   € ô "Ó#Ð#r   c                 ó   — t        «       ‚)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
        r^   r   s     r   r$   z/ClientConfigurationEndpoint.authenticate_clientž   rc   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()

        r^   )r   r,   r   s      r   r%   z/ClientConfigurationEndpoint.revoke_access_tokenª   ó   € ô "Ó#Ð#r   c                 ó   — t        «       ‚)a  Checks 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
        r^   r`   s      r   r&   z,ClientConfigurationEndpoint.check_permissionµ   rf   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
        r^   r`   s      r   r:   z)ClientConfigurationEndpoint.delete_clientÀ   rc   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
        r^   )r   r'   rL   r   s       r   rI   z)ClientConfigurationEndpoint.update_clientÌ   ra   r   c                 ó   — t        «       ‚)zeReturn server metadata which includes supported grant types,
        response types and etc.
        r^   )r   s    r   rQ   z/ClientConfigurationEndpoint.get_server_metadataÞ   s   € ô "Ó#Ð#r   )NN)Ú__name__Ú
__module__Ú__qualname__ÚENDPOINT_NAMEr   r   r   r/   r)   r*   r+   rH   r2   r4   r"   r$   r%   r&   r:   rI   rQ   rO   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   rO   r   r   ú<module>rt      s)   ðÝ /Ý "å 'Ý (Ý )Ý -Ý 0Ý 1÷V$ò V$r   