Ë
    ïñþiên  ã                   óÐ  — d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	m
Z
 ddlmZmZ ddlmZmZ ddlmZmZmZmZ ddlZddlZddlmZmZmZ ddlmZmZ dd	lm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. dd
l/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z:  ejv                  e<«      Z= G d„ de«      Z> G d„ de«      Z?e G d„ d«      «       Z@ G d„ dej‚                  «      ZBy)z|
OAuth2 Authentication implementation for HTTPX.

Implements authorization code flow with PKCE and automatic token refresh.
é    N)ÚAsyncGeneratorÚ	AwaitableÚCallable)Ú	dataclassÚfield)ÚAnyÚProtocol)ÚquoteÚ	urlencodeÚurljoinÚurlparse)Ú	BaseModelÚFieldÚValidationError)ÚOAuthFlowErrorÚOAuthTokenError)Ú8build_oauth_authorization_server_metadata_discovery_urlsÚ0build_protected_resource_metadata_discovery_urlsÚ$create_client_info_from_metadata_urlÚ"create_client_registration_requestÚcreate_oauth_metadata_requestÚextract_field_from_www_authÚ'extract_resource_metadata_from_www_authÚextract_scope_from_www_authÚget_client_metadata_scopesÚhandle_auth_metadata_responseÚ"handle_protected_resource_responseÚhandle_registration_responseÚhandle_token_response_scopesÚis_valid_client_metadata_urlÚshould_use_client_metadata_url)ÚMCP_PROTOCOL_VERSION)ÚOAuthClientInformationFullÚOAuthClientMetadataÚOAuthMetadataÚ
OAuthTokenÚProtectedResourceMetadata)Úcalculate_token_expiryÚcheck_resource_allowedÚresource_url_from_server_urlc                   ód   — e Zd ZU dZ eddd¬«      Zeed<    eddd¬«      Zeed<   e	d
d„«       Z
y	)ÚPKCEParametersz.PKCE (Proof Key for Code Exchange) parameters..é+   é€   )Ú
min_lengthÚ
max_lengthÚcode_verifierÚcode_challengec                 ó  — dj                  d„ t        d«      D «       «      }t        j                  |j	                  «       «      j                  «       }t        j                  |«      j                  «       j                  d«      } | ||¬«      S )zGenerate new PKCE parameters.Ú c              3   óŠ   K  — | ];  }t        j                  t        j                  t        j                  z   d z   «      –— Œ= y­w)z-._~N)ÚsecretsÚchoiceÚstringÚascii_lettersÚdigits)Ú.0Ú_s     úV/root/aria/mcps/aria-brain/venv/lib/python3.12/site-packages/mcp/client/auth/oauth2.pyú	<genexpr>z*PKCEParameters.generate.<locals>.<genexpr>B   s/   è ø€ ÒrÐbc¤§¡¬v×/CÑ/CÄfÇmÁmÑ/SÐV\Ñ/\× ]Ñrùs   ‚AAr.   ú=)r1   r2   )
ÚjoinÚrangeÚhashlibÚsha256ÚencodeÚdigestÚbase64Úurlsafe_b64encodeÚdecodeÚrstrip)Úclsr1   rE   r2   s       r=   ÚgeneratezPKCEParameters.generate?   sp   € ð Ÿ™ÑrÔglÐmpÓgqÔrÓrˆÜ—‘ × 4Ñ 4Ó 6Ó7×>Ñ>Ó@ˆÜ×1Ñ1°&Ó9×@Ñ@ÓB×IÑIÈ#ÓNˆÙ ¸~ÔNÐNó    N)Úreturnr,   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r1   ÚstrÚ__annotations__r2   ÚclassmethodrK   © rL   r=   r,   r,   9   s?   … Ù8á˜s¨r¸cÔB€M�3ÓBÙ °¸sÔC€N�CÓCàòOó ñOrL   r,   c                   óT   — e Zd ZdZdedz  fd„Zdeddfd„Zdedz  fd„Zdeddfd	„Z	y)
ÚTokenStoragez+Protocol for token storage implementations.rM   Nc              ƒ   ó   K  — y­w)zGet stored tokens.NrU   ©Úselfs    r=   Ú
get_tokenszTokenStorage.get_tokensK   ó	   è ø€ àùó   ‚Útokensc              ƒ   ó   K  — y­w)zStore tokens.NrU   )rZ   r^   s     r=   Ú
set_tokenszTokenStorage.set_tokensO   r\   r]   c              ƒ   ó   K  — y­w)zGet stored client information.NrU   rY   s    r=   Úget_client_infozTokenStorage.get_client_infoS   r\   r]   Úclient_infoc              ƒ   ó   K  — y­w)zStore client information.NrU   )rZ   rc   s     r=   Úset_client_infozTokenStorage.set_client_infoW   r\   r]   )
rN   rO   rP   rQ   r&   r[   r`   r#   rb   re   rU   rL   r=   rW   rW   H   sP   „ Ù5ð *¨tÑ"3ó ð zð °dó ðÐ'AÀDÑ'Hó ðÐ1Kð ÐPTô rL   rW   c                   ó(  — e Zd ZU dZeed<   eed<   eed<   eege	d   f   dz  ed<   eg e	e
eedz  f      f   dz  ed<   dZeed	<   dZedz  ed
<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<    eej6                  ¬«      Zej6                  ed<   dedefd„Zdeddfd„Zdefd„Z defd„Z!d d„Z"defd„Z#d!dedz  defd„Z$	 d!de%eef   de%eef   dz  de
e%eef   e%eef   f   fd„Z&y)"ÚOAuthContextzOAuth flow context.Ú
server_urlÚclient_metadataÚstorageNÚredirect_handlerÚcallback_handlerç     Àr@ÚtimeoutÚclient_metadata_urlÚprotected_resource_metadataÚoauth_metadataÚauth_server_urlÚprotocol_versionrc   Úcurrent_tokensÚtoken_expiry_time)Údefault_factoryÚlockrM   c                 óN   — t        |«      }|j                  › d|j                  › �S )z,Extract base URL by removing path component.z://)r   ÚschemeÚnetloc)rZ   rh   Úparseds      r=   Úget_authorization_base_urlz'OAuthContext.get_authorization_base_urlx   s%   € ä˜*Ó%ˆØ—-‘-�  F§M¡M ?Ð3Ð3rL   Útokenc                 ó8   — t        |j                  «      | _        y)z4Update token expiry time using shared util function.N)r(   Ú
expires_inru   )rZ   r}   s     r=   Úupdate_token_expiryz OAuthContext.update_token_expiry}   s   € ä!7¸×8HÑ8HÓ!IˆÕrL   c                 óÀ   — t        | j                  xrH | j                  j                  xr0 | j                   xs! t	        j                  «       | j                  k  «      S )z Check if current token is valid.)Úboolrt   Úaccess_tokenru   ÚtimerY   s    r=   Úis_token_validzOAuthContext.is_token_valid�   sU   € äØ×Ñò VØ×#Ñ#×0Ñ0òVà×+Ñ+Ð+ÒT¬t¯y©y«{¸d×>TÑ>TÑ/Tó
ð 	
rL   c                 óx   — t        | j                  xr$ | j                  j                  xr | j                  «      S )z Check if token can be refreshed.)r‚   rt   Úrefresh_tokenrc   rY   s    r=   Úcan_refresh_tokenzOAuthContext.can_refresh_token‰   s0   € ä�D×'Ñ'Òb¨D×,?Ñ,?×,MÑ,MÒbÐRV×RbÑRbÓcÐcrL   c                 ó    — d| _         d| _        y)zClear current tokens.N)rt   ru   rY   s    r=   Úclear_tokenszOAuthContext.clear_tokens�   s   € à"ˆÔØ!%ˆÕrL   c                 óÐ   — t        | j                  «      }| j                  rD| j                  j                  r.t	        | j                  j                  «      }t        ||¬«      r|}|S )zGet resource URL for RFC 8707.

        Uses PRM resource if it's a valid parent, otherwise uses canonical server URL.
        ©Úrequested_resourceÚconfigured_resource)r*   rh   rp   ÚresourcerR   r)   )rZ   r�   Úprm_resources      r=   Úget_resource_urlzOAuthContext.get_resource_url’   sV   € ô
 0°·±Ó@ˆð ×+Ò+°×0PÑ0P×0YÒ0YÜ˜t×?Ñ?×HÑHÓIˆLÜ%¸ÐWcÕdØ'�àˆrL   c                 ó,   — | j                   �y|sy|dk\  S )zàDetermine if the resource parameter should be included in OAuth requests.

        Returns True if:
        - Protected resource metadata is available, OR
        - MCP-Protocol-Version header is 2025-06-18 or later
        TFz
2025-06-18)rp   )rZ   rs   s     r=   Úshould_include_resource_paramz*OAuthContext.should_include_resource_param¡   s(   € ð ×+Ñ+Ð7Øñ  Øð   <Ñ/Ð/rL   ÚdataÚheadersc                 ó’  — |€i }| j                   s||fS | j                   j                  }|dk(  rÛ| j                   j                  rÅ| j                   j                  r¯t	        | j                   j                  d¬«      }t	        | j                   j                  d¬«      }|› d|› �}t        j                  |j                  «       «      j                  «       }d|› �|d<   |j                  «       D ��	ci c]  \  }}	|dk7  sŒ||	“Œ }}}	||fS |dk(  r/| j                   j                  r| j                   j                  |d<   ||fS c c}	}w )	zæPrepare authentication for token requests.

        Args:
            data: The form data to send
            headers: Optional headers dict to update

        Returns:
            Tuple of (updated_data, updated_headers)
        Úclient_secret_basicr4   )Úsafeú:zBasic ÚAuthorizationÚclient_secretÚclient_secret_post)
rc   Útoken_endpoint_auth_methodÚ	client_idr›   r
   rF   Ú	b64encoderD   rH   Úitems)
rZ   r”   r•   Úauth_methodÚ
encoded_idÚencoded_secretÚcredentialsÚencoded_credentialsÚkÚvs
             r=   Úprepare_token_authzOAuthContext.prepare_token_auth´   sD  € ð ˆ?ØˆGà×ÒØ˜�=Ð à×&Ñ&×AÑAˆàÐ/Ò/°D×4DÑ4D×4NÒ4NÐSW×ScÑSc×SqÒSqä˜t×/Ñ/×9Ñ9ÀÔCˆJÜ" 4×#3Ñ#3×#AÑ#AÈÔKˆNØ'˜L¨¨.Ð)9Ð:ˆKÜ"(×"2Ñ"2°;×3EÑ3EÓ3GÓ"H×"OÑ"OÓ"QÐØ)/Ð0CÐ/DÐ'EˆG�OÑ$à%)§Z¡Z£\×J™T˜Q °Q¸/Ó5I�A�q‘DÐJˆDÑJð �Wˆ}Ðð Ð0Ò0°T×5EÑ5E×5SÒ5Sà$(×$4Ñ$4×$BÑ$BˆD�Ñ!ð �Wˆ}Ðùó Ks   Ã1EÃ?E©rM   N©N)'rN   rO   rP   rQ   rR   rS   r$   rW   r   r   Útuplern   Úfloatro   rp   r'   rq   r%   rr   rs   rc   r#   rt   r&   ru   r   ÚanyioÚLockrw   r|   r€   r‚   r…   rˆ   rŠ   r‘   r“   Údictr¨   rU   rL   r=   rg   rg   \   s¼  … áàƒOØ(Ó(ØÓØ ˜u i°¡oÐ5Ñ6¸Ñ=Ó=Ø˜r 9¨U°3¸¸d¹
°?Ñ-CÑ#DÐDÑEÈÑLÓLØ€GˆUÓØ&*Ð˜˜t™Ó*ð EIÐÐ!:¸TÑ!AÓHØ+/€N�M DÑ(Ó/Ø"&€O�S˜4‘ZÓ&Ø#'Ð�c˜D‘jÓ'ð 6:€KÐ+¨dÑ2Ó9ð )-€N�J Ñ%Ó,Ø&*Ð�u˜t‘|Ó*ñ ¨U¯Z©ZÔ8€Dˆ%�*‰*Ó8ð4°Sð 4¸Só 4ð
J¨ð J¸ó Jð
 ó 
ðd 4ó dó&ð
 #ó ñ0¸cÀD¹jð 0ÐTXó 0ð( FJñ"Ø˜˜c˜‘Nð"Ø-1°#°s°(©^¸dÑ-Bð"à	ˆt�C˜�H‰~˜t C¨ H™~Ð-Ñ	.ô"rL   rg   c                   óL  — e Zd ZdZdZ	 	 	 	 d!dedededeege	d   f   dz  deg e	e
eedz  f      f   dz  d	ed
edz  fd„Zdeddfd„Zdej                   defd„Zdej&                  fd„Zde
eef   fd„Zdefd„Zi dœdededeeef   dz  dej&                  fd„Zdej                   ddfd„Zdej&                  fd„Zdej                   defd„Zd"d„Zdej&                  ddfd„Zdej                   ddfd„Zdej&                  de ej&                  ej                   f   fd „Z!y)#ÚOAuthClientProviderzw
    OAuth2 authentication for httpx.
    Handles OAuth flow with automatic client registration and token storage.
    TNrh   ri   rj   rk   rl   rn   ro   c           	      óv   — |�t        |«      st        d|› �«      ‚t        |||||||¬«      | _        d| _        y)al  Initialize OAuth2 authentication.

        Args:
            server_url: The MCP server URL.
            client_metadata: OAuth client metadata for registration.
            storage: Token storage implementation.
            redirect_handler: Handler for authorization redirects.
            callback_handler: Handler for authorization callbacks.
            timeout: Timeout for the OAuth flow.
            client_metadata_url: URL-based client ID. When provided and the server
                advertises client_id_metadata_document_supported=true, this URL will be
                used as the client_id instead of performing dynamic client registration.
                Must be a valid HTTPS URL with a non-root pathname.

        Raises:
            ValueError: If client_metadata_url is provided but not a valid HTTPS URL
                with a non-root pathname.
        NzMclient_metadata_url must be a valid HTTPS URL with a non-root pathname, got: )rh   ri   rj   rk   rl   rn   ro   F)r    Ú
ValueErrorrg   ÚcontextÚ_initialized)rZ   rh   ri   rj   rk   rl   rn   ro   s           r=   Ú__init__zOAuthClientProvider.__init__á   sY   € ð: Ð*Ô3OÐPcÔ3dÜØ_Ð`sÐ_tÐuóð ô $Ø!Ø+ØØ-Ø-ØØ 3ô
ˆŒð "ˆÕrL   ÚprmrM   c              ƒ   óÒ   K  — |j                   rt        |j                   «      nd}|syt        | j                  j                  «      }t        ||¬«      st        d|› d|› �«      ‚y­w)z?Validate that PRM resource matches the server URL per RFC 8707.NrŒ   zProtected resource z does not match expected )r�   rR   r*   r´   rh   r)   r   )rZ   r·   r�   Údefault_resources       r=   Ú_validate_resource_matchz,OAuthClientProvider._validate_resource_match  se   è ø€ à,/¯LªL”s˜3Ÿ<™<Ô(¸dˆÙØÜ7¸¿¹×8OÑ8OÓPÐÜ%Ð9IÐ_kÕlÜ Ð#6°|°nÐD]Ð^nÐ]oÐ!pÓqÐqð mùs   ‚A%A'Úresponsec              ƒ   ó2  K  — |j                   dk(  rs	 |j                  «       ƒ d{  –—† }t        j                  |«      }|| j                  _        |j                  r't        |j                  d   «      | j                  _        y|j                   dk(  r.t        j                  d|j                  j                  › d	�«       yt        d
|j                   › �«      ‚7 Œ³# t        $ r/ t        j                  d|j                  j                  › �«       Y yw xY w­w)zý
        Handle protected resource metadata discovery response.

        Per SEP-985, supports fallback when discovery fails at one URL.

        Returns:
            True if metadata was successfully discovered, False if we should try next URL
        éÈ   Nr   Tz'Invalid protected resource metadata at Fi”  z)Protected resource metadata not found at z, trying next URLz,Protected Resource Metadata request failed: )Ústatus_codeÚareadr'   Úmodel_validate_jsonr´   rp   Úauthorization_serversrR   rr   r   ÚloggerÚwarningÚrequestÚurlÚdebugr   ©rZ   r»   ÚcontentÚmetadatas       r=   Ú#_handle_protected_resource_responsez7OAuthClientProvider._handle_protected_resource_response  sÿ   è ø€ ð ×Ñ 3Ò&ðØ (§¡Ó 0×0�Ü4×HÑHÈÓQ�Ø;C�—‘Ô8Ø×1Ò1Ü36°x×7UÑ7UÐVWÑ7XÓ3Y�D—L‘LÔ0Øð ×!Ñ! SÒ(ä�L‰LÐDÀX×EUÑEU×EYÑEYÐDZÐZkÐlÔmØô !Ø>¸x×?SÑ?SÐ>TÐUóð ð# 1ùô #ò ä—‘Ð!HÈ×IYÑIY×I]ÑI]ÐH^Ð_Ô`Ùðüs:   ‚D“C ¦C§AC ÂADÃC Ã5DÄDÄDÄDc              ƒ   ó€   K  — | j                  «       ƒ d{  –—† \  }}| j                  ||«      ƒ d{  –—† }|S 7 Œ#7 Œ­w)zPerform the authorization flow.N)Ú!_perform_authorization_code_grantÚ"_exchange_token_authorization_code)rZ   Ú	auth_coder1   Útoken_requests       r=   Ú_perform_authorizationz*OAuthClientProvider._perform_authorization7  sB   è ø€ à)-×)OÑ)OÓ)Q×#QÑ ˆ	�=Ø"×EÑEÀiÐQ^Ó_×_ˆØÐð $RøØ_ús   ‚>–:—>³<´>¼>c              ƒ   óÂ  K  — | j                   j                  j                  €t        d«      ‚| j                   j                  st        d«      ‚| j                   j
                  st        d«      ‚| j                   j                  rJ| j                   j                  j                  r*t        | j                   j                  j                  «      }n;| j                   j                  | j                   j                  «      }t        |d«      }| j                   j                  st        d«      ‚t        j                  «       }t        j                   d«      }d| j                   j                  j"                  t        | j                   j                  j                  d	   «      ||j$                  d
dœ}| j                   j'                  | j                   j(                  «      r| j                   j+                  «       |d<   | j                   j                  j,                  r#| j                   j                  j,                  |d<   |› dt/        |«      › �}| j                   j	                  |«      ƒ d{  –—†  | j                   j                  «       ƒ d{  –—† \  }}|�t        j0                  ||«      st        d|› d|› �«      ‚|st        d«      ‚||j2                  fS 7 Œm7 ŒM­w)z5Perform the authorization redirect and get auth code.Nú6No redirect URIs provided for authorization code grantz9No redirect handler provided for authorization code grantz9No callback handler provided for authorization code grantz
/authorizez*No client info available for authorizationé    Úcoder   ÚS256)Úresponse_typerž   Úredirect_uriÚstater2   Úcode_challenge_methodr�   Úscopeú?zState parameter mismatch: z != zNo authorization code received)r´   ri   Úredirect_urisr   rk   rl   rq   Úauthorization_endpointrR   r|   rh   r   rc   r,   rK   r6   Útoken_urlsaferž   r2   r“   rs   r‘   rÚ   r   Úcompare_digestr1   )	rZ   Úauth_endpointÚauth_base_urlÚpkce_paramsrØ   Úauth_paramsÚauthorization_urlrÎ   Úreturned_states	            r=   rÌ   z5OAuthClientProvider._perform_authorization_code_grant=  sO  è ø€ à�<‰<×'Ñ'×5Ñ5Ð=Ü Ð!YÓZÐZØ�|‰|×,Ò,Ü Ð!\Ó]Ð]Ø�|‰|×,Ò,Ü Ð!\Ó]Ð]à�<‰<×&Ò&¨4¯<©<×+FÑ+F×+]Ò+]Ü §¡× ;Ñ ;× RÑ RÓS‰Mà ŸL™L×CÑCÀDÇLÁL×D[ÑD[Ó\ˆMÜ# M°<Ó@ˆMà�|‰|×'Ò'Ü Ð!MÓNÐNô %×-Ñ-Ó/ˆÜ×%Ñ% bÓ)ˆð $ØŸ™×1Ñ1×;Ñ;Ü §¡× <Ñ <× JÑ JÈ1Ñ MÓNØØ)×8Ñ8Ø%+ñ
ˆð �<‰<×5Ñ5°d·l±l×6SÑ6SÔTØ&*§l¡l×&CÑ&CÓ&EˆK˜
Ñ#à�<‰<×'Ñ'×-Ò-Ø#'§<¡<×#?Ñ#?×#EÑ#EˆK˜Ñ à,˜o¨Q¬y¸Ó/EÐ.FÐGÐØ�l‰l×+Ñ+Ð,=Ó>×>Ð>ð +/¯,©,×*GÑ*GÓ*I×$IÑ!ˆ	�>àÐ!¬×)?Ñ)?ÀÐPUÔ)VÜ Ð#=¸nÐ=MÈTÐRWÐQXÐ!YÓZÐZáÜ Ð!AÓBÐBð ˜+×3Ñ3Ð3Ð3ð 	?øð %Jús%   ‚I+KÉ-KÉ.!KÊKÊAKËKc                 ó>  — | j                   j                  rK| j                   j                  j                  r+t        | j                   j                  j                  «      }|S | j                   j	                  | j                   j
                  «      }t        |d«      }|S )Nú/token)r´   rq   Útoken_endpointrR   r|   rh   r   )rZ   Ú	token_urlrá   s      r=   Ú_get_token_endpointz'OAuthClientProvider._get_token_endpointr  su   € Ø�<‰<×&Ò&¨4¯<©<×+FÑ+F×+UÒ+UÜ˜DŸL™L×7Ñ7×FÑFÓGˆIð Ðð !ŸL™L×CÑCÀDÇLÁL×D[ÑD[Ó\ˆMÜ ¨xÓ8ˆIØÐrL   )Ú
token_datarÎ   r1   rë   c             ƒ   óœ  K  — | j                   j                  j                  €t        d«      ‚| j                   j                  st        d«      ‚| j                  «       }|xs i }|j                  d|t        | j                   j                  j                  d   «      | j                   j                  j                  |dœ«       | j                   j                  | j                   j                  «      r| j                   j                  «       |d<   ddi}| j                   j                  ||«      \  }}t        j                  d	|||¬
«      S ­w)z9Build token exchange request for authorization_code flow.rÒ   zMissing client infoÚauthorization_coder   )Ú
grant_typerÔ   r×   rž   r1   r�   úContent-Typeú!application/x-www-form-urlencodedÚPOST©r”   r•   )r´   ri   rÜ   r   rc   rê   ÚupdaterR   rž   r“   rs   r‘   r¨   ÚhttpxÚRequest)rZ   rÎ   r1   rë   ré   r•   s         r=   rÍ   z6OAuthClientProvider._exchange_token_authorization_codez  s  è ø€ ð �<‰<×'Ñ'×5Ñ5Ð=Ü Ð!YÓZÐZØ�|‰|×'Ò'Ü Ð!6Ó7Ð7à×,Ñ,Ó.ˆ	ØÒ% 2ˆ
Ø×Ñà2Ø!Ü # D§L¡L×$@Ñ$@×$NÑ$NÈqÑ$QÓ RØ!Ÿ\™\×5Ñ5×?Ñ?Ø!.ñô	
ð �<‰<×5Ñ5°d·l±l×6SÑ6SÔTØ%)§\¡\×%BÑ%BÓ%DˆJ�zÑ"ð "Ð#FÐGˆØ"Ÿl™l×=Ñ=¸jÈ'ÓRÑˆ
�Gä�}‰}˜V Y°ZÈÔQÐQùs   ‚E
Ec              ƒ   ó–  K  — |j                   dk7  rD|j                  «       ƒ d{  –—† }|j                  d«      }t        d|j                   › d|› �«      ‚t	        |«      ƒ d{  –—† }|| j
                  _        | j
                  j                  |«       | j
                  j                  j                  |«      ƒ d{  –—†  y7 Œ�7 Œ`7 Œ	­w)zHandle token exchange response.r½   Nzutf-8zToken exchange failed (z): )
r¾   r¿   rH   r   r   r´   rt   r€   rj   r`   )rZ   r»   ÚbodyÚ	body_textÚtoken_responses        r=   Ú_handle_token_responsez*OAuthClientProvider._handle_token_response™  s³   è ø€ à×Ñ 3Ò&Ø!Ÿ™Ó)×)ˆDØŸ™ GÓ,ˆIÜ!Ð$;¸H×<PÑ<PÐ;QÐQTÐU^ÐT_Ð"`ÓaÐaô  <¸HÓE×Eˆð '5ˆ�‰Ô#Ø�‰×(Ñ(¨Ô8Ø�l‰l×"Ñ"×-Ñ-¨nÓ=×=Ñ=ð *øð
 Føð
 	>ús4   ‚#C	¥C¦>C	Á$CÁ%AC	Â=CÂ>C	ÃC	ÃC	c              ƒ   óØ  K  — | j                   j                  r | j                   j                  j                  st        d«      ‚| j                   j                  r | j                   j                  j
                  st        d«      ‚| j                   j                  rJ| j                   j                  j                  r*t        | j                   j                  j                  «      }n;| j                   j                  | j                   j                  «      }t        |d«      }d| j                   j                  j                  | j                   j                  j
                  dœ}| j                   j                  | j                   j                  «      r| j                   j                  «       |d<   ddi}| j                   j                  ||«      \  }}t!        j"                  d	|||¬
«      S ­w)zBuild token refresh request.zNo refresh token availablezNo client info availablerç   r‡   )rî   r‡   rž   r�   rï   rð   rñ   rò   )r´   rt   r‡   r   rc   rž   rq   rè   rR   r|   rh   r   r“   rs   r‘   r¨   rô   rõ   )rZ   ré   rá   Úrefresh_datar•   s        r=   Ú_refresh_tokenz"OAuthClientProvider._refresh_token¨  sc  è ø€ à�|‰|×*Ò*°$·,±,×2MÑ2M×2[Ò2[Ü!Ð">Ó?Ð?à�|‰|×'Ò'¨t¯|©|×/GÑ/G×/QÒ/QÜ!Ð"<Ó=Ð=à�<‰<×&Ò&¨4¯<©<×+FÑ+F×+UÒ+UÜ˜DŸL™L×7Ñ7×FÑFÓG‰Ià ŸL™L×CÑCÀDÇLÁL×D[ÑD[Ó\ˆMÜ ¨xÓ8ˆIð *Ø!Ÿ\™\×8Ñ8×FÑFØŸ™×1Ñ1×;Ñ;ñ(
ˆð �<‰<×5Ñ5°d·l±l×6SÑ6SÔTØ'+§|¡|×'DÑ'DÓ'FˆL˜Ñ$ð "Ð#FÐGˆØ $§¡× ?Ñ ?ÀÈgÓ VÑˆ�gä�}‰}˜V Y°\È7ÔSÐSùs   ‚G(G*c              ƒ   ó6  K  — |j                   dk7  r=t        j                  d|j                   › �«       | j                  j	                  «        y	 |j                  «       ƒ d{  –—† }t        j                  |«      }|| j                  _        | j                  j                  |«       | j                  j                  j                  |«      ƒ d{  –—†  y7 Œs7 Œ# t        $ r2 t        j                  d«       | j                  j	                  «        Y yw xY w­w)z:Handle token refresh response. Returns True if successful.r½   zToken refresh failed: FNTzInvalid refresh response)r¾   rÂ   rÃ   r´   rŠ   r¿   r&   rÀ   rt   r€   rj   r`   r   Ú	exception)rZ   r»   rÈ   rù   s       r=   Ú_handle_refresh_responsez,OAuthClientProvider._handle_refresh_responseÆ  sã   è ø€ à×Ñ 3Ò&Ü�N‰NÐ3°H×4HÑ4HÐ3IÐJÔKØ�L‰L×%Ñ%Ô'Øð	Ø$ŸN™NÓ,×,ˆGÜ'×;Ñ;¸GÓDˆNà*8ˆD�L‰LÔ'Ø�L‰L×,Ñ,¨^Ô<Ø—,‘,×&Ñ&×1Ñ1°.ÓA×AÐAàð -øð
 Bùô ò 	Ü×ÑÐ7Ô8Ø�L‰L×%Ñ%Ô'Ùð	üsO   ‚ADÁC Á#CÁ$A-C ÃCÃC ÃDÃC ÃC Ã8DÄDÄDÄDc              ƒ   ó  K  — | j                   j                  j                  «       ƒ d{  –—† | j                   _        | j                   j                  j	                  «       ƒ d{  –—† | j                   _        d| _        y7 ŒV7 Œ­w)z#Load stored tokens and client info.NT)r´   rj   r[   rt   rb   rc   rµ   rY   s    r=   Ú_initializezOAuthClientProvider._initializeÛ  s\   è ø€ à,0¯L©L×,@Ñ,@×,KÑ,KÓ,M×&Mˆ�‰Ô#Ø)-¯©×)=Ñ)=×)MÑ)MÓ)O×#Oˆ�‰Ô Ø ˆÕð 'NøØ#Oús!   ‚(BªB«:BÁ%BÁ&BÂBrÄ   c                 óÔ   — | j                   j                  rR| j                   j                  j                  r1d| j                   j                  j                  › �|j                  d<   yyy)z<Add authorization header to request if we have valid tokens.zBearer rš   N)r´   rt   rƒ   r•   )rZ   rÄ   s     r=   Ú_add_auth_headerz$OAuthClientProvider._add_auth_headerá  sP   € à�<‰<×&Ò&¨4¯<©<×+FÑ+F×+SÒ+SØ18¸¿¹×9TÑ9T×9aÑ9aÐ8bÐ/cˆG�O‰O˜OÒ,ð ,TÐ&rL   c              ƒ   óŒ   K  — |j                  «       ƒ d {  –—† }t        j                  |«      }|| j                  _        y 7 Œ+­wrª   )r¿   r%   rÀ   r´   rq   rÇ   s       r=   Ú_handle_oauth_metadata_responsez3OAuthClientProvider._handle_oauth_metadata_responseæ  s6   è ø€ Ø Ÿ™Ó(×(ˆÜ ×4Ñ4°WÓ=ˆØ&.ˆ�‰Õ#ð )ús   ‚A–A—,Ac                óR  K  — | j                   j                  4 ƒd{  –—†  | j                  s| j                  «       ƒ d{  –—†  |j                  j                  t        «      | j                   _        | j                   j                  «       sW| j                   j                  «       r=| j                  «       ƒ d{  –—† }|­–—}| j                  |«      ƒ d{  –—† sd| _        | j                   j                  «       r| j                  |«       |­–—}|j                  dk(  �rÀ	 t        |«      }t        || j                   j                   «      }|D ]¬  }t#        |«      }|­–—}	t%        |	«      ƒ d{  –—† }
|
rm| j'                  |
«      ƒ d{  –—†  |
| j                   _        t+        |
j,                  «      dkD  sJ ‚t/        |
j,                  d   «      | j                   _         nt2        j5                  d|› �«       Œ® t7        | j                   j0                  | j                   j                   «      }|D ][  }t#        |«      }|­–—}t9        |«      ƒ d{  –—† \  }}|s n1|r|r|| j                   _         nt2        j5                  d|› �«       Œ] t=        t?        |«      | j                   j(                  | j                   j:                  «      | j                   j@                  _!        | j                   jD                  �s–tG        | j                   j:                  | j                   jH                  «      rªt2        j5                  d| j                   jH                  › �«       tK        | j                   jH                  | j                   j@                  jL                  ¬«      }|| j                   _"        | j                   jN                  jQ                  |«      ƒ d{  –—†  n¸tS        | j                   j:                  | j                   j@                  | j                   jU                  | j                   j                   «      «      }|­–—}tW        |«      ƒ d{  –—† }|| j                   _"        | j                   jN                  jQ                  |«      ƒ d{  –—†  | jY                  «       ƒ d{  –—† ­–—}| j[                  |«      ƒ d{  –—†  | j                  |«       |­–— n­|j                  d
k(  ržta        |d«      }|dk(  rw	 t=        t?        |«      | j                   j(                  «      | j                   j@                  _!        | jY                  «       ƒ d{  –—† ­–—}| j[                  |«      ƒ d{  –—†  | j                  |«       |­–— ddd«      ƒd{  –—†  y7 �Œ†7 �Œe7 �Œî7 �ŒÓ7 �Œ;7 �Œ#7 �Œ\7 �ŒÜ7 �Œd7 �Œ)7 �Œ7 Œú# t\        $ r t2        j_                  d	«       ‚ w xY w7 Œ�7 Œs# t\        $ r t2        j_                  d	«       ‚ w xY w7 Œr# 1 ƒd{  –—†7  sw Y   yxY w­w)zHTTPX auth flow integration.NFi‘  r   z.Protected resource metadata discovery failed: z!OAuth metadata discovery failed: z"Using URL-based client ID (CIMD): )rÜ   zOAuth flow errori“  ÚerrorÚinsufficient_scope)1r´   rw   rµ   r  r•   Úgetr"   rs   r…   rˆ   rý   r   r  r¾   r   r   rh   r   r   rº   rp   ÚlenrÁ   rR   rr   rÂ   rÆ   r   r   rq   r   r   ri   rÚ   rc   r!   ro   r   rÜ   rj   re   r   r|   r   rÐ   rú   Ú	Exceptionrÿ   r   )rZ   rÄ   Úrefresh_requestÚrefresh_responser»   Úwww_auth_resource_metadata_urlÚprm_discovery_urlsrÅ   Údiscovery_requestÚdiscovery_responser·   Úasm_discovery_urlsÚoauth_metadata_requestÚoauth_metadata_responseÚokÚasmÚclient_informationÚregistration_requestÚregistration_responserù   r  s                        r=   Úasync_auth_flowz#OAuthClientProvider.async_auth_flowë  sJ  è ø€ à—<‘<×$Ñ$÷ F	ñ F	Ø×$Ò$Ø×&Ñ&Ó(×(Ð(ð -4¯O©O×,?Ñ,?Ô@TÓ,UˆD�L‰LÔ)à—<‘<×.Ñ.Ô0°T·\±\×5SÑ5SÔ5Uà(,×(;Ñ(;Ó(=×"=�Ø)8Ò#8Ð à!×:Ñ:Ð;KÓL×LÐLà(-�DÔ%à�|‰|×*Ñ*Ô,Ø×%Ñ% gÔ.à$’}ˆHà×#Ñ# sÓ*ðUä5\Ð]eÓ5fÐ2ô *ZØ6¸¿¹×8OÑ8Oó*Ð&ð  2ò a˜Ü,IÈ#Ó,NÐ)à3DÒ-DÐ*ä$FÐGYÓ$Z×Z˜Ùà"&×"?Ñ"?ÀÓ"D×DÐDØGJ˜DŸL™LÔDô !$ C×$=Ñ$=Ó >ÀÒ BðØ Bô <?¸s×?XÑ?XÐYZÑ?[Ó;\˜DŸL™LÔ8Ù!ä"ŸL™LÐ+YÐZ]ÐY^Ð)_Õ`ð'aô* *bØŸ™×4Ñ4°d·l±l×6MÑ6Mó*Ð&ð
  2ò T˜Ü1NÈsÓ1SÐ.Ø8NÒ2NÐ/ä(EÐF]Ó(^×"^™˜˜CÙ!Ù!Ù¡#Ø:=˜DŸL™LÔ7Ù!ä"ŸL™LÐ+LÈSÈEÐ)RÕSðTô :TÜ3°HÓ=ØŸ™×@Ñ@ØŸ™×3Ñ3ó:�D—L‘L×0Ñ0Ô6ð  Ÿ<™<×3Ó3Ü9Ø ŸL™L×7Ñ7¸¿¹×9YÑ9Yôô #ŸL™LÐ+MÈdÏlÉl×NnÑNnÐMoÐ)pÔqÜ1UØ $§¡× @Ñ @Ø.2¯l©l×.JÑ.J×.XÑ.Xô2Ð.ð 8J˜DŸL™LÔ4Ø"&§,¡,×"6Ñ"6×"FÑ"FÐGYÓ"Z×ZÑZô 4VØ $§¡× ;Ñ ;Ø $§¡× <Ñ <Ø $§¡× GÑ GÈÏÉ×H_ÑH_Ó `ó4Ð0ð
 ;OÒ4NÐ1Ü7SÐTiÓ7j×1jÐ.Ø7I˜DŸL™LÔ4Ø"&§,¡,×"6Ñ"6×"FÑ"FÐGYÓ"Z×ZÐZð 26×1LÑ1LÓ1N×+NÒ%N�NØ×5Ñ5°nÓE×EÐEð ×%Ñ% gÔ.Ø”Ø×%Ñ%¨Ò,ä3°H¸gÓF�ð Ð0Ò0ðä=WÜ7¸ÓAÀ4Ç<Á<×CkÑCkó>˜Ÿ™×4Ñ4Ô:ð
 6:×5PÑ5PÓ5R×/RÒ)R˜Ø"×9Ñ9¸.ÓI×IÐIð ×%Ñ% gÔ.Ø“÷MF	÷ F	ñ F	ùà(ùð #>ùð Mùð2 [ùð Eùð, #_ùð8 [ùð 2kùàZùð ,OùØEùÜ ò Ü×$Ñ$Ð%7Ô8Øðúð( 0SøØIùÜ$ò Ü×(Ñ(Ð);Ô<ØðúðAF	ø÷ F	÷ F	ñ F	üse  ‚X'�V#žX'¡ XÁV&ÁA9XÂ;V)Â<XÃV,ÃAXÄ&AWÅ4V/Å5WÆV2ÆC	WÉV5ÉFWÏV8ÏA:WÑV;Ñ=WÒV>ÒWÒ-WÒ.WÓ	WÓ
WÓ7XÔAW-ÕW)ÕW-Õ7W+Õ8W-Õ<XÖX'ÖXÖX'Ö&XÖ)XÖ,XÖ/WÖ2WÖ5WÖ8WÖ;WÖ>W×W×W× W&×&X×)W-×+W-×- XØXØX'ØX$ØXØX$Ø X')NNrm   Nr©   )"rN   rO   rP   rQ   Úrequires_response_bodyrR   r$   rW   r   r   r«   r¬   r¶   r'   rº   rô   ÚResponser‚   rÊ   rõ   rÐ   rÌ   rê   r¯   r   rÍ   rú   rý   r   r  r  r  r   r  rU   rL   r=   r±   r±   Ù   sî  „ ñð
 "Ðð EIØSWØØ*.ñ+"àð+"ð -ð+"ð ð	+"ð
 # C 5¨)°D©/Ð#9Ñ:¸TÑAð+"ð # 2 y°°s¸CÀ$¹J°Ñ1GÑ'HÐ#HÑIÈDÑPð+"ð ð+"ð ! 4™Zó+"ðZrÐ2Kð rÐPTó rðÀ%Ç.Á.ð ÐUYó ð@¨e¯m©mó ð34¸¸sÀC¸x¹ó 34ðj Só ð Z\òRØðRØ-0ðRØAEÀcÈ3ÀhÁÐRVÑAVðRà	�‰óRð>>°U·^±^ð >Èó >ðT e§m¡mó Tð<°u·~±~ð È$ó ó*!ðd¨¯©ð d¸$ó dð
/¸e¿n¹nð /ÐQUó /ð
H¨U¯]©]ð H¸~ÈeÏmÉmÐ]b×]kÑ]kÐNkÑ?lô HrL   r±   )CrQ   rF   rB   Úloggingr6   r8   r„   Úcollections.abcr   r   r   Údataclassesr   r   Útypingr   r	   Úurllib.parser
   r   r   r   r­   rô   Úpydanticr   r   r   Úmcp.client.auth.exceptionsr   r   Úmcp.client.auth.utilsr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   Úmcp.client.streamable_httpr"   Úmcp.shared.authr#   r$   r%   r&   r'   Úmcp.shared.auth_utilsr(   r)   r*   Ú	getLoggerrN   rÂ   r,   rW   rg   ÚAuthr±   rU   rL   r=   ú<module>r+     sÎ   ðñó Û Û Û Û Û ß ?Ñ ?ß (ß  ß <Ó <ã Û ß 6Ñ 6ç F÷÷ ÷ ÷ ñ õ" <÷õ ÷ñ ð 
ˆ×	Ñ	˜8Ó	$€ôO�Yô Oô�8ô ð( ÷yð yó ðyôxZ˜%Ÿ*™*õ ZrL   