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   O/var/www/html/olx_land/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passwordmechanism_propertiescacheGSSAPIPropertiesservice_name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forwardforwardAndReverse)truefalseTF)rG   TzCANONICALIZE_HOST_NAME 'z' not in valid options: )
ValueError)rB   valid_namesr   r   r    _validate_canonicalize_host_nameZ   s   rK   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 GSSAPIauthmechanismpropertiesSERVICE_NAMEmongodbSERVICE_HOSTCANONICALIZE_HOST_NAMErH   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-AWSAWS_SESSION_TOKEN)rA   r   OIDC_CALLBACKOIDC_HUMAN_CALLBACKENVIRONMENTTOKEN_RESOURCE )z*.mongodb.netz*.mongodb-dev.netz*.mongodb-qa.netz*.mongodbgov.net	localhostz	127.0.0.1z::1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 usernameazurezTAzure environment for MONGODB-OIDC requires a TOKEN_RESOURCE auth mechanism propertygcpzOGCP provider for MONGODB-OIDC requires a TOKEN_RESOURCE auth mechanism propertyk8sz+unrecognized ENVIRONMENT for MONGODB-OIDC: )callbackhuman_callbackenvironmentallowed_hoststoken_resourcer6   r   adminzA password is required)r   rI   getrK   r:   r3   r@   r   r
   r   r   r   r   )rL   r5   rO   rP   rQ   rS   
propertiesr<   r?   canonicalizer>   propsrA   	aws_propsrf   rg   environrj   default_allowedri   msg
oidc_propssource_databaser   r   r   _build_credentials_tupled   s   	






	










rv   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   )rx   ).0xyr   r   r   
<listcomp>   s    z_xor.<locals>.<listcomp>)joinzip)rw   ry   r   r   r   _xor   s   r   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Tuplerx   split)r{   itemr   r   r   	<genexpr>   s
    
z(_parse_scram_response.<locals>.<genexpr>   ,)dictr   )r   r   r   r   _parse_scram_response   s   r   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-8r   s   =3Dr   s   =2C    s   n=s   ,r=r   s   n,,skipEmptyExchangeT)	saslStartr4   payloadautoAuthorizeoptions)r6   encodereplacer   osurandomr	   )r   r4   r6   rO   nonce
first_barecmdr   r   r   _authenticate_scram_start   s   

r   )rB   rC   r   rC   )rL   rM   r5   rN   rO   rN   rP   rN   rQ   rR   rS   rN   r   r3   )rw   rx   ry   rx   r   rx   )r   rx   r   r   )r   r3   r4   rM   r   r   )"__doc__
__future__r   r   r   base64r   collectionsr   r   r   r   r   bsonr	   pymongo.auth_oidc_sharedr
   r   r   r   r   pymongo.errorsr   	frozenset
MECHANISMSr   r3   r:   r@   rK   rv   r   r   r   r   r   r   r   <module>   s>   



~
