
    ^h[#                     x    S SK r S SKJrJr  S SKJrJrJr  S SKJ	r	  S SK
JrJrJrJrJr  SSKJr   " S S	5      rg)
    N)ListOptional)HTTPExceptionRequeststatus)verbose_proxy_logger)CommonProxyErrorsLiteLLM_UserTableLiteLLMRoutesLitellmUserRolesUserAPIKeyAuth   )_user_is_org_adminc                       \ rS rSr\S\\   S\\   S\S\	S\
S\S\4S	 j5       r\S\4S
 j5       r\S\S\4S j5       r\S\S\S\4S j5       r\S\S\\   S\4S j5       rSrg)RouteChecks   user_obj
_user_rolerouterequestvalid_tokenapi_keyrequest_datac                    [         R                  US9  [         R                  US9(       a  gU[        R                  R
                  ;   a  US:X  a  gUS:X  a  UR                  nUR                  S5      n[        R                  " SU SUR                   35        U(       aA  XR                  :w  a1  [        [        R                  SR                  XR                  5      S9eggUS	:X  a  gUS
:X  a  ggU[        R                  R
                  ;   a   [!        USS5      b  S[!        US/ 5      ;   a  gU["        R$                  R
                  :X  a  [         R                  US9(       a  [        [        R                  SU 3S9e[         R'                  U[        R(                  R
                  S9(       a  US:X  a\  UbX  [+        U[,        5      (       aB  UR/                  5       n	U	 H+  n
U
S;  d  M  [        [        R                  SU SU SU
 S3S9e   ggg[        [        R                  SU SU 3S9egU["        R0                  R
                  :X  a2  [         R'                  U[        R2                  R
                  S9(       a  g[5        X`S9(       a2  [         R'                  U[        R6                  R
                  S9(       a  gU["        R8                  R
                  :X  a2  [         R'                  U[        R:                  R
                  S9(       a  g[         R'                  U[        R<                  R
                  S9(       a  gSnSnU b*  U R>                  =(       d    SnU R                  =(       d    Sn[A        SU SU SU 35      e)z?
Checks if Non Proxy Admin User is allowed to access the route
)r   z	/key/infoz
/user/infouser_idz	user_id: z & valid_token.user_id: zHkey not allowed to access this user's info. user_id={}, key's user_id={}status_codedetailz/model/infoz
/team/infopermissionsNget_spend_routesz5user not allowed to access this OpenAI routes, role= r   allowed_routesz/user/update)
user_emailpasswordz-user not allowed to access this route, role= z. Trying to access: z and updating invalid param: z-. only user_email and password can be updated)r   user_objectunknownz^Only proxy admin can be used to generate, delete, update info for new keys/users/teams. Route=z. Your role=z. Your user_id=)!r   custom_admin_only_route_checkis_llm_api_router   info_routesvaluequery_paramsgetr   debugr   r   r   HTTP_403_FORBIDDENformatglobal_spend_tracking_routesgetattrr   PROXY_ADMIN_VIEW_ONLYcheck_route_accessmanagement_routes
isinstancedictkeysINTERNAL_USERinternal_user_routesr   org_admin_allowed_routesINTERNAL_USER_VIEW_ONLYinternal_user_view_only_routesself_managed_routes	user_role	Exception)r   r   r   r   r   r   r   r+   r   _params_updatedparamr>   s               Y/home/james-whalen/.local/lib/python3.13/site-packages/litellm/proxy/auth/route_checks.py$non_proxy_admin_allowed_routes_check0RouteChecks.non_proxy_admin_allowed_routes_check   s    	11 	2 	
 ''e'4]..444#,&&33&**95$**y(@ATAT@UV w*=*=='$*$=$=ipp#%8%8    >7 -',& ' ]??EEE]D9E"gk="&MM +AAGGG++%+8# & 9 9RS]R^_  --M,K,K,Q,Q .  N* $/J|T4R4R*6*;*;*=%4E$,FF&3060I0I-Z[eZffz  |A  {B  B_  `e  _f  fS  ,T'" !" &5 5S/ ($*$=$=!NzlZnotnuv !, *88>>>..M,N,N,T,T /  %
,,(N(N(T(T - 
 *BBHHH..,KKQQ / 
 ++(I(I(O(O , 
 !IG#$..;)	"**7ipqvpw  xD  EN  DO  O^  _f  ^g  h     c                     SSK JnJn  SU;   a[  USLa2  [        R                  " S[
        R                  R                   35        g XS   ;   a  [        [        R                  SU  S3S9eg )	Nr   )general_settingspremium_useradmin_only_routesTzFTrying to use 'admin_only_routes' this is an Enterprise only feature. z-user not allowed to access this route. Route=z is an admin only router   )litellm.proxy.proxy_serverrG   rH   r   errorr	   not_premium_userr*   r   r   r.   )r   rG   rH   s      rB   r'   )RouteChecks.custom_admin_only_route_check   s    M"224'$**\]n]]  ^F  ^F  ]G  H )<==# & 9 9J5'Qhi  	rE   returnc                 h   U [         R                  R                  ;   a  gU [         R                  R                  ;   a  g[         R                  R                   H%  nSU;   d  M  [        R                  XS9(       d  M%    g   SU ;   a  gSU ;   a  gSU ;   a  gSU ;   a  gSU ;   a  gS	U ;   a  gS
U ;   a  gg)z
Helper to checks if provided route is an OpenAI route


Returns:
    - True: if route is an OpenAI route
    - False: if route is not an OpenAI route
T{r   patternz	/bedrock/z/vertex-ai/z/gemini/z/cohere/z
/langfuse/z/anthropic/z/azure/F)r   openai_routesr*   anthropic_routesr   _route_matches_pattern)r   openai_routes     rB   r(   RouteChecks.is_llm_api_route   s     M//555M22888 *77==L l"55 6     > %E!5 E!rE   rR   c                 x    [         R                  " SSU5      nSU S3n[         R                  " X5      (       a  gg)a@  
Check if route matches the pattern placed in proxy/_types.py

Example:
- pattern: "/threads/{thread_id}"
- route: "/threads/thread_49EIN5QF32s4mH20M7GFKdlZ"
- returns: True


- pattern: "/key/{token_id}/regenerate"
- route: "/key/regenerate/82akk800000000jjsk"
- returns: False, pattern is "/key/{token_id}/regenerate"
z	\{[^}]+\}z[^/]+^$TF)resubmatchrQ   s     rB   rU   "RouteChecks._route_matches_pattern   s8     &&x9gYa.88G##rE   r"   c                 F   ^  T U;   =(       d    [        U 4S jU 5       5      $ )z
Check if a route has access by checking both exact matches and patterns

Args:
    route (str): The route to check
    allowed_routes (list): List of allowed routes/patterns

Returns:
    bool: True if route is allowed, False otherwise
c              3   L   >#    U  H  n[         R                  TUS 9v   M     g7f)rQ   N)r   rU   ).0allowed_router   s     rB   	<genexpr>1RouteChecks.check_route_access.<locals>.<genexpr>   s(      .
!/ ..UM.R!/s   !$)anyr!   s   ` rB   r3   RouteChecks.check_route_access   s+     & 
# .
!/.
 +
 	
rE    N)__name__
__module____qualname____firstlineno__staticmethodr   r
   r   strr   r   r6   rC   r'   boolr(   rU   r   r3   __static_attributes__rg   rE   rB   r   r      s    p,-p-.p p 	p
 $p p p pd S    * * * *X c C D  * 
# 
tCy 
T 
 
rE   r   )r[   typingr   r   fastapir   r   r   litellm._loggingr   litellm.proxy._typesr	   r
   r   r   r   auth_checks_organizationr   r   rg   rE   rB   <module>ru      s/    	 ! 2 2 1  9X
 X
rE   