
    _j                         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 j"        e#          Z$g dZ% G d de&e          Z' e(ej)        ej*        z   ej+        z             Z,de&ddfdZ-e'j.        j/        e'j0        j/        gZ1de&ddfdZ2 G d de          Z3 G d de          Z4 G d de          Z5dS )    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dS )r   z.
    Accceptable token transport headers.
    AuthorizationzX-Chroma-TokenN)__name__
__module____qualname____doc__AUTHORIZATIONX_CHROMA_TOKEN     _/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/chromadb/auth/token_authn/__init__.pyr   r   (   s$          $M%NNNr"   r   tokenreturnc                 t    t          |           }t          d |D                       st          d          d S )Nc              3   (   K   | ]}|t           v V  d S )N)valid_token_chars).0cs     r#   	<genexpr>z_check_token.<locals>.<genexpr>:   s(      99!q%%999999r"   zHInvalid token. Must contain only ASCII letters, digits, and punctuation.)strall
ValueError)r$   	token_strs     r#   _check_tokenr0   8   sK    E

I99y99999 
V
 
 	

 
r"   token_headerc                 L    | t           vrt          d|  dt                      d S )Nz Invalid token transport header: z. Must be one of )allowed_token_headersr.   )r1   s    r#   _check_allowed_token_headersr4   F   sF    0006| 6 636 6
 
 	
 10r"   c                   H     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                            d           t          t          |j        j                            | _        t          | j        
                                           |j        j        r9t          |j        j                   t          |j        j                  | _        d S t          j        | _        d S )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AAFO$R S STTT[1133444?= 	N(B   ,@B, ,D((( ,@+MD(((r"   c                     | 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   sM    k**,,'+?+MMM!C//C(.	#
 	
r"   )
r   r   r   r   r   r:   r
   r   rH   __classcell__rC   s   @r#   r   r   N   s         Nv N$ N N N N N N$ 
/ 
 
 
 X
 
 
 
 
r"   r   c                   v    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<   dS )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   se           	GGG
III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                    t                                          |           |j        | _        |j        j        r8t          |j        j                   t          |j        j                  | _        nt          j        | _        i | _	        | 
                                }t          |          dk    r,t          dddgd|d         g          | j	        |d         <   d S t          t          t                   t          j        d                    |                    d                   | _        | j        D ]}d|vrt'          d	          d
|vrd|d
<   d|vrdg|d<   |d         D ]^}t)          |           || j	        v r:| j	        |         |k    r)t'          d| d|d          d| j	        |                    || j	        |<   _d S )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      ?= 	N(B   ,@B, ,D(( ,@+MD(46 --// u::??15% az2 2 2D$U1X. F4:t~dii6F6F'G'G'PQQK 	7 	7Dt## !6777t##!$X$&&%(E[!h 7 7U###T555074??$B B B $T
B B $ 8 ?B B  
 37(//7	7 	7r"   z.TokenAuthenticationServerProvider.authenticateheadersc           	      d   	 | j         j                                        |                                vrt	          d| j         j         d          || j         j                                                 }| j         t
          j        k    r:|                    d          st	          d          t          j	        dd|          }|
                                }t          |           || j        vrt	          d          t          | j        |         d         | j        |         d	         | j        |         d
                   }|S # t          $ r4}t                              dt!          |                      Y d }~n~d }~wt"          $ rn}t%          j        |j                  }|d         }|j        }|j        }t                              dt/          |          j         d| d|            Y d }~nd }~ww xY wt3          j        t7          j        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7799OO\T-I-O\\\   D8>DDFFGE+/C/QQQ''	22 P#$NOOO{B66KKMMED444 GHHH(07=/6x@259+F  M
 !  	 	 	LLS$q''SS         		 		 		%ao66B fO)0K&/HLLY*.q''*:Y Y@HY YKVY Y       		 	
N5%((	
 	
 	
 s%   EE 
G:*E??G:A$G55G:)r   r   r   r   r   r:   r   r   ALLr
   r   r,   r   r   rI   rJ   s   @r#   r   r      s         .7v .7$ .7 .7 .7 .7 .7 .7` \8:R:V  ) T#s(^ )  )  )  )  X )  )  )  )  ) 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 A A A A A A A A A A A A A A                           # " " " " " + + + + + +       
 GCLL		8	$	$  
& 
& 
& 
& 
&3 
& 
& 
& C(<<v?QQRR 
 
 
 
 
 
 &,'- 
s 
t 
 
 
 
!
 !
 !
 !
 !
0 !
 !
 !
H    9   k  k  k  k  k (D k  k  k  k  k r"   