o
    RDi                     @  s   d dl mZ d dlZd dlZd dlmZmZ ejrd dlm	Z	 ddl
mZ ddlmZmZmZ dd	lmZmZ eG d
d deZG dd deZdS )    )annotationsN)Enumunique)SnowflakeConnection   )WORKLOAD_IDENTITY_AUTHENTICATOR)AttestationProviderWorkloadIdentityAttestationcreate_attestation   )AuthByPluginAuthTypec                   @  s.   e Zd ZdZdZdZdZdZedd	d
Z	dS )ApiFederatedAuthenticationTypez4An API-specific enum of the WIF authentication type.AWSAZUREGCPOIDCattestationr	   returnc                 C  sZ   | j tjkr	tjS | j tjkrtjS | j tjkrtjS | j tjkr$tjS td| j  d)a  Maps the internal / driver-specific attestation providers to API authenticator types.

        The AttestationProvider is related to how the driver fetches the credential, while the API authenticator
        type is related to how the credential is verified. In most current cases these may be the same, though
        in the future we could have, for example, multiple AttestationProviders that all fetch an OIDC ID token.
        zUnknown attestation provider '')providerr   r   r   r   r   r   
ValueErrorr    r   c/var/www/Datamplify/venv/lib/python3.10/site-packages/snowflake/connector/auth/workload_identity.pyfrom_attestation   s   
z/ApiFederatedAuthenticationType.from_attestationN)r   r	   r   r   )
__name__
__module____qualname____doc__r   r   r   r   staticmethodr   r   r   r   r   r      s    r   c                      sn   e Zd ZdZdddddd$ fddZd%ddZd&ddZd'ddZd(ddZd)dd Z	e
d*d"d#Z  ZS )+AuthByWorkloadIdentityz-Plugin to authenticate via workload identity.N)r   tokenentra_resourceimpersonation_pathr   AttestationProvider | Noner"   
str | Noner#   r$   list[str] | Noner   Nonec                  s4   t  jdi | || _|| _|| _|| _d | _d S )Nr   )super__init__r   r"   r#   r$   r   )selfr   r"   r#   r$   kwargs	__class__r   r   r*   4   s   	
zAuthByWorkloadIdentity.__init__r   c                 C  s   t jS N)r   WORKLOAD_IDENTITYr+   r   r   r   type_E   s   zAuthByWorkloadIdentity.type_c                 C  s
   d | _ d S r/   r   r1   r   r   r   reset_secretsH   s   
z$AuthByWorkloadIdentity.reset_secretsbodydict[typing.Any, typing.Any]c                 C  sT   t |d d< t| jj|d d< | jj|d d< t| jpg |d di d< d S )NdataAUTHENTICATORPROVIDERTOKENCLIENT_ENVIRONMENT+WORKLOAD_IDENTITY_IMPERSONATION_PATH_LENGTH)	r   r   r   r   value
credentiallenr$   
setdefault)r+   r4   r   r   r   update_bodyK   s   
z"AuthByWorkloadIdentity.update_bodyconnSnowflakeConnection | Noner,   
typing.Anyc                K  s2   t | j| j| j| j|r|jjddndd| _dS )zFetch the token.r   )max_retriesN)session_manager)r
   r   r#   r"   r$   _session_managercloner   )r+   rA   r,   r   r   r   prepareU   s   zAuthByWorkloadIdentity.preparedict[str, bool]c                 K  s   ddiS )zThis is only relevant for AuthByIdToken, which uses a web-browser based flow. All other auth plugins just call authenticate() again.successFr   )r+   r,   r   r   r   reauthenticatec   s   z%AuthByWorkloadIdentity.reauthenticatestrc                 C  s0   | j sdS | j j}| j jj|d< tj|dddS )zKReturns the CSP provider name and an identifier. Used for logging purposes. 	_providerT),:)	sort_keys
separators)r   user_identifier_componentsr   r<   jsondumps)r+   
propertiesr   r   r   assertion_contentg   s
   z(AuthByWorkloadIdentity.assertion_content)
r   r%   r"   r&   r#   r&   r$   r'   r   r(   )r   r   )r   r(   )r4   r5   r   r(   )rA   rB   r,   rC   r   r(   )r,   rC   r   rI   )r   rL   )r   r   r   r   r*   r2   r3   r@   rH   rK   propertyrW   __classcell__r   r   r-   r   r!   1   s    





r!   )
__future__r   rT   typingenumr   r   TYPE_CHECKINGsnowflake.connector.connectionr   networkr   wif_utilr   r	   r
   	by_pluginr   r   r   r!   r   r   r   r   <module>   s    