Ë
    ”Âiž  ã                   óÊ   — 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	  ej                  d	«      Z ej                  d	«      Zd
„ Zd„ Zd„ Z G d„ d«      Zy)é    N)Úto_bytes)Ú
to_unicode)Úurlsafe_b64encodeé   )ÚInvalidGrantError)ÚInvalidRequestError)ÚOAuth2Requestz^[a-zA-Z0-9\-._~]{43,128}$c                 ó„   — t        j                  t        | d«      «      j                  «       }t	        t        |«      «      S )z8Create S256 code_challenge with the given code_verifier.Úascii)ÚhashlibÚsha256r   Údigestr   r   )Úcode_verifierÚdatas     úX/var/www/timesheet/venv/lib/python3.12/site-packages/authlib/oauth2/rfc7636/challenge.pyÚcreate_s256_code_challenger      s1   € ä�>‰>œ( =°'Ó:Ó;×BÑBÓD€DÜÔ'¨Ó-Ó.Ð.ó    c                 ó   — | |k(  S ©N© ©r   Úcode_challenges     r   Úcompare_plain_code_challenger      s   € ð ˜NÑ*Ð*r   c                 ó   — t        | «      |k(  S r   )r   r   s     r   Úcompare_s256_code_challenger      s   € ä% mÓ4¸ÑFÐFr   c                   óL   — e Zd ZdZdZddgZeedœZdd„Z	d„ Z
d„ Zd„ Zd	„ Zd
„ Zy)ÚCodeChallengeaü  CodeChallenge extension to Authorization Code Grant. It is used to
    improve the security of Authorization Code flow for public clients by
    sending extra "code_challenge" and "code_verifier" to the authorization
    server.

    The AuthorizationCodeGrant SHOULD save the ``code_challenge`` and
    ``code_challenge_method`` into database when ``save_authorization_code``.
    Then register this extension via::

        server.register_grant(AuthorizationCodeGrant, [CodeChallenge(required=True)])
    ÚplainÚS256)r   r   c                 ó   — || _         y r   )Úrequired)Úselfr!   s     r   Ú__init__zCodeChallenge.__init__8   s	   € Ø ˆ�r   c                 ót   — |j                  d| j                  «       |j                  d| j                  «       y )NÚ,after_validate_authorization_request_payloadÚafter_validate_token_request)Úregister_hookÚvalidate_code_challengeÚvalidate_code_verifier)r"   Úgrants     r   Ú__call__zCodeChallenge.__call__;   s8   € Ø×ÑØ:Ø×(Ñ(ô	
ð 	×ÑØ*Ø×'Ñ'õ	
r   c                 ó>  — |j                   }|j                  j                  j                  d«      }|j                  j                  j                  d«      }|s|sy |st	        d«      ‚t        |j                  j                  j                  dg «      «      dkD  rt	        d«      ‚t        j                  |«      st	        d«      ‚|r|| j                  vrt	        d«      ‚t        |j                  j                  j                  dg «      «      dkD  rt	        d«      ‚y )	Nr   Úcode_challenge_methodzMissing 'code_challenge'é   z%Multiple 'code_challenge' in request.zInvalid 'code_challenge'z#Unsupported 'code_challenge_method'z,Multiple 'code_challenge_method' in request.)
ÚrequestÚpayloadr   Úgetr   ÚlenÚdatalistÚCODE_CHALLENGE_PATTERNÚmatchÚSUPPORTED_CODE_CHALLENGE_METHOD)r"   r*   Úredirect_urir/   Ú	challengeÚmethods         r   r(   z%CodeChallenge.validate_code_challengeE   sö   € Ø!&§¡ˆØ—O‘O×(Ñ(×,Ñ,Ð-=Ó>ˆ	Ø—‘×%Ñ%×)Ñ)Ð*AÓBˆÙ¡ØáÜ%Ð&@ÓAÐAäˆw�‰×'Ñ'×+Ñ+Ð,<¸bÓAÓBÀQÒFÜ%Ð&MÓNÐNä%×+Ñ+¨IÔ6Ü%Ð&@ÓAÐAá�f D×$HÑ$HÑHÜ%Ð&KÓLÐLäˆw�‰×'Ñ'×+Ñ+Ð,CÀRÓHÓIÈAÒMÜ%Ð&TÓUÐUð Nr   c                 ó   — |j                   }|j                  j                  d«      }| j                  r|j                  dk(  r|st        d«      ‚|j                  }| j                  |«      }|s|sy |st        d«      ‚t        j                  |«      st        d«      ‚| j                  |«      }|€| j                  }| j                  j                  |«      }|st        d|› d�«      ‚ |||«      st        d¬«      ‚y )	Nr   ÚnonezMissing 'code_verifier'zInvalid 'code_verifier'zNo verify method for 'ú'zCode challenge failed.)Údescription)r/   Úformr1   r!   Úauth_methodr   Úauthorization_codeÚ get_authorization_code_challengeÚCODE_VERIFIER_PATTERNr5   Ú'get_authorization_code_challenge_methodÚDEFAULT_CODE_CHALLENGE_METHODÚCODE_CHALLENGE_METHODSÚRuntimeErrorr   )	r"   r*   Úresultr/   Úverifierr@   r8   r9   Úfuncs	            r   r)   z$CodeChallenge.validate_code_verifier[   s  € Ø!&§¡ˆØ—<‘<×#Ñ# OÓ4ˆð �=Š=˜W×0Ñ0°FÒ:Á8Ü%Ð&?Ó@Ð@à$×7Ñ7ÐØ×9Ñ9Ð:LÓMˆ	ñ ¡Øñ Ü%Ð&?Ó@Ð@ä$×*Ñ*¨8Ô4Ü%Ð&?Ó@Ð@ð ×=Ñ=Ð>PÓQˆØˆ>Ø×7Ñ7ˆFà×*Ñ*×.Ñ.¨vÓ6ˆÙÜÐ!7¸°x¸qÐAÓBÐBñ �H˜iÔ(Ü#Ð0HÔIÐIð )r   c                 ó   — |j                   S )a[  Get "code_challenge" associated with this authorization code.
        Developers MAY re-implement it in subclass, the default logic::

            def get_authorization_code_challenge(self, authorization_code):
                return authorization_code.code_challenge

        :param authorization_code: the instance of authorization_code
        )r   ©r"   r@   s     r   rA   z.CodeChallenge.get_authorization_code_challenge   s   € ð "×0Ñ0Ð0r   c                 ó   — |j                   S )ap  Get "code_challenge_method" associated with this authorization code.
        Developers MAY re-implement it in subclass, the default logic::

            def get_authorization_code_challenge_method(self, authorization_code):
                return authorization_code.code_challenge_method

        :param authorization_code: the instance of authorization_code
        )r-   rK   s     r   rC   z5CodeChallenge.get_authorization_code_challenge_methodŠ   s   € ð "×7Ñ7Ð7r   N)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rD   r6   r   r   rE   r#   r+   r(   r)   rA   rC   r   r   r   r   r   !   sK   „ ñ
ð %,Ð!à'.°Ð&7Ð#ð .Ø+ñÐó
!ò
òVò,"JòH	1ó	8r   r   )r   ÚreÚauthlib.common.encodingr   r   r   Úrfc6749r   r   r	   ÚcompilerB   r4   r   r   r   r   r   r   r   ú<module>rU      s]   ðÛ Û 	å ,Ý .Ý 5å 'Ý )Ý #à"˜Ÿ
™
Ð#@ÓAÐ Ø#˜Ÿ™Ð$AÓBÐ ò/ò+òG÷
r8ò r8r   