
    h"<                         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mZ d dl	Z	d dl
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 dZ G d d      Zy)	    N)datetimetimezone)AnyListOptional)verbose_proxy_logger)CommonProxyErrorsGenerateKeyRequestGenerateKeyResponse
KeyRequestLiteLLM_AuditLogsLitellm_EntityTypeLiteLLM_VerificationTokenLitellmTableNamesRegenerateKeyRequestUpdateKeyRequestUserAPIKeyAuthzlitellm/c                   X   e Zd Ze	 ddedededee   fd       Z	e	 dde
dedededee   f
d       Ze	 ddee   dedededee   f
d	       Ze	 dded
ee   dededee   f
d       Zededefd       Zedededefd       Zededefd       Zed
ee   fd       Zedefd       Zy)KeyManagementEventHooksNdataresponseuser_api_key_dictlitellm_changed_byc                   K   ddl m} ddlm} | j                  du r-t
        j                  |j                  d             d{    t        j                  du r|j                  d      }t        j                   |t        t        t        j                                t#        j$                  t&        j(                        |xs |j*                  xs ||j,                  t.        j0                  |j2                  xs dd|d		      
             t
        j5                  | j6                  xs d|j2                   |j8                         d{    y7 7 w)z
        Hook that runs after a successful /key/generate request

        Handles the following:
        - Sending Email with Key Details
        - Storing Audit Logs for key generation
        - Storing Generated Key in DB
        r   create_audit_log_for_updatelitellm_proxy_admin_nameTexclude_noneN created	id
updated_at
changed_bychanged_by_api_key
table_name	object_idactionupdated_valuesbefore_valuerequest_datavirtual-key-)secret_namesecret_token)+litellm.proxy.management_helpers.audit_logsr   litellm.proxy.proxy_serverr   send_invite_emailr   _send_key_created_email
model_dumplitellmstore_audit_logsmodel_dump_jsonasynciocreate_taskr   struuiduuid4r   nowr   utcuser_idapi_keyr   KEY_TABLE_NAMEtoken_id$_store_virtual_key_in_secret_manager	key_aliaskey)r   r   r   r   r   r   _updated_valuess          j/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/proxy/hooks/key_management_event_hooks.pyasync_key_generated_hookz0KeyManagementEventHooks.async_key_generated_hook   s5    	
 	H!!T))AA###6  
 ##t+&66D6IO+!2tzz|,#+<<#=#5 $4,44$43+<+D+D#4#C#C"*"3"3"9r('6%)"$ &JJLL9J9J8K*L! K 
 	
 	
32	
s%   AEED	EEEEexisting_key_rowc                 6  K   ddl m} ddlm} t        j
                  du rt        j                  | j                  d      t              }|j                  d      }t        j                  |t              }t        j                   |t        t        t        j                               t        j                  t         j"                        |xs |j$                  xs ||j&                  t(        j*                  | j,                  d||	      	             y
y
w)z~
        Post /key/update processing hook

        Handles the following:
        - Storing Audit Logs for key update
        r   r   r   Tr   )defaultupdatedr#   r-   N)r2   r   r3   r   r7   r8   jsondumpsr<   r:   r;   r   r=   r>   r   r?   r   r@   rA   rB   r   rC   rG   )	r   rK   r   r   r   r   r   rH   _before_values	            rI   async_key_updated_hookz.KeyManagementEventHooks.async_key_updated_hookO   s     	
 	H ##t+"jj)EsSO,11t1DM JJ}cBM+!2tzz|,#+<<#=#5 $4,44$43+<+D+D#4#C#C"&((('6%2" ,s   DDc                   K   ddl m} ddlm} | n|j                  b|j
                  xs d|j                   }t        j                  || j
                  xs d|j                   |j                         d {    t        j                  du r|j                  t        j                   |t        t        t!        j"                               t%        j&                  t(        j*                        |xs |j,                  xs ||j                  t.        j0                  |j                  d|j3                  d      |j3                  d      		      
             y y y 7 w)Nr   r   r   r/   current_secret_namenew_secret_namenew_secret_valueTrotatedr   r#   r-   )r2   r   r3   r   rD   rF   tokenr   %_rotate_virtual_key_in_secret_managerrG   r7   r8   r:   r;   r   r<   r=   r>   r   r?   r   r@   rA   r   rC   r9   )r   rK   r   r   r   r   r   initial_secret_names           rI   async_key_rotated_hookz.KeyManagementEventHooks.async_key_rotated_hook{   sO    	
 	H  1 1 = **U=M=S=S<T.U   *OO$7 $ TLARAR@S2T!) P    ##t+0@0F0F0R+!2tzz|,#+<<#=#5 $4,44$43+<+B+B#4#C#C"2"8"8('/'?'?T'?'R%5%E%E)- &F &" 1S+s   A8E :E;C$E keys_being_deletedc                 (  K   ddl m} ddlm} t        j
                  du r| j                  |D ]  }|j                  |j                  d      }t        j                   |t        t        t        j                               t        j                   t"        j$                        |xs |j&                  xs ||j                  t(        j*                  |j                  dd|		      
              t,        j/                  |       d{    y7 w)z
        Post /key/delete processing hook

        Handles the following:
        - Storing Audit Logs for key deletion
        r   r   r   TNr   deletedz{}r#   r-   )r]   )r2   r   r3   r   r7   r8   keysrY   r9   r:   r;   r   r<   r=   r>   r   r?   r   r@   rA   r   rC   r   (_delete_virtual_keys_from_secret_manager)	r   r]   r   r   r   r   r   rG   _key_rows	            rI   async_key_deleted_hookz.KeyManagementEventHooks.async_key_deleted_hook   s     	
 	H ##t+		0E)99$..D.A##/%6"4::<0'/||HLL'A'9 (8088(87/@/F/F'8'G'G&)ii#,+/)1& *. &NN1 O 
 	
 	
 		
s   DD
DDr0   r1   c                 &  K   t         j                  {t         j                  j                  du r^ddlm} t        t         j                  |      r=t         j                  j                  t        j                  |       |       d{    yyyy7 w)z
        Store a virtual key in the secret manager

        Args:
            secret_name: Name of the virtual key
            secret_token: Value of the virtual key (example: sk-1234)
        NTr   BaseSecretManager)r0   secret_value)
r7   _key_management_settingsstore_virtual_keys+litellm.secret_managers.base_secret_managerrf   
isinstancesecret_manager_clientasync_write_secretr   _get_secret_name)r0   r1   rf   s      rI   rE   z<KeyManagementEventHooks._store_virtual_key_in_secret_manager   s      ++7//BBdJ
 g;;=NO!77JJ$;$L$L'% &2	 K    P K 8s   BBB	BrU   rV   rW   c                 N  K   t         j                  t         j                  j                  du rrddlm} t        t         j                  |      rQt         j                  j                  t        j                  |       t        j                  |      |       d{    yyyy7 w)z
        Update a virtual key in the secret manager

        Args:
            secret_name: Name of the virtual key
            secret_token: Value of the virtual key (example: sk-1234)
        NTr   re   rT   )
r7   rh   ri   rj   rf   rk   rl   async_rotate_secretr   rn   )rU   rV   rW   rf   s       rI   rZ   z=KeyManagementEventHooks._rotate_virtual_key_in_secret_manager   s      ++7//BBdJ
 g;;=NO!77KK,C,T,T/- )@(P(P+) *: L    P K 8s   BB%B#	B%returnc                     t         j                  j                  j                  d      rt         j                  j                   |  S t         j                  j                   d|  S )N/)r7   rh   prefix_for_stored_virtual_keysendswithr0   s    rI   rn   z(KeyManagementEventHooks._get_secret_name  s`    ++JJSS
 66UUVWbVcdd66UUVVWXcWdee    c                   K   t         j                  t         j                  j                  du rddlm} t        t         j                  |      r}| D ]w  }|j                  Ft         j                  j                  t        j                  |j                               d{    Ut        j                  d|j                   d       y yyyy7 .w)z
        Deletes virtual keys from the secret manager

        Args:
            keys_being_deleted: List of keys being deleted, this is passed down from the /key/delete operation
        NTr   re   rv   z]KeyManagementEventHooks._delete_virtual_key_from_secret_manager: Key alias not found for key z(. Skipping deletion from secret manager.)r7   rh   ri   rj   rf   rk   rl   rF   async_delete_secretr   rn   r   warningrY   )r]   rf   rG   s      rI   ra   z@KeyManagementEventHooks._delete_virtual_keys_from_secret_manager  s      ++7//BBdJ g;;=NO1==4")"?"?"S"S,C,T,T$'MM-" #T #   188"  AD  AJ  AJ  @K  Ks  !t  2 P K 8s   BC C!/Cc                 ~  K   	 ddl m} ddlm}m	} 	 ddl
m}  || j                  dd      dt        j                  d	| j                  d
d      | j                  dd      | j                  dd      | j                  dd       | j                  dd      | j                  dd       
      }t        j                   j#                  |      }t%        |      dkD  r/|D ])  }t'        ||      s|j)                  |       d {    + y d|j                  dg       vrt+        d      t-        j.                  |j0                  j3                  |             y # t        $ r' t        dt        j
                  j                  z         w xY w# t        $ r' t        dt        j
                  j                  z         w xY w7 w)Nr   )BaseEmailLoggerzTrying to use Email Hooks)general_settingsproxy_logging_obj)SendKeyCreatedEmailEventrG   r!   key_createdzAPI Key CreatedrY   spendg        
max_budgetrA   team_idzDefault TeamrF   )
virtual_keyeventevent_groupevent_messagerY   r   r   rA   r   rF   )callback_type)send_key_created_email_eventemailalertingzyEmail alerting not setup on config.yaml. Please set `alerting=['email']. 
Docs: https://docs.litellm.ai/docs/proxy/email`)webhook_event)>litellm_enterprise.enterprise_callbacks.send_emails.base_emailr|   ImportError	Exceptionr	   missing_enterprise_packagevaluer3   r}   r~   9litellm_enterprise.types.enterprise_callbacks.send_emailsr   getr   KEYr7   logging_callback_managerget_custom_loggers_for_typelenrk   send_key_created_email
ValueErrorr:   r;   slack_alerting_instance&send_key_created_or_user_invited_email)r   r|   r}   r~   r   r   initialized_email_loggersemail_loggers           rI   r5   z/KeyManagementEventHooks._send_key_created_email7  s    	 	S	 ) UB/*..+,,w+,,w,||L#6LLD1LLN;ll;5
" ,,HH- I  	"
 ()A- 9lO<&==5: >    !: .22:rBB  Q 
 !99``"' a q  	+#>>DDE 	  	+#>>DDE 	<sE   F=E F=F CF=)F=>F;?AF=0FF=0F88F=)N)__name__
__module____qualname__staticmethodr
   r   r   r   r<   rJ   r   r   rR   r   r   r\   r   r   dictrc   rE   rZ   rn   ra   r5    rw   rI   r   r      s   
 -1	0
 0
%0
 *0
 %SM	0
 0
d  -1))) ) *	)
 %SM) )V  -1++,+3+ &+ *	+
 %SM+ +Z  -100 !:;0 0 *	0
 %SM0 0d  SV  .  36JM 8 fc fc f f  !:; 8 A A Arw   r   )r:   rO   r=   r   r   typingr   r   r   r7   litellm._loggingr   litellm.proxy._typesr	   r
   r   r   r   r   r   r   r   r   r   "LITELLM_PREFIX_STORED_VIRTUAL_KEYSr   r   rw   rI   <module>r      sE       ' & &  1    &0 "^ ^rw   