o
    hp%                     @  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mZ dd	lmZ eg d
Z	 G dd dZedg dZ	 edg dZ	 eddgZ	 d1ddZd2d!d"Zd3d&d'Zd4d*d+Z d5d/d0Z!dS )6z6Constants and types shared across multiple auth types.    )annotationsN)standard_b64encode)
namedtuple)AnyDictMappingOptional)Binary)_OIDCAzureCallback_OIDCGCPCallback_OIDCK8SCallback_OIDCProperties_OIDCTestCallback)ConfigurationError)GSSAPIMONGODB-OIDCMONGODB-X509MONGODB-AWSPLAINzSCRAM-SHA-1zSCRAM-SHA-256DEFAULTc                   @  s@   e Zd ZdZed ZdddZdd	d
ZdddZdddZ	dS )_CachedatareturnNonec                 C  s
   d | _ d S Nr   self r   F/var/www/html/venv/lib/python3.10/site-packages/pymongo/auth_shared.py__init__7   s   
z_Cache.__init__otherobjectboolc                 C     t |trdS tS )NT
isinstancer   NotImplementedr   r!   r   r   r   __eq__:   s   
z_Cache.__eq__c                 C  r$   )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)r   r   )r!   r"   r   r#   )r   r+   )
__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_nameZcanonicalize_host_nameservice_realmservice_host_AWSPropertiesaws_session_tokenvalue
str | boolr   c                 C  s8   g d}| dv r| dv S | |vrt d|  d| | S )N)FTnoneforwardZforwardAndReverse)truefalseTF)rD   TzCANONICALIZE_HOST_NAME 'z' not in valid options: )
ValueError)r@   Zvalid_namesr   r   r    _validate_canonicalize_host_nameZ   s   rG   mechstrr5   Optional[str]userpasswdextraMapping[str, Any]databasec                 C  sH  | dvr|du rt |  d| dkrQ|dur|dkrtd|di }|dd	}|d
d}|dd}	t|	}	|d}
t||	|
|d}t| d|||dS | dkrr|dur]t d|duri|dkritdt| d|dddS | dkr|dur|du rt d|dur|dkrt d|di }|d}t|d}t| d|||dS | dkrs|di }|d}|d}|d}|dd}g d}|d|}|dddur|du rt dd }|durd!}t ||s|r|durt ||r|rd"}t |nU|durX|d#kr |durd$}t |t }n<|d%kr3d}|s.t d&t|}n)|d'krFd}|sAt d(t	|}n|d)krQd}t
 }nt d*| t |t||||||pfdd+}t| d|||t S | d,kr|p|pd}t| |||ddS |p|pd-}|du rt d.t| |||dt S )/z8Build and return a mechanism specific credentials tuple.)r   r   r   Nz requires a usernamer   z	$externalz:authentication source must be $external or None for GSSAPIZauthmechanismpropertiesZSERVICE_NAMEZmongodbZSERVICE_HOSTZCANONICALIZE_HOST_NAMErE   ZSERVICE_REALMr:   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_HOSTSz4ALLOWED_HOSTS is only valid with OIDC_HUMAN_CALLBACKzVauthentication 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k8sz+unrecognized ENVIRONMENT for MONGODB-OIDC: )callbackhuman_callbackenvironmentallowed_hoststoken_resourcer6   r   ZadminzA password is required)r   rF   getrG   r9   r3   r>   r   r
   r   r   r   r   )rH   r5   rK   rL   rM   rO   
propertiesr;   r=   Zcanonicalizer<   propsr?   Z	aws_propsrS   rT   environrW   Zdefault_allowedrV   msgZ
oidc_propsZsource_databaser   r   r   _build_credentials_tupled   s   	






	










r]   firbytessecc                 C  s   d dd t| |D S )zXOR two byte strings together.    c                 S  s   g | ]\}}t ||A gqS r   )r_   ).0xyr   r   r   
<listcomp>   s    z_xor.<locals>.<listcomp>)joinzip)r^   r`   r   r   r   _xor   s   rh   responseDict[bytes, bytes]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Tupler_   split)rb   itemr   r   r   	<genexpr>   s
    
z(_parse_scram_response.<locals>.<genexpr>   ,)dictrp   )ri   r   r   r   _parse_scram_response   s   ru   credentialsr4   4tuple[bytes, bytes, typing.MutableMapping[str, Any]]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-8rk   s   =3Drs   s   =2C    s   n=s   ,r=rl   s   n,,ZskipEmptyExchangeT)Z	saslStartr4   payloadZautoAuthorizeoptions)r6   encodereplacer   osurandomr	   )rv   r4   r6   rK   nonceZ
first_barecmdr   r   r   _authenticate_scram_start   s   

r   )r@   rA   r   rA   )rH   rI   r5   rJ   rK   rJ   rL   rJ   rM   rN   rO   rJ   r   r3   )r^   r_   r`   r_   r   r_   )ri   r_   r   rj   )rv   r3   r4   rI   r   rw   )"__doc__
__future__r   r}   rm   base64r   collectionsr   r   r   r   r   Zbsonr	   Zpymongo.auth_oidc_sharedr
   r   r   r   r   Zpymongo.errorsr   	frozensetZ
MECHANISMSr   r3   r9   r>   rG   r]   rh   ru   r   r   r   r   r   <module>   s>   



~
