o
    ưi4                     @   s   d dl Z d dlZd dlmZmZmZmZ d dlmZ d dl	Z	d dl
Z
d dlmZ d dlmZ d dlmZmZmZ d dlmZ dd	lmZ dd
lmZ G dd deZdS )    N)AnyDictOptionalUnion)quote)verbose_logger)InMemoryCache)_get_httpx_clientget_async_httpx_clienthttpxSpecialProvider)KeyManagementSystem   )BaseSecretManager)str_to_boolc                   @   sV  e Zd Zdd ZdefddZdefddZdedd	fd
dZdedefddZ					ddede
e de
eeejf  de
e fddZ				ddede
e de
eeejf  de
e fddZ								ddedede
e de
e de
eeejf  de
eeef  deeef fddZ					ddede
e de
e de
eeejf  def
ddZd	S ) CyberArkSecretManagerc                 C   s   ddl m}m} tdd| _tdd| _tdd| _td	d
| _tdd
| _	tdd
| _
ttd}|d ur?|nd| _| jsO| j	rK| j
sOtd| t_tjt_ttjdd}t|d| _|durrtd|jj | js|td d S d S )Nr   )CommonProxyErrorspremium_userZCYBERARK_API_BASEzhttp://127.0.0.1:8080ZCYBERARK_ACCOUNTdefaultZCYBERARK_USERNAMEZadminZCYBERARK_API_KEY ZCYBERARK_CLIENT_CERTZCYBERARK_CLIENT_KEYZCYBERARK_SSL_VERIFYTzMissing CyberArk credentials. Please set CYBERARK_API_KEY or both CYBERARK_CLIENT_CERT and CYBERARK_CLIENT_KEY in your environment.ZCYBERARK_REFRESH_INTERVALZ300)Zdefault_ttlz=CyberArk secret manager is only available for premium users. zzCyberArk SSL verification is disabled. This is insecure and should only be used for testing with self-signed certificates.)Zlitellm.proxy.proxy_serverr   r   osgetenvconjur_addrconjur_accountconjur_usernameconjur_api_keytls_cert_pathtls_key_pathr   
ssl_verify
ValueErrorlitellmZsecret_manager_clientr   ZCYBERARKZ_key_management_systemintenvirongetr   cacheZnot_premium_uservaluer   warning)selfr   r   Zssl_verify_envZ_refresh_interval r'   f/home/app/Keep/.python/lib/python3.10/site-packages/litellm/secret_managers/cyberark_secret_manager.py__init__   s<   zCyberArkSecretManager.__init__returnc           	   
   C   s   | j d}|dur|S td | j d| j d| j d}zL| jr;| jr;t	j
| j| jf| jd}|j|| jd}ntd	| jid
}|jj|| jd}|  |j}t|  }td | j jd|d |W S  ty~ } ztd| d}~ww )z
        Authenticate with CyberArk Conjur and get a session token.

        The token is a JSON object that must be base64-encoded for use in subsequent requests.

        Returns:
            str: Base64-encoded session token
        Zcyberark_auth_tokenNz&Authenticating with CyberArk Conjur...z/authn//z/authenticate)certverify)contentr   paramsz0Successfully authenticated with CyberArk Conjur.)keyr$   z+Could not authenticate to CyberArk Conjur: )r#   	get_cacher   debugr   r   r   r   r   httpxZClientr   postr   r	   clientraise_for_statustextbase64	b64encodeencodedecode	set_cache	ExceptionRuntimeError)	r&   Zcached_tokenZauth_urlhttp_clientrespZhttp_handlerZ
token_jsonZ	token_b64er'   r'   r(   _authenticateB   s0   



z#CyberArkSecretManager._authenticatec                 C   s   |   }dd| diS )z
        Get headers for CyberArk API requests including authentication.

        Returns:
            dict: Headers with authentication token
        AuthorizationzToken token="")rC   )r&   tokenr'   r'   r(   _get_request_headerso   s   z*CyberArkSecretManager._get_request_headerssecret_nameNc              
   C   s  | j  d| j d}d| d}z(td| jid}|jj|i |  ddi|d	}|  t	d
|  W dS  t
jyr } z-|jjdv rQt	d| d ntd|jj d|jj  W Y d}~dS W Y d}~dS d}~w ty } ztd|  W Y d}~dS d}~ww )z
        Ensure a variable exists in CyberArk Conjur by creating a policy entry if needed.

        Args:
            secret_name: Name of the variable to ensure exists
        z
/policies/z/policy/rootz- !variable 
r   r/   zContent-Typezapplication/x-yaml)headersr.   z#Created policy entry for variable: )i  i  z	Variable z- already exists or policy conflict (expected)z"Could not ensure variable exists: z - Nz Error ensuring variable exists: )r   r   r	   r   r6   r5   rG   r7   r   r3   r4   HTTPStatusErrorresponsestatus_coder%   r8   r>   )r&   rH   Z
policy_urlZpolicy_yamlr6   rA   rB   r'   r'   r(   _ensure_variable_existsy   s:   	
z-CyberArkSecretManager._ensure_variable_existsc                 C   s$   t |dd}| j d| j d| S )z
        Build the URL for accessing a secret in CyberArk Conjur.

        Args:
            secret_name: Name of the secret (will be URL-encoded)

        Returns:
            str: Full URL for the secret
        r   )safez	/secrets/z
/variable/)r   r   r   )r&   rH   encoded_namer'   r'   r(   get_url   s   zCyberArkSecretManager.get_urloptional_paramstimeoutc           	   
      s  | j |dur| j |S ttjd| jid}z"| |}|j||  dI dH }|	  |j
}| j || |W S  tjyg } z|jjdkrTtd| d ntd|  W Y d}~dS d}~w ty } ztd|  W Y d}~dS d}~ww )	a_  
        Reads a secret from CyberArk Conjur using an async HTTPX client.

        Args:
            secret_name: Name/path of the secret to read
            optional_params: Additional parameters (not used for Conjur)
            timeout: Request timeout

        Returns:
            Optional[str]: The secret value if found, None otherwise
        Nr   Zllm_providerr0   rJ     Secret  not found in CyberArk Conjur+Error reading secret from CyberArk Conjur: )r#   r2   r
   r   SecretManagerr   rQ   r"   rG   r7   r8   r=   r4   rK   rL   rM   r   r3   	exceptionr>   )	r&   rH   rR   rS   async_clienturlrL   secret_valuerB   r'   r'   r(   async_read_secret   s:   

z'CyberArkSecretManager.async_read_secretc           	   
   C   s   | j |dur| j |S td| jid}z | |}|jj||  d}|  |j	}| j 
|| |W S  tjyb } z|jjdkrOtd| d ntd|  W Y d}~dS d}~w ty| } ztd|  W Y d}~dS d}~ww )	a]  
        Reads a secret from CyberArk Conjur using a sync HTTPX client.

        Args:
            secret_name: Name/path of the secret to read
            optional_params: Additional parameters (not used for Conjur)
            timeout: Request timeout

        Returns:
            Optional[str]: The secret value if found, None otherwise
        Nr   r/   rU   rV   rW   rX   rY   )r#   r2   r	   r   rQ   r6   r"   rG   r7   r8   r=   r4   rK   rL   rM   r   r3   r[   r>   )	r&   rH   rR   rS   Zsync_clientr]   rL   r^   rB   r'   r'   r(   sync_read_secret   s2   

z&CyberArkSecretManager.sync_read_secretr^   descriptiontagsc              
      s   t tjd| jid}z,| | | |}|j||  |dI dH }	|	  | j	
|| dd| ddW S  tyX }
 ztd	|
  d
t|
dW  Y d}
~
S d}
~
ww )a  
        Writes a secret to CyberArk Conjur using an async HTTPX client.

        Args:
            secret_name: Name/path of the secret to write
            secret_value: Value to store
            description: Optional description (not used by Conjur)
            optional_params: Additional parameters
            timeout: Request timeout
            tags: Optional tags (not used by Conjur)

        Returns:
            dict: Response containing status and details of the operation
        r   rT   )r]   rJ   r.   NsuccessrW   z written successfullystatusmessagez)Error writing secret to CyberArk Conjur: error)r
   r   rZ   r   rN   rQ   r5   rG   r7   r#   r=   r>   r   r[   str)r&   rH   r^   ra   rR   rS   rb   r\   r]   rL   rB   r'   r'   r(   async_write_secret  s*   



z(CyberArkSecretManager.async_write_secret   recovery_window_in_daysc                    s"   t d | j| dddS )a  
        CyberArk Conjur does not support direct secret deletion via API.
        Secrets can only be removed through policy updates.

        Args:
            secret_name: Name of the secret
            recovery_window_in_days: Not used
            optional_params: Additional parameters
            timeout: Request timeout

        Returns:
            dict: Response indicating operation not supported
        zhCyberArk Conjur does not support direct secret deletion. Secrets must be removed through policy updates.Znot_supportedz`CyberArk Conjur does not support direct secret deletion. Use policy updates to remove variables.rd   )r   r%   r#   Zdelete_cache)r&   rH   rk   rR   rS   r'   r'   r(   async_delete_secretB  s   z)CyberArkSecretManager.async_delete_secret)NN)NNNN)rj   NN)__name__
__module____qualname__r)   rh   rC   dictrG   rN   rQ   r   r   floatr4   Timeoutr_   r`   listr   r   ri   r    rl   r'   r'   r'   r(   r      sz    +-
%
5
3

6r   )r9   r   typingr   r   r   r   urllib.parser   r4   r   Zlitellm._loggingr   Zlitellm.cachingr   Z&litellm.llms.custom_httpx.http_handlerr	   r
   r   Zlitellm.proxy._typesr   Zbase_secret_managerr   mainr   r   r'   r'   r'   r(   <module>   s    