Ë
    uPêjã>  ã                   ó  — U 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 d dlZd dlm	Z	m
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  e«       Zeed	<   d
Zeed<    G d„ de	«      Zdededefd„ZdZeed<   dee   fd„Zdedefd„Z d$dejB                  dz  defd„Z"dedz  de#dz  fd„Z$	 d$dedee#z  dz  dedz  fd„Z%dedz  dedz  fd„Z&	 d$dede#dz  de#dz  fd „Z'	 d$dedee#z  dz  fd!„Z(dede#fd"„Z)de#fd#„Z*y)%é    N)ÚFinal)Ú	BaseModelÚValidationError)Úverbose_logger)Ú	DualCache)ÚHTTPHandler)Úget_azure_ad_token_provider)Úget_secret_from_managerÚ
oidc_cacheé<   Ú!_OIDC_TOKEN_EXPIRY_MARGIN_SECONDSc                   ó"   — e Zd ZU dZedz  ed<   y)Ú_OidcTokenClaimsNÚexp)Ú__name__Ú
__module__Ú__qualname__r   ÚfloatÚ__annotations__© ó    úa/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/secret_managers/main.pyr   r      s   … Ø€Cˆ�‰Ôr   r   Ú
oidc_tokenÚmax_ttlÚreturnc                 óª  — | j                  d«      }t        |«      dk7  r|S |d   }	 t        j                  |dt        |«       dz  z  z   «      }t        j                  |«      }|j                  €|S t        |j                  «      }t        ||t        t        j                  «       «      z
  t        z
  «      S # t        t        t        f$ r |cY S w xY w)zÞCache TTL for a fetched OIDC token: ``max_ttl``, capped so the cache entry
    never outlives the token's own ``exp`` claim (minus a safety margin).
    Falls back to ``max_ttl`` when the token carries no readable ``exp``.ú.é   é   ú=é   )ÚsplitÚlenÚbase64Úurlsafe_b64decoder   Úmodel_validate_jsonr   ÚintÚ
ValueErrorÚOverflowErrorr   ÚminÚtimer   )r   r   ÚsegmentsÚpayloadÚdecodedÚclaimsr   s          r   Ú_oidc_token_cache_ttlr0      sÇ   € ð !×&Ñ& sÓ+€HÜ
ˆ8ƒ}˜ÒØˆØ˜a‘[€GðÜ×1Ñ1°'¸CÄCÈÃLÀ=ÐSTÑCTÑ<UÑ2UÓVˆÜ(×<Ñ<¸WÓEˆØ�:‰:ÐØˆNÜ˜Ÿ™“_ˆô ˆw˜œc¤$§)¡)£+Ó.Ñ.Ô1RÑRÓSÐSøô œ¤Ð7ò ØŠðús   ¨A
B9 Á3B9 Â9CÃC)z/var/run/secretsz/run/secretsÚ%_DEFAULT_OIDC_ALLOWED_CREDENTIAL_DIRSc                  ó8  — t        j                  d«      } | r>| j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% c}nt	        t
        «      }|D �cg c]!  }t         j                  j                  |«      ‘Œ# c}S c c}w c c}w )aI  
    Return the absolute, normalized list of directories from which
    ``oidc/file/`` is permitted to read token files.

    Defaults to standard container credential mount points. Operators can
    override via the ``LITELLM_OIDC_ALLOWED_CREDENTIAL_DIRS`` environment
    variable (comma-separated list of absolute paths).
    Ú$LITELLM_OIDC_ALLOWED_CREDENTIAL_DIRSú,)ÚosÚgetenvr"   ÚstripÚlistr1   ÚpathÚrealpath)ÚoverrideÚdÚraw_dirss      r   Ú!_get_oidc_allowed_credential_dirsr>   4   sy   € ô —i‘iÐ FÓG€Hñ ð %ŸN™N¨3Ó/Ö=�q°1·7±7µ9ˆ�‰�Ó=äÔ7Ó8ð ð
 *2Ö2 AŒB�G‰G×Ñ˜QÕÒ2Ð2ùò	 	>ùò 3s   «BÁBÁ)&BÚrequested_pathc                 ó8  — t         j                  j                  | «      st        d«      ‚t         j                  j	                  | «      }t        «       D ]+  }	 t         j                  j                  ||g«      |k(  r|c S Œ- t        d«      ‚# t        $ r Y ŒDw xY w)z�
    Resolve ``requested_path`` and verify it falls within one of the allowed
    credential directories. Raises ``ValueError`` otherwise.
    z€oidc/file path must be absolute. Use the format 'oidc/file//var/run/secrets/<name>' (note the leading slash after 'oidc/file/').zoidc/file path is outside the allowed credential directories. Set LITELLM_OIDC_ALLOWED_CREDENTIAL_DIRS to extend the allowlist.)r5   r9   Úisabsr(   r:   r>   Ú
commonpath)r?   ÚresolvedÚalloweds      r   Ú_resolve_oidc_file_pathrE   F   s¥   € ô
 �7‰7�=‰=˜Ô(Üð#ó
ð 	
ô
 —g‘g×&Ñ& ~Ó6€HÜ4Ó6ò ˆð	Ü�w‰w×!Ñ! 8¨WÐ"5Ó6¸'ÒAØ’ð Bðô ð	Lóð øô	 ò 	ñ ð	ús   Á%BÂ	BÂBÚtimeoutc                 óL   — | €t        j                  dd¬«      } t        | ¬«      S )a*  
    Factory function to create HTTPHandler for OIDC requests.
    This function can be mocked in tests.

    Args:
        timeout: Optional timeout for HTTP requests. Defaults to 600.0 seconds with 5.0 connect timeout.

    Returns:
        HTTPHandler instance configured for OIDC requests.
    g     À‚@g      @)rF   Úconnect©rF   )ÚhttpxÚTimeoutr   rI   s    r   Ú_get_oidc_http_handlerrL   `   s$   € ð €Ü—-‘-¨°sÔ;ˆÜ˜wÔ'Ð'r   Úvaluec                 óf   — | €ydh}dh}| j                  «       j                  «       }||v ry||v ryy)a  
    Converts a string to a boolean if it's a recognized boolean string.
    Returns None if the string is not a recognized boolean value.

    :param value: The string to be checked.
    :return: True or False if the string is a recognized boolean, otherwise None.
    NÚtrueÚfalseTF)r7   Úlower)rM   Útrue_valuesÚfalse_valuesÚvalue_lowers       r   Ústr_to_boolrU   s   sG   € ð €}Øà ˜€KØ"˜)€LàŸ™›×,Ñ,Ó.€Kà�kÑ!ØØ	˜Ñ	$Øàr   Úsecret_nameÚdefault_valuec                 óF   — t        | |¬«      }|�t        |t        «      sy|S )zi
    Guarantees response from 'get_secret' is either string or none. Used for fixing linting errors.
    )rV   rW   N)Ú
get_secretÚ
isinstanceÚstr)rV   rW   rM   s      r   Úget_secret_strr\   ‹   s'   € ô ¨+À]ÔS€EØÐ¤¨E´3Ô!7Øà€Lr   Úvalc                 ó4   — | €y| j                  «       }|r|S dS )zË
    Strip whitespace and treat None, '', and whitespace-only strings as unset.

    Use when pairing secrets (mutual exclusion, optional auth) so whitespace-only
    values do not count as present.
    N)r7   )r]   Ústrippeds     r   Únormalize_nonempty_secret_strr`   ™   s$   € ð €{ØØ—i‘i“k€HÙˆ8Ð) TÐ)r   c                 óZ   — t        | |«      }|€yt        |t        «      r|S t        |«      S )aP  
    Guarantees response from 'get_secret' is either boolean or none. Used for fixing linting errors.

    Args:
        secret_name: The name of the secret to get.
        default_value: The default value to return if the secret is not found.

    Returns:
        The secret value as a boolean or None if the secret is not found.
    N)rY   rZ   ÚboolrU   )rV   rW   Ú_secret_values      r   Úget_secret_boolrd   ¦   s4   € ô & k°=ÓA€MØÐØÜ	�M¤4Ô	(ØÐä˜=Ó)Ð)r   c                 óø
  — t         j                  }t         j                  }d }| j                  d«      r| j	                  dd«      } | j                  d«      �r\| j	                  dd«      }|j                  dd«      \  }}dj                  |j                  d«      dd  «      }|dk(  rªt        j                  | ¬«      }|�|S t        «       }	|	j                  dd	|id
di¬«      }
|
j                  dk(  rT|
j                  }t        |d«      }|dkD  rt        j                  | ||¬«       |S t        j                   d| t"        «       |S t%        d«      ‚|dk(  r$t'        j(                  d«      }|€t%        d«      ‚|S |dk(  r$t'        j(                  d«      }|€t%        d«      ‚|S |dk(  rÍt'        j(                  d«      }t'        j(                  d«      }|�|€t%        d«      ‚t        j                  | ¬«      }|�|S t        «       }	|	j                  |d	|id|› �ddœ¬«      }
|
j                  dk(  r:|
j+                  «       j                  d d «      }t        j                  | |d!¬«       |S t%        d"«      ‚|d#k(  rwt'        j(                  d$«      }|€8t        j                   d%«       t-        |¬&«      }	  |«       }|€t%        d'«      ‚|S t3        |d)«      5 }|j5                  «       }|cd d d «       S |d*k(  r3t7        |«      }t3        |d)«      5 }|j5                  «       }|cd d d «       S |d+k(  r(t'        j(                  |«      }|€t%        d,|› d-�«      ‚|S |d.k(  rNt'        j(                  |«      }|€t%        d,|› d-�«      ‚t3        |d)«      5 }|j5                  «       }|cd d d «       S t%        d/«      ‚	 t9        «       r™t         j:                  �‰	 t         j:                  }d0}|�|j<                  }|�|j>                  �| |j>                  vrd0}tA        ||| |¬1«      }	 tG        |tH        «      r)tK        jL                  |«      }tG        |tN        «      r|S |S y t&        jP                  j                  | «      }|�tS        |«      nd }|�tG        |tN        «      r|S |S # t.        $ r*}d(|› �}t        j0                  |«       t%        |«      ‚d }~ww xY w# 1 sw Y   �Œ(xY w# 1 sw Y   �Œ5xY w# 1 sw Y   �ŒBxY w# t.        $ rJ}t        j0                  d2| |tC        jD                  «       «       t'        j(                  | «      }Y d }~�Œ*d }~ww xY w# t.        $ r |cY S w xY w# t.        $ r}|�|cY d }~S |‚d }~ww xY w)3Núos.environ/Ú zoidc/ú/r   Úgoogle)Úkeyz]http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identityÚaudiencezMetadata-FlavorÚGoogle)ÚparamsÚheaderséÈ   iÔ  r   )rj   rM   ÚttlzQGoogle OIDC token for %s is already expired or expires within %ss; not caching itzGoogle OIDC provider failedÚcircleciÚCIRCLE_OIDC_TOKENz*CIRCLE_OIDC_TOKEN not found in environmentÚcircleci_v2ÚCIRCLE_OIDC_TOKEN_V2z-CIRCLE_OIDC_TOKEN_V2 not found in environmentÚgithubÚACTIONS_ID_TOKEN_REQUEST_URLÚACTIONS_ID_TOKEN_REQUEST_TOKENzWACTIONS_ID_TOKEN_REQUEST_URL or ACTIONS_ID_TOKEN_REQUEST_TOKEN not found in environmentzBearer z!application/json; api-version=2.0)ÚAuthorizationÚAcceptrM   i'  zGithub OIDC provider failedÚazureÚAZURE_FEDERATED_TOKEN_FILEzTAZURE_FEDERATED_TOKEN_FILE not found in environment will use Azure AD token provider)Úazure_scopez'Azure OIDC provider returned None tokenzAzure OIDC provider failed: ÚrÚfileÚenvzEnvironment variable z
 not foundÚenv_pathzUnsupported OIDC providerÚlocal)ÚclientÚkey_managerrV   Úkey_management_settingszJDefaulting to os.environ value for key=%s. An exception occurred - %s.

%s)*ÚlitellmÚ_key_management_systemÚ_key_management_settingsÚ
startswithÚreplacer"   Újoinr   Ú	get_cacherL   ÚgetÚstatus_codeÚtextr0   Ú	set_cacher   Úwarningr   r(   r5   r6   Újsonr	   Ú	ExceptionÚerrorÚopenÚreadrE   Ú'_should_read_secret_from_secret_managerÚsecret_manager_clientrM   Úhosted_keysr
   Ú	tracebackÚ
format_excrZ   r[   ÚastÚliteral_evalrb   ÚenvironrU   )rV   rW   Úkey_management_systemr„   ÚsecretÚsecret_name_splitÚoidc_providerÚoidc_audr   Úoidc_clientÚresponserp   Ú
env_secretÚactions_id_token_request_urlÚactions_id_token_request_tokenÚazure_federated_token_fileÚazure_token_providerÚeÚ	error_msgÚfÚ	safe_pathÚtoken_file_pathr‚   rƒ   Úsecret_value_as_bools                            r   rY   rY   ½   sí  € ô $+×#AÑ#AÐÜ%,×%EÑ%EÐØ€Fà×Ñ˜mÔ,Ø!×)Ñ)¨-¸Ó<ˆð ×Ñ˜gÕ&Ø#.×#6Ñ#6°wÀÓ#CÐØ"3×"9Ñ"9¸#¸qÓ"AÑˆ�xØ—8‘8Ð-×3Ñ3°CÓ8¸¸Ð<Ó=ˆà˜HÒ$Ü#×-Ñ-°+Ð-Ó>ˆJØÐ%Ø!Ð!ä0Ó2ˆKà"—‘ØoØ" HÐ-Ø*¨HÐ5ð 'ó ˆHð
 ×#Ñ# sÒ*Ø%Ÿ]™]�
Ü2°:¸yÓI�Ø˜’7Ü×(Ñ(¨[À
ÐPSÐ(ÔTð "Ð!ô #×*Ñ*ØkØ#Ü9ôð
 "Ð!ä Ð!>Ó?Ð?Ø˜jÒ(äŸ™Ð#6Ó7ˆJØÐ!Ü Ð!MÓNÐNØÐØ˜mÒ+äŸ™Ð#9Ó:ˆJØÐ!Ü Ð!PÓQÐQØÐØ˜hÒ&ä24·)±)Ð<ZÓ2[Ð(Ü46·I±IÐ>^Ó4_Ð*Ø+Ð3Ð7UÐ7]Ü Ømóð ô $×-Ñ-°+Ð-Ó>ˆJØÐ%Ø!Ð!ä0Ó2ˆKØ"—‘Ø,Ø" HÐ-à'.Ð/MÐ.NÐ%OØAñð 'ó ˆHð ×#Ñ# sÒ*Ø%Ÿ]™]›_×0Ñ0°¸$Ó?�
Ü×$Ñ$¨¸JÈGÐ$ÔTØ!Ð!ä Ð!>Ó?Ð?Ø˜gÒ%ä02·	±	Ð:VÓ0WÐ&Ø)Ð1Ü×&Ñ&Øjôô /JÐV^Ô._Ð$ð0Ù!5Ó!7�JØ!Ð)Ü(Ð)RÓSÐSØ%Ð%ô
 Ð0°#Ó6ð "¸!ØŸV™V›X�
Ø!÷"ñ "ð ˜fÒ$ä6°xÓ@ˆIÜ�i Ó%ð "¨ØŸV™V›X�
Ø!÷"ñ "ð ˜eÒ#äŸ™ 8Ó,ˆJØÐ!Ü Ð#8¸¸
À*Ð!MÓNÐNØÐØ˜jÒ(ä%'§Y¡Y¨xÓ%8ˆOØÐ&Ü Ð#8¸¸
À*Ð!MÓNÐNÜ�o sÓ+ð "¨qØŸV™V›X�
Ø!÷"ñ "ô Ð8Ó9Ð9ð2Ü2Ô4¼×9VÑ9VÐ9bð0Ü '× =Ñ =�Ø%�Ø(Ð4Ø"7×"=Ñ"=�Kà*Ð6à/×;Ñ;ÐGØ'Ð/F×/RÑ/RÑRà&-˜ô 1Ø!Ø +Ø +Ø,Cô	�ðÜ˜f¤cÔ*Ü+.×+;Ñ+;¸FÓ+CÐ(Ü!Ð"6¼Ô=Ø3Ð3à%˜ð +ô —Z‘Z—^‘^ KÓ0ˆFØ:@Ð:L¤;¨vÔ#6ÐRVÐ Ø#Ð/´JÐ?SÔUYÔ4ZØ+Ð+à�øôW !ò 0Ø)EÀaÀSÐ'I�IÜ"×(Ñ(¨Ô3Ü$ YÓ/Ð/ûð0ú÷"ñ "ú÷"ñ "ú÷"ñ "ûô8 ò 0Ü×$Ñ$ØbØØÜ×(Ñ(Ó*ô	ô Ÿ™ ;Ó/–ûð0ûô ò Ø’ðûô ò ØÐ$Ø Õ àˆGûð	ús¶   Ê3R ËSÌSÎS,Î5U  ÏAS9 Ð6U ÑU ÑAU  ÒU  Ò	SÒ%%S
Ó
SÓSÓS)Ó,S6Ó9	UÔ?UÕU  ÕUÕU  ÕUÕU  ÕUÕU  Õ 	U9Õ)U4Õ,U9Õ2U4Õ4U9c                 ó�   — t        «       syt        j                  }|�|j                  €y| j	                  d«      |j                  v S )a‚  
    Returns True if a `get_secret` read for `secret_name` would actually reach the hosted manager.

    Mirrors the gating `get_secret` applies below: the manager has to be up and readable, and
    `hosted_keys`, when set, is an allowlist of the names it is consulted for. Callers use this to
    tell "the manager does not have this key" apart from "the manager was never asked".
    FTrf   )r–   r…   r‡   r˜   Úremoveprefix)rV   r„   s     r   Ú!secret_manager_would_be_consultedr²   p  sK   € ô 3Ô4ØÜ%,×%EÑ%EÐØÐ&Ð*A×*MÑ*MÐ*UØØ×#Ñ# MÓ2Ð6M×6YÑ6YÐYÐYr   c                  ód   — t         j                  } t         j                  �| €y| j                  dv S )a  
    Returns True if the secret manager should be used to read the secret, False otherwise

    - If the secret manager client is not set, return False
    - If the `_key_management_settings` access mode is "read_only" or "read_and_write", return True
    - Otherwise, return False
    F)Ú	read_onlyÚread_and_write)r…   r‡   r—   Úaccess_mode)r„   s    r   r–   r–   €  s7   € ô &-×%EÑ%EÐÜ×$Ñ$Ð,Ð0GÐ0OØØ"×.Ñ.Ð2QÐQÐQr   )N)+r›   r$   r5   r+   r™   Útypingr   rJ   Úpydanticr   r   r…   Úlitellm._loggingr   Úlitellm.caching.cachingr   Ú&litellm.llms.custom_httpx.http_handlerr   Ú3litellm.secret_managers.get_azure_ad_token_providerr	   Ú.litellm.secret_managers.secret_manager_handlerr
   r   r   r   r   r[   r'   r0   r1   r8   r>   rE   rK   rL   rb   rU   r\   r`   rd   rY   r²   r–   r   r   r   ú<module>r¾      s¢  ðÜ 
Û Û 	Û Û Ý ã ß /ã Ý +Ý -Ý >õõ Sá“K€
ˆEÓ ð ,.Ð ! 5Ó -ô�yô ðT cð T°Cð T¸Có Tð& 0TÐ % uÓ Sð3¨4°©9ó 3ð$¨Cð °Có ñ4( E§M¡M°DÑ$8ð (ÀKó (ð&�s˜T‘zð  d¨T¡kó ð4 (,ñØðà˜‘: Ñ$ðð 	ˆ4�Zóð
* s¨T¡zð 
*°c¸D±jó 
*ð "&ñ*Øð*à˜$‘;ð*ð 
ˆD�[ó*ð2 (,ñpØðpà˜‘: Ñ$ópðfZ°3ð Z¸4ó Zð R°ô Rr   