Ë
    ”Âi  ã                   ó´   — 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«      Zy)é    N©Úgenerate_token)Údefault_json_headers)Ú	deprecate)Ú	JoseError)ÚJsonWebTokené   )ÚAccessDeniedError)ÚInvalidRequestErroré   )ÚClientMetadataClaims)ÚInvalidClientMetadataError)ÚInvalidSoftwareStatementError)Ú UnapprovedSoftwareStatementErrorc                   ón   — e Zd Zd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y)ÚClientRegistrationEndpointz�The client registration endpoint is an OAuth 2.0 endpoint designed to
    allow a client to be registered with the authorization server.
    Úclient_registrationNc                 ó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/rfc7591/endpoint.pyÚ__init__z#ClientRegistrationEndpoint.__init__   s   € ØˆŒØ,ÒFÔ1EÐ0FˆÕó    c                 ó$   — | j                  |«      S r   )Úcreate_registration_response©r   Úrequests     r   Ú__call__z#ClientRegistrationEndpoint.__call__"   s   € Ø×0Ñ0°Ó9Ð9r   c                 óX  — | j                  |«      }|s
t        «       ‚||_        | j                  |«      }| j	                  |«      }i }|j                  |«       |j                  |«       | j                  |||«      }| j                  ||«      }|r|j                  |«       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_infos           r   r   z7ClientRegistrationEndpoint.create_registration_response%   s¨   € Ø×'Ñ'¨Ó0ˆÙÜ#Ó%Ð%à"ˆÔà×6Ñ6°wÓ?ˆØ×/Ñ/°Ó8ˆØˆØ�‰�OÔ$Ø�‰�KÔ Ø×!Ñ! +¨ÀÓHˆØ ×BÑBÀ6È7ÓSÐÙØ�K‰KÐ)Ô*Ø�DÔ.Ð.Ð.r   c                 ób  — |j                   j                  s
t        «       ‚|j                   j                  j                  «       }|j	                  dd «      }|r/| j
                  r#| 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Úsoftware_statementÚget_claims_options© )ÚpayloadÚdatar   ÚcopyÚpopÚ'software_statement_alg_values_supportedÚextract_software_statementr'   Úget_server_metadatar   Úhasattrr2   Úvalidater   r   ÚdescriptionÚget_registered_claims)r   r   Ú	json_datar1   r5   r+   Úserver_metadataÚclaims_classÚoptionsÚclaimsÚerrors              r   r%   z2ClientRegistrationEndpoint.extract_client_metadata7   s.  € Ø�‰×#Ò#Ü%Ó'Ð'à—O‘O×(Ñ(×-Ñ-Ó/ˆ	Ø&Ÿ]™]Ð+?ÀÓFÐÙ $×"NÒ"NØ×2Ñ2Ð3EÀwÓOˆDØ×Ñ˜TÔ"àˆØ×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   ÃD
Ä
	D.ÄD)Ä)D.c                 óÈ   — | j                  |«      }|s
t        «       ‚	 t        | j                  «      }|j	                  ||«      }|S # t
        $ r}t        «       |‚d }~ww xY wr   )Úresolve_public_keyr   r   r8   Údecoder   r   )r   r1   r   ÚkeyÚjwtrC   Úexcs          r   r9   z5ClientRegistrationEndpoint.extract_software_statementR   sd   € Ø×%Ñ% gÓ.ˆÙÜ2Ó4Ð4ð	;Ü˜t×KÑKÓLˆCØ—Z‘ZÐ 2°CÓ8ˆFàˆMøÜò 	;Ü/Ó1°sÐ:ûð	;ús   Ÿ(A Á	A!ÁAÁA!c                 óV  — 	 | j                  |«      }	 | j                  |«      }t	        t        j
                  «       «      }d}t        ||||¬«      S # t        $ r  | j                  «       }t        dd¬«       Y Œhw xY w# t        $ r  | j                  «       }t        dd¬«       Y Œ‚w xY w)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   rM   rN   rO   rP   s         r   r&   z/ClientRegistrationEndpoint.generate_client_info_   s»   € ð	Ø×/Ñ/°Ó8ˆIð	Ø ×7Ñ7¸Ó@ˆMô "¤$§)¡)£+Ó.ÐØ#$Ð ÜØØ'Ø 3Ø%=ô	
ð 	
øô) ò 	Ø×/Ñ/Ó1ˆIÜð>à÷ð	ûô ò 	Ø ×7Ñ7Ó9ˆMÜð>à÷ð	ús"   ‚A ”A? Á&A<Á;A<Á?&B(Â'B(c                  ó   — y)zÝGenerate ```registration_client_uri`` and ``registration_access_token``
        for RFC7592. This method returns ``None`` by default. Developers MAY rewrite
        this method to return registration information.
        Nr3   )r   r.   r   s      r   r)   z<ClientRegistrationEndpoint.generate_client_registration_info~   s   € ð
 r   c                 ó8   — | j                   j                  |«      S r   )r   Úcreate_json_requestr   s     r   Úcreate_endpoint_requestz2ClientRegistrationEndpoint.create_endpoint_request…   s   € Ø�{‰{×.Ñ.¨wÓ7Ð7r   c                 ó   — t        d«      S )z�Generate ``client_id`` value. Developers MAY rewrite this method
        to use their own way to generate ``client_id``.
        é*   r   r   s     r   rQ   z-ClientRegistrationEndpoint.generate_client_idˆ   s   € ô ˜bÓ!Ð!r   c                 óp   — t        j                  t        j                  d«      «      j	                  d«      S )z‰Generate ``client_secret`` value. Developers MAY rewrite this method
        to use their own way to generate ``client_secret``.
        é   Úascii)ÚbinasciiÚhexlifyÚosÚurandomrG   r   s     r   rS   z1ClientRegistrationEndpoint.generate_client_secretŽ   s(   € ô ×Ñ¤§
¡
¨2£Ó/×6Ñ6°wÓ?Ð?r   c                 ó   — t        «       ‚)zeReturn server metadata which includes supported grant types,
        response types and etc.
        ©ÚNotImplementedError)r   s    r   r:   z.ClientRegistrationEndpoint.get_server_metadata”   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
        re   r   s     r   r#   z-ClientRegistrationEndpoint.authenticate_tokenš   ó   € ô "Ó#Ð#r   c                 ó   — t        «       ‚)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
        re   r   s     r   rF   z-ClientRegistrationEndpoint.resolve_public_key¦   rh   r   c                 ó   — t        «       ‚)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
        re   )r   r,   r+   r   s       r   r(   z&ClientRegistrationEndpoint.save_client²   s   € ô "Ó#Ð#r   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚENDPOINT_NAMEr8   r   r    r   r%   r9   r&   r)   rZ   rQ   rS   r:   r#   rF   r(   r3   r   r   r   r      s^   „ ñð *€Mð /3Ð+óGò:ò/ò$ò6;ò
ò>ò8ò"ò@ò$ò
$ò
$ó$r   r   )r`   rb   rU   Úauthlib.common.securityr   Úauthlib.constsr   Úauthlib.deprecater   Úauthlib.joser   r   Úrfc6749r
   r   rC   r   Úerrorsr   r   r   r   r3   r   r   ú<module>rv      s;   ðÛ Û 	Û å 2Ý /Ý 'Ý "Ý %å 'Ý )Ý (Ý .Ý 1Ý 4÷l$ò l$r   