Ë
    tPêjl—  ã                   óî  — U d dl Z d dlZd dlZd dlmZmZ d dlmZmZ d dlm	Z	m
Z
mZ d dlmZ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 d d	lmZ d d
lmZ 	 d dl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)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8m9Z9 e	rd dl:m;Z; d dl<m=Z=  e«       Z>e
e?d<    G d„ de«      Z@ G d„ de«      ZAdddeAfd„ZBdZCe
e?d <   d!eeDeEf   dz  deFeDeDf   fd"„ZGdrd#„ZHd$eDd%e)d&eeDeEf   dz  d'eeDeEf   dz  d(e/d)eDdz  ddfd*„ZId+d,d-d.d/d0d1d2d3d4d5d6œZJe
eFeDeDf      e?d7<   h d8£ZKe
eLeD      e?d9<   d:d;d<d=d>d?d@dAdBœZMe
eFeDeDf      e?dC<   dDdEhZNe
eLeD      e?dF<    e%«       ZOe
e?dG<   dHeeDeEf   dIeLeD   deFeDeEf   fdJ„ZPdKeFeDeDf   deFeDeDdz  f   fdL„ZQ G dM„ dNedO¬P«      ZRdQeRdeDfdR„ZSdSeTe   deFeDeEf   fdT„ZUdUeDeeDeEf   z  deFeDeEf   fdV„ZVeJfdWeeDeEf   dKeeDeDf   ddfdX„ZWdsd[„ZXdsd\„ZYdYdZd]eeDeDdz  f   ddfd^„ZZdsd_„Z[dddYdZdWeeDeEf   deFeDeEf   fd`„Z\e>j»                  dadbg ee1«      g¬c«       ee1«       eddd¬e«      fd!e9d(e/d)eDdz  fdf„«       Z^e>j¿                  dadbg ee1«      ge7¬g«       ee1«      fd(e/fdh„«       Z`e>jÃ                  dadbg ee1«      g¬c«       ee1«       eddd¬e«      fd(e/d)eDdz  fdi„«       Zbe>j»                  djdbg ee1«      g¬c«       ee1«      fd(e/fdk„«       Zce>j»                  dldbg ee1«      g¬c«       ee1«       eddd¬e«      fd!e8d(e/d)eDdz  deFeDeDf   fdm„«       Zde>j¿                  dldbg ee1«      ge7¬g«       ee1«      fd(e/de7fdn„«       Zee>jÃ                  dldbg ee1«      g¬c«       ee1«       eddd¬e«      fd(e/d)eDdz  deFeDeDf   fdo„«       Zfe>j»                  dpdbg ee1«      g¬c«       ee1«      fd(e/deFeDeDf   fdq„«       Zgy# e$ r e ZY �Œ–w xY w)té    N)ÚMappingÚSequence)ÚdatetimeÚtimezone)ÚTYPE_CHECKINGÚFinalÚProtocol)Ú	APIRouterÚDependsÚHeaderÚHTTPException)Ú	BaseModelÚTypeAdapter)ÚReadOnlyÚ	TypedDict)Úuuid)Ú
safe_dumps)Úsafe_json_loads)ÚRecordNotFoundError)Úverbose_proxy_logger)ÚSensitiveDataMasker)Úget_async_httpx_client)ÚAUDIT_ACTIONSÚCommonProxyErrorsÚKeyManagementSystemÚLiteLLM_AuditLogsÚLitellmTableNamesÚLitellmUserRolesÚUserAPIKeyAuth)Úuser_api_key_auth)ÚConfigOverridesRepository)ÚhttpxSpecialProvider)ÚConfigOverrideSettingsResponseÚCyberArkConfigÚHashicorpVaultConfig)ÚProxyConfig)ÚPrismaClientÚrouterc                   ó8   — e Zd Zedeeeef   z  dz  fd„«       Zy)Ú_ConfigOverrideRowÚreturnNc                  ó   — y ©N© )Úselfs    ú�/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/management_endpoints/config_override_endpoints.pyÚconfig_valuez_ConfigOverrideRow.config_value3   s   € ØADó    )Ú__name__Ú
__module__Ú__qualname__ÚpropertyÚstrr   Úobjectr1   r.   r2   r0   r*   r*   2   s(   „ ØØD˜c G¨C°¨KÑ$8Ñ8¸4Ñ?ÒDó ÙDr2   r*   c                   óx   — e Zd Zdeeef   dedz  fd„Zdeeef   deeeeef   f   defd„Zdeeef   defd„Z	y)Ú_ConfigOverridesTableClientÚwherer+   Nc              ƒ   ó   K  — y ­wr-   r.   ©r/   r;   s     r0   Úfind_uniquez'_ConfigOverridesTableClient.find_unique8   ó   è ø� ùó   ‚Údatac              ƒ   ó   K  — y ­wr-   r.   )r/   r;   rA   s      r0   Úupsertz"_ConfigOverridesTableClient.upsert:   r?   r@   c              ƒ   ó   K  — y ­wr-   r.   r=   s     r0   Údeletez"_ConfigOverridesTableClient.delete<   r?   r@   )
r3   r4   r5   r   r7   r*   r>   r8   rC   rE   r.   r2   r0   r:   r:   7   sg   „ Ø[ w¨s°C¨xÑ'8Ð[Ð=OÐRVÑ=VÓ[àj '¨#¨s¨(Ñ"3Ðj¸7À3ÈÐPSÐUXÐPXÑHYÐCYÑ;ZÐjÐ_eÓjàC '¨#¨s¨(Ñ"3ÐC¸ÔCr2   r:   Úprisma_clientr'   r+   c                 ó,   — t        | «      j                  S r-   )r!   Útable)rF   s    r0   Ú_config_overrides_tablerI   ?   s   € Ü$ ]Ó3×9Ñ9Ð9r2   z***REDACTED***Ú_AUDIT_REDACTEDÚconfigc                 ó>   — | si S | D �ci c]	  }|t         “Œ c}S c c}w )aY  Strip values from a config snapshot before audit-log emission.

    Hashicorp Vault config carries ``vault_token``, ``approle_secret_id``,
    ``client_key`` etc.  Persisting them verbatim into ``LiteLLM_AuditLogs``
    would let anyone with read access to the audit table harvest the
    proxy's KMS credentials.  Keep keys, redact values.
    )rJ   )rK   Úks     r0   Ú_redact_configrN   F   s%   € ñ Øˆ	Ø(.Ö/ 1ˆAŒÑÒ/Ð/ùÒ/s   ‰c                 óx   — | j                  «       ry | j                  «       }|�t        j                  d|«       y y )Nz-Failed to write config override audit log: %s)Ú	cancelledÚ	exceptionr   Úwarning)ÚtaskÚexcs     r0   Ú_log_audit_task_exceptionrU   S   s7   € Ø‡~�~ÔØØ—‘Ó!€CØ
€Ü×$Ñ$Ð%TÐVYÕZð r2   Ú	object_idÚactionÚbefore_configÚafter_configÚuser_api_key_dictÚlitellm_changed_byc              ƒ   ó  K  — ddl m}m} ddlm}  |«       syt        j                   |t        t        t        j                  «       «      t        j                  t        j                  «      |xs |j                  xs ||j                   t"        j$                  | |t'        j(                  dt+        |«      it        ¬«      t'        j(                  dt+        |«      it        ¬«      ¬«	      ¬«      «      }	|	j-                  t.        «       y­w)	a
  Emit an audit-log row for a /config_overrides/{object_id} mutation.

    Mirrors the ``store_audit_logs``-gated pattern from
    ``team_callback_endpoints.py``.  Captured under
    ``LiteLLM_ConfigOverrides`` so the row co-locates with the table it
    mutates.
    r   )Úcreate_audit_log_for_updateÚis_audit_logging_enabled)Úlitellm_proxy_admin_nameNrK   ©Údefault)	ÚidÚ
updated_atÚ
changed_byÚchanged_by_api_keyÚ
table_namerV   rW   Úupdated_valuesÚbefore_value)Úrequest_data)Ú+litellm.proxy.management_helpers.audit_logsr]   r^   Úlitellm.proxy.proxy_serverr_   ÚasyncioÚcreate_taskr   r7   r   Úuuid4r   Únowr   ÚutcÚuser_idÚapi_keyr   ÚCONFIG_OVERRIDES_TABLE_NAMEÚjsonÚdumpsrN   Úadd_done_callbackrU   )
rV   rW   rX   rY   rZ   r[   r]   r^   r_   rS   s
             r0   Ú_emit_config_override_audit_logrw   [   sÈ   è ø€ ÷ õ Dá#Ô%Øä×%Ñ%Ù#Ü*Ü”t—z‘z“|Ó$Ü#Ÿ<™<¬¯©Ó5Ø-ÒfÐ1B×1JÑ1JÒfÐNfØ#4×#<Ñ#<Ü,×HÑHØ#ØÜ#Ÿz™z¨8´^ÀLÓ5QÐ*RÔ\_Ô`Ü!ŸZ™Z¨´>À-Ó3PÐ(QÔ[^Ô_ô
ô	
ó€Dð 	×ÑÔ4Õ5ùs   ‚D	DÚHCP_VAULT_ADDRÚHCP_VAULT_TOKENÚHCP_VAULT_APPROLE_ROLE_IDÚHCP_VAULT_APPROLE_SECRET_IDÚHCP_VAULT_APPROLE_MOUNT_PATHÚHCP_VAULT_CLIENT_CERTÚHCP_VAULT_CLIENT_KEYÚHCP_VAULT_CERT_ROLEÚHCP_VAULT_NAMESPACEÚHCP_VAULT_MOUNT_NAMEÚHCP_VAULT_PATH_PREFIX)Ú
vault_addrÚvault_tokenÚapprole_role_idÚapprole_secret_idÚapprole_mount_pathÚclient_certÚ
client_keyÚvault_cert_roleÚvault_namespaceÚvault_mount_nameÚvault_path_prefixÚHASHICORP_ENV_VAR_MAPPING>   r‰   r„   r†   ÚHASHICORP_SENSITIVE_FIELDSÚCYBERARK_API_BASEÚCYBERARK_ACCOUNTÚCYBERARK_USERNAMEÚCYBERARK_API_KEYÚCYBERARK_CLIENT_CERTÚCYBERARK_CLIENT_KEYÚCYBERARK_SSL_VERIFYÚCYBERARK_REFRESH_INTERVAL)Úcyberark_api_baseÚcyberark_accountÚcyberark_usernameÚcyberark_api_keyrˆ   r‰   Ú
ssl_verifyÚrefresh_intervalÚCYBERARK_ENV_VAR_MAPPINGr›   r‰   ÚCYBERARK_SENSITIVE_FIELDSÚ_sensitive_maskerrA   Úsensitive_fieldsc                 ó¢   — i }| j                  «       D ]9  \  }}|�-||v r)t        |t        «      rt        j	                  |«      ||<   Œ5|||<   Œ; |S )zMMask sensitive fields for API responses. Non-sensitive fields are left as-is.)ÚitemsÚ
isinstancer7   r    Ú_mask_value)rA   r¡   ÚmaskedÚkeyÚvalues        r0   Ú_mask_sensitive_fieldsr©   ´   s[   € à')€FØ—j‘j“lò  ‰
ˆˆUØÐ Ð(8Ñ!8¼ZÈÌsÔ=SÜ+×7Ñ7¸Ó>ˆF�3ŠKàˆF�3ŠKð	 ð
 €Mr2   Úenv_var_mappingc                 ó‚   — i }| j                  «       D ])  \  }}t        j                  j                  |«      }|||<   Œ+ |S )zARead current env var values as fallback when no DB record exists.)r£   ÚosÚenvironÚget)rª   ÚvaluesÚ
field_nameÚenv_var_nameÚ	env_values        r0   Ú_get_current_env_valuesr³   ¿   sG   € à€FØ$3×$9Ñ$9Ó$;ò 'Ñ ˆ
�LÜ—J‘J—N‘N <Ó0ˆ	Ø&ˆˆzÒð'ð €Mr2   c                   óD   — e Zd ZU ee   ed<   eed       ed<   ee   ed<   y)Ú_JsonSchemaFieldÚtypeÚanyOfÚdescriptionN)r3   r4   r5   r   r7   Ú__annotations__r   r.   r2   r0   rµ   rµ   È   s'   … Ø
�3‰-ÓØ�HÐ/Ñ0Ñ1Ó1Ø˜#‘Ôr2   rµ   F)ÚtotalÚ
field_infoc                 ó”   — d| v r| d   S | j                  dg «      D ]*  }|j                  d«      dk7  sŒ|j                  dd«      c S  y)z?Extract the non-null type from a Pydantic v2 JSON schema field.r¶   r·   ÚnullÚstring)r®   )r»   Úoptions     r0   Ú_extract_field_typerÀ   Î   sV   € à�ÑØ˜&Ñ!Ð!Ø—.‘. ¨"Ó-ò 0ˆØ�:‰:�fÓ Ó'Ø—:‘:˜f hÓ/Ò/ð0ð r2   Úmodel_classc                 óü   — t        | «      j                  d¬«      }|j                  di «      }i }|j                  «       D ]&  \  }}|j                  dd«      t	        |«      dœ||<   Œ( |j                  dd«      |dœS )z?Build field_schema dict from a Pydantic model for UI rendering.T)Úby_aliasÚ
propertiesr¸   Ú )r¸   r¶   )r¸   rÄ   )r   Újson_schemar®   r£   rÀ   )rÁ   ÚschemaÚraw_propertiesrÄ   r°   r»   s         r0   Ú_build_field_schemarÉ   Ø   sŒ   € ä Ó,×8Ñ8À$Ð8ÓG€FØ<B¿J¹JÀ|ÐUWÓ<X€NØ€JØ"0×"6Ñ"6Ó"8ò 
Ñˆ
�Jà%Ÿ>™>¨-¸Ó<Ü'¨
Ó3ñ"
ˆ
�:Òð
ð —z‘z -°Ó4Ø ñð r2   Úrawc                 óR   — t        | t        «      rt        | i ¬«      S t        | «      S )z:Parse a config_value from DB (may be JSON string or dict).r`   )r¤   r7   r   Údict)rÊ   s    r0   Ú_parse_config_valuerÍ   è   s#   € ä�#”sÔÜ˜s¨BÔ/Ð/Ü�‹9Ðr2   Úconfig_datac                 óÞ   — |j                  «       D ]Z  \  }}| j                  |«      }|�"|dk7  rt        |«      t        j                  |<   Œ;t        j                  j                  |d«       Œ\ y)zPSet mapped env vars from config data. Unsets vars for missing/None/empty fields.NrÅ   )r£   r®   r7   r¬   r­   Úpop)rÎ   rª   r°   r±   r¨   s        r0   Ú_set_env_varsrÑ   ï   s_   € ð
 %4×$9Ñ$9Ó$;ò /Ñ ˆ
�LØ—‘ 
Ó+ˆØÐ ¨"¢Ü'*¨5£zŒB�J‰J�|Ò$ä�J‰J�N‰N˜<¨Õ.ñ/r2   Úproxy_configr&   c                 ó–   — t        i «       t        j                  t        j                  k(  rdt        _        dt        _        d| _        y)zVClear all Hashicorp Vault state: env vars, secret manager, and change-detection cache.N)rÑ   ÚlitellmÚ_key_management_systemr   ÚHASHICORP_VAULTÚsecret_manager_clientÚ_last_hashicorp_vault_config©rÒ   s    r0   Ú_clear_hashicorp_vault_staterÚ   ü   s7   € ä�"ÔÜ×%Ñ%Ô)<×)LÑ)LÒLØ(,ŒÔ%Ø)-ŒÔ&Ø04€LÕ-r2   c                 óF   — | j                   €t        t        «      | _         yy)z[Capture deployment-provided CYBERARK_* env vars once, before the first DB-driven overwrite.N)Ú_cyberark_boot_envr³   rž   rÙ   s    r0   Ú_snapshot_cyberark_boot_envrÝ     s!   € à×&Ñ&Ð.Ü*AÔBZÓ*[ˆÕ'ð /r2   Ú
env_valuesc                 óâ  — t        |t        «       |j                  d«      r	 | j                  d¬«       yt        j                  t        j                  k7  rydt        _        dt        _        d| _        t        j                  j                  d«      r	 | j                  d¬«       yy# t        $ r t        j                  d«       Y Œ“w xY w# t        $ r t        j                  d«       Y yw xY w)	zXRestore CYBERARK_* env vars and reinitialize (or drop) the secret manager to match them.r˜   Úcyberark©Úkey_management_systemNz1Failed to restore previous CyberArk configurationrx   Úhashicorp_vaultz>Failed to reinitialize Hashicorp Vault after CyberArk rollback)rÑ   rž   r®   Úinitialize_secret_managerÚ	Exceptionr   rQ   rÔ   rÕ   r   ÚCYBERARKr×   rØ   r¬   r­   )rÒ   rÞ   s     r0   Ú_restore_cyberark_runtimerç     sÖ   € ä�*Ô6Ô7Ø‡~�~Ð)Ô*ð	Ø×2Ñ2ÈÐ2ÔTð Ü×%Ñ%Ô)<×)EÑ)EÒEØØ$(„GÔ!Ø%)„GÔ"à04€LÔ-Ü	‡z�z‡~�~Ð&Ô'ð	mØ×2Ñ2ÐIZÐ2Õ[ð (øô ò 	`Ü ×*Ñ*Ð+^Ö_ð	`ûô ò 	mÜ ×*Ñ*Ð+kÖlð	mús#   £B) ÂC Â)C
Ã	C
ÃC.Ã-C.c                 óJ   — | j                   xs i }t        | |«       d| _        y)zMDrop DB-driven CyberArk state, restoring deployment-provided env vars if any.N)rÜ   rç   Ú_last_cyberark_config)rÒ   Úboot_envs     r0   Ú_clear_cyberark_staterë   "  s+   € ð 	×'Ñ'Ò-¨2ð ô ˜l¨HÔ5Ø)-€LÕ&r2   c              ƒ   óÊ   K  — |j                  t        |«      «      }t        |«      }t        | «      j	                  ddid|dœd|idœ¬«      ƒ d{  –—†  t        |«      S 7 Œ­w)zSEncrypt and upsert the CyberArk config row; returns the stored (encrypted) payload.Úconfig_typerà   ©rí   r1   r1   ©ÚcreateÚupdate©r;   rA   N)Ú_encrypt_env_variablesrÌ   r   rI   rC   r   )rF   rÒ   rÎ   Úencrypted_datar1   s        r0   Ú_persist_cyberark_configrõ   +  s�   è ø€ ð )×?Ñ?ÄÀ[Ó@QÓR€NÜ$ ^Ó4€LÜ
! -Ó
0×
7Ñ
7Ø˜jÐ)ð  *Ø ,ñð
  ðñ
ð 8ó ÷ ð ô ˜<Ó(Ð(ðús   ‚AA#ÁA!ÁA#z!/config_overrides/hashicorp_vaultzConfig Overrides)ÚtagsÚdependenciesz�The litellm-changed-by header enables tracking of actions performed by authorized users on behalf of other users, providing an audit trail for accountability)r¸   c              ƒ   ó&  K  — ddl m}m} |j                  t        j
                  k7  rt        dd¬«      ‚|€%t        dt        j                  j                  ¬«      ‚| j                  d¬	«      }t        |«      j                  d
di¬«      ƒ d{  –—† }d}i }|�]|j                  �Qt        |j                  «      }	|j                  |	«      }t         D ]!  }
|
|vsŒ|j#                  |
«      sŒ||
   ||
<   Œ# n9t%        t         «      }t         D ]!  }
|
|vsŒ|j#                  |
«      sŒ||
   ||
<   Œ# |j'                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}t)        |j#                  d«      «      }t)        |j#                  d«      «      }t)        |j#                  d«      xr |j#                  d«      «      }t)        |j#                  d«      xr |j#                  d«      «      }|st        dd¬«      ‚|s|s|st        dd¬«      ‚t%        t         «      }t+        |«       	 |j-                  d¬«       |j7                  |«      }t9        |«      }t        |«      j;                  d
did|dœd|idœ¬«      ƒ d{  –—†  t=        |«      |_        |�|n|}|�dnd}tA        d|||||¬ «      ƒ d{  –—†  d!d"d#œS 7 �Œ+c c}}w # t.        $ r?}t+        |«       t1        j2                  dt5        |«      «       t        dd|› �¬«      ‚d}~ww xY w7 Œ’7 Œ_­w)$z½
    Update Hashicorp Vault secret manager configuration.
    Sets environment variables, encrypts sensitive fields, and stores in DB.
    Reinitializes the secret manager on this pod.
    r   ©rF   rÒ   é“  ú,Only admin users can update config overrides©Ústatus_codeÚdetailNéô  T©Úexclude_nonerí   rã   ©r;   rÅ   rƒ   r„   r…   r†   rˆ   r‰   é�  zVault Address is requiredzŽAt least one authentication method is required: provide a Token, both AppRole Role ID and Secret ID, or both Client Certificate and Client Keyrá   z7Error reinitializing Hashicorp Vault secret manager: %sú%Failed to initialize secret manager: rî   r1   rï   rò   ÚupdatedÚcreated©rV   rW   rX   rY   rZ   r[   z2Hashicorp Vault configuration updated successfullyÚsuccess©ÚmessageÚstatus)!rk   rF   rÒ   Ú	user_roler   ÚPROXY_ADMINr   r   Údb_not_connected_errorr¨   Ú
model_dumprI   r>   r1   rÍ   Ú_decrypt_db_variablesrŽ   r®   r³   r£   ÚboolrÑ   rä   rå   r   rQ   r7   ró   r   rC   r   rØ   rw   )rK   rZ   r[   rF   rÒ   rÎ   Úexisting_recordÚexisting_decryptedrÞ   Úexisting_dataÚfieldrM   ÚvÚhas_vault_addrÚhas_token_authÚhas_approle_authÚhas_tls_cert_authÚprevious_envÚerô   r1   rX   rW   s                          r0   Úupdate_hashicorp_vault_configr  E  sx  è ø€ ÷$ Gà×"Ñ"Ô&6×&BÑ&BÒBÜØØAô
ð 	
ð
 ÐÜØÜ$×;Ñ;×AÑAô
ð 	
ð
 &,×%6Ñ%6ÀDÐ%6Ó%I€Kô $;¸=Ó#I×#UÑ#UØÐ/Ð0ð $Vó $÷ €Oð 48ÐØ(*€JØÐ" ×'CÑ'CÐ'OÜ2°?×3OÑ3OÓPˆØ)×?Ñ?ÀÓNÐÜ.ò 	?ˆEØ˜KÒ'Ð,>×,BÑ,BÀ5Õ,IØ%7¸Ñ%>�˜EÒ"ñ	?ô -Ô-FÓGˆ
Ü.ò 	7ˆEØ˜KÒ'¨J¯N©N¸5Õ,AØ%/°Ñ%6�˜EÒ"ð	7ð
 %0×$5Ñ$5Ó$7×C™D˜A˜q¸1À»7�1�a‘4ÐC€KÑCô ! §¡°Ó!>Ó?€NÜ  §¡°Ó!?Ó@€NÜ" ;§?¡?Ð3DÓ#EÒ#nÈ+Ï/É/ÐZmÓJnÓoÐÜ# K§O¡O°MÓ$BÒ$dÀ{ÇÁÐWcÓGdÓeÐáÜØØ.ô
ð 	
ñ
 Ñ"2Ñ;LÜØð8ô
ð 	
ô 2Ô2KÓL€Lô �+Ôð
Ø×.Ñ.ÐEVÐ.ÔWð )×?Ñ?ÀÓL€NÜ$ ^Ó4€LÜ
! -Ó
0×
7Ñ
7ØÐ/Ð0ð  1Ø ,ñð
  ðñ
ð 8ó ÷ ð ô 1@ÀÓ0M€LÔ-ð 2DÐ1OÑ-ÐU_€MØ0?Ð0K¡9ÐQZ€FÜ
)Ø#ØØ#Ø Ø+Ø-ô÷ ð ð HØñð ð}ûó( Døô< ò 
Ü�lÔ#Ü×&Ñ&Ð'`ÔbeÐfgÓbhÔiÜØØ:¸1¸#Ð>ô
ð 	
ûð
úðøð0ús‡   ‚BLÂJ9ÂA	LÃLÃ+'LÄLÄ%LÅJ<ÅJ<ÅCLÈ#K È5ALÉ:LÉ;4LÊ/LÊ0
LÊ<LË	L
Ë:LÌL
Ì
LÌL)rö   r÷   Úresponse_modelc              ƒ   ó  K  — ddl m} ddlm}m}  || «      st        dd¬«      ‚|€%t        dt        j                  j                  ¬«      ‚t        t        «      }t        |«      j                  d	d
i¬«      ƒ d{  –—† }|�P|j                  �Dt        |j                  «      }|j                  |«      }t!        |t"        «      }t%        d
||¬«      S t'        t(        «      }	t!        |	t"        «      }
t%        d
|
|¬«      S 7 Œƒ­w)z}
    Get current Hashicorp Vault configuration.
    Returns decrypted values from DB, or falls back to current env vars.
    r   ©Ú_user_has_admin_viewrù   rú   ú*Only admin users can view config overridesrü   Nrÿ   rí   rã   r  ©rí   r¯   Úfield_schema)Ú/litellm.proxy.management_endpoints.common_utilsr!  rk   rF   rÒ   r   r   r  r¨   rÉ   r%   rI   r>   r1   rÍ   r  r©   r�   r#   r³   rŽ   ©rZ   r!  rF   rÒ   r$  Ú	db_recordrÎ   Údecrypted_dataÚmasked_datarÞ   Úmasked_env_valuess              r0   Úget_hashicorp_vault_configr+  Í  s  è ø€ õ UßFñ  Ð 1Ô2ÜØØ?ô
ð 	
ð
 ÐÜØÜ$×;Ñ;×AÑAô
ð 	
ô
 .Ô.BÓC€Lô 5°]ÓC×OÑOØÐ/Ð0ð Pó ÷ €Ið Ð ×!7Ñ!7Ð!CÜ0°×1GÑ1GÓHˆð 7C×6XÑ6XÐYdÓ6eˆÜ3°NÔD^Ó_ˆä-Ø)ØØ%ô
ð 	
ô 0Ô0IÓJ€JÜ5°jÔB\Ó]Ðä)Ø%Ø Ø!ôð ð+úó   ‚A:DÁ<D Á=BDc              ƒ   ó�  K  — ddl m}m} | j                  t        j
                  k7  rt        dd¬«      ‚|€%t        dt        j                  j                  ¬«      ‚t        |«      j                  dd	i¬
«      ƒ d{  –—† }d}|�1|j                  �%	 |j                  t        |j                  «      «      }d}	 t        |«      j!                  dd	i¬
«      ƒ d{  –—†  d}t)        |«       |rt+        d	d|d| |¬«      ƒ d{  –—†  dddœS 7 ŒŽ# t        $ r d}Y Œdw xY w7 ŒD# t"        $ r t%        j&                  d«       Y Œ`w xY w7 ŒB­w)z1Delete Hashicorp Vault configuration. Idempotent.r   rù   rú   ú,Only admin users can delete config overridesrü   Nrÿ   rí   rã   r  FTz3No existing Hashicorp Vault config record to deleteÚdeletedr  z2Hashicorp Vault configuration deleted successfullyr  r	  )rk   rF   rÒ   r  r   r  r   r   r  r¨   rI   r>   r1   r  rÍ   rå   rE   r   r   ÚdebugrÚ   rw   ©rZ   r[   rF   rÒ   r  rX   r/  s          r0   Údelete_hashicorp_vault_configr2  	  s�  è ø€ ÷ Gà×"Ñ"Ô&6×&BÑ&BÒBÜØØAô
ð 	
ð
 ÐÜØÜ$×;Ñ;×AÑAô
ð 	
ô $;¸=Ó#I×#UÑ#UØÐ/Ð0ð $Vó $÷ €Oð /3€MØÐ" ×'CÑ'CÐ'Oð	!Ø(×>Ñ>Ô?RÐSb×SoÑSoÓ?pÓqˆMð
 €GðZÜ% mÓ4×;Ñ;À=ÐRcÐBdÐ;Óe×eÐeØˆô ! Ô.ñ Ü-Ø'ØØ'ØØ/Ø1ô
÷ 	
ð 	
ð HØñð ðAùô ò 	!Ø ŠMð	!úð 	fùäò ZÜ×"Ñ"Ð#XÖYðZúð	
úóx   ‚A:EÁ<DÁ=EÂ$D Â6EÂ9 D  ÃDÃD  Ã !EÄEÄ
EÄDÄEÄDÄEÄD  Ä EÄ>EÅ EÅEz1/config_overrides/hashicorp_vault/test_connectionc              ƒ   óœ  K  — ddl m} | j                  t        j                  k7  rt        dd¬«      ‚t        j                  }t        ||«      st        dd¬«      ‚	 t        j                  |j                  «      ƒ d{  –—† }	 t        t        j                  ¬«      }|j                   › d�}|j"                  r|j"                  |d<   |j%                  ||¬«      ƒ d{  –—† }|j'                  «        dd|j                   › �dœS 7 Œ†# t        $ r}t        d	d
|› �¬«      ‚d}~ww xY w7 ŒI# t        $ r}t        d	d|› �¬«      ‚d}~ww xY w­w)z�
    Test the connection to the currently configured Hashicorp Vault.
    Uses the already-initialized secret manager client. Does not modify any state.
    r   )ÚHashicorpSecretManagerrú   z*Only admin users can test Vault connectionrü   r  z>Hashicorp Vault is not configured. Save a configuration first.Néö  zVault authentication failed: )Úllm_providerz/v1/auth/token/lookup-selfzX-Vault-Namespace©ÚheaderszVault token validation failed: r  z#Successfully connected to Vault at ©r  r
  )Ú0litellm.secret_managers.hashicorp_secret_managerr5  r  r   r  r   rÔ   r×   r¤   rl   Ú	to_threadÚ_get_request_headersrå   r   r"   ÚSecretManagerrƒ   r‹   r®   Úraise_for_status)rZ   r5  Úclientr9  r  Úasync_clientÚ
lookup_urlÚresponses           r0   Útest_hashicorp_vault_connectionrD  L  se  è ø€ õð ×"Ñ"Ô&6×&BÑ&BÒBÜØØ?ô
ð 	
ô
 ×1Ñ1€FÜ�fÐ4Ô5ÜØØSô
ð 	
ð
Ü29×2CÑ2CÀF×D_ÑD_Ó2`×,`ˆð
Ü4ÔBV×BdÑBdÔeˆØ%×0Ñ0Ð1Ð1KÐLˆ
Ø×!Ò!Ø+1×+AÑ+AˆGÐ'Ñ(Ø ,× 0Ñ 0°ÀWÐ 0Ó M×MˆØ×!Ñ!Ô#ð Ø8¸×9JÑ9JÐ8KÐLñð ð+ -aùÜò 
ÜØØ2°1°#Ð6ô
ð 	
ûð
úð Nùäò 
ÜØØ4°Q°CÐ8ô
ð 	
ûð
üsm   ‚AEÁ"D Á?DÂ D ÂAD+ ÃD)Ã D+ Ã4EÄD Ä	D&ÄD!Ä!D&Ä&EÄ)D+ Ä+	E	Ä4EÅE	Å	Ez/config_overrides/cyberarkc              ƒ   ó  K  — ddl m}m} |j                  t        j
                  k7  rt        dd¬«      ‚|€%t        dt        j                  j                  ¬«      ‚| j                  d¬	«      }t        |«      j                  d
di¬«      ƒ d{  –—† }d}i }|�]|j                  �Qt        |j                  «      }	|j                  |	«      }t         D ]!  }
|
|vsŒ|j#                  |
«      sŒ||
   ||
<   Œ# n9t%        t         «      }t         D ]!  }
|
|vsŒ|j#                  |
«      sŒ||
   ||
<   Œ# |j'                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}t)        |j#                  d«      «      }t)        |j#                  d«      «      }t)        |j#                  d«      xr |j#                  d«      «      }|st        dd¬«      ‚|s|st        dd¬«      ‚t+        |«       t%        t         «      }t-        |t         «       	 |j/                  d¬«       	 t9        |||«      ƒ d{  –—† |_        |�|n|}|�dnd}t?        d|||||¬«      ƒ d{  –—†  dddœS 7 �ŒÍc c}}w # t0        $ rD}t-        |t         «       t3        j4                  dt7        |«      «       t        dd|› �¬«      ‚d}~ww xY w7 ŒŒ# t0        $ r@}t=        ||«       t3        j4                  dt7        |«      «       t        dd|› �¬«      ‚d}~ww xY w7 Œ°­w) z½
    Update CyberArk Conjur secret manager configuration.
    Sets environment variables, encrypts sensitive fields, and stores in DB.
    Reinitializes the secret manager on this pod.
    r   rù   rú   rû   rü   Nrÿ   Tr   rí   rà   r  rÅ   r˜   r›   rˆ   r‰   r  zCyberArk API Base is requiredzmAt least one authentication method is required: provide an API Key, or both Client Certificate and Client Keyrá   z0Error reinitializing CyberArk secret manager: %sr  z+Error persisting CyberArk configuration: %sz*Failed to persist CyberArk configuration: r  r  r  z+CyberArk configuration updated successfullyr  r	  ) rk   rF   rÒ   r  r   r  r   r   r  r¨   r  rI   r>   r1   rÍ   r  rž   r®   r³   r£   r  rÝ   rÑ   rä   rå   r   rQ   r7   rõ   ré   rç   rw   )rK   rZ   r[   rF   rÒ   rÎ   r  r  rÞ   r  r  rM   r  Úhas_api_baseÚhas_api_key_authr  r  r  rX   rW   s                       r0   Úupdate_cyberark_configrH  ‰  sS  è ø€ ÷$ Gà×"Ñ"Ô&6×&BÑ&BÒBÜØØAô
ð 	
ð
 ÐÜØÜ$×;Ñ;×AÑAô
ð 	
ð
 &,×%6Ñ%6ÀDÐ%6Ó%I€Kô $;¸=Ó#I×#UÑ#UØ˜jÐ)ð $Vó $÷ €Oð 48ÐØ(*€JØÐ" ×'CÑ'CÐ'OÜ2°?×3OÑ3OÓPˆØ)×?Ñ?ÀÓNÐÜ-ò 	?ˆEØ˜KÒ'Ð,>×,BÑ,BÀ5Õ,IØ%7¸Ñ%>�˜EÒ"ñ	?ô -Ô-EÓFˆ
Ü-ò 	7ˆEØ˜KÒ'¨J¯N©N¸5Õ,AØ%/°Ñ%6�˜EÒ"ð	7ð %0×$5Ñ$5Ó$7×C™D˜A˜q¸1À»7�1�a‘4ÐC€KÑCä˜{Ÿ™Ð/BÓCÓD€LÜ" ;§?¡?Ð3EÓ#FÓGÐÜ# K§O¡O°MÓ$BÒ$dÀ{ÇÁÐWcÓGdÓeÐáÜØØ2ô
ð 	
ñ
 Ñ$5ÜØðLô
ð 	
ô   Ô-Ü1Ô2JÓK€LÜ�+Ô7Ô8ð
Ø×.Ñ.ÀZÐ.ÔPð

Ü3KØ˜<¨ó4
÷ .
ˆÔ*ð 2DÐ1OÑ-ÐU_€MØ0?Ð0K¡9ÐQZ€FÜ
)ØØØ#Ø Ø+Ø-ô÷ ð ð AØñð ðSûó" Døô2 ò 
Ü�lÔ$<Ô=Ü×&Ñ&Ð'YÔ[^Ð_`Ó[aÔbÜØØ:¸1¸#Ð>ô
ð 	
ûð
úð.
ùô ò 
Ü! ,°Ô=Ü×&Ñ&Ð'TÔVYÐZ[ÓV\Ô]ÜØØ?À¸sÐCô
ð 	
ûð
úðús¤   ‚BLÂIÂA	LÃLÃ+'LÄLÄ%LÅIÅIÅB.LÈI$ ÈJ6 È'J4È(	J6 È1 LÉLÉ
LÉLÉ$	J1É-?J,Ê,J1Ê1LÊ4J6 Ê6	K?Ê?;K:Ë:K?Ë?Lc              ƒ   ó  K  — ddl m} ddlm}m}  || «      st        dd¬«      ‚|€%t        dt        j                  j                  ¬«      ‚t        t        «      }t        |«      j                  d	d
i¬«      ƒ d{  –—† }|�P|j                  �Dt        |j                  «      }|j                  |«      }t!        |t"        «      }t%        d
||¬«      S t'        t(        «      }	t!        |	t"        «      }
t%        d
|
|¬«      S 7 Œƒ­w)z¸
    Get current CyberArk Conjur configuration.
    Returns decrypted values from DB, or falls back to current env vars.
    Sensitive fields are masked before leaving the server.
    r   r   rù   rú   r"  rü   Nrÿ   rí   rà   r  r#  )r%  r!  rk   rF   rÒ   r   r   r  r¨   rÉ   r$   rI   r>   r1   rÍ   r  r©   rŸ   r#   r³   rž   r&  s              r0   Úget_cyberark_configrJ  ü  s  è ø€ õ÷ GáÐ 1Ô2ÜØØ?ô
ð 	
ð
 ÐÜØÜ$×;Ñ;×AÑAô
ð 	
ô
 .¬nÓ=€Lä4°]ÓC×OÑOØ˜jÐ)ð Pó ÷ €Ið Ð ×!7Ñ!7Ð!CÜ0°×1GÑ1GÓHˆØ6B×6XÑ6XÐYdÓ6eˆÜ3°NÔD]Ó^ˆä-Ø"ØØ%ô
ð 	
ô 0Ô0HÓI€JÜ5°jÔB[Ó\Ðä)ØØ Ø!ôð ð%úr,  c              ƒ   ó�  K  — ddl m}m} | j                  t        j
                  k7  rt        dd¬«      ‚|€%t        dt        j                  j                  ¬«      ‚t        |«      j                  dd	i¬
«      ƒ d{  –—† }d}|�1|j                  �%	 |j                  t        |j                  «      «      }d}	 t        |«      j!                  dd	i¬
«      ƒ d{  –—†  d}t)        |«       |rt+        d	d|d| |¬«      ƒ d{  –—†  dddœS 7 ŒŽ# t        $ r d}Y Œdw xY w7 ŒD# t"        $ r t%        j&                  d«       Y Œ`w xY w7 ŒB­w)z1Delete CyberArk Conjur configuration. Idempotent.r   rù   rú   r.  rü   Nrÿ   rí   rà   r  FTz,No existing CyberArk config record to deleter/  r  z+CyberArk configuration deleted successfullyr  r	  )rk   rF   rÒ   r  r   r  r   r   r  r¨   rI   r>   r1   r  rÍ   rå   rE   r   r   r0  rë   rw   r1  s          r0   Údelete_cyberark_configrL  6  sˆ  è ø€ ÷ Gà×"Ñ"Ô&6×&BÑ&BÒBÜØØAô
ð 	
ð
 ÐÜØÜ$×;Ñ;×AÑAô
ð 	
ô
 $;¸=Ó#I×#UÑ#UØ˜jÐ)ð $Vó $÷ €Oð /3€MØÐ" ×'CÑ'CÐ'Oð	!Ø(×>Ñ>Ô?RÐSb×SoÑSoÓ?pÓqˆMð €GðSÜ% mÓ4×;Ñ;Ø  *Ð-ð <ó 
÷ 	
ð 	
ð ˆô ˜,Ô'áÜ-Ø ØØ'ØØ/Ø1ô
÷ 	
ð 	
ð AØñð ð?ùô ò 	!Ø ŠMð	!úð
	
ùô ò SÜ×"Ñ"Ð#QÖRðSúð	
úr3  z*/config_overrides/cyberark/test_connectionc              ƒ   ó€  K  — ddl m} | j                  t        j                  k7  rt        dd¬«      ‚t        j                  }t        ||«      st        dd¬«      ‚	 t        j                  |j                  «      ƒ d{  –—† }	 t        t        j                  d|j                   i¬«      }|j"                  › d�}|j%                  ||¬«      ƒ d{  –—† }|j'                  «        dd|j"                  › �dœS 7 Œx# t        $ r}t        d	d
|› �¬«      ‚d}~ww xY w7 ŒI# t        $ r}t        d	d|› �¬«      ‚d}~ww xY w­w)z¤
    Test the connection to the currently configured CyberArk Conjur server.
    Uses the already-initialized secret manager client. Does not modify any state.
    r   )ÚCyberArkSecretManagerrú   z-Only admin users can test CyberArk connectionrü   r  z7CyberArk is not configured. Save a configuration first.Nr6  z CyberArk authentication failed: rœ   )r7  Úparamsz/whoamir8  z"CyberArk token validation failed: r  z-Successfully connected to CyberArk Conjur at r:  )Ú/litellm.secret_managers.cyberark_secret_managerrN  r  r   r  r   rÔ   r×   r¤   rl   r<  r=  rå   r   r"   r>  rœ   Úconjur_addrr®   r?  )rZ   rN  r@  r9  r  rA  Ú
whoami_urlrC  s           r0   Útest_cyberark_connectionrS  v  s[  è ø€ õ Và×"Ñ"Ô&6×&BÑ&BÒBÜØØBô
ð 	
ô
 ×1Ñ1€FÜ�fÐ3Ô4ÜØØLô
ð 	
ð

Ü29×2CÑ2CÀF×D_ÑD_Ó2`×,`ˆð
Ü4Ü-×;Ñ;Ø  &×"3Ñ"3Ð4ô
ˆð  &×1Ñ1Ð2°'Ð:ˆ
Ø ,× 0Ñ 0°ÀWÐ 0Ó M×MˆØ×!Ñ!Ô#ð ØBÀ6×CUÑCUÐBVÐWñð ð+ -aùÜò 
ÜØØ5°a°SÐ9ô
ð 	
ûð
úð Nùäò 
ÜØØ7¸°sÐ;ô
ð 	
ûð
üsm   ‚AD>Á"C: Á?C8Â C: ÂAD ÃDÃD Ã&D>Ã8C: Ã:	DÄDÄDÄD>ÄD Ä	D;Ä&D6Ä6D;Ä;D>)rS   zasyncio.Task[None]r+   N)rÒ   r&   r+   N)hrl   rt   r¬   Úcollections.abcr   r   r   r   Útypingr   r   r	   Úfastapir
   r   r   r   Úpydanticr   r   Útyping_extensionsr   r   Úlitellm._uuidr   Ú*litellm.litellm_core_utils.safe_json_dumpsr   Ú*litellm.litellm_core_utils.safe_json_loadsr   Úprisma.errorsr   ÚImportErrorrå   rÔ   Úlitellm._loggingr   Ú0litellm.litellm_core_utils.sensitive_data_maskerr   Ú&litellm.llms.custom_httpx.http_handlerr   Úlitellm.proxy._typesr   r   r   r   r   r   r   Ú$litellm.proxy.auth.user_api_key_authr    Ú'litellm.repositories.table_repositoriesr!   Úlitellm.types.llms.custom_httpr"   Ú9litellm.types.proxy.management_endpoints.config_overridesr#   r$   r%   rk   r&   Úlitellm.proxy.utilsr'   r(   r¹   r*   r:   rI   rJ   r7   r8   rÌ   rN   rU   rw   rŽ   r�   Úsetrž   rŸ   r    r©   r³   rµ   rÀ   r¶   rÉ   rÍ   rÑ   rÚ   rÝ   rç   rë   rõ   Úpostr  r®   r+  rE   r2  rD  rH  rJ  rL  rS  r.   r2   r0   ú<module>ri     sÏ  ðÜ Û Û 	ß -ß 'ß 1Ñ 1ç =Ó =ß +ß 1å Ý AÝ Fð$Ý1ó Ý 1Ý PÝ I÷÷ ñ õ CÝ MÝ ?÷ñ ñ Ý6Ý0á“€ˆÓ ôE˜ô Eô
D (ô Dð:¨>ð :Ð>Yó :ð *€�Ó )ð
0˜7 3¨ ;Ñ/°$Ñ6ð 
0¸4ÀÀSÀ¹>ó 
0ó[ð(6àð(6ð ð(6ð ˜3 ˜;Ñ'¨$Ñ.ð	(6ð
 ˜#˜v˜+Ñ&¨Ñ-ð(6ð &ð(6ð ˜d™
ð(6ð 
ó(6ð\ #Ø$Ø2Ø6Ø8Ø*Ø(Ø,Ø,Ø.Ø0ñ4Ð ˜5  c¨3 h¡Ñ0ó ò/Ð ˜E # c¡(™Oó ð -Ø*Ø,Ø*Ø)Ø'Ø'Ø3ñ	3Ð ˜%  S¨# X¡Ñ/ó 	ð Øð.Ð ˜5  S¡™?ó ñ
 /Ó0Ð �5Ó 0ð ¨¨f¨Ñ!5ð ÈÈSÉð ÐVZÐ[^Ð`fÐ[fÑVgó ð¨T°#°s°(©^ð ÀÀSÈ#ÐPTÉ*À_Ñ@Uó ô�y¨õ ðÐ$4ð ¸ó ð T¨)¡_ð ¸¸cÀ6¸kÑ9Jó ð ˜S 7¨3°¨;Ñ#7Ñ7ð ¸DÀÀfÀÑ<Mó ð *Cñ
/Ø˜˜f˜Ñ%ð
/à˜S #˜XÑ&ð
/ð 
ó
/ó5ó\ðm¨Mð mÀwÈsÐTWÐZ^ÑT^ÈÑG_ð mÐdhó mó..ð)Ø!ð)àð)ð ˜˜f˜Ñ%ð)ð 
ˆ#ˆvˆ+Ñó	)ð4 ‡�Ø'Ø
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(BÙ%+Øð tô&ñ@Ø ð@à%ð@ð ˜d™
ò@óð
@ðF ‡�Ø'Ø
Ð	ÙÐ+Ó,Ð-Ø1ð	 ó ñ )0Ð0AÓ(Bñ3Ø%ò3óð3ðl ‡�Ø'Ø
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(BÙ%+Øð tô&ñ;Ø%ð;à˜d™
ò;óð
;ð| ‡�Ø7Ø
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(Bñ2Ø%ò2óð
2ðp ‡�Ø Ø
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(BÙ%+Øð tô&ñkØðkà%ðkð ˜d™
ðkð 
ˆ#ˆsˆ(�^òkóð
kð\ ‡�Ø Ø
Ð	ÙÐ+Ó,Ð-Ø1ð	 ó ñ )0Ð0AÓ(Bñ1Ø%ð1à#ò1óð1ðh ‡�Ø Ø
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(BÙ%+Øð tô&ñ8Ø%ð8à˜d™
ð8ð 
ˆ#ˆsˆ(�^ò8óð
8ðv ‡�Ø0Ø
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(Bñ/Ø%ð/à	ˆ#ˆsˆ(�^ò/óñ
/øðS ò $Ø#Óð$ús   ÁO) Ï)O4Ï3O4