U
    ~fh "                  
   @  s,  d Z ddlmZ ddlZddl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 ddlmZmZmZmZ dd	lmZ ed
ddddddddg	ZG dd dZedddddddgZeddddgZed d!gZd"d#d"d"d$d#dd%d&d'Zd(d(d(d)d*d+Zd(d,d-d.d/Zdd"d0d1d2d3ZdS )4z6Constants and types shared across multiple auth types.    )annotationsN)standard_b64encode)
namedtuple)AnyDictMappingOptional)Binary)_OIDCAzureCallback_OIDCGCPCallback_OIDCProperties_OIDCTestCallback)ConfigurationErrorGSSAPIz
MONGODB-CRMONGODB-OIDCMONGODB-X509MONGODB-AWSPLAINzSCRAM-SHA-1zSCRAM-SHA-256DEFAULTc                   @  sT   e Zd ZdZed ZddddZdddd	d
ZdddddZddddZ	dS )_CachedataNone)returnc                 C  s
   d | _ d S Nr   self r   7/tmp/pip-unpacked-wheel-36gvocj8/pymongo/auth_shared.py__init__7   s    z_Cache.__init__objectbool)otherr   c                 C  s   t |trdS tS )NT
isinstancer   NotImplementedr   r"   r   r   r   __eq__:   s    
z_Cache.__eq__c                 C  s   t |trdS tS )NFr#   r&   r   r   r   __ne__@   s    
z_Cache.__ne__intc                 C  s   | j S r   )	_hash_valr   r   r   r   __hash__E   s    z_Cache.__hash__N)
__name__
__module____qualname__	__slots__hashr*   r   r'   r(   r+   r   r   r   r   r   2   s   r   MongoCredential	mechanismsourceusernamepasswordZmechanism_propertiescacheGSSAPIPropertiesservice_namecanonicalize_host_nameservice_realm_AWSPropertiesaws_session_tokenstrzOptional[str]zMapping[str, Any])mechr3   userpasswdextradatabaser   c                 C  s  | dkr|dkrt |  d| dkr|dk	r>|dkr>td|di }|dd	}t|d
d}|d}	t|||	d}
t| d|||
dS | dkr|dk	rt d|dk	r|dkrtdt| d|dddS | dkrB|dk	r|dkrt d|dk	r|dkrt d|di }|d}t|d}t| d|||dS | dkr|di }|d}|d}|d}|dd}ddddd d!d"g}|d#|}d$}|dk	rd%}t ||s|r|dk	rt ||r|rd&}t |n|dk	r|d'kr$|dk	rd(}t |t }nZ|d)krJd}|s@t d*t|}n4|d+krpd}|sft d,t	|}nt d-| nt |t
||||||d.}t| d|||t S | d/kr|p|pd}t| |||ddS |p|pd0}|dkrt d1t| |||dt S dS )2z8Build and return a mechanism specific credentials tuple.)r   r   r   Nz requires a username.r   z	$externalz:authentication source must be $external or None for GSSAPIZauthmechanismpropertiesZSERVICE_NAMEZmongodbZCANONICALIZE_HOST_NAMEFZSERVICE_REALM)r8   r9   r:   r   z+Passwords are not supported by MONGODB-X509z@authentication source must be $external or None for MONGODB-X509r   z;username without a password is not supported by MONGODB-AWSz?authentication source must be $external or None for MONGODB-AWSZAWS_SESSION_TOKEN)r<   r   ZOIDC_CALLBACKZOIDC_HUMAN_CALLBACKZENVIRONMENTZTOKEN_RESOURCE z*.mongodb.netz*.mongodb-dev.netz*.mongodb-qa.netz*.mongodbgov.net	localhostz	127.0.0.1z::1ZALLOWED_HOSTSzVauthentication with MONGODB-OIDC requires providing either a callback or a environmentz)password is not supported by MONGODB-OIDCz5cannot set both OIDC_CALLBACK and OIDC_HUMAN_CALLBACKtestz;test environment for MONGODB-OIDC does not support usernameZazurezTAzure environment for MONGODB-OIDC requires a TOKEN_RESOURCE auth mechanism propertyZgcpzOGCP provider for MONGODB-OIDC requires a TOKEN_RESOURCE auth mechanism propertyz+unrecognized ENVIRONMENT for MONGODB-OIDC: )callbackhuman_callbackenvironmentallowed_hoststoken_resourcer4   r   ZadminzA password is required.)r   
ValueErrorgetr!   r7   r1   r;   r   r
   r   r   r   )r>   r3   r?   r@   rA   rB   Z
propertiesr8   canonicalizer:   propsr<   Z	aws_propsrF   rG   environrJ   Zdefault_allowedrI   msgZ
oidc_propsZsource_databaser   r   r   _build_credentials_tupleZ   s    	







	











rQ   bytes)firsecr   c                 C  s   d dd t| |D S )zXOR two byte strings together.    c                 S  s   g | ]\}}t ||A gqS r   )rR   ).0xyr   r   r   
<listcomp>   s     z_xor.<locals>.<listcomp>)joinzip)rS   rT   r   r   r   _xor   s    r\   zDict[bytes, bytes])responser   c                 C  s   t dd | dD S )z-Split a scram response into key, value pairs.c                 s  s,   | ]$}t t jttf |d dV  qdS )   =   N)typingcastTuplerR   split)rV   itemr   r   r   	<genexpr>   s   z(_parse_scram_response.<locals>.<genexpr>   ,)dictrc   )r]   r   r   r   _parse_scram_response   s    rh   z4tuple[bytes, bytes, typing.MutableMapping[str, Any]])credentialsr2   r   c                 C  sd   | j }|ddddd}ttd}d| d | }d	|td
| d	ddid}|||fS )Nzutf-8r^   s   =3Drf   s   =2C    s   n=s   ,r=r_   s   n,,ZskipEmptyExchangeT)Z	saslStartr2   payloadZautoAuthorizeoptions)r4   encodereplacer   osurandomr	   )ri   r2   r4   r?   nonceZ
first_barecmdr   r   r   _authenticate_scram_start   s    
rs   ) __doc__
__future__r   ro   r`   base64r   collectionsr   r   r   r   r   Zbsonr	   Zpymongo.auth_oidc_sharedr
   r   r   r   Zpymongo.errorsr   	frozensetZ
MECHANISMSr   r1   r7   r;   rQ   r\   rh   rs   r   r   r   r   <module>   sF    v