
    gA                     h    d dl Z d dlZd dlZd dlmZ d dlmZ d dlZd dlmZ d dl	m
Z
  G d d      Zy)    N)datetime)Optional)verbose_proxy_logger)HTTPHandlerc                   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
 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        d      | _        d | _        | j                          y )NLITELLM_LICENSEzLicense Str value - {}   )timeout)
osgetenvlicense_strr   debugformatr   http_handler
public_keyread_public_keyselfs    W/var/www/openai/venv/lib/python3.12/site-packages/litellm/proxy/auth/litellm_license.py__init__zLicenseCheck.__init__   sV    99%6=""#;#B#B4CSCS#TU'3    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&3&G&G&XDO 54 #' 54  	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   r1   responsenum_retriesiresponse_jsonpremiumr.   s	            r   _verifyz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% ,, 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   rC   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(c           
         	 ddl m} ddlm} t	        j
                  |      }|j                  dd      \  }}|j                  |||j                  |j                  |j                               |j                  j                        |j                                t        j                  |j                               }t        j                   d|       t#        j$                  |d   d	      }	|	t#        j&                         k  ry
y# t(        $ r7}
t        j                   dj+                  t-        |
                   Y d }
~
yd }
~
ww xY w)Nr   )hashes)padding   .r2   )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   rI   )cryptography.hazmat.primitives.asymmetricrJ   base64	b64decodesplitr3   PSSMGF1SHA256
MAX_LENGTHr:   loadsdecoder   r   r   strptimenowr(   r   r*   )r   r   rE   rI   rJ   decodedmessage	signaturelicense_datarN   r.   s              r   rF   z/LicenseCheck.verify_license_without_api_request   s#   (	=I &&{3G!(tQ!7GY V]]_5 ' 6 6     ::gnn&67L !&&'9<H '//./O /3 	 && E  L  LF
 	s   DD 	E-EE)r	   N)__name__
__module____qualname____doc__r4   r   r   r*   r<   rC   rG   rF    r   r   r   r      s?    
 ,HN"+3 +4 +Z"D "H)r   r   )rP   r:   r   r   typingr   r8   litellm._loggingr   &litellm.llms.custom_httpx.http_handlerr   r   rc   r   r   <module>rg      s+      	    1 >Z Zr   