o
    ưih                     @   s   d dl Z d dlZd dlZd dlm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 er8d dlmZ G dd	 d	ZdS )
    N)datetime)TYPE_CHECKINGOptional)verbose_proxy_logger)NON_LLM_CONNECTION_TIMEOUT)HTTPHandlerEnterpriseLicenseDatac                   @   sr   e Zd ZdZdZdddZdd Zd	edefd
dZ	defddZ
dedefddZdedefddZdd ZdS )LicenseCheckzE
    - Check if license in env
    - Returns if license is valid
    zhttps://license.litellm.aireturnNc                 C   sJ   t dd | _td| j ttd| _d| _	d | _
|   d | _d S )NLITELLM_LICENSEzLicense Str value - {})timeoutF)osgetenvlicense_strr   debugformatr   r   http_handler_premium_check_logged
public_keyread_public_keyairgapped_license_dataself r   Y/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/auth/litellm_license.py__init__   s   
zLicenseCheck.__init__c              
   C   s   zEddl m} tjtjt}tj|d}tj|r@t	|d}|
| | _W d    W d S 1 s8w   Y  W d S d | _W d S  tyb } ztdt|  W Y d }~d S d }~ww )Nr   )serializationzpublic_key.pemrbzError reading public key: )cryptography.hazmat.primitivesr   r   pathdirnamerealpath__file__joinexistsopenZload_pem_public_keyreadr   	Exceptionr   errorstr)r   r   Zcurrent_dirZ_path_to_public_keykey_fileer   r   r   r   $   s   &"zLicenseCheck.read_public_keyr   c           	   
   C   s  t d| j| d| j|}d }zRd}t|D ](}z| jj|d}|d u r,td|  W q t	j
yB   ||d kr@ Y qw |d u rKtd| }|d }t|tsZJ t d|| |W S  ty } zt d	|t| W Y d }~d
S d }~ww )Nz`litellm.proxy.auth.litellm_license.py::_verify - Checking license against {}/verify_license - {}z{}/verify_license/{}   )urlzNo response from license server   verifyzIlitellm.proxy.auth.litellm_license.py::_verify - License={} is premium={}zZlitellm.proxy.auth.litellm_license.py::_verify - Unable to verify License={} via api. - {}F)r   r   r   base_urlranger   getr(   raise_for_statushttpxZHTTPStatusErrorjson
isinstancebool	exceptionr*   )	r   r   r.   responseZnum_retriesiZresponse_jsonZpremiumr,   r   r   r   _verify5   sP   zLicenseCheck._verifyc                 C   s   zL| j std| j | jdu rtdd| _| j s(td| j d| _ | jdu r0W dS | j| j| jddu r>W dS | j	| jddu rJW dS W dS  t
yV   Y dS w )	z
        1. verify_license_without_api_request: checks if license was generate using private / public key pair
        2. _verify: checks if license is valid calling litellm API. This is the old way we were generating/validating license
        z`litellm.proxy.auth.litellm_license.py::is_premium() - ENTERING 'IS_PREMIUM' - LiteLLM License={}Nr   zUlitellm.proxy.auth.litellm_license.py::is_premium() - Updated 'self.license_str' - {}TF)r   license_key)r   )r   r   r   r   r   r   r   "verify_license_without_api_requestr   r<   r(   r   r   r   r   
is_premiuma   s<   

zLicenseCheck.is_premiumtotal_usersc                 C   s:   | j du rdS d| j vst| j d tsdS || j d kS )8
        Check if the license is over the limit
        NFZ	max_users)r   r7   int)r   r@   r   r   r   is_over_limit   s   

zLicenseCheck.is_over_limit
team_countc                 C   s:   | j du rdS | j d}d| j vst|tsdS ||kS )rA   NFZ	max_teams)r   r3   r7   rB   )r   rD   Z_max_teams_in_licenser   r   r   is_team_count_over_limit   s   
z%LicenseCheck.is_team_count_over_limitc              
   C   s  znddl m} ddlm} ddlm} t|d }|r#|dd|  7 }t|}|	dd\}}	|
|	||j|| |jjd	|  t| }
|di |
| _td
|
 t|
d d}|t k rlW dS W dS  ty } ztdt| W Y d }~dS d }~ww )Nr   )hashes)paddingr      =   .r/   )ZmgfZsalt_lengthzLicense data: %sexpiration_datez%Y-%m-%d)FzLicense has expiredTzrlitellm.proxy.auth.litellm_license.py::verify_license_without_api_request - Unable to verify License locally. - {}Fr   )r   rF   Z)cryptography.hazmat.primitives.asymmetricrG   litellm.proxy._typesr	   lenbase64	b64decodesplitr0   ZPSSZMGF1SHA256Z
MAX_LENGTHr6   loadsdecoder   r   r   r   strptimenowr(   r   r*   )r   r   r=   rF   rG   r	   Zpadding_neededdecodedmessage	signatureZlicense_datarK   r,   r   r   r   r>      sH   
z/LicenseCheck.verify_license_without_api_request)r   N)__name__
__module____qualname____doc__r1   r   r   r*   r8   r<   r?   rB   rC   rE   r>   r   r   r   r   r
      s    
	,'r
   )rN   r6   r   r   typingr   r   r5   Zlitellm._loggingr   Zlitellm.constantsr   Z&litellm.llms.custom_httpx.http_handlerr   rL   r	   r
   r   r   r   r   <module>   s   