o
    RDi                     @  s   d dl mZ d dlZd dlZd dlZd dlmZmZmZ d dlm	Z	 d dl
mZ d dlZ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 d	dlmZmZ d	dlmZ ddlmZmZ e	e Z!G dd deZ"dS )    )annotationsN)datetime	timedeltatimezone)	getLogger)Any)default_backend)RSAPrivateKey)EncodingPublicFormatload_der_private_key   )ER_CONNECTION_TIMEOUTER_INVALID_PRIVATE_KEY)OperationalErrorProgrammingError)KEY_PAIR_AUTHENTICATOR   )AuthByPluginAuthTypec                      s   e Zd ZdZdZdZdZdZdZdZ	dZ
dZe	fd6 fddZd7ddZed8ddZd9ddZd:ddZed d! Zd;d$d%Zd<d&d'Zd=d*d+Zd> fd0d1Zed?d4d5Z  ZS )@AuthByKeyPairzKey pair based authentication.RS256isssubexpiat<   
   private_keybytes | str | RSAPrivateKeylifetime_in_secondsintreturnNonec                   st   t  jd	dttdtji| ttttdtjd	 | _
|| _d| _d| _tttd|d| _dS )
a#  Inits AuthByKeyPair class with private key.

        Args:
            private_key: a byte array of der formats of private key, or an
                object that implements the `RSAPrivateKey` interface.
            lifetime_in_seconds: number of seconds the JWT token will be valid
        max_retry_attemptsJWT_CNXN_RETRY_ATTEMPTSJWT_CNXN_WAIT_TIME)seconds r   JWT_LIFETIME_IN_SECONDSN )super__init__r!   osgetenvr   DEFAULT_JWT_RETRY_ATTEMPTSr   DEFAULT_JWT_CNXN_WAIT_TIMEtotal_seconds_socket_timeout_private_key
_jwt_token_jwt_token_exp	_lifetime)selfr   r    kwargs	__class__r*   Y/var/www/Datamplify/venv/lib/python3.10/site-packages/snowflake/connector/auth/keypair.pyr,   (   s4   

zAuthByKeyPair.__init__c                 C  s
   d | _ d S N)r3   r7   r*   r*   r;   reset_secretsQ      
zAuthByKeyPair.reset_secretsr   c                 C  s   t jS r<   )r   KEY_PAIRr=   r*   r*   r;   type_T   s   zAuthByKeyPair.type_accountstruserr8   r   c          
   
   K  s  d|v r| dd }n| dd }| }| }ttjjd d}t| jt	rKz	t
| j| _W n tyJ } z
td| dtdd }~ww t| jtrzt| jd t d	}W n tyr } z
td
| dtdd }~ww t|tstd|jj dtdnt| jtr| j}n
tdt| j | |}|| j | _| j| d| d| | j| d| | j|| j| ji}tj||| j d}	t|	tr|	!d| _"| j"S |	| _"| j"S )Nz.global-r   .)tzinfozFailed to decode private key: z`
Please provide a valid unencrypted rsa private key in base64-encoded DER format as a str object)msgerrno)datapasswordbackendzFailed to load private key: zQ
Please provide a valid unencrypted rsa private key in DER format as bytes objectzPrivate key type (zU) not supported.
Please provide a valid rsa private key in DER format as bytes objectz%Expected bytes or RSAPrivateKey, got )	algorithmutf-8)#	partitionupperr   nowr   utcreplace
isinstancer3   rC   base64	b64decode	Exceptionr   r   bytesr   r   r	   r:   __name__	TypeErrortype calculate_public_key_fingerprintr6   r5   ISSUERSUBJECT
ISSUE_TIMEEXPIRE_TIMEjwtencode	ALGORITHMdecoder4   )
r7   rB   rD   r8   rQ   er   public_key_fppayloadr4   r*   r*   r;   prepareX   sl   





zAuthByKeyPair.preparedict[str, bool]c                 K  s   ddiS )NsuccessFr*   )r7   r8   r*   r*   r;   reauthenticate   s   zAuthByKeyPair.reauthenticatec                 C  sN   |   tjtj}t }|| dt	
| d }td| |S )NzSHA256:rN   zPublic key fingerprint is %s)
public_keypublic_bytesr
   DERr   SubjectPublicKeyInfohashlibsha256updaterU   	b64encodedigestrd   loggerdebug)r   public_key_der
sha256hashrf   r*   r*   r;   r\      s   
z.AuthByKeyPair.calculate_public_key_fingerprintbodydict[Any, Any]c                 C  s   t |d d< | j|d d< d S )NrJ   AUTHENTICATORTOKEN)r   r4   )r7   ry   r*   r*   r;   update_body   s   zAuthByKeyPair.update_bodyc                 C  s   | j S r<   )r4   r=   r*   r*   r;   assertion_content   s   zAuthByKeyPair.assertion_contentcountboolc                 C  s
   || j k S r<   )_jwt_retry_attempts)r7   r   r*   r*   r;   should_retry   r?   zAuthByKeyPair.should_retryauthenticatorservice_name
str | NonerK   c                  s>   t d t j|||||dd t d | j||d d S )NzInvoking base timeout handlerF)r   r   rB   rD   rK   delete_paramsz@Base timeout handler passed, preparing new token before retrying)rB   rD   )ru   rv   r+   handle_timeoutrh   )r7   r   r   rB   rD   rK   r8   r9   r*   r;   r      s   


	zAuthByKeyPair.handle_timeoutopr   c                 C  s   | j tu rdS dS )NTF)rI   r   )r   r*   r*   r;   can_handle_exception   s   
z"AuthByKeyPair.can_handle_exception)r   r   r    r!   r"   r#   )r"   r#   )r"   r   )rB   rC   rD   rC   r8   r   r"   rC   )r8   r   r"   ri   )ry   rz   r"   r#   )r"   rC   )r   r!   r"   r   )r   rC   r   r   rB   rC   rD   rC   rK   r   r8   r   r"   r#   )r   r   r"   r   )rY   
__module____qualname____doc__rc   r]   r^   r`   r_   LIFETIMEr/   r0   r,   r>   propertyrA   rh   rk   staticmethodr\   r}   r~   r   r   r   __classcell__r*   r*   r9   r;   r      s2    
)

L



r   )#
__future__r   rU   rp   r-   r   r   r   loggingr   typingr   ra   cryptography.hazmat.backendsr   -cryptography.hazmat.primitives.asymmetric.rsar	   ,cryptography.hazmat.primitives.serializationr
   r   r   	errorcoder   r   errorsr   r   networkr   	by_pluginr   r   rY   ru   r   r*   r*   r*   r;   <module>   s"   