Ë
    tPêjº6  ã            
       ó¤  — d Z ddlZddlZddlmZmZmZ ddlmZmZm	Z	 ddl
Z
ddlmZ ddlZddlmZmZ ddlmZ ddl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"m#Z#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* de+de+de+ddfd„Z,de+dz  de-e+e+f   fd„Z. G d„ d«      Z/de+de+de+dz  de!dz  de/f
d„Z0de1fd„Z2de*de+de+fd„Z3de/d e4d!e5de*fd"„Z6y)#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)ÚdatetimeÚ	timedeltaÚtimezone)ÚFinalÚLiteralÚcast)ÚHTTPException)ÚLITELLM_PROXY_ADMIN_NAMEÚLITELLM_UI_SESSION_DURATION)Úduration_in_seconds)ÚLiteLLM_UserTableÚLitellmUserRolesÚProxyErrorTypesÚProxyExceptionÚUpdateUserRequestÚUserAPIKeyAuth)Úuser_update)Úgenerate_key_helper_fn)Ú,get_disabled_non_admin_personal_key_creation)ÚPrismaClientÚget_server_root_pathÚhash_passwordÚverify_password)ÚUserRepository)Úget_secret_bool)ÚReturnedUITokenObjectÚuser_idÚpasswordÚstoredÚreturnc              ƒ   ó¼   K  — |j                  d«      ryddlm} |�<t        |«      j                  j                  d| idt        |«      i¬«      ƒ d{  –—†  yy7 Œ­w)z>Rehash legacy password (SHA256) to scrypt on successful login.zscrypt:Nr   )Úprisma_clientr   r   )ÚwhereÚdata)Ú
startswithÚlitellm.proxy.proxy_serverr"   r   ÚtableÚupdater   )r   r   r   r"   s       úc/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/auth/login_utils.pyÚ_rehash_password_if_neededr*   -   sg   è ø€ à×Ñ˜Ô#ØÝ8àÐ Ü˜]Ó+×1Ñ1×8Ñ8Ø˜gÐ&Øœm¨HÓ5Ð6ð 9ó 
÷ 	
ñ 	
ð !ð	
ús   ‚AAÁAÁAÚ
master_keyc                 óÂ   — t        j                  dd«      }t        j                  dd«      }|€| �t        | «      nd}|€t        dt        j
                  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
    ÚUI_USERNAMEÚadminÚ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_passwords      r)   Úget_ui_credentialsr<   :   so   € ô Ÿ™ =°'Ó:€KÜ—)‘)˜M¨4Ó0€KØÐØ)3Ð)?”c˜*”oÀTˆØÐÜð VÜ ×+Ñ+ØØô	
ð 	
ð ˜Ð#Ð#ó    c                   ó|   — e Zd ZU dZeed<   eed<   edz  ed<   eed<   ed   ed<   	 d
dedededz  deded   f
d	„Zy)ÚLoginResultz8Result object containing authentication data from login.r   ÚkeyNÚ
user_emailÚ	user_role)ÚssoÚusername_passwordÚlogin_methodc                 óJ   — || _         || _        || _        || _        || _        y )N©r   r@   rA   rB   rE   )Úselfr   r@   rA   rB   rE   s         r)   Ú__init__zLoginResult.__init__^   s(   € ð ˆŒØˆŒØ$ˆŒØ"ˆŒØ(ˆÕr=   )rD   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r8   Ú__annotations__r   rI   © r=   r)   r?   r?   U   so   … ÙBàƒLØ	ƒHØ�d‘
ÓØƒNØÐ4Ñ5Ó5ð =Pñ)àð)ð ð)ð ˜$‘Jð	)ð
 ð)ð Ð8Ñ9ô)r=   r?   Úusernamer"   c              ƒ   ó”  K  — |€t        dt        j                  dd¬«      ‚t        |«      \  }}d}d}|�Ct	        t
        dz  t        |«      j                  j                  d| ddœi¬	«      ƒ d{  –—† «      }	 t        j                  | j                  d
«      |j                  d
«      «      �r¸t        j                  |j                  d
«      |j                  d
«      «      �rƒt        j                  }t        }t        }	t        j                   dd«      �t        j"                  d   |k(  s	|t        k(  rt        j                   dt        «      }	t%        t'        |	|¬«      t)        t        j                  ¬«      ¬«      ƒ d{  –—†  t        j                   d«      �@t+        d(ddit        j                  t,        t.        j0                  g i i d|	ddœ	¤Žƒ d{  –—† }
nt        dt        j                  dd¬«      ‚|
d   }t3        d«      rNddlm} d}|�|}n|�t        ||g t.        j0                  ¬«      }|€t9        dddi¬«      ‚|j;                  |«      }t=        ||d|d¬«      S |��4	 t?        |d d!«      }t?        |d"t        j@                  «      }t?        |dd!«      }t?        |d#d!«      }|€t        d$t        j                  d#d¬«      ‚tC        ||«      r¦tE        |jF                  ||«      ƒ d{  –—†  t        j                   d«      �2t+        d(ddi|t,        t.        j0                  g i i d|ddœ	¤Žƒ d{  –—† }
nt        dt        j                  dd¬«      ‚|
d   }t=        |||t	        tH        |«      d¬«      S t        d%| › �t        j                  d&d¬«      ‚t        d't        j                  d&d¬«      ‚7 �ŒK7 �Œ<7 �Œë7 ŒÑ7 Œ�­w))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
    NzùMaster 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+   r0   r1   rA   Úinsensitive)ÚequalsÚmode)r#   zutf-8ÚPROXY_ADMIN_ID)r   rB   )rB   )r$   Úuser_api_key_dictÚDATABASE_URLÚrequest_typer@   r   zlitellm-dashboard)	rB   ÚdurationÚkey_max_budgetÚmodelsÚaliasesÚconfigÚspendr   Úteam_idz_No Database connected. Set DATABASE_URL in .env. If set, use `--detailed_debug` to debug issue.ÚtokenÚEXPERIMENTAL_UI_LOGIN)ÚExperimentalUIJWTToken)r   rB   r[   Ú
max_budgeti‘  Úerrorz6User Information is required for experimental UI login)Ústatus_codeÚdetailrD   rG   r   ÚunknownrB   r   zPUser has no password set. Please set a password for the user via `/user/update`.zAInvalid credentials used to access UI.
Not valid credentials for Úinvalid_credentialszVInvalid credentials used to access UI.
Check 'UI_USERNAME', 'UI_PASSWORD' in .env filerO   )%r   r   r9   r<   r   r   r   r'   Ú
find_firstÚsecretsÚcompare_digestÚencoder   ÚPROXY_ADMINr
   r6   r7   Úenvironr   r   r   r   r   ÚlitellmÚmax_ui_session_budgetr   Úlitellm.proxy.auth.auth_checksrb   r	   Ú(get_experimental_ui_login_jwt_auth_tokenr?   ÚgetattrÚINTERNAL_USER_VIEW_ONLYr   r*   r   r8   )rP   r   r+   r"   r:   r;   Ú	_user_rowrB   r   Úkey_user_idÚresponser@   rb   Ú	user_inforA   Ú	_passwords                   r)   Úauthenticate_userrz   m   s8  è ø€ ð2 ÐÜð PÜ ×+Ñ+ØØô	
ð 	
ô  2°*Ó=Ñ€K�ð +/€Ið 	ð ð Ð ÜÜ Ñ$Ü  Ó/×5Ñ5×@Ñ@Ø#°À-Ñ%PÐQð Aó ÷ ó
ˆ	ðô
 ×Ñ˜hŸo™o¨gÓ6¸×8JÑ8JÈ7Ó8SÕTÔY`×YoÑYoØ�‰˜Ó  +×"4Ñ"4°WÓ"=õZô %×0Ñ0ˆ	Ü*ˆô /ˆä�I‰IÐ&¨Ó-Ð9¼b¿j¹jÐIYÑ>ZÐ^eÒ>eØÔ0Ò0äŸ)™)Ð$4Ô6NÓOˆKô
 Ü"Ø#Ø#ôô -Ü*×6Ñ6ôô
÷ 	
ð 	
ô �9‰9�^Ó$Ð0Ü3ñ Ø"ðô "2×!=Ñ!=Ü ;Ü&-×&CÑ&CØ Ø!Ø ØØ*Ø2ñ
ñ÷ ‰Hô !ØyÜ$×/Ñ/Ø$Øô	ð ð �wÑˆäÐ2Ô3ÝMà26ˆIØÐ$Ø%‘	ØÐ$Ü-Ø#Ø'ØÜ&×<Ñ<ô	�	ð Ð Ü#Ø #Ø#Ð%]Ð^ôð ð
 )×QÑQÐR[Ó\ˆCäØØØØØ,ô
ð 	
ð 
Ñ	ð	ô
 ˜) Y°	Ó:ˆÜ˜I {Ô4D×4\Ñ4\Ó]ˆ	Ü# I¨|¸YÓGˆ
Ü" 9¨j¸)ÓDˆ	àÐÜ ØjÜ$×/Ñ/Ø Øô	ð ô ˜8 YÔ/Ü,¨Y×->Ñ->ÀÈ)ÓT×TÐTÜ�y‰y˜Ó(Ð4Ü!7ñ "Ø!&ð"ð &/Ü$?Ü*1×*GÑ*GØ"$Ø#%Ø"$Ø!"Ø#*Ø#6ñ
ñ"÷ ‘ô %Ø}Ü(×3Ñ3Ø(Øô	ð ð ˜7Ñ#ˆCäØØØ%Üœs IÓ.Ø0ôð ô !Ø\Ð]eÐ\fÐgÜ$×/Ñ/Ø+Øô	ð ô ØmÜ ×+Ñ+Ø'Øô	
ð 	
ðsùð8	
ùðùðR Uøðús_   ‚A.OÁ0N;
Á1DOÆN>ÆAOÇOÇDOË2OË3AOÌ8OÌ9BOÎ>OÏOÏOÏOc                  ó®   — t        t        «      } t        t        j                  t
        j                  «      t        | ¬«      z   j                  «       «      S )a±  The ``exp`` claim (unix seconds) for a UI session cookie, ``LITELLM_UI_SESSION_DURATION``
    from now. The virtual key sealed inside the cookie already expires after this same
    duration; stamping the JWT itself gives the cookie the bounded lifetime the dashboard's
    client-side expiry check and the server-side session-cookie readers both assume, instead
    of a token that stays signature-valid until the master key rotates.)Úseconds)	r   r   Úintr   Únowr   Úutcr   Ú	timestamp)Úttl_secondss    r)   Ú_ui_session_exp_timestampr‚   @  s:   € ô -Ô-HÓI€KÜ”—‘œXŸ\™\Ó*¬Y¸{Ô-KÑK×VÑVÓXÓYÐYr=   Úreturned_ui_token_objectc                 ón   — i t        t        | «      ¥dt        «       i¥}t        j                  ||d¬«      S )aÎ  Encode a UI session cookie JWT with a bounded ``exp``.

    The single choke point every UI login path (SSO and username/password /login, /v2,
    /v3) uses to mint the ``token`` cookie, so the cookie's lifetime is set in exactly one
    place and cannot drift between paths. Without the ``exp`` the cookie is valid until the
    master key rotates, and the session-cookie readers that require a bounded lifetime
    (the MCP interactive sign-in) reject it.
    ÚexpÚHS256)Ú	algorithm)r   Údictr‚   Újwtrl   )rƒ   r+   Úclaimss      r)   Úencode_ui_session_jwtr‹   J  s5   € ð a”tœDÐ":Ó;Ð`¸UÔD]ÓD_Ñ`€FÜ�:‰:�f˜j°GÔ<Ð<r=   Úlogin_resultÚgeneral_settingsÚpremium_userc                 óÒ   — t        «       }t        | j                  | j                  | j                  | j
                  | j                  ||j                  dd«      |t        «       ¬«	      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
    Úlitellm_key_header_nameÚAuthorization)	r   r@   rA   rB   rE   rŽ   Úauth_header_nameÚ(disabled_non_admin_personal_key_creationÚserver_root_path)	r   r   r   r@   rA   rB   rE   Úgetr   )rŒ   r�   rŽ   r“   s       r)   Úcreate_ui_token_objectr–   W  se   € ô  7cÓ6dÐ,ä Ø×$Ñ$Ø×ÑØ×*Ñ*Ø×(Ñ(Ø!×.Ñ.Ø!Ø)×-Ñ-Ð.GÈÓYØ1YÜ-Ó/ô
ð 
r=   )7rM   r6   rj   r   r   r   Útypingr   r   r   r‰   Úfastapir	   ro   Úlitellm.constantsr
   r   Ú*litellm.litellm_core_utils.duration_parserr   Úlitellm.proxy._typesr   r   r   r   r   r   Ú:litellm.proxy.management_endpoints.internal_user_endpointsr   Ú;litellm.proxy.management_endpoints.key_management_endpointsr   Ú)litellm.proxy.management_endpoints.ui_ssor   Úlitellm.proxy.utilsr   r   r   r   Ú$litellm.repositories.user_repositoryr   Úlitellm.secret_managers.mainr   Úlitellm.types.proxy.ui_ssor   r8   r*   Útupler<   r?   rz   r}   r‚   r‹   rˆ   Úboolr–   rO   r=   r)   ú<module>r¥      s?  ðñó 
Û ß 2Ñ 2ß 'Ñ 'ã 
Ý !ã ß SÝ J÷÷ õ Sõõ÷ó õ @Ý 8Ý <ð

¨cð 

¸Sð 

È#ð 

ÐRVó 

ð$ 3¨¡:ð $°%¸¸S¸±/ó $÷6)ñ )ð0P
ØðP
àðP
ð �d‘
ðP
ð   $Ñ&ð	P
ð
 óP
ðfZ 3ó Zð
=Ð4Ið 
=ÐWZð 
=Ð_bó 
=ðØðàðð ðð ô	r=   