
    h                         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rd dlmZ  G d d	      Zy)
    N)datetime)TYPE_CHECKINGOptional)verbose_proxy_logger)NON_LLM_CONNECTION_TIMEOUT)HTTPHandlerEnterpriseLicenseDatac                   d    e Zd ZdZdZddZd ZdedefdZ	defd	Z
d
edefdZdedefdZd Zy)LicenseCheckzE
    - Check if license in env
    - Returns if license is valid
    zhttps://license.litellm.aireturnNc                     t        j                  dd       | _        t        j                  dj                  | j                               t        t              | _        d | _	        | j                          d | _        y )NLITELLM_LICENSEzLicense Str value - {})timeout)osgetenvlicense_strr   debugformatr   r   http_handler
public_keyread_public_keyairgapped_license_dataselfs    ^/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/proxy/auth/litellm_license.py__init__zLicenseCheck.__init__   s_    99%6=""#;#B#B4CSCS#TU'0JKIM#    c                    	 ddl m} t        j                  j	                  t        j                  j                  t                    }t        j                  j                  |d      }t        j                  j                  |      r:t        |d      5 }|j                  |j                               | _        d d d        y d | _        y # 1 sw Y   y xY w# t        $ r+}t        j                  dt!        |              Y d }~y d }~ww xY w)Nr   )serializationzpublic_key.pemrbzError reading public key: )cryptography.hazmat.primitivesr    r   pathdirnamerealpath__file__joinexistsopenload_pem_public_keyreadr   	Exceptionr   errorstr)r   r    current_dir_path_to_public_keykey_filees         r   r   zLicenseCheck.read_public_key#   s    	ND ''//"''*:*:8*DEK #%'',,{<L"Mww~~12-t4 Y&3&G&G&XDOY Y #'Y Y  	N &&)CCF8'LMM	Ns<   BC %C	8C C 	CC C 	D	!DD	r   c           	         t        j                  dj                  | j                  |             dj                  | j                  |      }d }	 d}t	        |      D ]<  }	 | j
                  j                  |      }|t        d      |j                          > |t        d      |j                         }|d   }t        |t              sJ t        j                  dj                  ||             |S # t        j                  $ r ||dz
  k(  r Y w xY w# t        $ r8}t        j                  d	j                  |t        |                   Y d }~y
d }~ww xY 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httpxHTTPStatusErrorjson
isinstancebool	exceptionr.   )	r   r   r5   responsenum_retriesiresponse_jsonpremiumr2   s	            r   _verifyzLicenseCheck._verify4   s`   ""nuu{	

 %++DMM;G-1!	K;'#00444=H''(IJJ--/ (  ABB$MMOM#H-Ggt,,, &&[bb
 N% ,, K!O+ ,&  	 **lssQ
 	s=   D  9C6AD 6DD DD 	E!.EEc                    	 t        j                  dj                  | j                               | j                  t	        j
                  dd      | _        t        j                  dj                  | j                               | j                  y| j                  | j                  | j                        du ry| j                  | j                        du ryy# t        $ r Y yw xY 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' - {}F)r   license_keyT)r   )
r   r   r   r   r   r   "verify_license_without_api_requestr   rG   r,   r   s    r   
is_premiumzLicenseCheck.is_premium`   s    
	 &&ryy$$ '#%99->#E  &&gnn$$ '77#D<L<L 8  
 $*:*:;tC 		s   BC )C <C 	C('C(total_usersc                     | j                   yd| j                   vst        | j                   d   t              sy|| j                   d   kD  S )8
        Check if the license is over the limit
        F	max_users)r   r?   int)r   rL   s     r   is_over_limitzLicenseCheck.is_over_limit   sT     &&.d999''4cB
 T88EEEr   
team_countc                     | j                   y| j                   j                  d      }d| j                   vst        |t              sy||kD  S )rN   F	max_teams)r   r:   r?   rP   )r   rR   _max_teams_in_licenses      r   is_team_count_over_limitz%LicenseCheck.is_team_count_over_limit   sV     &&./3/J/J/N/N{/[d999!3B
 111r   c           
         	 ddl m} ddlm} ddlm} t        j                  |      }|j                  dd      \  }}|j                  |||j                  |j                  |j                               |j                  j                        |j                                t        j                  |j!                               }	 |di |	| _        t%        j&                  d|	       t)        j*                  |	d	   d
      }
|
t)        j,                         k  ryy# t.        $ r7}t%        j&                  dj1                  t3        |                   Y d }~yd }~ww xY w)Nr   )hashes)paddingr	      .r6   )mgf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. - {}F )r"   rX   )cryptography.hazmat.primitives.asymmetricrY   litellm.proxy._typesr
   base64	b64decodesplitr7   PSSMGF1SHA256
MAX_LENGTHr>   loadsdecoder   r   r   r   strptimenowr,   r   r.   )r   r   rI   rX   rY   r
   decodedmessage	signaturelicense_datar]   r2   s               r   rJ   z/LicenseCheck.verify_license_without_api_request   s6   ,	=IB &&{3G!(tQ!7GY V]]_5 ' 6 6     ::gnn&67L*?*O,*OD' !&&'9<H '//./O /3 	 && E  L  LF
 	s   DD 	E#-EE)r   N)__name__
__module____qualname____doc__r8   r   r   r.   r@   rG   rK   rP   rQ   rV   rJ   r^   r   r   r   r      si    
 ,HNN"*3 *4 *X"D "H
F 
F 
F23 24 2-r   r   )ra   r>   r   r   typingr   r   r<   litellm._loggingr   litellm.constantsr   &litellm.llms.custom_httpx.http_handlerr   r`   r
   r   r^   r   r   <module>rx      s4      	  *  1 8 >:x xr   