o
    'h3B                     @  s  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 ddlmZ ddlmZmZmZmZmZmZ ddlmZ ddlZddlmZ ddlmZ dd	l m!Z" dd
l m#Z# ddl$m%Z% ddl&m'Z'm(Z( ddl)m*Z+ ddl)m,Z, ddl-m.Z. er~ddlm/Z/ edZ0zddl1Z1dZ2W n e3y   dZ2Y nw ej4Z5ej6Z6ej7Z7ej8Z8e9eddZ:dZ;dZ<ej=Z>ej?ej@ejAejBejCejBejDB iZEdd eEF D ZGd'ddZHejIejJejKfZLejIZMejJZNejKZOd(dd ZPG d!d" d"ejQZRG d#d$ d$ZSG d%d& d&ZTdS ))zA CPython compatible SSLContext implementation wrapping PyOpenSSL's
context.

Due to limitations of the CPython asyncio.Protocol implementation for SSL, the async API does not support PyOpenSSL.
    )annotationsN)EINTR)
ip_address)TYPE_CHECKINGAnyCallableOptionalTypeVarUnion)SSL)crypto)ConfigurationError)_CertificateError)
_OCSPCache)_load_trusted_ca_certs_ocsp_callback)SocketChecker)_errno_from_exception)validate_boolean)
VerifyMode_TTFOP_NO_RENEGOTIATIONc                 C  s   i | ]\}}||qS  r   ).0keyvaluer   r   U/var/www/html/olx_land/venv/lib/python3.10/site-packages/pymongo/pyopenssl_context.py
<dictcomp>N   s    r   addressr   returnboolc              	   C  s(   zt |  W dS  ttfy   Y dS w )NTF)_ip_address
ValueErrorUnicodeError)r   r   r   r   _is_ip_addressS   s   r$   excBaseExceptionc                 C  s
   | j dkS )z<Return True if the OpenSSL.SSL.SysCallError is a ragged EOF.)zUnexpected EOF)args)r%   r   r   r   _ragged_eofc   s   
r)   c                      sb   e Zd Zd  fddZd!ddZd" fddZd# fddZd$ fddZd%d& fddZ  Z	S )'_sslConnctx_SSL.ContextsockOptional[_socket.socket]suppress_ragged_eofsr    c                   s    t  | _|| _t || d S N)_SocketCheckersocket_checkerr/   super__init__)selfr+   r-   r/   	__class__r   r   r4   l   s   z_sslConn.__init__callCallable[..., _T]r(   r   kwargsr   r   c           	   
   O  s   |   }|r
t }	 z||i |W S  tyy } zZ|dkr!||  dkr<|r7t | |kr7tdd tdd t|t	j
rGd}d}nt|t	jrRd}d}nd}d}| j| ||| |rot | |krotdd W Y d }~q
d }~ww )NTr   r'   z	timed outz!Underlying socket has been closedF)
gettimeout_time	monotonicBLOCKING_IO_ERRORSfileno_sockettimeoutSSLError
isinstance_SSLWantReadErrorWantWriteErrorr2   select)	r5   r8   r(   r:   rA   startr%   	want_read
want_writer   r   r   _callv   s6   
z_sslConn._callNonec                   s   | j t jg|R i |S r0   )rK   r3   do_handshake)r5   r(   r:   r6   r   r   rM      s   z_sslConn.do_handshakebytesc              
     X   z| j t jg|R i |W S  tjy+ } z| jr&t|r&W Y d }~dS  d }~ww )N    )rK   r3   recvrD   SysCallErrorr/   r)   r5   r(   r:   r%   r6   r   r   rQ         z_sslConn.recvintc              
     rO   Nr   )rK   r3   	recv_intorD   rR   r/   r)   rS   r6   r   r   rW      rT   z_sslConn.recv_intor   bufflagsc              
     s   t |}t|}d}||k rIz| t j||d  |}W n ty6 } zt|tkr1W Y d }~q
 d }~ww |dkr?td||7 }||k sd S d S )Nr   zconnection closed)
memoryviewlenrK   r3   sendOSErrorr   _EINTR)r5   rX   rY   viewtotal_length
total_sentsentr%   r6   r   r   sendall   s    z_sslConn.sendall)r+   r,   r-   r.   r/   r    )r8   r9   r(   r   r:   r   r   r   )r(   r   r:   r   r   rL   )r(   r   r:   r   r   rN   )r(   r   r:   r   r   rU   )r   )rX   rN   rY   rU   r   rL   )
__name__
__module____qualname__r4   rK   rM   rQ   rW   rc   __classcell__r   r   r6   r   r*   k   s    

		r*   c                   @  s   e Zd ZdZdddZdS )_CallbackDataz0Data class which is passed to the OCSP callback.r   rL   c                 C  s   d | _ d | _t | _d S r0   )trusted_ca_certscheck_ocsp_endpointr   ocsp_response_cacher5   r   r   r   r4      s   z_CallbackData.__init__Nr   rL   )rd   re   rf   __doc__r4   r   r   r   r   rh      s    rh   c                   @  s   e Zd ZdZdZdDddZedEdd	ZdFddZdGddZ	eee	Z
dHddZdIddZeeeZdJddZdKddZeeeZdEddZdLddZeeeZ	 	 dMdNd'd(Z	 dMdOd+d,ZdPd-d.ZdQd1d2ZdPd3d4ZdPd5d6Z	7	8	8	 	 dRdSdBdCZd S )T
SSLContextzUA CPython compatible SSLContext implementation wrapping PyOpenSSL's
    context.
    )	_protocol_ctx_callback_data_check_hostnameprotocolrU   c                 C  s@   || _ t| j | _t | _d| _d| j_| jjt	| jd d S )NT)callbackdata)
rp   rD   Contextrq   rh   rr   rs   rj   set_ocsp_client_callbackr   )r5   rt   r   r   r   r4      s   zSSLContext.__init__r   c                 C     | j S )zhThe protocol version chosen when constructing the context.
        This attribute is read-only.
        )rp   rl   r   r   r   rt      s   zSSLContext.protocolr   c                 C  s   t | j  S )zWhether to try to verify other peers' certificates and how to
        behave if verification fails. This attribute must be one of
        ssl.CERT_NONE, ssl.CERT_OPTIONAL or ssl.CERT_REQUIRED.
        )_REVERSE_VERIFY_MAPrq   get_verify_moderl   r   r   r   __get_verify_mode   s   zSSLContext.__get_verify_moder   rL   c                 C  s    ddd}| j t| | dS )zSetter for verify_mode._connobj_SSL.Connection_x509obj_crypto.X509_errnumrU   	_errdepthretcoder   r    c                 S  s   t |S r0   )r    )r}   r   r   r   r   r   r   r   _cb   s   z)SSLContext.__set_verify_mode.<locals>._cbN)r}   r~   r   r   r   rU   r   rU   r   rU   r   r    )rq   
set_verify_VERIFY_MAP)r5   r   r   r   r   r   __set_verify_mode   s   
zSSLContext.__set_verify_moder    c                 C  ry   r0   )rs   rl   r   r   r   __get_check_hostname   s   zSSLContext.__get_check_hostnamer   c                 C  s   t d| || _d S )Ncheck_hostname)r   rs   r5   r   r   r   r   __set_check_hostname  s   

zSSLContext.__set_check_hostnameOptional[bool]c                 C  s   | j jS r0   )rr   rj   rl   r   r   r   __get_check_ocsp_endpoint  s   z$SSLContext.__get_check_ocsp_endpointc                 C  s   t d| || j_d S )N
check_ocsp)r   rr   rj   r   r   r   r   __set_check_ocsp_endpoint  s   
z$SSLContext.__set_check_ocsp_endpointc                 C  s   | j dS rV   )rq   set_optionsrl   r   r   r   __get_options  s   zSSLContext.__get_optionsc                 C  s   | j t| d S r0   )rq   r   rU   r   r   r   r   __set_options  s   zSSLContext.__set_optionsNcertfileUnion[str, bytes]keyfileUnion[str, bytes, None]passwordOptional[str]c                   sH    rd fd	d
}| j | | j | | j |p| | j   dS )a  Load a private key and the corresponding certificate. The certfile
        string must be the path to a single file in PEM format containing the
        certificate as well as any number of CA certificates needed to
        establish the certificate's authenticity. The keyfile string, if
        present, must point to a file containing the private key. Otherwise
        the private key will be taken from certfile as well.
        _max_lengthrU   _prompt_twicer    
_user_dataOptional[bytes]r   rN   c                   s    d usJ   dS )Nzutf-8)encode)r   r   r   r   r   r   _pwcb1  s   
z)SSLContext.load_cert_chain.<locals>._pwcbN)r   rU   r   r    r   r   r   rN   )rq   set_passwd_cbuse_certificate_chain_fileuse_privatekey_filecheck_privatekey)r5   r   r   r   r   r   r   r   load_cert_chain  s   zSSLContext.load_cert_chaincafilecapathc                 C  s:   | j || ttjds|dusJ t|| j_dS dS )zLoad a set of "certification authority"(CA) certificates used to
        validate other peers' certificates when `~verify_mode` is other than
        ssl.CERT_NONE.
        get_verified_chainN)rq   load_verify_locationshasattrrD   
Connectionr   rr   ri   )r5   r   r   r   r   r   r   =  s
   z SSLContext.load_verify_locationsc                 C  s   t r| t  dS td)z&Attempt to load CA certs from certifi.ztlsAllowInvalidCertificates is False but no system CA certificates could be loaded. Please install the certifi package, or provide a path to a CA file using the tlsCAFile optionN)_HAVE_CERTIFIr   certifiwhere_ConfigurationErrorrl   r   r   r   _load_certifiJ  s
   zSSLContext._load_certifistorestrc                 C  sj   | j  }|dusJ tjjj}t|D ]\}}}|dkr2|du s&||v r2|tj	
t| qdS )z2Attempt to load CA certs from Windows trust store.Nx509_asnT)rq   get_cert_store
_stdlibsslPurposeSERVER_AUTHoidenum_certificatesadd_cert_cryptoX509from_cryptographyx509load_der_x509_certificate)r5   r   
cert_storer   certencodingtrustr   r   r   _load_wincertsV  s   

zSSLContext._load_wincertsc                 C  s^   t jdkrzdD ]}| | qW n ty   |   Y n
w t jdkr(|   | j  dS )z7A PyOpenSSL version of load_default_certs from CPython.win32)CAROOTdarwinN)_sysplatformr   PermissionErrorr   rq   set_default_verify_paths)r5   	storenamer   r   r   load_default_certsc  s   

zSSLContext.load_default_certsc                 C  s   | j   dS )zmSpecify that the platform provided CA certificates are to be used
        for verification purposes.
        N)rq   r   rl   r   r   r   r   s  s   z#SSLContext.set_default_verify_pathsFTr-   _socket.socketserver_sidedo_handshake_on_connectr/   server_hostnamesessionOptional[_SSL.Session]r*   c           
   
   C  s   t | j||}|r|| |du r|  n|r%t|s%||d | jtj	kr/|
  |  |rt|  | jrt|durtddlm} zt|rT||| W |S ||| W |S  tjtjfys }	 ztt|	dd}	~	ww |S )zZWrap an existing Python socket connection and return a TLS socket
        object.
        TidnaNr   )	pyopenssl)r*   rq   set_sessionset_accept_stater$   set_tlsext_host_namer   verify_moder   	CERT_NONErequest_ocspset_connect_staterM   r   service_identityr   verify_ip_addressverify_hostnameSICertificateErrorSIVerificationErrorr   r   )
r5   r-   r   r   r/   r   r   ssl_connr   r%   r   r   r   wrap_socket{  s8   

zSSLContext.wrap_socket)rt   rU   )r   rU   )r   r   )r   r   r   rL   )r   r    )r   r   r   rL   )r   r   )r   r    r   rL   )r   rU   r   rL   )NN)r   r   r   r   r   r   r   rL   )r   r   r   r   r   rL   rm   )r   r   r   rL   )FTTNN)r-   r   r   r    r   r    r/   r    r   r   r   r   r   r*   )rd   re   rf   rn   	__slots__r4   propertyrt   _SSLContext__get_verify_mode_SSLContext__set_verify_moder   _SSLContext__get_check_hostname_SSLContext__set_check_hostnamer   $_SSLContext__get_check_ocsp_endpoint$_SSLContext__set_check_ocsp_endpointrj   _SSLContext__get_options_SSLContext__set_optionsoptionsr   r   r   r   r   r   r   r   r   r   r   ro      sB    
















ro   )r   r   r   r    )r%   r&   r   r    )Urn   
__future__r   socketr@   sslr   sysr   timer<   errnor   r^   	ipaddressr   r!   typingr   r   r   r   r	   r
   cryptography.x509r   r   OpenSSLr   rD   r   r   pymongo.errorsr   r   r   pymongo.ocsp_cacher   pymongo.ocsp_supportr   r   pymongo.socket_checkerr   r1   r   pymongo.write_concernr   r   r   r   r   ImportErrorSSLv23_METHODPROTOCOL_SSLv23OP_NO_SSLv2OP_NO_SSLv3OP_NO_COMPRESSIONgetattrr   HAS_SNIIS_PYOPENSSLErrorrB   r   VERIFY_NONECERT_OPTIONALVERIFY_PEERCERT_REQUIREDVERIFY_FAIL_IF_NO_PEER_CERTr   itemsrz   r$   rE   rF   WantX509LookupErrorr>   BLOCKING_IO_READ_ERRORBLOCKING_IO_WRITE_ERRORBLOCKING_IO_LOOKUP_ERRORr)   r   r*   rh   ro   r   r   r   r   <module>   sf    


S	