
    3i                      .   S SK r S SKrS SKrS SKrS SKrS SKrS SKJr  S SKJ	r	J
r
JrJrJrJr  S SKJr  S SKJr  S SKrS SKJrJrJrJrJr  S SKJr  S SKJr  S S	KJrJ r   \" S
5      r!\ RD                  " \#5      r$/ SQr% " S S\&\5      r'\(" \RR                  \RT                  -   \RV                  -   5      r,S\&SS4S jr-\'R\                  R^                  \'R`                  R^                  /r1S\&SS4S jr2 " S S\5      r3 " S S\5      r4 " S S\5      r5g)    N)Enum)castDictListOptional	TypedDictTypeVar)override)	SecretStr)ServerAuthenticationProviderClientAuthProviderClientAuthHeadersUserIdentity	AuthError)System)ChromaAuthError)OpenTelemetryGranularitytrace_methodT)!TokenAuthenticationServerProviderTokenAuthClientProviderTokenTransportHeaderc                        \ rS rSrSrSrSrSrg)r   (   z&
Accceptable token transport headers.
AuthorizationzX-Chroma-Token N)__name__
__module____qualname____firstlineno____doc__AUTHORIZATIONX_CHROMA_TOKEN__static_attributes__r       \/home/james-whalen/.local/lib/python3.13/site-packages/chromadb/auth/token_authn/__init__.pyr   r   (   s     $M%Nr%   r   tokenreturnc                 ^    [        U 5      n[        S U 5       5      (       d  [        S5      eg )Nc              3   2   #    U  H  o[         ;   v   M     g 7f)N)valid_token_chars).0cs     r&   	<genexpr>_check_token.<locals>.<genexpr>:   s     9y!%%ys   zHInvalid token. Must contain only ASCII letters, digits, and punctuation.)strall
ValueError)r'   	token_strs     r&   _check_tokenr4   8   s1    E
I9y999V
 	
 :r%   token_headerc                 B    U [         ;  a  [        SU  S[          35      eg )Nz Invalid token transport header: z. Must be one of )allowed_token_headersr2   )r5   s    r&   _check_allowed_token_headersr8   F   s4    00.|n =346
 	
 1r%   c                   P   ^  \ rS rSrSrS\SS4U 4S jjr\S\4S j5       r	Sr
U =r$ )	r   N   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U ]  U5        UR                  U l        UR                  R	                  S5        [        [        UR                  R                  5      5      U l        [        U R                  R                  5       5        UR                  R                  (       aD  [        UR                  R                  5        [        UR                  R                  5      U l        g [        R                  U l        g )Nchroma_client_auth_credentials)super__init__settings	_settingsrequirer   r0   r=   _tokenr4   get_secret_value"chroma_auth_token_transport_headerr8   r   _token_transport_headerr"   )selfr;   	__class__s     r&   r?    TokenAuthClientProvider.__init__V   s      @AFOO$R$R STT[[1134??==(BB ,@BB,D( ,@+M+MD(r%   c                     U R                   R                  5       nU R                  [        R                  :X  a  SU 3nU R                  R
                  [        U5      0$ )NBearer )rC   rD   rF   r   r"   valuer   )rG   vals     r&   authenticate$TokenAuthClientProvider.authenticateh   sS    kk**,''+?+M+MMC5/C((..	#
 	
r%   )rA   rC   rF   )r   r   r   r    r!   r   r?   r
   r   rN   r$   __classcell__rH   s   @r&   r   r   N   s:    Nv N$ N$ 
/ 
 
r%   r   c                   d    \ rS rSr% Sr\\S'   \\S'   \\   \S'   \\\      \S'   \\   \S'   Sr	g	)
Userr   z
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tokensr   N)
r   r   r   r    r!   r0   __annotations__r   r   r$   r   r%   r&   rS   rS   r   s6     	G
ISMS	""Ir%   rS   c                      ^  \ rS rSrSrS\SS4U 4S jjr\" S\R                  5      \
S\\\4   S\4S	 j5       5       rS
rU =r$ )r      ay  
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.
r;   r(   Nc                   > [         TU ]  U5        UR                  U l        UR                  R                  (       aD  [        UR                  R                  5        [        UR                  R                  5      U l        O[        R                  U l        0 U l	        U R                  5       n[        U5      S:X  a#  [        SSS/SUS   /S9U R                  US   '   g [        [        [           [        R                   " SR#                  U5      5      S   5      U l        U R$                   H  nSU;  a  ['        S	5      eS
U;  a  SUS
'   SU;  a  S/US'   US    Hb  n[)        U5        X@R                  ;   a7  U R                  U   U:w  a$  ['        SU SUS    SU R                  U    35      eX0R                  U'   Md     M     g )N   	anonymous*r   )rU   rW   rX   rV   rY   
usersrY   zUser missing tokensrW   rX   zToken z+ already in use: wanted to use it for user rU   z! but it's already in use by user )r>   r?   r@   rA   rE   r8   r   rF   r"   _token_user_mappingread_creds_or_creds_filelenrS   r   r   yaml	safe_loadjoin_usersr2   r4   )rG   r;   credsuserr'   rH   s        r&   r?   *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#5550074?$  (  $T
| ,  $ 8 8 ?@B 
 37((/ (  r%   z.TokenAuthenticationServerProvider.authenticateheadersc           	      n    U R                   R                  R                  5       UR                  5       ;  a#  [	        SU R                   R                   S35      eXR                   R                  R                  5          nU R                   [
        R                  :X  a9  UR                  S5      (       d  [	        S5      e[        R                  " SSU5      nUR                  5       n[        U5        X R                  ;  a  [	        S5      e[        U R                  U   S   U R                  U   S	   U R                  U   S
   S9nU$ ! [         a+  n[        R                  S[!        U5       35         S nAOS nAf["         ax  n[$        R&                  " UR(                  5      nUS   nUR*                  nUR,                  n[        R                  S[/        U5      R0                   SU SU 35         S nAOS nAff = f[2        R4                  " [6        R8                  " SS5      5        [;        5       e)NzAuthorization header 'z' not foundrK   z(Bearer not found in Authorization headerz^Bearer  z%Invalid credentials: Token not found}rU   rW   rX   )user_idrW   rX   z7TokenAuthenticationServerProvider.authenticate failed: zNTokenAuthenticationServerProvider.authenticate failed: Failed to authenticate z at :gMbP?g{Gzt?)rF   rL   lowerkeysr   r   r"   
startswithresubstripr4   rc   r   loggerdebugrepr	Exception	traceback
extract_tb__traceback__linenofilenametyper   timesleeprandomuniformr   )	rG   rm   r'   user_identityetblast_call_stackline_numberr   s	            r&   authenticate_or_raise7TokenAuthenticationServerProvider.authenticate_or_raise   s   
$	++11779O,T-I-I-O-O,PP[\  88>>DDFGE++/C/Q/QQ''	22#$NOO{B6KKME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
 

G?!E::G?A.G::G?)rA   rF   rc   ri   )r   r   r   r    r!   r   r?   r   r   ALLr
   r   r0   r   r   r$   rP   rQ   s   @r&   r   r      sa    .7v .7$ .7` 8:R:V:V ) T#s(^ )  )  ) r%   r   )6loggingr   rv   stringr   r}   enumr   typingr   r   r   r   r   r	   	overridesr
   pydanticr   rf   chromadb.authr   r   r   r   r   chromadb.configr   chromadb.errorsr    chromadb.telemetry.opentelemetryr   r   r   	getLoggerr   ry   __all__r0   r   setdigitsascii_letterspunctuationr+   r4   r"   rL   r#   r7   r8   r   rS   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%   