
    ^hA                     h    S SK r S SKrS SKrS SKJr  S SKJr  S SKrS SKJr  S SK	J
r
   " S S5      rg)    N)datetime)Optional)verbose_proxy_logger)HTTPHandlerc                   R    \ rS rSrSrSrSS jrS rS\S\	4S	 jr
S\	4S
 jrS rSrg)LicenseCheck   z9
- Check if license in env
- Returns if license is valid
zhttps://license.litellm.aireturnNc                     [         R                  " SS 5      U l        [        R                  " SR                  U R                  5      5        [        SS9U l        S U l        U R                  5         g )NLITELLM_LICENSEzLicense Str value - {}r	   )timeout)
osgetenvlicense_strr   debugformatr   http_handler
public_keyread_public_keyselfs    \/home/james-whalen/.local/lib/python3.13/site-packages/litellm/proxy/auth/litellm_license.py__init__LicenseCheck.__init__   sV    99%6=""#;#B#B4CSCS#TU'3    c                 0    SSK Jn  [        R                  R	                  [        R                  R                  [        5      5      n[        R                  R                  US5      n[        R                  R                  U5      (       a:  [        US5       nUR                  UR                  5       5      U l        S S S 5        g S U l        g ! , (       d  f       g = f! [         a,  n[        R                  " S[!        U5       35         S nAg S nAff = f)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   LicenseCheck.read_public_key   s    	ND ''//"''*:*:8*DEK #%'',,{<L"Mww~~122-t4&3&G&G&XDO 54 #' 54  	N &&)CCF8'LMM	Ns<   BC %C=C C 
CC C 
D)"DDr   c           	         [         R                  " SR                  U R                  U5      5        SR                  U R                  U5      nS n Sn[	        U5       H;  n U R
                  R                  US9nUc  [        S5      eUR                  5         M=     Uc  [        S5      eUR                  5       nUS   n[        U[        5      (       d   e[         R                  " SR                  X5      5        U$ ! [        R                   a    XTS-
  :X  a  e  M  f = f! [         a9  n[         R                  " S	R                  U[        U5      5      5         S nAg
S nAff = f)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   r3   responsenum_retriesiresponse_jsonpremiumr/   s	            r   _verifyLicenseCheck._verify/   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% ,, !O+ ,&  	 **lssQ
 	s=   D! !7C=A$D! =DD! DD! !
E$+/EE$c                     [         R                  " SR                  U R                  5      5        U R                  c  [        R
                  " SS5      U l        [         R                  " SR                  U R                  5      5        U R                  c  gU R                  U R                  U R                  S9SL a  gU R                  U R                  S9SL a  gg! [         a     gf = f)	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   rE   r)   r   s    r   
is_premium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*c           
          SSK Jn  SSKJn  [        R
                  " U5      nUR                  SS5      u  pgUR                  UUUR                  UR                  UR                  5       5      UR                  R                  S9UR                  5       5        [        R                  " UR                  5       5      n[        R                   " SU5        ["        R$                  " US   S	5      n	U	["        R&                  " 5       :  a  g
g! [(         a8  n
[        R                   " SR+                  [-        U
5      5      5         S n
A
gS n
A
ff = f)Nr   )hashes)padding   .r4   )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   rM   )cryptography.hazmat.primitives.asymmetricrN   base64	b64decodesplitr5   PSSMGF1SHA256
MAX_LENGTHr<   loadsdecoder   r   r   strptimenowr)   r   r+   )r   r   rH   rM   rN   decodedmessage	signaturelicense_datarR   r/   s              r   rI   /LicenseCheck.verify_license_without_api_request   s!   (	=I &&{3G!(tQ!7G V]]_5 ' 6 6     ::gnn&67L !&&'9<H '//./O /3 	 && E  L  LF
 	s   DD	 	
E.EE)r   r   r   )r
   N)__name__
__module____qualname____firstlineno____doc__r6   r   r   r+   r>   rE   rJ   rI   __static_attributes__ r   r   r   r      s?    
 ,HN"+3 +4 +Z"D "H)r   r   )rT   r<   r   r   typingr   r:   litellm._loggingr   &litellm.llms.custom_httpx.http_handlerr   r   rj   r   r   <module>rn      s+      	    1 >Z Zr   