o
    'h@                     @  st  U d Z 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mZ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 dd	lmZmZ dd
lmZ ddl m!Z! ddl"m#Z#m$Z$ ddl%m&Z& er{ddl'm(Z( ddl)m*Z* dZ+dZ,zddl-Z.e/e0e1e.j23ddd dkrdZ,W n e4y   zddl.Z.W n e4y   dZ+Y nw Y nw dZ5dHddZ6dId!d"Z7dJd$d%Z8dKd)d*Z9dLd+d,Z:dLd-d.Z;dLd/d0Z<dLd1d2Z=e:e<e!e#e;ej>e6d3d4ej>e6d5d4e=d6Z?d7e@d8< G d9d: d:ZAG d;d< d<eAZBG d=d> d>eAZCG d?d@ d@eAZDeCej>eBd3d4ej>eBd5d4eDej>eBd5d4dAZEdBe@dC< 	dMdNdFdGZFdS )OzAuthentication helpers.    )annotationsN)standard_b64decodestandard_b64encode)TYPE_CHECKINGAnyCallableMappingMutableMappingOptionalcast)quote)Binary)MongoCredential_authenticate_scram_start_parse_scram_response_xor)ConfigurationErrorOperationFailure)saslprep)_authenticate_aws)_authenticate_oidc_get_authenticator)_getaddrinfo)Hello)
ConnectionTF.   )r      credentialsr   connr   	mechanismstrreturnNonec                  C  sx  | j }|dkrd}tj}t| jd}nd}tj}t|| jd}| j}| j	}t
j}	|j}
|
rL|
 rLt|
ts<J |
jdusCJ |
j\}}|
j}nt| |\}}}|||}|dus`J |d }t|}t|d }|dk rvtd	|d
 }|d }||stdd| }|jr|j\}}}}nd\}}}}|r||ks||krt||t||}|	|d| }|	|d| }||||f|_|| }d|||f}|	||| }dtt|| }d||f}t|	||| }d|d t|d}|||}t|d }t
 |d |std|d s8d|d tdd}|||}|d s:tddS dS )zAuthenticate using SCRAM.SCRAM-SHA-256sha256utf-8sha1Npayload   ii   z+Server returned an invalid iteration count.   s   rz!Server returned an invalid nonce.s	   c=biws,r=)NNNNs
   Client Keys
   Server Key   ,s   p=   conversationIdsaslContinuer.   r(      vz%Server returned an invalid signature.done    z%SASL conversation failed to complete.)!usernamehashlibr%   r   passwordencoder'   _password_digestsourcecachehmacHMACauth_ctxspeculate_succeeded
isinstance_ScramContext
scram_dataspeculative_authenticater   commandr   intr   
startswithdatapbkdf2_hmacr   digestjoinr   r   r   compare_digest) r   r   r    r4   rH   	digestmodrF   r9   r:   _hmacctxnonce
first_barerescmdserver_firstparsed
iterationssaltrnoncewithout_proof
client_key
server_keycsaltciterationssalted_pass
stored_keyauth_msg
client_sigclient_proofclient_final
server_sig rc   T/var/www/html/olx_land/venv/lib/python3.10/site-packages/pymongo/synchronous/auth.py_authenticate_scramG   s|   



re   r4   r6   c                 C  sp   t |ts	tdt|dkrtdt | ts!tdt|  t }|  d| }||	d |
 S )z0Get a password digest to use for authentication.z#password must be an instance of strr   zpassword can't be emptyz)username must be an instance of str, not z:mongo:r&   )r?   r!   	TypeErrorlen
ValueErrortyper5   md5updater7   	hexdigest)r4   r6   md5hashrF   rc   rc   rd   r8      s   

r8   rN   c                 C  s:   t ||}t }|  | | }||d | S )z*Get an auth key to use for authentication.r&   )r8   r5   rj   rk   r7   rl   )rN   r4   r6   rH   rm   rF   rc   rc   rd   	_auth_key   s
   
rn   hostnameoption
str | boolc                 C  s~   |dv r| S t | dddtjtjdd \}}}}}|dkr!| S z	t|tj}W n tjy8   |  Y S w |d  S )z2Canonicalize hostname following MIT-krb5 behavior.)FnoneNr   )familyri   protoflagsforward)r   socketIPPROTO_TCPAI_CANONNAMElowergetnameinfoNI_NAMEREQDgaierror)ro   rp   afsocktypert   	canonnamesockaddrnamerc   rc   rd   _canonicalize_hostname   s(   r   c              
   C  sb  t stdz| j}| j}| j}|jp|jd }t||j}|j	d | }|j
dur2|d |j
 }|durotrOdt|t|f}tj||tjd\}}	n*d|v r\|dd\}
}n|d}
}tj|tj|
||d\}}	n
tj|tjd\}}	|tjkrtd	zt|	d
dkrtdt|	}dd|dd}|d|}tdD ]0}t|	t|d }|dkrtdt|	pd
}d|d |d}|d|}|tjkr nqtdt|	t|d dkrtdt|	t|	|dkrtdt|	}d|d |d}|d| W t|	 W dS t|	 w  tjy0 } ztt|dd}~ww )zAuthenticate using GSSAPI.zEThe "kerberos" module must be installed to use GSSAPI authentication.r   @N:)gssflagsr-   )r   userdomainr6   z&Kerberos context failed to initialize. z*Unknown kerberos failure in step function.GSSAPI	saslStartr    r(   autoAuthorize	$external
   r(   r.   r/   z+Kerberos authentication failed to complete.z0Unknown kerberos failure during GSS_Unwrap step.z.Unknown kerberos failure during GSS_Wrap step.)HAVE_KERBEROSr   r4   r6   mechanism_propertiesservice_hostaddressr   canonicalize_host_nameservice_nameservice_realm_USE_PRINCIPALrI   r   kerberosauthGSSClientInitGSS_C_MUTUAL_FLAGsplitAUTH_GSS_COMPLETEr   authGSSClientStepauthGSSClientResponserC   ranger!   authGSSClientUnwrapauthGSSClientWrapauthGSSClientCleanKrbError)r   r   r4   r6   propshostservice	principalresultrM   r   r   r(   rQ   response_excrc   rc   rd   _authenticate_gssapi   s   





r   c                 C  sH   | j }| j}| j}d| d|  }ddt|dd}||| dS )z(Authenticate using SASL PLAIN (RFC 4616) r-   PLAINr   N)r9   r4   r6   r7   r   rC   )r   r   r9   r4   r6   r(   rQ   rc   rc   rd   _authenticate_plain=  s   r   c                 C  s6   |j }|r| rdS t| |j }|d| dS )z Authenticate using MONGODB-X509.Nr   )r=   r>   _X509Contextr   speculate_commandrC   )r   r   rM   rQ   rc   rc   rd   _authenticate_x509L  s
   r   c                 C  s|   |j dkr8|jr|j}n| j}| }|d | j |d< |j||dddg }d|v r2t| |dS t| |dS t| |dS )N   r   saslSupportedMechsF)publish_eventsr$   SCRAM-SHA-1)max_wire_versionnegotiated_mechsr9   	hello_cmdr4   rC   getre   )r   r   mechsr9   rQ   rc   rc   rd   _authenticate_defaultW  s   
r   r   )r    r$   )r   MONGODB-X509zMONGODB-AWSMONGODB-OIDCr   r   r$   DEFAULTz!Mapping[str, Callable[..., None]]	_AUTH_MAPc                   @  sB   e Zd ZdddZedddZdddZdddZdddZdS )_AuthContextr   r   r   tuple[str, int]r"   r#   c                 C  s   || _ d | _|| _d S N)r   rB   r   )selfr   r   rc   rc   rd   __init__u  s   
z_AuthContext.__init__credsOptional[_AuthContext]c                 C  s$   t | j}|rtt|| |S d S r   )_SPECULATIVE_AUTH_MAPr   r    r   r   )r   r   spec_clsrc   rc   rd   from_credentialsz  s   z_AuthContext.from_credentials"Optional[MutableMapping[str, Any]]c                 C  s   t r   )NotImplementedErrorr   rc   rc   rd   r     s   z_AuthContext.speculate_commandhelloHello[Mapping[str, Any]]c                 C  s   |j | _ d S r   )rB   )r   r   rc   rc   rd   parse_response  s   z_AuthContext.parse_responseboolc                 C  s
   t | jS r   )r   rB   r   rc   rc   rd   r>     s   
z _AuthContext.speculate_succeededN)r   r   r   r   r"   r#   )r   r   r   r   r"   r   r"   r   )r   r   r"   r#   )r"   r   )	__name__
__module____qualname__r   staticmethodr   r   r   r>   rc   rc   rc   rd   r   t  s    


r   c                      s(   e Zd Zd fd	d
ZdddZ  ZS )r@   r   r   r   r   r    r!   r"   r#   c                   s   t  || d | _|| _d S r   )superr   rA   r    )r   r   r   r    	__class__rc   rd   r     s   
z_ScramContext.__init__r   c                 C  s.   t | j| j\}}}| jj|d< ||f| _|S Ndb)r   r   r    r9   rA   )r   rN   rO   rQ   rc   rc   rd   r     s   
z_ScramContext.speculate_command)r   r   r   r   r    r!   r"   r#   r   )r   r   r   r   r   __classcell__rc   rc   r   rd   r@     s    r@   c                   @     e Zd ZdddZdS )r   r"   MutableMapping[str, Any]c                 C  s&   ddd}| j jd ur| j j|d< |S )Nr-   r   )authenticater    r   )r   r4   )r   rQ   rc   rc   rd   r     s   
z_X509Context.speculate_commandN)r"   r   r   r   r   r   rc   rc   rc   rd   r         r   c                   @  r   )_OIDCContextr"   r   c                 C  s2   t | j| j}| }|d u rd S | jj|d< |S r   )r   r   r   get_spec_auth_cmdr9   )r   authenticatorrQ   rc   rc   rd   r     s   z_OIDCContext.speculate_commandNr   r   rc   rc   rc   rd   r     r   r   )r   r   r$   r   r   zMapping[str, Any]r   reauthenticater   c                 C  s4   | j }t| }|dkrt| || dS || | dS )zAuthenticate connection.r   N)r    r   r   )r   r   r   r    	auth_funcrc   rc   rd   r     s
   r   )r   r   r   r   r    r!   r"   r#   )r4   r!   r6   r!   r"   r!   )rN   r!   r4   r!   r6   r!   r"   r!   )ro   r!   rp   rq   r"   r!   )r   r   r   r   r"   r#   )F)r   r   r   r   r   r   r"   r#   )G__doc__
__future__r   	functoolsr5   r;   rw   base64r   r   typingr   r   r   r   r	   r
   r   urllib.parser   bson.binaryr   pymongo.auth_sharedr   r   r   r   pymongo.errorsr   r   pymongo.saslprepr   pymongo.synchronous.auth_awsr   pymongo.synchronous.auth_oidcr   r   pymongo.synchronous.helpersr   pymongo.hellor   pymongo.synchronous.poolr   r   r   winkerberosr   tuplemaprD   __version__r   ImportError_IS_SYNCre   r8   rn   r   r   r   r   r   partialr   __annotations__r   r@   r   r   r   r   rc   rc   rc   rd   <module>   s   $	"

S

	

n


