
    ug                      *   d dl Z d dlZd dlZd dlZd dlZd dl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Zd dl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m Z   ed
      Z! e jD                  e#      Z$g dZ% G d de&e      Z' e(ejR                  ejT                  z   ejV                  z         Z,de&ddfdZ-e'j\                  j^                  e'j`                  j^                  gZ1de&ddfdZ2 G d de      Z3 G d de      Z4 G d de      Z5y)    N)Enum)castDictListOptional	TypedDictTypeVar)override)	SecretStr)ServerAuthenticationProviderClientAuthProviderClientAuthHeadersUserIdentity	AuthError)System)ChromaAuthError)OpenTelemetryGranularitytrace_methodT)!TokenAuthenticationServerProviderTokenAuthClientProviderTokenTransportHeaderc                       e Zd ZdZdZdZy)r   z.
    Accceptable token transport headers.
    AuthorizationzX-Chroma-TokenN)__name__
__module____qualname____doc__AUTHORIZATIONX_CHROMA_TOKEN     W/var/www/openai/venv/lib/python3.12/site-packages/chromadb/auth/token_authn/__init__.pyr   r   (   s     $M%Nr"   r   tokenreturnc                 T    t        |       }t        d |D              st        d      y )Nc              3   ,   K   | ]  }|t         v   y w)N)valid_token_chars).0cs     r#   	<genexpr>z_check_token.<locals>.<genexpr>:   s     9y!q%%ys   zHInvalid token. Must contain only ASCII letters, digits, and punctuation.)strall
ValueError)r$   	token_strs     r#   _check_tokenr0   8   s.    E
I9y99V
 	
 :r"   token_headerc                 >    | t         vrt        d|  dt                y )Nz Invalid token transport header: z. Must be one of )allowed_token_headersr.   )r1   s    r#   _check_allowed_token_headersr4   F   s4    00.|n =346
 	
 1r"   c                   B     e Zd ZdZdeddf fdZedefd       Z xZ	S )r   z
    Client auth provider for token-based auth. Header key will be either
    "Authorization" or "X-Chroma-Token" depending on
    `chroma_auth_token_transport_header`. If the header is "Authorization",
    the token is passed as a bearer token.
    systemr%   Nc                    t         |   |       |j                  | _        |j                  j	                  d       t        t        |j                  j                              | _        t        | j                  j                                |j                  j                  rDt        |j                  j                         t        |j                  j                        | _        y t        j                  | _        y )Nchroma_client_auth_credentials)super__init__settings	_settingsrequirer   r,   r8   _tokenr0   get_secret_value"chroma_auth_token_transport_headerr4   r   _token_transport_headerr   )selfr6   	__class__s     r#   r:   z TokenAuthClientProvider.__init__V   s      @AFOO$R$R STT[[1134??==(BB ,@BB,D( ,@+M+MD(r"   c                     | j                   j                         }| j                  t        j                  k(  rd| }| j                  j
                  t        |      iS )NBearer )r>   r?   rA   r   r   valuer   )rB   vals     r#   authenticatez$TokenAuthClientProvider.authenticateh   sS    kk**,''+?+M+MMC5/C((..	#
 	
r"   )
r   r   r   r   r   r:   r
   r   rH   __classcell__rC   s   @r#   r   r   N   s:    Nv N$ N$ 
/ 
 
r"   r   c                   \    e Zd ZU dZeed<   eed<   ee   ed<   eee      ed<   ee   ed<   y)Userz
    A simple User class for use in this module only. If you need a generic
    way to represent a User, please use UserIdentity as this class keeps
    track of sensitive tokens.
    idroletenant	databasestokensN)r   r   r   r   r,   __annotations__r   r   r!   r"   r#   rL   rL   r   s6     	G
ISMS	""Ir"   rL   c                   |     e Zd ZdZdeddf fdZ edej                        e	de
eef   defd              Z xZS )	r   a  
    Server authentication provider for token-based auth. The provider will
    - On initialization, read the users from the file specified in
        `chroma_server_authn_credentials_file`. This file must be a well-formed
        YAML file with a top-level array called `users`. Each user must have
        an `id` field and a `tokens` (string array) field.
    - On each request, check the token in the header specified by
        `chroma_auth_token_transport_header`. If the configured header is
        "Authorization", the token is expected to be a bearer token.
    - If the token is valid, the server will return the user identity
        associated with the token.
    r6   r%   Nc                 r   t         |   |       |j                  | _        |j                  j                  rDt        |j                  j                         t        |j                  j                        | _        nt        j                  | _        i | _	        | j                         }t        |      dk(  r&t        dddgd|d   g      | j                  |d   <   y t        t        t           t        j                   dj#                  |            d         | _        | j$                  D ]  }d|vrt'        d	      d
|vrd|d
<   d|vrdg|d<   |d   D ]`  }t)        |       || j                  v r6| j                  |   |k7  r$t'        d| d|d    d| j                  |          || j                  |<   b  y )N   	anonymous*r   )rM   rO   rP   rN   rQ   
usersrQ   zUser missing tokensrO   rP   zToken z+ already in use: wanted to use it for user rM   z! but it's already in use by user )r9   r:   r;   r<   r@   r4   r   rA   r   _token_user_mappingread_creds_or_creds_filelenrL   r   r   yaml	safe_loadjoin_usersr.   r0   )rB   r6   credsuserr$   rC   s        r#   r:   z*TokenAuthenticationServerProvider.__init__   s    ??==(BB ,@BB,D( ,@+M+MD(46 --/ u:?15% az2D$$U1X. 4:t~~dii6F'G'PQKKDt# !677t#!$X$&%(E[!hU#T5550074?$  (  $T
| ,  $ 8 8 ?@B 
 37((/ (  r"   z.TokenAuthenticationServerProvider.authenticateheadersc           	      X   	 | j                   j                  j                         |j                         vr#t	        d| j                   j                   d      || j                   j                  j                            }| j                   t
        j                  k(  r3|j                  d      st	        d      t        j                  dd|      }|j                         }t        |       || j                  vrt	        d      t        | j                  |   d   | j                  |   d	   | j                  |   d
         }|S # t        $ r+}t        j                  dt!        |              Y d }~nd }~wt"        $ rw}t%        j&                  |j(                        }|d   }|j*                  }|j,                  }t        j                  dt/        |      j0                   d| d|        Y d }~nd }~ww xY wt3        j4                  t7        j8                  dd             t;               )NzAuthorization header 'z' not foundrE   z(Bearer not found in Authorization headerz^Bearer  z%Invalid credentials: Token not found}rM   rO   rP   )user_idrO   rP   z7TokenAuthenticationServerProvider.authenticate failed: zNTokenAuthenticationServerProvider.authenticate failed: Failed to authenticate z at :gMbP?g{Gzt?)rA   rF   lowerkeysr   r   r   
startswithresubstripr0   rZ   r   loggerdebugrepr	Exception	traceback
extract_tb__traceback__linenofilenametyper   timesleeprandomuniformr   )	rB   rc   r$   user_identityetblast_call_stackline_numberrw   s	            r#   authenticate_or_raisez7TokenAuthenticationServerProvider.authenticate_or_raise   s   
$	++11779O,T-I-I-O-O,PP[\  D88>>DDFGE++/C/Q/QQ''	2#$NOO{B6KKMED444 GHH(007=//6x@2259+FM
 !  	LLI$q'S   		%%aoo6B fO)00K&//HLL**.q'*:*:);4z;-Y 		 	

NN5%(	
 s%   EE 	G6!E33G6?A-G11G6)r   r   r   r   r   r:   r   r   ALLr
   r   r,   r   r   rI   rJ   s   @r#   r   r      sa    .7v .7$ .7` 8:R:V:V ) T#s(^ )  )  ) r"   r   )6loggingr{   rl   stringry   rs   enumr   typingr   r   r   r   r   r	   	overridesr
   pydanticr   r]   chromadb.authr   r   r   r   r   chromadb.configr   chromadb.errorsr    chromadb.telemetry.opentelemetryr   r   r   	getLoggerr   ro   __all__r,   r   setdigitsascii_letterspunctuationr(   r0   r   rF   r    r3   r4   r   rL   r   r!   r"   r#   <module>r      s     	     A A     # +
 CL			8	$
&3 
& (<(<<v?Q?QQR 
 
 
 &&,,''-- 
s 
t 
!
0 !
H9 k (D k r"   