Ë
    tPêjR  ã                   óˆ   — 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ÚFinal)Ú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                  «       t        t        ¬«      | _        d| _        d | _	        | j                  «        d | _        y )NÚLITELLM_LICENSEzLicense Str value - %s)ÚtimeoutF)ÚosÚgetenvÚlicense_strr   Údebugr   r   Úhttp_handlerÚ_premium_check_loggedÚ
public_keyÚread_public_keyÚairgapped_license_data©Úselfs    úg/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/auth/litellm_license.pyÚ__init__zLicenseCheck.__init__   s^   € ÜŸ9™9Ð%6¸Ó=ˆÔÜ×"Ñ"Ð#;¸T×=MÑ=MÔNÜ'Ô0JÔKˆÔØ%*ˆÔ"ØˆŒØ×ÑÔØDHˆÕ#ó    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|«       Y d }~y d }~ww xY w)Nr   )Úserializationzpublic_key.pemÚrbzError reading public key: %s)Úcryptography.hazmat.primitivesr    r   ÚpathÚdirnameÚrealpathÚ__file__ÚjoinÚexistsÚopenÚload_pem_public_keyÚreadr   Ú	Exceptionr   Úerror)r   r    Úcurrent_dirÚ_path_to_public_keyÚkey_fileÚes         r   r   zLicenseCheck.read_public_key$   sË   € ð	JÝDô "$§¡§¡´·±×1AÑ1AÄ(Ó1KÓ!LˆKô *,¯©¯©°kÐCSÓ)TÐÜ�w‰w�~‰~Ð1Ô2ÜÐ-¨tÓ4ð Y¸Ø&3×&GÑ&GÈÏÉËÓ&X�D”O÷Yð Yð #'�•÷Yð Yûô ò 	JÜ ×&Ñ&Ð'EÀq×IÑIûð	Jús<   ‚BC Â%C	Â8C ÃC Ã	CÃC ÃC Ã	C>ÃC9Ã9C>r   c                 ó<  — t        j                  d| j                  |«       | j                  › d|› �}d }	 d}t        |«      D ]<  }	 | j                  j                  |¬«      }|€t        d«      ‚|j                  «        Œ> |€t        d«      ‚|j                  «       }|d   }t        |t        «      sJ ‚t        j                  d||«       |S # t        j                  $ r ||dz
  k(  r‚ Y Œªw xY w# t        $ r!}t        j                  d	||«       Y d }~y
d }~ww xY w)Nz`litellm.proxy.auth.litellm_license.py::_verify - Checking license against %s/verify_license - %sz/verify_license/é   )ÚurlzNo response from license serveré   ÚverifyzIlitellm.proxy.auth.litellm_license.py::_verify - License=%s is premium=%szZlitellm.proxy.auth.litellm_license.py::_verify - Unable to verify License=%s via api. - %sF)r   r   Úbase_urlÚranger   Úgetr,   Úraise_for_statusÚhttpxÚHTTPStatusErrorÚjsonÚ
isinstanceÚboolÚ	exception)	r   r   r4   ÚresponseÚnum_retriesÚiÚresponse_jsonÚpremiumr1   s	            r   Ú_verifyzLicenseCheck._verify5   sB  € Ü×"Ñ"ØnØ�M‰MØô	
ð
 Ÿ™�Ð&6°{°mÐDˆà*.ˆð	Ø!"ˆKÜ˜;Ó'ò �ðØ#×0Ñ0×4Ñ4¸Ð4Ó=�HØÐ'Ü'Ð(IÓJÐJØ×-Ñ-Õ/ðð ÐÜÐ AÓBÐBà#+§=¡=£?ˆMà*¨8Ñ4ˆGä˜g¤tÔ,Ð,Ð,ä ×&Ñ&Ø[Ð]hÐjqôð ˆNøô! ×,Ñ,ò Ø˜K¨!™OÒ+Øñ ,ðûô" ò 	Ü ×*Ñ*ØlØØôô
 ûð	ús<   ¶C1 Á9CÂ AC1 ÃC.Ã+C1 Ã-C.Ã.C1 Ã1	DÃ:DÄDc                 óÚ  — 	 | j                   s t        j                  d| j                  «       | j                  €t	        j
                  dd«      | _        | j                   s't        j                  d| j                  «       d| _         | j                  €y| j                  | j                  | j                  ¬«      du s| 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=%sNr   zUlitellm.proxy.auth.litellm_license.py::is_premium() - Updated 'self.license_str' - %sTF)r   Úlicense_key)r   )
r   r   r   r   r   r   Ú"verify_license_without_api_requestr   rF   r,   r   s    r   Ú
is_premiumzLicenseCheck.is_premium_   sß   € ð
	Ø×-Ò-Ü$×*Ñ*ØvØ×$Ñ$ôð
 ×ÑÐ'Ü#%§9¡9Ð->ÀÓ#E�Ô à×-Ò-Ü$×*Ñ*ØkØ×$Ñ$ôð .2�Ô*à×ÑÐ'Øà×7Ñ7À4Ç?Á?Ð`d×`pÑ`pÐ7ÓqØñà—‘¨$×*:Ñ*:�Ó;¸tÑCØØøÜò 	Ùð	ús   ‚BC ÂA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   rK   s     r   Úis_over_limitzLicenseCheck.is_over_limit€   sT   € ð ×&Ñ&Ð.ØØ˜d×9Ñ9Ñ9ÄØ×'Ñ'¨Ñ4´côB
ð Ø˜T×8Ñ8¸ÑEÑEÐEr   Ú
team_countc                 óš   — | j                   €y| j                   j                  d«      }d| j                   vst        |t        «      sy||kD  S )rM   FÚ	max_teams)r   r9   r>   rO   )r   rQ   Ú_max_teams_in_licenses      r   Úis_team_count_over_limitz%LicenseCheck.is_team_count_over_limitŒ   sS   € ð ×&Ñ&Ð.Øà37×3NÑ3N×3RÑ3RÐS^Ó3_ÐØ˜d×9Ñ9Ñ9ÄÐLaÔcfÔAgØØÐ1Ñ1Ð1r   c           
      óÂ  — 	 ddl m} ddlm} ddlm} t        |«      dz  }|r|dd|z
  z  z  }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# t0        $ r }t'        j(                  d|«       Y d }~yd }~ww xY w)Nr   )Úhashes)Úpaddingr	   é   ú=ó   .r5   )Ú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. - %sF© )r"   rW   Ú)cryptography.hazmat.primitives.asymmetricrX   Úlitellm.proxy._typesr
   ÚlenÚbase64Ú	b64decodeÚsplitr6   ÚPSSÚMGF1ÚSHA256Ú
MAX_LENGTHr=   ÚloadsÚdecoder   r   r   r   ÚstrptimeÚnowr,   )r   r   rH   rW   rX   r
   Úpadding_neededÚdecodedÚmessageÚ	signatureÚlicense_datar^   r1   s                r   rI   z/LicenseCheck.verify_license_without_api_request˜   sC  € ð.	Ý=ÝIåBô %(¨Ó$4°qÑ$8ˆNÙØ˜s a¨.Ñ&8Ñ9Ñ9�ä#×-Ñ-¨kÓ:ˆGØ!(§¡¨t°QÓ!7ÑˆG�Yð ×ÑØØØ—‘ØŸ™ V§]¡]£_Ó5Ø '§¡× 6Ñ 6ð ó ð —‘“ôô #'§*¡*¨W¯^©^Ó-=Ó">ˆLá*?Ñ*OÀ,Ñ*OˆDÔ'ô !×&Ñ&Ð'9¸<ÔHô &.×%6Ñ%6°|ÐDUÑ7VÐXbÓ%cˆOØ¤§¡£Ò/Ø3àøäò 	Ü ×&Ñ&ð EØôô ûð	ús   ‚D1D5 Ä5	EÄ>EÅE)r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r7   r   r   Ústrr?   rF   rJ   rO   rP   rU   rI   r_   r   r   r   r      si   „ ñð
 ,€HóIòJð"( 3ð (¨4ó (ðT˜Dó ðB
F¨ð 
F°ó 
Fð
2°3ð 
2¸4ó 
2ó/r   r   )rc   r=   r   r   Útypingr   r   r;   Úlitellm._loggingr   Úlitellm.constantsr   Ú&litellm.llms.custom_httpx.http_handlerr   ra   r
   r   r_   r   r   ú<module>r|      s4   ðó Û Û 	Ý ß 'ã å 1Ý 8Ý >áÝ:÷tò tr   