Ë
    Âj•6  ã                  óh  — U d dl mZ d dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlmZ d dl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 d	d
lmZ e› de› �ZdZdZdZdd„Z dd„Z!ddœdd„Z"g d¢Z# ejH                  e%«      Z&de'd<    G d„ de«      Z( G d„ d«      Z)dddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Z*y) é    )ÚannotationsN)ÚTracebackType)ÚAnyÚDictÚTypeÚOptional)Úoverrideé   )ÚAccessTokenÚIdentityTokenProvider)ÚTOKEN_ENDPOINTÚDEFAULT_BASE_URLÚGRANT_TYPE_JWT_BEARERÚOAUTH_API_BETA_HEADERÚFEDERATION_BETA_HEADERÚTOKEN_EXCHANGE_TIMEOUTÚ_user_agentÚ_require_httpsé   )ÚAnthropicErrorÚ,é   i @  i   c                óv   — | j                   j                  d«      xs | j                   j                  d«      }|S )Nz
Request-Idz
request-id)ÚheadersÚget)ÚrespÚrids     úV/var/www/html/venv/lib/python3.12/site-packages/anthropic/lib/credentials/_workload.pyÚ_request_idr   ,   s/   € ØŸ™×)Ñ)¨,Ó7ÒY¸4¿<¹<×;KÑ;KÈLÓ;Y€CØ€Jó    c                óâ   — | €yt        | t        «      r4t        | «      t        k  r| S | dt         dt        | «      t        z
  › d�z   S t        | t        «      ri }dD ]  }|| v sŒ| |   ||<   Œ |S y)zHTruncate a token-endpoint error body for safe inclusion in an exception.Nz... <z more chars>)ÚerrorÚerror_descriptionÚ	error_uri)Ú
isinstanceÚstrÚlenÚ_MAX_ERROR_BODY_CHARSÚdict)ÚbodyÚkeptÚkeys      r   Ú_redact_bodyr-   1   s†   € à€|ØÜ�$œÔÜˆt‹9Ô-Ò-ØˆKØÐ*Ô*Ð+°´c¸$³iÔBWÑ6WÐ5XÐXdÐ.eÑeÐeä�$œÔØ!ˆÛ>ˆCØ�dŠ{Ø  ™I��S’	ð ?ð ˆØr    )Úhintc               óî   — 	 | j                  «       }t        |«      }|› d| j                  › d|› �}|r|› d|› �}t        || j                  |t        | «      ¬«      ‚# t        $ r | j                  }Y Œaw xY w)uÆ  Raise a redacted :class:`WorkloadIdentityError` from a non-200 token-endpoint response.

    Shared between the jwt-bearer exchange path in this module and the
    refresh_token grant path in :mod:`_providers`.

    ``hint`` is an optional caller-supplied diagnostic appended verbatim to the
    error message (after the redacted body). Callers gate it on the response
    status and their own state â€” this helper does not inspect ``resp`` for it.
    z (HTTP ú): Ú ©Ústatus_coder*   Ú
request_id)ÚjsonÚ
ValueErrorÚtextr-   r3   ÚWorkloadIdentityErrorr   )r   Úmessage_prefixr.   ÚpayloadÚredactedÚmessages         r   Ú_raise_token_endpoint_errorr=   C   s�   € ðØ—y‘y“{ˆô ˜GÓ$€HØÐ  ¨×(8Ñ(8Ð'9¸¸X¸JÐG€GÙØ�I˜Q˜t˜fÐ%ˆÜ
ØØ×$Ñ$ØÜ˜tÓ$ô	ð øô ò Ø—)‘)Šðús   ‚A ÁA4Á3A4)ÚWorkloadIdentityCredentialsr8   Úexchange_federation_assertionzlogging.LoggerÚlogc                  óv   ‡ — e Zd ZU dZded<   ded<   ded<   dddd	œ	 	 	 	 	 	 	 	 	 dˆ fd
„Zedˆ fd„«       Zˆ xZS )r8   zERaised when the OIDC token exchange (``POST /v1/oauth/token``) fails.úOptional[int]r3   r   r*   úOptional[str]r4   Nr2   c               óN   •— t         ‰| �  |«       || _        || _        || _        y ©N)ÚsuperÚ__init__r3   r*   r4   )Úselfr<   r3   r*   r4   Ú	__class__s        €r   rG   zWorkloadIdentityError.__init__i   s(   ø€ ô 	‰Ñ˜Ô!Ø&ˆÔØˆŒ	Ø$ˆ�r    c                ó`   •— t         ‰| �  «       }| j                  r|› d| j                  › d�S |S )Nz [request_id=Ú])rF   Ú__str__r4   )rH   ÚbaserI   s     €r   rL   zWorkloadIdentityError.__str__v   s3   ø€ ä‰w‰Ó ˆØ�?Š?Ø�V˜=¨¯©Ð(9¸Ð;Ð;Øˆr    )
r<   r&   r3   rB   r*   r   r4   rC   ÚreturnÚNone©rN   r&   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__rG   r	   rL   Ú__classcell__)rI   s   @r   r8   r8   b   sk   ø… ÙOàÓØ
ƒIØÓð &*ØØ$(ñ%àð%ð #ð	%ð
 ð%ð "ð%ð 
õ%ð ôó ôr    r8   c                  ó¤   — e Zd ZdZdddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zedd„«       Zedd„«       Zdd„Zdd„Z	dd	„Z
	 	 	 	 	 	 	 	 dd
„Zddœdd„Zy)r>   uÏ  Exchanges an external OIDC JWT for an Anthropic access token via the
    RFC 7523 ``jwt-bearer`` grant.

    This is an :class:`AccessTokenProvider`: calling it performs a *fresh* token
    exchange. Wrap in a :class:`TokenCache` (done automatically when passed as
    ``credentials=`` to :class:`anthropic.Anthropic`) to avoid exchanging on every
    request.

    Args:
        organization_id: The organization's raw UUID string (organizations do
            not use tagged IDs).
        workspace_id: Optional ``wrkspc_*`` tagged ID, or the literal
            ``"default"`` to scope the token to the organization's default
            workspace. When omitted the server picks the rule's sole enabled
            workspace, else the org default if the rule covers it. Required
            when the rule enables more than one non-default workspace, or to
            target a specific workspace other than the one the server would
            pick. The minted token is workspace-scoped: per-request workspace
            selection (the ``anthropic-workspace-id`` header) is not supported
            for federation tokens â€” switching workspaces requires a new token
            exchange with a different ``workspace_id``.
    N)Úservice_account_idÚworkspace_idÚscopeÚhttp_clientc               óÔ   — || _         || _        || _        || _        || _        || _        d | _        |€'t        j                  t        ¬«      | _
        d| _        y || _
        d| _        y )N)ÚtimeoutTF)Ú_identity_token_providerÚ_federation_rule_idÚ_organization_idÚ_service_account_idÚ_workspace_idÚ_scopeÚ_bound_base_urlÚhttpxÚClientr   Ú_http_clientÚ_owns_http_client)rH   Úidentity_token_providerÚfederation_rule_idÚorganization_idrX   rY   rZ   r[   s           r   rG   z$WorkloadIdentityCredentials.__init__–   sp   € ð )@ˆÔ%Ø#5ˆÔ Ø /ˆÔØ#5ˆÔ Ø)ˆÔð
 ˆŒð /3ˆÔØÐÜ %§¡Ô5KÔ LˆDÔØ%)ˆDÕ"à +ˆDÔØ%*ˆDÕ"r    c                ó   — | j                   S rE   )rc   ©rH   s    r   rZ   z!WorkloadIdentityCredentials.scope¹   s   € à�{‰{Ðr    c                ó*   — | j                   xs t        S rE   )rd   r   rm   s    r   Ú	_base_urlz%WorkloadIdentityCredentials._base_url½   s   € à×#Ñ#Ò7Ô'7Ð7r    c                óN   — |j                  d«      }t        |d¬«       || _        y)a  Set the API ``base_url`` the token exchange POSTs to.

        Called by :class:`anthropic.Anthropic` when this object is passed as
        ``credentials=``, so callers don't pass the same URL twice. For
        standalone use (no client) or tests, call this directly.
        Ú/Úbase_url)ÚfieldN)Úrstripr   rd   )rH   rr   Úbounds      r   Úbind_base_urlz)WorkloadIdentityCredentials.bind_base_urlÁ   s$   € ð —‘ Ó$ˆÜ�u JÕ/Ø$ˆÕr    c                óR   — | j                   r| j                  j                  «        yy)z7Close the underlying ``httpx.Client`` if we created it.N)rh   rg   Úcloserm   s    r   rx   z!WorkloadIdentityCredentials.closeÌ   s"   € à×!Ò!Ø×Ñ×#Ñ#Õ%ð "r    c                ó   — | S rE   © rm   s    r   Ú	__enter__z%WorkloadIdentityCredentials.__enter__Ñ   s   € Øˆr    c                ó$   — | j                  «        y rE   )rx   )rH   Úexc_typeÚexcÚtbs       r   Ú__exit__z$WorkloadIdentityCredentials.__exit__Ô   s   € ð 	�
‰
�r    F)Úforce_refreshc               óú  — ~| j                  «       }t        |j                  d«      «      t        kD  r.t	        dt        |j                  d«      «      › dt        › d�«      ‚t
        || j                  | j                  dœ}| j                  �| j                  |d<   | j                  �| j                  |d<   | j                  › t        › �}	 | j                  j                  ||t        dt        «       d	œ¬
«      }t%        |«      }t        |j&                  «      t(        kD  r6t	        dt(        › dt        |j&                  «      › d�|j*                  |¬«      ‚|j*                  dk\  r7d }|j*                  dk(  rd}| j                  €|dz  }|dz  }t-        |d|¬«       	 |j/                  «       }	|	j7                  d«      }|�Bt9        |«      j;                  «       dk7  r&t	        d|›d�|j*                  t3        |	«      |¬«      ‚	 |	d   }t=        |	d    «      }tC        |t=        tE        jD                  «       «      |z   ¬"«      S # t         j"                  $ r}t	        d|› d|› �«      |‚d }~ww xY w# t0        $ rD}t3        |j4                  «      }
t	        d|j*                  › d|
› �|j*                  |
|¬«      |‚d }~ww xY w# t>        t@        t0        f$ r(}t	        d!|j*                  t3        |	«      |¬«      |‚d }~ww xY w)#Nzutf-8zIdentity token assertion is z bytes, which exceeds the uˆ   -byte limit. This is almost certainly not a JWT â€” check that the identity-token path points at the projected token, not a key or cert.)Ú
grant_typeÚ	assertionrj   rk   rX   rY   zapplication/json)zanthropic-betazContent-Typez
User-Agent)r5   r   zFailed to reach token endpoint z: z%Token endpoint response body exceeds z bytes (got z); refusing to parse.)r3   r4   i�  i‘  z9Ensure your federation rule matches your identity token. z­If your federation rule is scoped to multiple workspaces, set the ANTHROPIC_WORKSPACE_ID environment variable, the 'workspace_id' config key, or the workspace_id= argument. zaView your authentication events in the Workload identity page of Claude Console for more details.zToken exchange failed)r9   r.   z2Token endpoint returned non-JSON response (status r0   r2   Ú
token_typeÚbearerz/Token endpoint returned unsupported token_type z (expected 'Bearer').Úaccess_tokenÚ
expires_inzLToken endpoint response missing required fields (access_token / expires_in).)ÚtokenÚ
expires_at)#r^   r'   ÚencodeÚ_MAX_ASSERTION_BYTESr8   r   r_   r`   ra   rb   ro   r   rg   ÚpostÚ_JWT_BEARER_BETA_HEADERr   re   Ú	HTTPErrorr   ÚcontentÚ_MAX_TOKEN_RESPONSE_BYTESr3   r=   r5   r6   r-   r7   r   r&   ÚlowerÚintÚKeyErrorÚ	TypeErrorr   Útime)rH   r�   Újwtr*   Úurlr   Úerrr4   r.   Údatar;   r…   r‰   rˆ   s                 r   Ú__call__z$WorkloadIdentityCredentials.__call__Ü   sB  € ð Ø×+Ñ+Ó-ˆäˆs�z‰z˜'Ó"Ó#Ô&:Ò:Ü'Ø.¬s°3·:±:¸gÓ3FÓ/GÐ.HÐHbÜ'Ð(ð )aðbóð ô 0ØØ"&×":Ñ":Ø#×4Ñ4ñ	 
ˆð ×#Ñ#Ð/Ø)-×)AÑ)AˆDÐ%Ñ&Ø×ÑÐ)Ø#'×#5Ñ#5ˆD�Ñ à—‘Ð ¤Ð 0Ð1ˆð	aØ×$Ñ$×)Ñ)ØØä&=Ø$6Ü"-£-ñð *ó ˆDô ! Ó&ˆ
äˆt�|‰|ÓÔ8Ò8Ü'Ø7Ô8QÐ7Rð SÜ˜DŸL™LÓ)Ð*Ð*?ðAà ×,Ñ,Ø%ô	ð ð ×Ñ˜sÒ"ð
 #'ˆDØ×Ñ 3Ò&ØR�Ø×%Ñ%Ð-ØðFñ�Dð
 Ð{Ñ{�Ü'¨Ð=TÐ[_Õ`ð		Ø—9‘9“;ˆDð —X‘X˜lÓ+ˆ
ØÐ!¤c¨*£o×&;Ñ&;Ó&=ÀÒ&IÜ'ØAÀ*ÀÐOdÐeØ ×,Ñ,Ü! $Ó'Ø%ô	ð ð
	Ø˜Ñ(ˆEä˜T ,Ñ/Ó0ˆJô  ´3´t·y±y³{Ó3CÀjÑ3PÔQÐQøô} �‰ò 	aÜ'Ð*IÈ#ÈÈbÐQTÐPUÐ(VÓWÐ]`Ð`ûð	aûô@ ò 	Ü# D§I¡IÓ.ˆHÜ'ØDÀT×EUÑEUÐDVÐVYÐZbÐYcÐdØ ×,Ñ,ØØ%ô	ð
 ðûð	ûô, œ)¤ZÐ0ò 	Ü'Ø^Ø ×,Ñ,Ü! $Ó'Ø%ô	ð
 ðûð	úsH   Ã.I ÆI. ÈJ> ÉI+ÉI&É&I+É.	J;É7?J6Ê6J;Ê>K:Ë#K5Ë5K:)ri   r   rj   r&   rk   r&   rX   rC   rY   rC   rZ   rC   r[   úOptional[httpx.Client]rN   rO   )rN   rC   rP   )rr   r&   rN   rO   )rN   rO   )rN   z'WorkloadIdentityCredentials')r}   zOptional[Type[BaseException]]r~   zOptional[BaseException]r   zOptional[TracebackType]rN   rO   )r�   ÚboolrN   r   )rQ   rR   rS   rT   rG   ÚpropertyrZ   ro   rv   rx   r{   r€   r›   rz   r    r   r>   r>   ~   sÙ   „ ñð: -1Ø&*Ø#Ø.2ñ!+ð "7ð!+ð  ð	!+ð
 ð!+ð *ð!+ð $ð!+ð ð!+ð ,ð!+ð 
ó!+ðF òó ðð ò8ó ð8ó	%ó&ó
ðà/ðð %ðð $ð	ð
 
óð 16ö bRr    r>   )rX   rY   rr   r[   c                ó¬   ‡ — t        ˆ fd„|||||¬«      }|�|j                  |«       	  |«       |j                  «        S # |j                  «        w xY w)aS  Perform a single RFC 7523 ``jwt-bearer`` exchange and return the resulting
    :class:`AccessToken`.

    This is a one-shot convenience wrapper around :class:`WorkloadIdentityCredentials`
    for callers that already have the assertion JWT in hand and just want the
    Anthropic access token back (no caching, no provider plumbing).
    c                 ó   •— ‰ S rE   rz   )r„   s   €r   Ú<lambda>z/exchange_federation_assertion.<locals>.<lambda>S  s   ø€ ©	r    )ri   rj   rk   rX   rY   r[   )r>   rv   rx   )r„   rj   rk   rX   rY   rr   r[   Úcredss   `       r   r?   r?   A  sT   ø€ ô" (Û 1Ø-Ø'Ø-Ø!Øô€Eð ÐØ×Ñ˜HÔ%ðÙ‹wà�‰�øˆ�‰�ús   ªA ÁA)r   úhttpx.ResponserN   rC   )r*   r   rN   r   )r   r£   r9   r&   r.   rC   rN   rO   )r„   r&   rj   r&   rk   r&   rX   rC   rY   rC   rr   rC   r[   rœ   rN   r   )+Ú
__future__r   r–   ÚloggingÚtypesr   Útypingr   r   r   r   Útyping_extensionsr	   re   Ú_typesr   r   Ú
_constantsr   r   r   r   r   r   r   r   Ú_exceptionsr   rŽ   r(   rŒ   r‘   r   r-   r=   Ú__all__Ú	getLoggerrQ   r@   rU   r8   r>   r?   rz   r    r   Ú<module>r®      s  ðÞ "ã Û Ý ß ,Ó ,Ý &ã ç 6÷	÷ 	ó 	õ *ð
 3Ð3°1Ð5KÐ4LÐMÐ ð Ð ð !Ð Ø#Ð óó
ð$ eiõ ò4 d€à'�g×'Ñ'¨Ó1€€^Ó 1ô˜Nô ÷8@Rñ @RðP )-Ø"&Ø"Ø*.ñàðð ðð ð	ð
 &ðð  ðð ðð (ðð ôr    