
    g0&                     x    d dl Z d dlmZmZ d dlmZmZmZ d dlm	Z	 d dl
mZmZmZmZmZ ddlmZ  G d d	      Zy)
    N)ListOptional)HTTPExceptionRequeststatus)verbose_proxy_logger)CommonProxyErrorsLiteLLM_UserTableLiteLLMRoutesLitellmUserRolesUserAPIKeyAuth   )_user_is_org_adminc                       e Zd Zedee   dee   dedede	dede
fd       Zedefd	       Zeded
efd       Zeded
efd       Zededed
efd       Zededee   d
efd       Zy)RouteChecksuser_obj
_user_rolerouterequestvalid_tokenapi_keyrequest_datac                    t         j                  |       t         j                  |      ry|t        j                  j
                  v r|dk(  ry|dk(  r|j                  }|j                  d      }t        j                  d| d|j                          |rR||j                  k7  rBt        t        j                  dj                  ||j                              |d	k(  ry|d
k(  ryyyy|t        j                  j
                  v rt!        |dd      dt!        |dg       v ry|t"        j$                  j
                  k(  rt         j                  |      rt        t        j                  d|       t         j'                  |t        j(                  j
                        r{|dk(  rS|st+        |t,              rb|j/                         }	|	D ]+  }
|
dvst        t        j                  d| d| d|
 d       yt        t        j                  d| d|       yyy|t"        j0                  j
                  k(  r0t         j'                  |t        j2                  j
                        ryt5        ||       r0t         j'                  |t        j6                  j
                        ry|t"        j8                  j
                  k(  r0t         j'                  |t        j:                  j
                        ryt         j'                  |t        j<                  j
                        ryd}d}|  | j>                  xs d}| j                  xs d}tA        d| d| d|       )zO
        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               T/var/www/openai/venv/lib/python3.12/site-packages/litellm/proxy/auth/route_checks.py$non_proxy_admin_allowed_routes_checkz0RouteChecks.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|T4R*6*;*;*=%4E$,FF&3060I0I-Z[eZffz  |A  {B  B_  `e  _f  fS  ,T'" !" &5 ($*$=$=!NzlZnotnuv  5S/, *88>>>..M,N,N,T,T /  %8
,,(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                     ddl m}m} d|v r[|dur1t        j                  dt
        j                  j                          y | |d   v rt        t        j                  d|  d      y )	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_serverrF   rG   r   errorr	   not_premium_userr*   r   r   r.   )r   rF   rG   s      rB   r'   z)RouteChecks.custom_admin_only_route_check   s    M"224'$**\]n]]  ^F  ^F  ]G  H ()<==# & 9 9J5'Qhi  	rD   returnc                 p   | t         j                  j                  v ry| t         j                  j                  v ryt         j                  j                  D ]   }d|v st        j                  | |      s  y t        j                  |       ryd| v ryd| v ryd| v ryd| v ryd	| v ryd
| v ryd| v ryd| v ryy)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   patternr   z	/bedrock/z/vertex-ai/z/gemini/z/cohere/z
/langfuse/z/anthropic/z/azure/z/openai/F)r   openai_routesr*   anthropic_routesr   _route_matches_pattern_is_azure_openai_route)r   openai_routes     rB   r(   zRouteChecks.is_llm_api_route   s     M//555M22888 *77==L l"55 6    > --E-: %E!5 E!rD   c                 f    d}d}t        j                  ||       st        j                  ||       ryy)z
        Check if route is a route from AzureOpenAI SDK client

        eg.
        route='/openai/deployments/vertex_ai/gemini-1.5-flash/chat/completions'
        z2^/openai/deployments/[^/]+/[^/]+/chat/completions$z!^/engines/[^/]+/chat/completions$TF)rematch)r   deployment_patternengine_patterns      rB   rT   z"RouteChecks._is_azure_openai_route   s2     S=88&."((>52QrD   rP   c                 l    t        j                  dd|      }d| d}t        j                  ||       ryy)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)rW   subrX   rO   s     rB   rS   z"RouteChecks._route_matches_pattern   s7     &&x9gYa.88GU#rD   r"   c                 8      |v xs t         fd|D              S )a%  
        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   K   | ]  }t         j                  |         yw)rO   N)r   rS   ).0allowed_router   s     rB   	<genexpr>z1RouteChecks.check_route_access.<locals>.<genexpr>   s)      .
!/ ..UM.R!/s   !$)anyr!   s   ` rB   r3   zRouteChecks.check_route_access   s+     & 
# .
!/.
 +
 	
rD   N)__name__
__module____qualname__staticmethodr   r
   r   strr   r   r6   rC   r'   boolr(   rT   rS   r   r3    rD   rB   r   r      s"   p,-p-.p p 	p
 $p p p pd S    / / / /b c d   c C D  * 
# 
tCy 
T 
 
rD   r   )rW   typingr   r   fastapir   r   r   litellm._loggingr   litellm.proxy._typesr	   r
   r   r   r   auth_checks_organizationr   r   rk   rD   rB   <module>rq      s/    	 ! 2 2 1  9m
 m
rD   