o
    ùT·j=  ã                   @  s‚  U d dl mZ d dlZd dl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mZmZmZ d dlZddlmZ ddlmZmZ dd	lmZmZmZ dd
lmZ dZdZdZ dddœZ!G dd„ de	ƒZ"G dd„ de	ƒZ#e#Z$de%d< G dd„ de	ƒZ&ede#e&ƒZ'ddœdAd!d"„Z(	#dBdCd&d'„Z)	(dDdddd)d*dd+œdEd6d7„Z*	8dFd*dd9œdGd;d<„Z+G d=d>„ d>ee' ƒZ,G d?d@„ d@e,e# ƒZ-dS )Hé    )ÚannotationsN)ÚAnyÚGenericÚTypeVarÚCallableÚ	TypedDictÚcast)ÚPath)ÚLiteralÚ	TypeAliasÚNotRequiredÚoverrideé   )Úis_dict)ÚDefaultHttpx2ClientÚ_loaded_legacy_httpx)Ú
OAuthErrorÚOpenAIErrorÚSubjectTokenProviderError)Ú	to_threadz/urn:ietf:params:oauth:grant-type:token-exchangez#https://auth.openai.com/oauth/tokeni°  z$urn:ietf:params:oauth:token-type:jwtz)urn:ietf:params:oauth:token-type:id_token)ÚjwtÚidc                   @  s   e Zd ZU ded< ded< dS )ÚSubjectTokenProviderzLiteral['jwt', 'id']Ú
token_typezCallable[[], str]Ú	get_tokenN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r   r   úX/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/openai/auth/_workload.pyr      s   
 r   c                   @  s8   e Zd ZU dZded< 	 ded< 	 ded< 	 ded< d	S )
ÚWorkloadIdentityz(Identity provider resource id in WIFAPI.ÚstrÚidentity_provider_idÚservice_account_idr   ÚproviderúNotRequired[float]Úrefresh_buffer_secondsN©r   r   r   Ú__doc__r   r   r   r   r    r!      s   
 r!   r   ÚSubjectTokenWorkloadIdentityc                   @  s2   e Zd ZU dZded< ded< ded< ded< d	S )
ÚX509WorkloadIdentityzJAuthenticate with the client certificate configured on the HTTP transport.zLiteral['x509']Útyper"   r#   r$   r&   r'   Nr(   r   r   r   r    r+   1   s   
 r+   Ú_WorkloadIdentityT)r'   r#   r"   r$   r'   úfloat | NoneÚreturnc                 C  s    d| |dœ}|dur||d< |S )zHConfigure X.509 workload identity without handling certificate material.Úx509)r,   r#   r$   Nr'   r   )r#   r$   r'   Úidentityr   r   r    Úx509_workload_identity=   s   ýr2   ú3/var/run/secrets/kubernetes.io/serviceaccount/tokenÚtoken_file_pathú
str | Pathc                   s   d‡ fdd„}d|dœS )	aK  
    Get a subject token provider for Kubernetes clusters with Workload Identity configured.

    Cloud providers typically mount the subject token as a file in the container.

    Args:
        token_file_path: path to the mounted service account token file. Defaults to `/var/run/secrets/kubernetes.io/serviceaccount/token`.
    r/   r"   c               
     s†   z+t ˆ dƒ�} |  ¡  ¡ }|stdˆ › d�ƒ‚|W  d   ƒ W S 1 s$w   Y  W d S  tyB } ztdˆ › d|› �ƒ|‚d }~ww )NÚrzThe token file at z
 is empty.z!Failed to read the token file at z: )ÚopenÚreadÚstripr   Ú	Exception)ÚfÚtokenÚe©r4   r   r    r   Z   s   (ü€ÿz5k8s_service_account_token_provider.<locals>.get_tokenr   ©r   r   N©r/   r"   r   )r4   r   r   r>   r    Ú"k8s_service_account_token_providerN   s   

rA   úhttps://management.azure.com/z
2018-02-01ç      $@)Ú	object_idÚ	client_idÚ
msi_res_idÚapi_versionÚtimeoutÚhttp_clientÚresourcerD   ú
str | NonerE   rF   rG   rH   ÚfloatrI   úhttpx2.Client | Nonec                  s$   d‡ ‡‡‡‡‡‡fdd„}d|dœS )	a�  
    Get a subject token provider for Azure Managed Identities.

    See: https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http

    Args:
        resource: the resource URI to request a token for. Defaults to `https://management.azure.com/` (Azure Resource Manager).
        object_id: the object ID of the managed identity to use, when multiple are assigned.
        client_id: the client ID of the managed identity to use, when multiple are assigned.
        msi_res_id: the ARM resource ID of the managed identity to use, when multiple are assigned.
        api_version: the Azure IMDS API version. Defaults to `2018-02-01`.
        timeout: the request timeout in seconds. Defaults to 10.0.
        http_client: optional httpx2.Client instance to use for requests. If not provided, a new client will be created for each request.
    r/   r"   c               
     s  zrd} ˆ ˆdœ}ˆd urˆ|d< ˆd urˆ|d< ˆd ur ˆ|d< ˆd ur0ˆj | |ddiˆd�}nt ¡ �}|j | |ddiˆd�}W d   ƒ n1 sJw   Y  |jr\td	|j› �|d
�‚| ¡ }|  d¡}|smtd|d
�‚tt|ƒW S  t	y† } ztd|› �ƒ|‚d }~ww )Nz5http://169.254.169.254/metadata/identity/oauth2/token)zapi-versionrJ   rD   rE   rF   ÚMetadataÚtrue©ÚparamsÚheadersrH   z4Failed to fetch Azure subject token from IMDS: HTTP ©ÚresponseÚaccess_tokenz3Azure IMDS response did not include an access_tokenz/Failed to fetch Azure subject token from IMDS: )
ÚgetÚhttpx2ÚClientÚis_errorr   Ústatus_codeÚjsonr   r"   r:   )ÚurlrQ   rT   ÚclientÚdatar<   r=   ©rG   rE   rI   rF   rD   rJ   rH   r   r    r   €   s<   

ÿ
þ
ÿ€ÿz8azure_managed_identity_token_provider.<locals>.get_tokenr   r?   Nr@   r   )rJ   rD   rE   rF   rG   rH   rI   r   r   r_   r    Ú%azure_managed_identity_token_providerg   s   
 r`   úhttps://api.openai.com/v1)rH   rI   Úaudiencec                  s   d‡ ‡‡fdd„}d|dœS )	a6  
    Get a subject token provider for GCP VM instances using the instance metadata server.

    See: https://cloud.google.com/compute/docs/instances/verifying-instance-identity

    Args:
        audience: the unique URI agreed upon by both the instance and the system verifying
            the instance's identity. Defaults to `https://api.openai.com/v1`.
        timeout: the request timeout in seconds. Defaults to 10.0.
        http_client: optional httpx2.Client instance to use for requests. If not provided, a new client will be created for each request.
    r/   r"   c               
     sÎ   zRd} dˆ i}ˆd urˆj | |ddiˆd�}nt ¡ �}|j | |ddiˆd�}W d   ƒ n1 s1w   Y  |jrCtd|j› �|d�‚|j ¡ }|sPtd|d�‚|W S  tyf } ztd	|› �ƒ|‚d }~ww )
Nz]http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identityrb   zMetadata-FlavorÚGooglerP   z=Failed to fetch GCP subject token from metadata server: HTTP rS   z+GCP metadata server returned an empty tokenz8Failed to fetch GCP subject token from metadata server: )	rV   rW   rX   rY   r   rZ   Útextr9   r:   )r\   rQ   rT   r]   r<   r=   ©rb   rI   rH   r   r    r   µ   s*   
ÿ
þ
€ÿz(gcp_id_token_provider.<locals>.get_tokenr   r?   Nr@   r   )rb   rH   rI   r   r   re   r    Úgcp_id_token_provider£   s   
rf   c                   @  s¬   e Zd Zeddœd5dd„Zd6dd„Zd6dd„Zd7d8dd„Zd9dd„Zd:dd„Z	d;dd„Z
d<d d!„Zd=d%d&„Zd>d'd(„Zd>d)d*„Zd>d+d,„Zd?d-d.„Zd@d1d2„ZdAd3d4„ZdS )BÚ_WorkloadIdentityAuthT©Útoken_exchange_urlÚ_use_httpx2Úworkload_identityr-   ri   r"   rj   Úboolr/   ÚNonec                C  sL   || _ || _|| _d | _d | _d | _d | _d| _t 	¡ | _
t | j
¡| _d S ©NF)rk   ri   rj   Ú_follow_redirectsÚ_cached_tokenÚ"_cached_token_expires_at_monotonicÚ"_cached_token_refresh_at_monotonicÚ_refreshingÚ	threadingÚLockÚ_lockÚ	ConditionÚ
_condition©Úselfrk   ri   rj   r   r   r    Ú__init__Ð   s   
z_WorkloadIdentityAuth.__init__c                 C  sÀ  | j �X | jr|  ¡ r| j ¡  | jr|  ¡ s|  ¡ s,|  ¡ s,tt| jƒW  d   ƒ S | jrQ| jr:| j ¡  | js2| j}|  ¡ rEt	dƒ‚tt|ƒW  d   ƒ S d| _W d   ƒ n1 s^w   Y  z`|  
¡  | j �2 |  ¡ rtt	dƒ‚tt| jƒW  d   ƒ W | j � d| _| j ¡  W d   ƒ S 1 s—w   Y  S 1 s w   Y  W | j � d| _| j ¡  W d   ƒ d S 1 s½w   Y  d S | j � d| _| j ¡  W d   ƒ w 1 sÚw   Y  w )Nz)Token is unusable after refresh completedTF)rv   rs   Ú_token_unusablerx   ÚwaitÚ_needs_refreshr   r"   rp   ÚRuntimeErrorÚ_perform_refreshÚ
notify_all©rz   r<   r   r   r    r   ã   sJ   
ÿ
û
ÿóñ
ýþû*þþz_WorkloadIdentityAuth.get_tokenc                 Ã  s   �t | jƒI d H S ©N)r   r   ©rz   r   r   r    Úget_token_async   s   €z%_WorkloadIdentityAuth.get_token_asyncNr<   rK   c                 C  sb   | j �$ |d ur| j|kr	 W d   ƒ d S d | _d | _d | _W d   ƒ d S 1 s*w   Y  d S rƒ   )rv   rp   rq   rr   r‚   r   r   r    Úinvalidate_token  s   þ"ûz&_WorkloadIdentityAuth.invalidate_tokenc                 C  s   |   ¡ }|  |¡ d S rƒ   )Ú_fetch_token_from_exchangeÚ_store_token)rz   Ú
token_datar   r   r    r€     s   z&_WorkloadIdentityAuth._perform_refreshr‰   údict[str, Any]c                 C  s`   t  ¡ }|d }| j� |d | _|| | _||  |¡ | _W d   ƒ d S 1 s)w   Y  d S )NÚ
expires_inrU   )ÚtimeÚ	monotonicrv   rp   rq   Ú_refresh_delay_secondsrr   )rz   r‰   Únowr‹   r   r   r    rˆ     s   

"ýz"_WorkloadIdentityAuth._store_tokenc                 C  s   t dƒ‚)Nz>Workload identity authentication must implement token exchange)ÚNotImplementedErrorr„   r   r   r    r‡     s   z0_WorkloadIdentityAuth._fetch_token_from_exchangerT   úhttpx2.Responsec                 C  s´   z|j r| ¡ nd }W n ty   d }Y nw |jdv r"t||d�‚|jrR|d u r-tdƒ‚t|ƒs5tdƒ‚| d¡}| d¡}t	|t
ƒrF|sJtdƒ‚||  |¡dœS td	|j› �ƒ‚)
N)i�  i‘  i“  )rT   Úbodyz4Token exchange succeeded but response body was emptyz@Token exchange succeeded but response body was not a JSON objectrU   r‹   z<Token exchange response did not include a valid access_token)rU   r‹   z"Token exchange failed with status )Úcontentr[   Ú
ValueErrorrZ   r   Ú
is_successr   r   rV   Ú
isinstancer"   Ú_validate_expires_in)rz   rT   r’   rU   r‹   r   r   r    Ú_handle_token_response  s(   ÿ



ÿz,_WorkloadIdentityAuth._handle_token_responser‹   ÚobjectrL   c                 C  s   t |ttfƒstdƒ‚t|ƒS )Nz:Token exchange response did not include a valid expires_in)r–   ÚintrL   r   )rz   r‹   r   r   r    r—   3  s   z*_WorkloadIdentityAuth._validate_expires_inc                 C  s   | j d u p|  ¡ S rƒ   )rp   Ú_token_expiredr„   r   r   r    r|   8  s   z%_WorkloadIdentityAuth._token_unusablec                 C  ó   | j d u rdS t ¡ | j kS )NT)rq   rŒ   r�   r„   r   r   r    r›   ;  ó   
z$_WorkloadIdentityAuth._token_expiredc                 C  rœ   rn   )rr   rŒ   r�   r„   r   r   r    r~   @  r�   z$_WorkloadIdentityAuth._needs_refreshc                 C  s*   | j  dt¡}t||d ƒ}t|| dƒS )Nr'   r   g        )rk   rV   ÚDEFAULT_REFRESH_BUFFER_SECONDSÚminÚmax)rz   r‹   Úconfigured_bufferÚeffective_bufferr   r   r    rŽ   E  s   z,_WorkloadIdentityAuth._refresh_delay_secondsÚrequestúhttpx2.Requestc                 C  ó   ~dS )ú>Preserve the established subject-token request retry behavior.Tr   ©rz   r£   r   r   r    Ú_can_retry_requestJ  s   z(_WorkloadIdentityAuth._can_retry_requestc                 C  r¥   )r¦   Nr   r§   r   r   r    Ú_prepare_retry_requestO  s   z,_WorkloadIdentityAuth._prepare_retry_request)rk   r-   ri   r"   rj   rl   r/   rm   r@   rƒ   )r<   rK   r/   rm   )r/   rm   )r‰   rŠ   r/   rm   ©r/   rŠ   )rT   r‘   r/   rŠ   )r‹   r™   r/   rL   )r/   rl   )r‹   rL   r/   rL   )r£   r¤   r/   rl   )r£   r¤   r/   rm   )r   r   r   ÚDEFAULT_TOKEN_EXCHANGE_URLr{   r   r…   r†   r€   rˆ   r‡   r˜   r—   r|   r›   r~   rŽ   r¨   r©   r   r   r   r    rg   Ï   s$    û




	






rg   c                      s>   e Zd Zeddœd‡ fdd„Zeddd„ƒZddd„Z‡  ZS )ÚWorkloadIdentityAuthTrh   rk   r!   ri   r"   rj   rl   r/   rm   c                  s   t ƒ j|||d� d S )N)rk   ri   rj   )Úsuperr{   ry   ©Ú	__class__r   r    r{   U  s
   
ýzWorkloadIdentityAuth.__init__rŠ   c              	   C  sÌ   |   ¡ }| jd d }t |¡}|d u r#td|›dd t ¡ ¡› �ƒ‚| js)tƒ nd }|d ur3| 	¡ nt
dd�}|�"}|j| jt||| jd | jd	 d
œdd�}|  |¡W  d   ƒ S 1 s_w   Y  d S )Nr%   r   zUnsupported token type: z. Supported types: z, F)Úfollow_redirectsr#   r$   )Ú
grant_typeÚsubject_tokenÚsubject_token_typer#   r$   rC   )r[   rH   )Ú_get_subject_tokenrk   ÚSUBJECT_TOKEN_TYPESrV   r   ÚjoinÚkeysrj   r   rX   r   Úpostri   ÚTOKEN_EXCHANGE_GRANT_TYPEr˜   )rz   r²   r   r³   Úlegacy_httpxÚexchange_clientr]   rT   r   r   r    r‡   b  s.   
ÿÿû÷$ôz/WorkloadIdentityAuth._fetch_token_from_exchangec                 C  s$   | j d }|d ƒ }|stdƒ‚|S )Nr%   r   z>The workload identity provider returned an empty subject token)rk   r   )rz   r%   r²   r   r   r    r´   ~  s
   

z'WorkloadIdentityAuth._get_subject_token)rk   r!   ri   r"   rj   rl   r/   rm   rª   r@   )	r   r   r   r«   r{   r   r‡   r´   Ú__classcell__r   r   r®   r    r¬   T  s    ûr¬   )r#   r"   r$   r"   r'   r.   r/   r+   )r3   )r4   r5   r/   r   )rB   )rJ   r"   rD   rK   rE   rK   rF   rK   rG   r"   rH   rL   rI   rM   r/   r   )ra   )rb   r"   rH   rL   rI   rM   r/   r   ).Ú
__future__r   rŒ   rt   Útypingr   r   r   r   r   r   Úpathlibr	   Útyping_extensionsr
   r   r   r   rW   Ú_utilsr   Ú_httpx2r   r   Ú_exceptionsr   r   r   Ú_utils._syncr   r¹   r«   rž   rµ   r   r!   r*   r   r+   r-   r2   rA   r`   rf   rg   r¬   r   r   r   r    Ú<module>   sV     þ	üÿÿø=ÿü, 