o
    RDi[                     @  s  d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dlm	Z	 d dl
mZmZmZ d dlm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mZmZmZm Z m!Z! ddl"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.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z< ddl:m=Z> ddl:m?Z? ddl@mAZA ddlBmCZCmDZDmEZE ddlFmGZG ddlHmIZI ddlJmKZK erddlLmMZM eNeOZPdZQdZRdZSdZTdZUh d ZVG d!d" d"ZWd0d*d+ZXd1d.d/ZYdS )2    )annotationsN)datetimetimezone)Thread)TYPE_CHECKINGAnyCallable)default_backend)EncodingNoEncryptionPrivateFormatload_der_private_keyload_pem_private_key   )get_application_path)	urlencode)DAY_IN_SECONDSHTTP_HEADER_ACCEPTHTTP_HEADER_CONTENT_TYPEHTTP_HEADER_SERVICE_NAMEHTTP_HEADER_USER_AGENT"PARAMETER_CLIENT_REQUEST_MFA_TOKEN+PARAMETER_CLIENT_STORE_TEMPORARY_CREDENTIAL)COMPILERIMPLEMENTATIONOPERATING_SYSTEMPLATFORMPYTHON_VERSION)ER_FAILED_TO_CONNECT_TO_DB)BadGatewayErrorDatabaseErrorErrorForbiddenErrorProgrammingErrorServiceUnavailableError)!ACCEPT_TYPE_APPLICATION_SNOWFLAKECONTENT_TYPE_APPLICATION_JSON&ID_TOKEN_INVALID_LOGIN_REQUEST_GS_CODE"OAUTH_ACCESS_TOKEN_EXPIRED_GS_CODEPYTHON_CONNECTOR_USER_AGENTReauthenticationRequest)detect_platforms)BaseHttpConfig
HttpConfig)SessionManager)SessionManagerFactory)'SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED)
TokenCacheTokenKey	TokenType)VERSION   )
AuthNoAuth)AuthByOAuth)AuthByPluginznet.snowflake.temporary_token
temp_tokenzSNOWFLAKE-PYTHON-DRIVERID_TOKENMFATOKEN>	   
LOGIN_NAMEACCOUNT_NAMESVN_REVISIONAUTHENTICATORCLIENT_APP_IDCLIENT_APP_VERSIONCLIENT_ENVIRONMENTSESSION_PARAMETERSEXT_AUTHN_DUO_METHODc                   @  s   e Zd ZdZd>ddZe						d?d@ddZ										dAdBd)d*ZdCd.d/ZdDd1d2Z	dEd4d5Z
dFd7d8ZdGd9d:ZdHd<d=ZdS )IAuthzSnowflake Authenticator.returnNonec                 C  s   || _ d | _d S N)_rest_token_cache)selfrest rM   W/var/www/Datamplify/venv/lib/python3.10/site-packages/snowflake/connector/auth/_auth.py__init__^   s   
zAuth.__init__Nlogin_timeout
int | Nonenetwork_timeoutsocket_timeout"platform_detection_timeout_secondsfloat | Nonesession_managerSyncSessionManager | Nonehttp_configBaseHttpConfig | Nonec                 C  s~   |d ur|d u rt d	i | }tj|d}d||td || |t tttt	t
|j|t |||	t|
|jdddddiS )
N)configdata   r   )max_retries)rT   rV   )APPLICATIONAPPLICATION_PATHOS
OS_VERSIONr   PYTHON_RUNTIMEPYTHON_COMPILER	OCSP_MODECERT_REVOCATION_CHECK_MODETRACINGLOGIN_TIMEOUTNETWORK_TIMEOUTSOCKET_TIMEOUTr   )r@   rA   r>   r=   r<   rB   rM   )r-   to_base_dictr/   get_managerr4   r   r   r   r   r   r   nameloggergetEffectiveLevelr+   clone)useraccountapplicationinternal_application_nameinternal_application_version	ocsp_modecert_revocation_check_moderP   rR   rS   rT   rV   rX   sync_configrM   rM   rN   base_auth_datab   s:   
zAuth.base_auth_dataFauth_instancer8   rq   strrp   database
str | Noneschema	warehouserolepasscodepasscode_in_passwordboolmfa_callbackCallable[[], None] | Nonepassword_callbackCallable[[], str] | Nonesession_parametersdict[Any, Any] | Nonetimeoutdict[str, str | int | bool]c                   s  t d t tri S |d u r j}|d u ri }tt }tt	t
ttti}t|v r1|t |t< d}tj||| jjj| jjj| jjj| jj | jjj| jjj| jjj| jjj| jjj| jjjddd}t|}  | t d||||||| d|i}|d ur||d< |d ur||d	< |d ur||d
< |d ur||d< |d t!| }|	rd|d d< n|rd|d d< ||d d< |r||d d< t ddd |d " D  z| jj#||t$%| jd}W nC t&y } z|j'dj(| jj)| jj*t|dt+t,dd }~w t-t.fy) } z|j'dj(| jj)| jj*t|dt+t,dd }~ww |d r|d /ddv r|d /d|d< d|d d< di d| _0dK fd"d#}t1|| ||t$%|gd$}d%|_2|3  t4|
r|
 }| j0r~| j0/d&dkrt5| | j0r~| j0/d&dks~n|j6|d' | j0}|r|d r|d /dd(krt|}|d /d|d< | jj#||t$%| jd}ny|r|d r|d /d)st78| jjd t9d*j(| jj)| jj*|d& dt+t,d |S nL|d rA|d /dd+krAt4|rAt|}|d /d|d< ||d d,< t: d-r& j;nd |d d.< | |d d/< | jj#||t$%| jd}t d0 |d1 s|/d2t+}|t<krqd | j_=| >| jj)|t?j@ tAtB|d& tC|t,d|tDkrt tEstAtB|d& tC|t,dd3d4lFmG} t |rt d5t jHttIJtKjLjMd d6 d3d7lFmN} t |r| >| jj)|t?jO t78| jjd t9d8j(| jj)| jj*|d& dt+t,d d S t d9|d r|d /d)d urd:nd; t d<|d r|d /d=d urd:nd; t d>|d r|d /d?d urd:nd; t d@|d r4|d /dAd ur4d:nd; |d sFt78d d t7dBdCi | jjP|d /d)|d /d=|d /dD|d /d?|d /dAdE | Q| jj)||| |d rdF|d v r|d /dF| jj_R|d rdG|d v r|d /dG}|/d| jj_S|/d	| jj_T|/dH| jj_U|/d| jj_V|d rdI|d v r|WdJd |d /dID  | jjX| |S )LNauthenticatez/session/v1/login-requestF)use_pooling)rV   zQaccount=%s, user=%s, database=%s, schema=%s, warehouse=%s, role=%s, request_id=%s
request_iddatabaseName
schemaNamer~   roleName?r   r[   rD   PASSCODErC   zbody['data']: %sc                 S  s"   i | ]\}}||t v r|nd qS )******)$AUTHENTICATION_REQUEST_KEY_WHITELIST).0kvrM   rM   rN   
<dictcomp>   s    z%Auth.authenticate.<locals>.<dictcomp>rS   zUFailed to connect to DB. Verify the account name is correct: {host}:{port}. {message})hostportmessage)msgerrnosqlstatezIFailed to connect to DB. Service is unavailable: {host}:{port}. {message}
nextAction)EXT_AUTHN_DUO_ALLEXT_AUTHN_DUO_PUSH_N_PASSCODEinFlightCtxpushTimeout)r   r[   rF   rG   c                   s   | j j||| jd| _d S )Nr   )rI   _post_request_socket_timeoutret)rK   urlheadersbodyry   rM   rN   post_request_wrapper'  s   z/Auth.authenticate.<locals>.post_request_wrapper)targetargsTr   )r   EXT_AUTHN_SUCCESStokenzLFailed to connect to DB. MFA authentication failed: {host}:{port}. {message}
PWD_CHANGEr<   passwordPASSWORDCHOSEN_NEW_PASSWORDzcompleted authenticationsuccesscoder5   AuthByKeyPairzGJWT Token authentication failed. Token expires at: %s. Current Time: %s)tzinfo)AuthByUsrPwdMfaz1Failed to connect to DB: {host}:{port}. {message}z
token = %sr   NULLzmaster_token = %smasterTokenzid_token = %sidTokenzmfa_token = %smfaTokenr   zGThere is no data in the returning response, please retry the operation.masterValidityInSeconds)master_validity_in_secondsid_token	mfa_token	sessionIdsessionInfowarehouseName
parametersc                 S  s   i | ]	}|d  |d qS )rl   valuerM   )r   prM   rM   rN   r     s    rF   rG   )Yrm   debug
isinstancer6   r   rz   uuiduuid4r   r&   r   r%   r   r)   r   rE   rx   rI   _connectionrr   _internal_application_name_internal_application_version
_ocsp_moderv   rP   _network_timeoutr   rT   rV   ro   copydeepcopyupdate_bodyr   itemsr   jsondumpsr"   	__class__format_host_portr   r0   r$   r   getr   r   daemonstartcallablenextjoinr!   errorhandler_wrapperr    hasattrr   r'   r   _delete_temporary_credentialr3   r:   r*   r#   intr(   r7    r   _jwt_token_expr   nowr   utcreplacer   	MFA_TOKENupdate_tokenswrite_temporary_credentials_session_id	_database_schema
_warehouse_roleupdate_update_parameters)rK   ry   rq   rp   r{   r}   r~   r   r   r   r   r   r   r   r   r   r   body_templater   url_parametersr   errr   tcr   r   r   session_inforM   r   rN   r      s"  









 	








zAuth.authenticater   	cred_typer3   c                 C  s   |   t|||S rH   )get_token_cacheretriever2   rK   r   rp   r   rM   rM   rN   _read_temporary_credential  s   zAuth._read_temporary_credentialdict[str, Any]c                 C  sH   | tdr| ||tj| j_| tdr"| ||tj| j_	dS dS )a  Attempt to load cached credentials to skip interactive authentication.

        SSO (ID_TOKEN): If present, avoids opening browser for external authentication.
            Controlled by client_store_temporary_credential parameter.

        MFA (MFA_TOKEN): If present, skips MFA prompt on next connection.
            Controlled by client_request_mfa_token parameter.

        If cached tokens are expired/invalid, they're deleted and normal auth proceeds.
        FN)
r   r   r  r3   r:   rI   r   r   r   r   )rK   r   rp   r   rM   rM   rN   read_temporary_credentials  s   zAuth.read_temporary_credentialscredc                 C  s.   |s	t d d S |  t|||| d S )Nz=no credential is given when try to store temporary credential)rm   r   r   storer2   )rK   r   rp   r   r  rM   rM   rN   _write_temporary_credential  s   z Auth._write_temporary_credentialresponsec                 C  sd   | j jjjr|tdr| ||tj|d d |t	dr0| ||tj
|d d dS dS )aV  Cache credentials received from successful authentication for future use.

        Tokens are only cached if:
        1. Server returned the token in response (server-side caching must be enabled)
        2. Client has caching enabled via session parameters
        3. User consented to caching (consent_cache_id_token for ID tokens)
        Fr[   r   r   N)rI   r   
auth_classconsent_cache_id_tokenr   r   r  r3   r:   r   r   )rK   r   rp   r   r  rM   rM   rN   r   +  s   
z Auth.write_temporary_credentialsc                 C  s   |   t||| d S rH   )r   remover2   r   rM   rM   rN   r   H  s   z!Auth._delete_temporary_credentialr1   c                 C  s$   | j d u rtj| jjjd| _ | j S )N)skip_file_permissions_check)rJ   r1   makerI   r   #_unsafe_skip_file_permissions_check)rK   rM   rM   rN   r   M  s
   
zAuth.get_token_cacher   )NNNNNN)rP   rQ   rR   rQ   rS   rQ   rT   rU   rV   rW   rX   rY   )
NNNNNFNNNN)ry   r8   rq   rz   rp   rz   r{   r|   r}   r|   r~   r|   r   r|   r   r|   r   r   r   r   r   r   r   r   r   rQ   rF   r   )r   rz   rp   rz   r   r3   rF   r|   )r   rz   rp   rz   r   r  rF   rG   )
r   rz   rp   rz   r   r3   r  r|   rF   rG   )
r   rz   rp   rz   r   r  r  r  rF   rG   )r   rz   rp   rz   r   r3   rF   rG   )rF   r1   )__name__
__module____qualname____doc__rO   staticmethodrx   r   r  r  r  r   r   r   rM   rM   rM   rN   rE   [   s<    
	9  
b



rE   rp   rz   rq   privatekey_pathkey_passwordr|   rF   c           
      C  s   |d ur|  nd }t|d}t| |t d}W d    n1 s$w   Y  |jtjtj	t
 d}ddlm} ||t}	|	j|| dS )Nrbr   backendencodingr   encryption_algorithmr5   r   )rq   rp   )encodeopenr   readr	   private_bytesr
   DERr   PKCS8r   r   r   r   prepare)
rp   rq   r  r  encoded_passwordkeyp_keyprivate_keyr   ry   rM   rM   rN   get_token_from_private_keyU  s"   r&  private_key_filer   c                 C  s~   t | d}t| | t d}W d   n1 sw   Y  |jtjtj	t
 d}t|dt d}ddlm} ||S )zPHelper function to generate the public key fingerprint from the private key filer  r  Nr  )r[   r   r  r5   r   )r  r   r  r  r	   r  r
   r  r   r   r   r   r   r    calculate_public_key_fingerprint)r'  r   r#  r$  r%  r   rM   rM   rN   get_public_key_fingerprintl  s   
r)  )
rp   rz   rq   rz   r  rz   r  r|   rF   rz   )r'  rz   r   rz   rF   rz   )Z
__future__r   r   r   loggingr   r   r   	threadingr   typingr   r   r   cryptography.hazmat.backendsr	   ,cryptography.hazmat.primitives.serializationr
   r   r   r   r   _utilsr   compatr   	constantsr   r   r   r   r   r   r   descriptionr   r   r   r   r   	errorcoder   errorsr   r    r!   r"   r#   r$   networkr%   r&   r'   r(   r)   r*   platform_detectionr+   rV   r,   r-   r.   SyncSessionManagerr/   r   r0   token_cacher1   r2   r3   versionr4   no_authr6   oauthr7   r   r8   	getLoggerr  rm   KEYRING_SERVICE_NAMEKEYRING_USERKEYRING_DRIVER_NAMEr:   r   r   rE   r&  r)  rM   rM   rM   rN   <module>   sR    $	  
   
}