Ë
    lQê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 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© ó    úg/home/oem/CyberBrain26-unified/.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   è ø€ Ò9¨!ˆqÔ%Ô%Ñ9ùs   ‚zHInvalid token. Must contain only ASCII letters, digits, and punctuation.)ÚstrÚallÚ
ValueError)r$   Ú	token_strs     r#   Ú_check_tokenr0   8   s.   € Ü�E“
€IÜÑ9¨yÔ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Ü¤ F§O¡O×$RÑ$RÓ SÓTˆŒÜ�T—[‘[×1Ñ1Ó3Ô4à�?‰?×=Ò=Ü(Ø—‘×BÑBôô ,@Ø—‘×BÑBó,ˆDÕ(ô ,@×+MÑ+MˆDÕ(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   € à�k‰k×*Ñ*Ó,ˆØ×'Ñ'Ô+?×+MÑ+MÒMØ˜C˜5�/ˆ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Ø�S‰MÓØ˜˜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Ñ+MˆDÔ(à46ˆÔ Ø×-Ñ-Ó/ˆô ˆu‹:˜Š?Ü15ØØØ˜%Ø Ø˜a™�zô2ˆD×$Ñ$ U¨1¡XÑ.ð äœ4¤™:¤t§~¡~°d·i±iÀÓ6FÓ'GÈÑ'PÓQˆŒØ—K‘Kò 	7ˆDØ˜tÑ#Ü Ð!6Ó7Ð7Ø˜tÑ#Ø!$��X‘Ø $Ñ&Ø%( E��[Ñ!Ø˜h™ò 7�Ü˜UÔ#à˜T×5Ñ5Ñ5Ø×0Ñ0°Ñ7¸4Ò?ä$Ø   ð ( Ø $ T¡
˜|ð , Ø $× 8Ñ 8¸Ñ ?Ð@ðBóð ð
 37�×(Ñ(¨Ò/ñ7ñ	7r"   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 }~n†d }~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 ú:gü©ñÒMbP?g{®Gázt?)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Ð,PÐP[Ð\óð ð ˜D×8Ñ8×>Ñ>×DÑDÓFÑGˆEØ×+Ñ+Ô/C×/QÑ/QÒQØ×'Ñ'¨	Ô2Ü#Ð$NÓOÐOÜŸ™˜{¨B°Ó6�à—K‘K“MˆEÜ˜Ôà˜D×4Ñ4Ñ4ÜÐ GÓHÐHä(Ø×0Ñ0°Ñ7¸Ñ=Ø×/Ñ/°Ñ6°xÑ@Ø×2Ñ2°5Ñ9¸+ÑFôˆMð
 !Ð øÜò 	Ü�L‰LØIÌ$ÈqË'ÈÐS÷ñ ûô ò 		Ü×%Ñ% a§o¡oÓ6ˆBà  ™fˆOØ)×0Ñ0ˆKØ&×/Ñ/ˆHÜ�L‰Lð*Ü*.¨q«'×*:Ñ*:Ð);¸4À¸zÈÈ;È-ðY÷ñ ûð		úô 	�
‰
Ü�N‰N˜5 %Ó(ô	
ô ÓÐ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   ø„ ñð.7˜vð .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õ Ý Û ÷õ õ #Ý +÷ñ
 ˆCƒL€à	ˆ×	Ñ	˜8Ó	$€ò€ô
&˜3 ô 
&ñ ˜Ÿ™¨×(<Ñ(<Ñ<¸v×?QÑ?QÑQÓRÐ ð
˜ð 
 ó 
ð ×&Ñ&×,Ñ,Ø×'Ñ'×-Ñ-ðÐ ð
¨sð 
°tó 
ô!
Ð0ô !
ôHˆ9ô ôk Ð(Dõ k r"   