U
    ~fh                     @  s   d Z ddlmZ ddlmZmZmZmZ ddlZddl	m
Z
 ddlmZmZ ertddlmZ ddlmZ dd	lmZ d
ZddddddZdS )z#MONGODB-AWS Authentication helpers.    )annotations)TYPE_CHECKINGAnyMappingTypeNBinary)ConfigurationErrorOperationFailure)_ReadableBuffer)AsyncConnection)MongoCredentialFr   r   None)credentialsconnreturnc              
     sv  zddl }W n, tk
r8 } ztd|W 5 d}~X Y nX ddlm}m} |d |jdk rdtdG dd	 d	|j}z||| j	| j
| jj}|d}d
d|d}	|d|	I dH }
|
}tdD ]B}||d }d
|
d |d}|d|I dH }|d r q
qW nd |jk
rR } z$|d t| d|j ddW 5 d}~X Y n  tk
rp   |d  Y nX dS )zAuthenticate using MONGODB-AWS.r   NzhMONGODB-AWS authentication requires pymongo-auth-aws: install with: python -m pip install 'pymongo[aws]')set_cached_credentialsset_use_cached_credentialsT	   z@MONGODB-AWS authentication requires MongoDB version 4.4 or laterc                   @  s:   e Zd ZddddZddddd	Zd
ddddZdS )z)_authenticate_aws.<locals>.AwsSaslContextzType[Binary])r   c                 S  s   t S )z#Return the bson.binary.Binary type.r   )self r   A/tmp/pip-unpacked-wheel-36gvocj8/pymongo/asynchronous/auth_aws.pybinary_type6   s    z5_authenticate_aws.<locals>.AwsSaslContext.binary_typezMapping[str, Any]bytes)docr   c                 S  s
   t |S )zEncode a dictionary to BSON.)bsonencode)r   r   r   r   r   bson_encode:   s    z5_authenticate_aws.<locals>.AwsSaslContext.bson_encoder   )datar   c                 S  s
   t |S )zDecode BSON to a dictionary.)r   decode)r   r   r   r   r   bson_decode>   s    z5_authenticate_aws.<locals>.AwsSaslContext.bson_decodeN)__name__
__module____qualname__r   r   r    r   r   r   r   AwsSaslContext4   s   r$      zMONGODB-AWS)Z	saslStartZ	mechanismpayloadz	$external
   r&   conversationId)ZsaslContinuer(   r&   donez (pymongo-auth-aws version ))pymongo_auth_awsImportErrorr	   Zpymongo_auth_aws.authr   r   Zmax_wire_versionr$   ZAwsCredentialusernamepasswordZmechanism_propertiesZaws_session_tokenstepcommandrangeZPyMongoAuthAwsErrorr
   __version__	Exception)r   r   r+   er   r   r$   ctxZclient_payloadZclient_firstZserver_firstres_cmdexcr   r   r   _authenticate_aws    sX    

r:   )__doc__
__future__r   typingr   r   r   r   r   Zbson.binaryr   Zpymongo.errorsr	   r
   Zbson.typingsr   Zpymongo.asynchronous.poolr   Zpymongo.auth_sharedr   Z_IS_SYNCr:   r   r   r   r   <module>   s   