o
    pkjA                     @   s  d Z ddlmZmZ ddlZddlZddlZddlmZ ddl	Z	ddl
mZmZ ddlZddlmZ ddlmZmZ eeZdZed	Zed
Zdd Zdd ZeG dd dZdefddZG dd dejZdd Ze fdefddZ G dd deZ!dS )z5Mutual TLS for Google Compute Engine metadata server.    )	dataclassfieldN)Path)urlparse
urlunparse)HTTPAdapter)environment_vars
exceptionsntz#C:/ProgramData/Google/ComputeEnginez/run/google-mds-mtlsc                   C      t jtkr	td S td S )Nzmds-mtls-root.crtzroot.crtosname_WINDOWS_OS_NAME"_WINDOWS_MTLS_COMPONENTS_BASE_PATH_MTLS_COMPONENTS_BASE_PATH r   r   ^/home/djax/ivt_ai_plugin/venv/lib/python3.10/site-packages/google/auth/compute_engine/_mtls.py_get_mds_root_crt_path,      
r   c                   C   r   )Nzmds-mtls-client.keyz
client.keyr   r   r   r   r   "_get_mds_client_combined_cert_path3   r   r   c                   @   s2   e Zd ZU eedZeed< eedZ	eed< dS )MdsMtlsConfig)default_factoryca_cert_pathclient_combined_cert_pathN)
__name__
__module____qualname__r   r   r   r   __annotations__r   r   r   r   r   r   r   :   s   
 r   mds_mtls_configc                 C   s   t j| jot j| jS )z&Checks if the mTLS certificates exist.)r   pathexistsr   r   )r   r   r   r   _certs_existD   s   r"   c                   @   s   e Zd ZdZdZdZdZdS )MdsMtlsModeaG  MDS mTLS mode. Used to configure connection behavior when connecting to MDS.

    STRICT: Always use HTTPS/mTLS.  If certificates are not found locally, an error will be returned.
    NONE: Never use mTLS. Requests will use regular HTTP.
    DEFAULT: Use mTLS if certificates are found locally, otherwise use regular HTTP.
    strictnonedefaultN)r   r   r   __doc__STRICTNONEDEFAULTr   r   r   r   r#   K   s
    r#   c                  C   s6   t jtjd } zt| W S  ty   tdw )z7Parses the GCE_METADATA_MTLS_MODE environment variable.r%   zXInvalid value for GCE_METADATA_MTLS_MODE. Must be one of 'strict', 'none', or 'default'.)r   environgetr   GCE_METADATA_MTLS_MODElowerr#   
ValueError)mode_strr   r   r   _parse_mds_modeX   s   
r1   c                 C   s<   t  }|tjkrt| stddS |tjkrdS t| S )z:Determines if mTLS should be used for the metadata server.z+mTLS certificates not found in strict mode.TF)r1   r#   r(   r"   r	   MutualTLSChannelErrorr)   )r   moder   r   r   should_use_mds_mtlsc   s   

r4   c                       s\   e Zd ZdZe fdef fddZ fddZ fddZ fd	d
Z fddZ	  Z
S )MdsMtlsAdapterz7An HTTP adapter that uses mTLS for the metadata server.r   c                    sN   t  | _| jj|jd | jj|jdd t | _t	t
| j|i | d S )N)cafile )certfilepassword)sslcreate_default_contextssl_contextload_verify_locationsr   load_cert_chainr   r   _fallback_adaptersuperr5   __init__)selfr   argskwargs	__class__r   r   rA   u   s   
zMdsMtlsAdapter.__init__c                        | j |d< tt| j|i |S Nr<   )r<   r@   r5   init_poolmanagerrB   rC   rD   rE   r   r   rI         
zMdsMtlsAdapter.init_poolmanagerc                    rG   rH   )r<   r@   r5   proxy_manager_forrJ   rE   r   r   rL      rK   z MdsMtlsAdapter.proxy_manager_forc                    s   t  tjkrtt| j|fi |S ztt| j|fi |}|  |W S  tjt	j
jt	j
jt	j
jt	j
jfye } z&td| t|j}t|jdd}||_| jj|fi |W  Y d }~S d }~ww )NzcmTLS connection to Compute Engine Metadata server failed. Falling back to standard HTTP. Reason: %shttp)scheme)r1   r#   r(   r@   r5   sendraise_for_statusr:   SSLErrorrequestsr	   	HTTPErrorConnectionErrorTimeout_LOGGERwarningr   urlr   _replacer?   )rB   requestrD   responseeparsed_original_urlhttp_fallback_urlrE   r   r   rO      s.   
 zMdsMtlsAdapter.sendc                    s   | j   tt|   d S )N)r?   closer@   r5   )rB   rE   r   r   r_      s   
zMdsMtlsAdapter.close)r   r   r   r'   r   rA   rI   rL   rO   r_   __classcell__r   r   rE   r   r5   r   s    r5   )"r'   dataclassesr   r   enumloggingr   pathlibr   r:   urllib.parser   r   rR   requests.adaptersr   google.authr   r	   	getLoggerr   rV   r   r   r   r   r   r   r"   Enumr#   r1   r4   r5   r   r   r   r   <module>   s0   
	