o
    >Bii                     @   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   `/var/www/html/Trade-python/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_mtlse   s   

r4   c                       sP   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  Z	S )MdsMtlsAdapterz7An HTTP adapter that uses mTLS for the metadata server.r   c                    sD   t  | _| jj|jd | jj|jd tt| j	|i | d S )N)cafile)certfile)
sslcreate_default_contextssl_contextload_verify_locationsr   load_cert_chainr   superr5   __init__)selfr   argskwargs	__class__r   r   r>   w   s   
zMdsMtlsAdapter.__init__c                        | j |d< tt| j|i |S Nr:   )r:   r=   r5   init_poolmanagerr?   r@   rA   rB   r   r   rF         
zMdsMtlsAdapter.init_poolmanagerc                    rD   rE   )r:   r=   r5   proxy_manager_forrG   rB   r   r   rI      rH   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fya } z(td| t|j}t|jdd}||_t }|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_statusr8   SSLErrorrequestsr	   	HTTPError_LOGGERwarningr   urlr   _replacer   )r?   requestrA   responseeparsed_original_urlhttp_fallback_urlhttp_adapterrB   r   r   rL      s,   
zMdsMtlsAdapter.send)
r   r   r   r'   r   r>   rF   rI   rL   __classcell__r   r   rB   r   r5   t   s    
r5   )"r'   dataclassesr   r   enumloggingr   pathlibr   r8   urllib.parser   r   rO   requests.adaptersr   google.authr   r	   	getLoggerr   rQ   r   r   r   r   r   r   r"   Enumr#   r1   r4   r5   r   r   r   r   <module>   s0   
	