o
    ưi,0                  
   @   s,  d Z ddlZddlZddlmZmZmZ ddlmZ ddl	Z	ddl
mZmZ ddlmZmZmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZ ddl m!Z! dee" de#e"e"f fddZ$G dd dZ%de"de"dee" dee de%f
ddZ&de%de'de(de!fddZ)dS )z
Login utilities for handling user authentication in the proxy server.

This module contains the core login logic that can be reused across different
login endpoints (e.g., /login and /v2/login).
    N)LiteralOptionalcast)HTTPException)LITELLM_PROXY_ADMIN_NAMELITELLM_UI_SESSION_DURATION)LiteLLM_UserTableLitellmUserRolesProxyErrorTypesProxyExceptionUpdateUserRequestUserAPIKeyAuth
hash_token)user_update)generate_key_helper_fn),get_disabled_non_admin_personal_key_creation)PrismaClientget_server_root_path)get_secret_bool)ReturnedUITokenObject
master_keyreturnc                 C   sV   t dd}t dd}|du r| durt| nd}|du r'tdtjddd||fS )aU  
    Get UI username and password from environment variables or master key.

    Args:
        master_key: Master key for the proxy (used as fallback for password)

    Returns:
        tuple[str, str]: A tuple containing (ui_username, ui_password)

    Raises:
        ProxyException: If neither UI_PASSWORD nor master_key is available
    ZUI_USERNAMEZadminZUI_PASSWORDNzset Proxy master key to use UI. https://docs.litellm.ai/docs/proxy/virtual_keys. If set, use `--detailed_debug` to debug issue.  messagetypeparamcode)osgetenvstrr   r
   
auth_error)r   ui_usernameui_password r$   U/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/auth/login_utils.pyget_ui_credentials%   s   r&   c                   @   sl   e Zd ZU dZeed< eed< ee ed< eed< ed ed< 	ddededee deded f
d	d
ZdS )LoginResultz8Result object containing authentication data from login.user_idkey
user_email	user_role)Zssousername_passwordlogin_methodr,   c                 C   s"   || _ || _|| _|| _|| _d S )Nr(   r)   r*   r+   r-   )selfr(   r)   r*   r+   r-   r$   r$   r%   __init__I   s
   
zLoginResult.__init__N)r,   )	__name__
__module____qualname____doc__r    __annotations__r   r   r0   r$   r$   r$   r%   r'   @   s&   
 r'   usernamepasswordprisma_clientc                    s  |du rt dtjdddt|\}}d}d}|dur1ttt |jjj	d| ddid	I dH }	 t
| d
|d
rt
|d
|d
rtj}t}t}	tdddur`tjd |ksd|tkrjtdt}	tt|	|dttjddI dH  tddurtd)dditjttjg i i d|	dd	I dH }
n	t dtjddd|
d }tdrddlm} d}|dur|}n|durt||g tjd}|du rtdddid||}t||d|ddS |durs	 t |d d!}t |d"tj!}t |dd!}t |d#d!}|du rt d$tjd#ddt"|d%}t
|d
|d
s.t
|d
|d
rgtddurNtd)ddi|ttjg i i d|dd	I dH }
n	t dtjddd|
d }t|||tt#|ddS t d&|  tjd'ddt d(tjd'dd)*ap  
    Authenticate a user and generate an API key for UI access.

    This function handles two login scenarios:
    1. Admin login using UI_USERNAME and UI_PASSWORD
    2. User login using email and password from database

    Args:
        username: Username or email from the login form
        password: Password from the login form
        master_key: Master key for the proxy (required)
        prisma_client: Prisma database client (optional)

    Returns:
        LoginResult: Object containing authentication data

    Raises:
        ProxyException: If authentication fails or required configuration is missing
    NzMaster Key not set for Proxy. Please set Master Key to use Admin UI. Set `LITELLM_MASTER_KEY` in .env or set general_settings:master_key in config.yaml.  https://docs.litellm.ai/docs/proxy/virtual_keys. If set, use `--detailed_debug` to debug issue.r   r   r   r*   Zinsensitive)equalsmode)wherezutf-8ZPROXY_ADMIN_ID)r(   r+   )r+   )dataZuser_api_key_dictZDATABASE_URLZrequest_typer)   r   zlitellm-dashboard)	r+   durationZkey_max_budgetmodelsaliasesconfigZspendr(   Zteam_idz_No Database connected. Set DATABASE_URL in .env. If set, use `--detailed_debug` to debug issue.tokenZEXPERIMENTAL_UI_LOGIN)ExperimentalUIJWTToken)r(   r+   r>   Z
max_budgeti  errorz6User Information is required for experimental UI login)status_codedetailr,   r.   r(   unknownr+   r7   zPUser has no password set. Please set a password for the user via `/user/update`.)rA   zAInvalid credentials used to access UI.
Not valid credentials for Zinvalid_credentialszVInvalid credentials used to access UI.
Check 'UI_USERNAME', 'UI_PASSWORD' in .env filer$   )$r   r
   r!   r&   r   r   r   dbZlitellm_usertableZ
find_firstsecretscompare_digestencoder	   ZPROXY_ADMINr   r   r   environr   r   r   r   r   litellmZmax_ui_session_budgetr   Zlitellm.proxy.auth.auth_checksrB   r   Z(get_experimental_ui_login_jwt_auth_tokenr'   getattrZINTERNAL_USER_VIEW_ONLYr   r    )r6   r7   r   r8   r"   r#   Z	_user_rowr+   r(   Zkey_user_idresponser)   rB   Z	user_infor*   Z	_passwordZhash_passwordr$   r$   r%   authenticate_userX   s2  	




rO   login_resultgeneral_settingspremium_userc                 C   s4   t  }t| j| j| j| j| j||dd|t d	S )aG  
    Create a ReturnedUITokenObject from a LoginResult.

    Args:
        login_result: The result from authenticate_user
        general_settings: General proxy settings dictionary
        premium_user: Whether premium features are enabled

    Returns:
        ReturnedUITokenObject: Token object ready for JWT encoding
    Zlitellm_key_header_nameAuthorization)	r(   r)   r*   r+   r-   rR   Zauth_header_name(disabled_non_admin_personal_key_creationZserver_root_path)	r   r   r(   r)   r*   r+   r-   getr   )rP   rQ   rR   rT   r$   r$   r%   create_ui_token_object6  s   rV   )*r4   r   rH   typingr   r   r   Zfastapir   rL   Zlitellm.constantsr   r   Zlitellm.proxy._typesr   r	   r
   r   r   r   r   Z:litellm.proxy.management_endpoints.internal_user_endpointsr   Z;litellm.proxy.management_endpoints.key_management_endpointsr   Z)litellm.proxy.management_endpoints.ui_ssor   Zlitellm.proxy.utilsr   r   Zlitellm.secret_managers.mainr   Zlitellm.types.proxy.ui_ssor   r    tupler&   r'   rO   dictboolrV   r$   r$   r$   r%   <module>   sJ    $	
 _