§
    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ð ×$Ò$ W¨eÑ4Ô4Ð4Ý$°Ð5Ñ5Ô5Ð5à×$Ò$ V¨WÑ5Ô5ð 	;õ *°cÐ:Ñ:Ô:Ð:àˆŒàŒ>˜UÒ"Ð"Ø×3Ò3°F¸GÑDÔDÐDØŒ^˜xÒ'Ð'Ø×5Ò5°f¸gÑFÔFÐFØŒ^˜uÒ$Ð$Ø×5Ò5°f¸gÑ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×:Ò:¸6À7Ñ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   € Ø×Ò˜6 7Ñ+Ô+Ð+à)Ø"ð
ˆð �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Ø�G”LÐ Ð Ý)Ñ+Ô+Ð+ð !ð ”L×$Ò$ [Ñ1Ô1ˆ	Øð 	(Ý%Ñ'Ô'Ð'Ø˜×,Ò,Ñ.Ô.Ò.Ð.Ý%Ñ'Ô'Ð'ð
 ˜gœlÐ*Ð*Ø×-Ò-¨g¬l¸?Ô.KÑLÔLð ,Ý)Ñ+Ô+Ð+à×6Ò6°wÑ?Ô?ˆØ×#Ò# F¨O¸WÑ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×%Ò%Ñ'Ô'ˆ	Ø×)Ò)Ñ+Ô+ˆØ×"Ò" 9¨b°'¸4×;SÒ;SÑ;UÔ;UÑVÔVˆð	@Ø�OŠOÑÔÐÐøÝð 	@ð 	@ð 	@Ý,¨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Ò2°6Ñ:Ô:Ð: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   ø€ Ø/×:Ò:½3¸u¹:¼:Ñ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Ð<ˆG�GÑà#Ð/Ý'*Ð+CÑ'DÔ'DÐ$ðGð Gð Gð Gð Gð *4Ð5MÐ(NˆGÐ$Ñ%à Ð,Ý$'Ð(=Ñ$>Ô$>Ð!ðDð Dð Dð Dð Dð '1Ð2GÐ%HˆG�MÑ"à!Ð-Ø5=Ð?UÐ4VˆGÐ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   