Ë
    ”ÂiÍ  ã                   ór   — d dl Z d dlmZ d dlmZ ddlmZ dZ e j                  e	«      Z
 G d„ d«      Zd	„ Zy)
é    N)Újwt)Ú	JoseErroré   )ÚInvalidClientErrorz6urn:ietf:params:oauth:client-assertion-type:jwt-bearerc                   óJ   — e Zd ZdZeZdZdd„Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd	„ Zd
„ Zy)ÚJWTBearerClientAssertionz]Implementation of Using JWTs for Client Authentication, which is
    defined by RFC7523.
    Úclient_assertion_jwtc                 ó.   — || _         || _        || _        y )N)Ú	token_urlÚ_validate_jtiÚleeway)Úselfr   Úvalidate_jtir   s       úU/var/www/timesheet/venv/lib/python3.12/site-packages/authlib/oauth2/rfc7523/client.pyÚ__init__z!JWTBearerClientAssertion.__init__   s   € Ø"ˆŒØ)ˆÔð ˆ�ó    c                 ó4  — |j                   }|j                  d«      }|j                  d«      }|t        k(  rA|r?| j                  ||«      }| j	                  ||«       | j                  |j                  «      S t        j                  d| j                  «       y )NÚclient_assertion_typeÚclient_assertionzAuthenticate via %r failed)
ÚformÚgetÚASSERTION_TYPEÚcreate_resolve_key_funcÚprocess_assertion_claimsÚauthenticate_clientÚclientÚlogÚdebugÚCLIENT_AUTH_METHOD)r   Úquery_clientÚrequestÚdataÚassertion_typeÚ	assertionÚresolve_keys          r   Ú__call__z!JWTBearerClientAssertion.__call__   s   € Ø�|‰|ˆØŸ™Ð"9Ó:ˆØ—H‘HÐ/Ó0ˆ	Øœ^Ò+±	Ø×6Ñ6°|ÀWÓMˆKØ×)Ñ)¨)°[ÔAØ×+Ñ+¨G¯N©NÓ;Ð;Ü�	‰	Ð.°×0GÑ0GÕHr   c                 ó€   — dt         dœddid| j                  dœddidœ}| j                  rd| j                  dœ|d<   |S )z�Create a claims_options for verify JWT payload claims. Developers
        MAY overwrite this method to create a more strict options.
        T)Ú	essentialÚvalidater(   )r(   Úvalue)ÚissÚsubÚaudÚexpÚjti)Ú_validate_issr   r   r   )r   Úoptionss     r   Úcreate_claims_optionsz.JWTBearerClientAssertion.create_claims_options'   sS   € ð "&´=ÑAØ Ð&Ø!%°·±Ñ?Ø Ð&ñ	
ˆð ×ÒØ+/¸T×=NÑ=NÑOˆG�E‰NØˆr   c                 ó  — 	 t        j                  ||| j                  «       ¬«      }|j                  | j                  ¬«       |S # t
        $ r2}t        j                  d|«       t        |j                  ¬«      |‚d}~ww xY w)aa  Extract JWT payload claims from request "assertion", per
        `Section 3.1`_.

        :param assertion: assertion string value in the request
        :param resolve_key: function to resolve the sign key
        :return: JWTClaims
        :raise: InvalidClientError

        .. _`Section 3.1`: https://tools.ietf.org/html/rfc7523#section-3.1
        )Úclaims_options)r   zAssertion Error: %r©ÚdescriptionN)
r   Údecoder2   r)   r   r   r   r   r   r6   )r   r$   r%   ÚclaimsÚes        r   r   z1JWTBearerClientAssertion.process_assertion_claims7   su   € ð	GÜ—Z‘ZØ˜;°t×7QÑ7QÓ7SôˆFð �O‰O 4§;¡;ˆOÔ/ð ˆøô ò 	GÜ�I‰IÐ+¨QÔ/Ü$°·±Ô?ÀQÐFûð	Gús   ‚AA Á	BÁ-A<Á<Bc                 óp   — |j                  | j                  d«      r|S t        d| j                  › �¬«      ‚)NÚtokenz,The client cannot authenticate with method: r5   )Úcheck_endpoint_auth_methodr   r   )r   r   s     r   r   z,JWTBearerClientAssertion.authenticate_clientL   s;   € Ø×,Ñ,¨T×-DÑ-DÀgÔNØˆMÜ ØFÀt×G^ÑG^ÐF_Ð`ô
ð 	
r   c                 ó   ‡ ‡‡— ˆˆˆ fd„}|S )Nc                 ól   •— |d   } ‰|«      }|st        d¬«      ‚|‰_        ‰j                  || «      S )Nr,   z)The client does not exist on this server.r5   )r   r   Úresolve_client_public_key)ÚheadersÚpayloadÚ	client_idr   r    r!   r   s       €€€r   r%   zEJWTBearerClientAssertion.create_resolve_key_func.<locals>.resolve_keyT   sG   ø€ ð   ™ˆIÙ! )Ó,ˆFÙÜ(Ø Kôð ð $ˆGŒNØ×1Ñ1°&¸'ÓBÐBr   © )r   r    r!   r%   s   ``` r   r   z0JWTBearerClientAssertion.create_resolve_key_funcS   s   ú€ ö	Cð Ðr   c                 ó   — t        «       ‚)af  Validate if the given ``jti`` value is used before. Developers
        MUST implement this method::

            def validate_jti(self, claims, jti):
                key = "jti:{}-{}".format(claims["sub"], jti)
                if redis.get(key):
                    return False
                redis.set(key, 1, ex=3600)
                return True
        ©ÚNotImplementedError)r   r8   r/   s      r   r   z%JWTBearerClientAssertion.validate_jtic   s   € ô "Ó#Ð#r   c                 ó   — t        «       ‚)aN  Resolve the client public key for verifying the JWT signature.
        A client may have many public keys, in this case, we can retrieve it
        via ``kid`` value in headers. Developers MUST implement this method::

            def resolve_client_public_key(self, client, headers):
                return client.public_key
        rE   )r   r   r@   s      r   r?   z2JWTBearerClientAssertion.resolve_client_public_keyp   s   € ô "Ó#Ð#r   N)Té<   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚCLIENT_ASSERTION_TYPEr   r   r&   r2   r   r   r   r   r?   rC   r   r   r   r      s>   „ ñð
 +Ðà/ÐóòIòò ò*
òò $ó$r   r   c                 ó   — | d   |k(  S )Nr,   rC   )r8   r+   s     r   r0   r0   {   s   € Ø�%‰=˜CÑÐr   )ÚloggingÚauthlib.joser   Úauthlib.jose.errorsr   Úrfc6749r   r   Ú	getLoggerrI   r   r   r0   rC   r   r   ú<module>rT      s:   ðÛ å Ý )å (àI€Ø€g×Ñ˜Ó!€÷l$ñ l$ó^ r   