Ë
    tPêjt   ã                   óp   — d dl Z d dlZd dlmZmZ d dlZd dlmZ d dlm	Z	m
Z
 d dlmZmZmZ  G d„ d«      Zy)é    N)ÚFinalÚcast)Úverbose_proxy_logger)Úget_async_httpx_clientÚhttpxSpecialProvider)ÚCommonProxyErrorsÚLitellmUserRolesÚUserAPIKeyAuthc                   ó  — e Zd ZdZedededz  dedz  defd„«       Zedededz  dedz  dee	eef   e	eef   f   fd	„«       Z
edede	eef   fd
„«       Zede	dedededeedz  edz  edz  f   f
d„«       Zededefd„«       Zy)ÚOauth2Handlerz*
    Handles OAuth2 token validation.
    Útoken_info_endpointÚoauth_client_idNÚoauth_client_secretÚreturnc                 ó>   — d| j                  «       v xr
 |duxr |duS )am  
        Determine if this is an introspection endpoint (requires POST) or token info endpoint (uses GET).

        Args:
            token_info_endpoint: The OAuth2 endpoint URL
            oauth_client_id: OAuth2 client ID
            oauth_client_secret: OAuth2 client secret

        Returns:
            bool: True if this is an introspection endpoint
        Ú
introspectN)Úlower©r   r   r   s      úd/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/auth/oauth2_check.pyÚ_is_introspection_endpointz(Oauth2Handler._is_introspection_endpoint   s5   € ð$ Ð/×5Ñ5Ó7Ð7ò 0Ø tÐ+ò0à#¨4Ð/ð	
ó    Útokenc                 ó´   — ddi}d| i}|rD|rBt        j                  |› d|› �j                  «       «      j                  «       }d|› �|d<   ||fS |r||d<   ||fS )aP  
        Prepare headers and data for OAuth2 introspection endpoint (RFC 7662).

        Args:
            token: The OAuth2 token to validate
            oauth_client_id: OAuth2 client ID
            oauth_client_secret: OAuth2 client secret

        Returns:
            Tuple of (headers, data) for the introspection request
        úContent-Typez!application/x-www-form-urlencodedr   ú:zBasic ÚAuthorizationÚ	client_id)Úbase64Ú	b64encodeÚencodeÚdecode)r   r   r   ÚheadersÚdataÚcredentialss         r   Ú_prepare_introspection_requestz,Oauth2Handler._prepare_introspection_request+   s‡   € ð" )Ð*MÐNˆØ Ð&ˆñ Ñ2ä!'×!1Ñ!1°_Ð4EÀQÐGZÐF[Ð2\×2cÑ2cÓ2eÓ!f×!mÑ!mÓ!oˆKØ)/°¨}Ð'=ˆG�OÑ$ð
 ˜ˆ}Ðñ	 à /ˆD�Ñà˜ˆ}Ðr   c                 ó   — d| › �ddœS )zÊ
        Prepare headers for generic token info endpoint.

        Args:
            token: The OAuth2 token to validate

        Returns:
            Dict of headers for the token info request
        zBearer zapplication/json)r   r   © ©r   s    r   Ú_prepare_token_info_requestz)Oauth2Handler._prepare_token_info_requestJ   s   € ð $+¨5¨'Ð!2ÐDVÑWÐWr   Úresponse_dataÚuser_id_field_nameÚuser_role_field_nameÚuser_team_id_field_namec                 ór   — | j                  |«      }| j                  |«      }| j                  |«      }|||fS )a‰  
        Extract user information from OAuth2 response.

        Args:
            response_data: The response data from OAuth2 endpoint
            user_id_field_name: Field name for user ID
            user_role_field_name: Field name for user role
            user_team_id_field_name: Field name for team ID

        Returns:
            Tuple of (user_id, user_role, user_team_id)
        )Úget)r*   r+   r,   r-   Úuser_idÚuser_team_idÚ	user_roles          r   Ú_extract_user_infoz Oauth2Handler._extract_user_infoW   sD   € ð& '×*Ñ*Ð+=Ó>ˆØ+×/Ñ/Ð0GÓHˆØ(×,Ñ,Ð-AÓBˆ	à˜	 <Ð/Ð/r   c           	   ƒ   óX  K  — ddl m} |dur&t        dt        j                  j
                  z   «      ‚t        j                  d| du«       t        j                  d«      }t        j                  j                  dd	«      }t        j                  j                  d
d«      }t        j                  j                  dd«      }t        j                  j                  d«      }t        j                  j                  d«      }|st        d«      ‚t        t        j                  ¬«      }t        j!                  |||¬«      }		 |	rMt        j                  d«       t        j#                  | ||¬«      \  }
}|j%                  ||
|¬«      ƒ d{  –—† }nFt        j                  d«       t        j'                  | ¬«      }
|j                  ||
¬«      ƒ d{  –—† }|j)                  «        |j+                  «       }t        j                  d| |«       |	r|j                  dd«      st        d«      ‚t        j-                  ||||¬«      \  }}}t/        | ||t1        t2        |«      ¬«      S 7 ŒÛ7 Œ–# t4        j6                  $ r}t        d|› �«      ‚d}~wt8        $ r}t        d|› �«      ‚d}~ww xY w­w) aB  
        Makes a request to the token introspection endpoint to validate the OAuth2 token.

        This function implements OAuth2 token introspection according to RFC 7662.
        It supports both generic token info endpoints (GET) and OAuth2 introspection endpoints (POST).

        Args:
            token (str): The OAuth2 token to validate.

        Returns:
            UserAPIKeyAuth: If the token is valid, containing user information.

        Raises:
            ValueError: If the token is invalid, the request fails, or the token info endpoint is not set.
        r   )Úpremium_userTz;Oauth2 token validation is only available for premium usersz*Oauth2 token validation for token=[set=%s]NÚOAUTH_TOKEN_INFO_ENDPOINTÚOAUTH_USER_ID_FIELD_NAMEÚsubÚOAUTH_USER_ROLE_FIELD_NAMEÚroleÚOAUTH_USER_TEAM_ID_FIELD_NAMEÚteam_idÚOAUTH_CLIENT_IDÚOAUTH_CLIENT_SECRETz9OAUTH_TOKEN_INFO_ENDPOINT environment variable is not set)Úllm_providerr   z*Using OAuth2 introspection endpoint (POST))r   r   r   )r"   r#   z'Using generic token info endpoint (GET)r(   )r"   z?Oauth2 token validation for token=%s, response from endpoint=%sÚactivezToken is not active)r*   r+   r,   r-   )Úapi_keyr<   r0   r2   z#Oauth 2.0 Token validation failed: z+An error occurred during token validation: )Úlitellm.proxy.proxy_serverr5   Ú
ValueErrorr   Únot_premium_userÚvaluer   ÚdebugÚosÚgetenvÚenvironr/   r   r   ÚOauth2Checkr   r   r%   Úpostr)   Úraise_for_statusÚjsonr3   r
   r   r	   ÚhttpxÚHTTPStatusErrorÚ	Exception)r   r5   r   r+   r,   r-   r   r   ÚclientÚis_introspection_endpointr"   r#   Úresponser0   r2   r1   Úes                    r   Úcheck_oauth2_tokenz Oauth2Handler.check_oauth2_tokenp   s•  è ø€ õ" 	<à˜tÑ#ÜØMÔPa×PrÑPr×PxÑPxÑxóð ô 	×"Ñ"Ð#OÐQVÐ^bÐQbÔcô &(§Y¡YÐ/JÓ%KÐÜ$&§J¡J§N¡NÐ3MÈuÓ$UÐÜ&(§j¡j§n¡nÐ5QÐSYÓ&ZÐÜ)+¯©¯©Ð8WÐYbÓ)cÐô "$§¡§¡Ð0AÓ!BˆÜ%'§Z¡Z§^¡^Ð4IÓ%JÐá"ÜÐXÓYÐYä.Ô<P×<\Ñ<\Ô]ˆô ,9×+SÑ+SØ 3Ø+Ø 3ð ,Tó ,
Ð!ð5	PÙ(ä$×*Ñ*Ð+WÔXä -× LÑ LØØ$3Ø(;ð !Mó !‘�˜ð "(§¡Ð-@È'ÐX\ Ó!]×]‘ô %×*Ñ*Ð+TÔUÜ'×CÑCÈ%ÐCÓP�Ø!'§¡Ð,?È Ó!Q×Q�ð ×%Ñ%Ô'ð —=‘=“?ˆDä ×&Ñ&ØQØØôñ )°·±¸(ÀDÔ1IÜ Ð!6Ó7Ð7ô 0=×/OÑ/OØ"Ø#5Ø%9Ø(?ð	 0Pó 0Ñ,ˆG�Y ô "ØØ$ØÜÔ/°Ó;ô	ð ð? ^øð
 Rùô@ ×$Ñ$ò 	HäÐBÀ1À#ÐFÓGÐGûÜò 	PäÐJÈ1È#ÐNÓOÐOûð	Püs]   ‚D;J*Ä>A	I' ÆI#ÆAI' ÇI%ÇBI' É"J*É#I' É%I' É'J'É:JÊJ'ÊJ"Ê"J'Ê'J*)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstaticmethodÚstrÚboolr   ÚtupleÚdictr%   r)   r3   r
   rU   r'   r   r   r   r      sS  „ ñð ð
Ø ð
à˜t™ð
ð ! 4™Zð
ð 
ò	
ó ð
ð, ðØðà˜t™ðð ! 4™Zðð 
ˆt�C˜�H‰~˜t C¨ H™~Ð-Ñ	.ò	ó ðð< ð
X¨3ð 
X°4¸¸S¸±>ò 
Xó ð
Xð ð0Øð0àð0ð "ð0ð "%ð	0ð
 
ˆs�T‰z˜3 ™: s¨T¡zÐ1Ñ	2ò0ó ð0ð0 ðdP¨ð dP°ò dPó ñdPr   r   )r   rG   Útypingr   r   rN   Úlitellm._loggingr   Ú&litellm.llms.custom_httpx.http_handlerr   r   Úlitellm.proxy._typesr   r	   r
   r   r'   r   r   ú<module>rc      s0   ðÛ Û 	ß ã å 1÷÷ UÑ T÷FPò FPr   