
    [j@                       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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) ddl*m+Z, ddl*m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z5 ddl3m6Z6 ddl7m8Z8 erddlm9Z9 ddlm:Z:  ed          Z;	 ddl<Z<dZ=n# e>$ r dZ=Y nw xY wej?        Z@ejA        ZAejB        ZBejC        ZC eDedd          ZEdZFdZGejH        ZIejJ        ejK        ejL        ejM        ejN        ejM        ejO        z  iZPd ePQ                                D             ZRd*d ZSejT        ejU        ejV        fZWd+d#ZX G d$ d%ejY                  ZZ G d& d'          Z[ G d( d)          Z\dS ),zMA CPython compatible SSLContext implementation wrapping PyOpenSSL's
context.
    )annotationsN)EINTR)
ip_address)TYPE_CHECKINGAnyCallableOptionalTypeVarUnion)load_der_x509_certificate)SSL)crypto)CertificateError)VerificationError)verify_hostname)verify_ip_address)ConfigurationError)_CertificateError)
_OCSPCache)_load_trusted_ca_certs_ocsp_callback)SocketChecker)_errno_from_exception)validate_boolean)
VerifyMode)Certificate_TTFOP_NO_RENEGOTIATIONc                    i | ]\  }}||	S  r    ).0keyvalues      ]/var/www/app.qaans.com/backend/venv/lib/python3.11/site-packages/pymongo/pyopenssl_context.py
<dictcomp>r%   P   s    HHHjc5ucHHH    addressr   returnboolc                V    	 t          |            dS # t          t          f$ r Y dS w xY w)NTF)_ip_address
ValueErrorUnicodeError)r'   s    r$   _is_ip_addressr.   U   sA    Gt%   uus    ((excBaseExceptionc                    | j         dk    S )z<Return True if the OpenSSL.SSL.SysCallError is a ragged EOF.)zUnexpected EOF)args)r/   s    r$   _ragged_eofr4   b   s    8---r&   c                  Z     e Zd Zd fdZddZd fdZd fdZd fdZdd  fdZ xZ	S )!_sslConnctx_SSL.ContextsockOptional[_socket.socket]suppress_ragged_eofsr)   c                    t                      | _        || _        t                                          ||           d S N)_SocketCheckersocket_checkerr;   super__init__)selfr7   r9   r;   	__class__s       r$   rA   z_sslConn.__init__k   s;     -..$8!d#####r&   callCallable[..., _T]r3   r   kwargsr(   r   c                j   |                                  }|rt          j                    }	 	  ||i |S # t          $ r}|                                 dk    rA|r/t          j                    |z
  |k    rt          j        d          d t          d          d t          |t          j
                  rd}d}n#t          |t          j                  rd}d}nd}d}| j                            | |||           |r/t          j                    |z
  |k    rt          j        d          d Y d }~d }~ww xY w)NTr2   z	timed outz!Underlying socket has been closedF)
gettimeout_time	monotonicBLOCKING_IO_ERRORSfileno_sockettimeoutSSLError
isinstance_SSLWantReadErrorWantWriteErrorr?   select)	rB   rD   r3   rF   rN   startr/   	want_read
want_writes	            r$   _callz_sslConn._callr   s`   //## 	&O%%E	tT,V,,,%   ;;==B&& E5?#4#4u#<w#F#F%ok::D"#FGGTQc4#566 & $I!&JJT%899 & %I!%JJ $I!%J#**4JPPP Au00587BB!/+66D@%s   4 
D2C)D--D2Nonec                H     | j         t                      j        g|R i |S r=   )rX   r@   do_handshake)rB   r3   rF   rC   s      r$   r[   z_sslConn.do_handshake   s,    tz%''.@@@@@@@r&   bytesc                    	  | j         t                      j        g|R i |S # t          j        $ r"}| j        rt          |          rY d }~dS  d }~ww xY w)Nr&   )rX   r@   recvrQ   SysCallErrorr;   r4   rB   r3   rF   r/   rC   s       r$   r^   z_sslConn.recv   s|    	4:eggl<T<<<V<<<  	 	 	( [-=-= sssss		   !% AAAAintc                    	  | j         t                      j        g|R i |S # t          j        $ r"}| j        rt          |          rY d }~dS  d }~ww xY wNr   )rX   r@   	recv_intorQ   r_   r;   r4   r`   s       r$   re   z_sslConn.recv_into   s}    	4:egg/A$AAA&AAA  	 	 	( [-=-= qqqqq		ra   r   bufflagsc                \   t          |          }t          |          }d}||k     r	 |                     t                      j        ||d          |          }n0# t
          $ r#}t          |          t          k    rY d }~_ d }~ww xY w|dk    rt          d          ||z  }||k     d S d S )Nr   zconnection closed)
memoryviewlenrX   r@   sendOSErrorr   _EINTR)	rB   rf   rg   viewtotal_length
total_sentsentr/   rC   s	           r$   sendallz_sslConn.sendall   s    #3xx
<''zz%'',Z[[0A5II    (--77HHHH qyy1222$J <''''''s   0A 
B$BBB)r7   r8   r9   r:   r;   r)   )rD   rE   r3   r   rF   r   r(   r   )r3   r   rF   r   r(   rY   )r3   r   rF   r   r(   r\   )r3   r   rF   r   r(   rb   )r   )rf   r\   rg   rb   r(   rY   )
__name__
__module____qualname__rA   rX   r[   r^   re   rr   __classcell__)rC   s   @r$   r6   r6   j   s        $ $ $ $ $ $   6A A A A A A                    r&   r6   c                      e Zd ZdZddZdS )_CallbackDataz0Data class which is passed to the OCSP callback.r(   rY   c                H    d | _         d | _        t                      | _        d S r=   )trusted_ca_certscheck_ocsp_endpointr   ocsp_response_cacherB   s    r$   rA   z_CallbackData.__init__   s$    =A37 #-<<   r&   Nr(   rY   )rs   rt   ru   __doc__rA   r    r&   r$   rx   rx      s.        ::0 0 0 0 0 0r&   rx   c                  $   e Zd ZdZdZd3dZed4d            Zd5d	Zd6dZ	 eee	          Z
d7dZd8dZ eee          Zd9dZd:dZ eee          Zd;dZd<dZ eee          Z	 	 d=d>dZ	 d=d?d Zd;d!Zd@d$Zd;d%Zd;d&Z	 	 	 	 	 dAdBd2ZdS )C
SSLContextzUA CPython compatible SSLContext implementation wrapping PyOpenSSL's
    context.
    )	_protocol_ctx_callback_data_check_hostnameprotocolrb   c                    || _         t          j        | j                   | _        t	                      | _        d| _        d| j        _        | j                            t          | j                   d S )NT)callbackdata)
r   rQ   Contextr   rx   r   r   r{   set_ocsp_client_callbackr   )rB   r   s     r$   rA   zSSLContext.__init__   sa    !L00	+oo#
 37/	**NI\*]]]]]r&   r(   c                    | j         S )zhThe protocol version chosen when constructing the context.
        This attribute is read-only.
        )r   r}   s    r$   r   zSSLContext.protocol   s    
 ~r&   r   c                J    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_MAPr   get_verify_moder}   s    r$   __get_verify_modezSSLContext.__get_verify_mode   s    
 #49#<#<#>#>??r&   r#   rY   c                Z    dd}| j                             t          |         |           dS )zSetter for verify_mode._connobj_SSL.Connection_x509obj_crypto.X509_errnumrb   	_errdepthretcoder(   r)   c                     t          |          S r=   )r)   )r   r   r   r   r   s        r$   _cbz)SSLContext.__set_verify_mode.<locals>._cb   s     == r&   N)r   r   r   r   r   rb   r   rb   r   rb   r(   r)   )r   
set_verify_VERIFY_MAP)rB   r#   r   s      r$   __set_verify_modezSSLContext.__set_verify_mode   s;    	! 	! 	! 	!  		[/55555r&   r)   c                    | j         S r=   )r   r}   s    r$   __get_check_hostnamezSSLContext.__get_check_hostname   s    ##r&   r   c                4    t          d|           || _        d S )Ncheck_hostname)r   r   rB   r#   s     r$   __set_check_hostnamezSSLContext.__set_check_hostname   s!    )5111$r&   Optional[bool]c                    | j         j        S r=   )r   r{   r}   s    r$   __get_check_ocsp_endpointz$SSLContext.__get_check_ocsp_endpoint  s    "66r&   c                >    t          d|           || j        _        d S )N
check_ocsp)r   r   r{   r   s     r$   __set_check_ocsp_endpointz$SSLContext.__set_check_ocsp_endpoint  s#    u---27///r&   c                6    | j                             d          S rd   )r   set_optionsr}   s    r$   __get_optionszSSLContext.__get_options
  s     y$$Q'''r&   c                T    | j                             t          |                     d S r=   )r   r   rb   r   s     r$   __set_optionszSSLContext.__set_options  s&     		c%jj)))))r&   NcertfileUnion[str, bytes]keyfileUnion[str, bytes, None]passwordOptional[str]c                    r d
f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_lengthrb   _prompt_twicer)   
_user_datar\   r(   c                6    J                      d          S )Nzutf-8)encode)r   r   r   r   s      r$   _pwcbz)SSLContext.load_cert_chain.<locals>._pwcb*  s#      +++w///r&   N)r   rb   r   r)   r   r\   r(   r\   )r   set_passwd_cbuse_certificate_chain_fileuse_privatekey_filecheck_privatekey)rB   r   r   r   r   s      ` r$   load_cert_chainzSSLContext.load_cert_chain  s       		+0 0 0 0 0 0 I##E***	,,X666	%%g&9:::	""$$$$$r&   cafilecapathc                    | j                             ||           t          t          j        d          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)r   load_verify_locationshasattrrQ   
Connectionr   r   rz   )rB   r   r   s      r$   r   z SSLContext.load_verify_locations6  sc     		''777t(<== 	R%%%3I&3Q3QD000	R 	Rr&   c                ~    t           r(|                     t          j                               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_ConfigurationErrorr}   s    r$   _load_certifizSSLContext._load_certifiC  sA     	&&w}77777%'  r&   storestrc                4   | j                                         }t          j        j        j        }t          j        |          D ]S\  }}}|dk    rG|du s||v r?|                    t          j	        
                    t          |                               TdS )z2Attempt to load CA certs from Windows trust store.x509_asnTN)r   get_cert_store
_stdlibsslPurposeSERVER_AUTHoidenum_certificatesadd_cert_cryptoX509from_cryptography_load_der_x509_certificate)rB   r   
cert_storer   certencodingtrusts          r$   _load_wincertszSSLContext._load_wincertsO  s    Y--//
 ,0%/%A%%H%H 	 	!D(E:%%D==C5LL''667QRV7W7WXX  	 	r&   c                    t           j        dk    r@	 dD ]}|                     |           nH# t          $ r |                                  Y n(w xY 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   r   set_default_verify_paths)rB   	storenames     r$   load_default_certszSSLContext.load_default_certsZ  s    
 =G##%!/ 3 3I''	22223" % % %""$$$$$% ]h&&   	**,,,,,s   - AAc                8    | j                                          dS )zmSpecify that the platform provided CA certificates are to be used
        for verification purposes.
        N)r   r   r}   s    r$   r   z#SSLContext.set_default_verify_pathsj  s     		**,,,,,r&   FTr9   _socket.socketserver_sidedo_handshake_on_connectr;   server_hostnamesessionOptional[_SSL.Session]r6   c                   t          | j        ||          }|r|                    |           |du r|                                 nv|r7t	          |          s(|                    |                    d                     | j        t          j	        k    r|
                                 |                                 |r|                                 | j        rj|h	 t	          |          rt          ||           nt          ||           n6# t           t"          f$ r"}t%          t'          |                    dd}~ww xY w|S )zZWrap an existing Python socket connection and return a TLS socket
        object.
        TidnaN)r6   r   set_sessionset_accept_stater.   set_tlsext_host_namer   verify_moder   	CERT_NONErequest_ocspset_connect_stater[   r   _verify_ip_address_verify_hostname_SICertificateError_SIVerificationErrorr   r   )	rB   r9   r   r   r;   r   r   ssl_connr/   s	            r$   wrap_socketzSSLContext.wrap_socketr  sy    DIt-ABB 	*  )))$%%''''  N~o'F'F N --o.D.DV.L.LMMM:#777%%'''&&((( # 	@ !!### " @'B@%o66 D*8_EEEE(?CCC+-AB @ @ @+CHH554?@s   0D ED<<E)r   rb   )r(   rb   )r(   r   )r#   r   r(   rY   )r(   r)   )r#   r   r(   rY   )r(   r   )r#   r)   r(   rY   r~   )r#   rb   r(   rY   )NN)r   r   r   r   r   r   r(   rY   )r   r   r   r   r(   rY   )r   r   r(   rY   )FTTNN)r9   r   r   r)   r   r)   r;   r)   r   r   r   r   r(   r6   )rs   rt   ru   r   	__slots__rA   propertyr   _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_endpointr{   _SSLContext__get_options_SSLContext__set_optionsoptionsr   r   r   r   r   r   r  r    r&   r$   r   r      s         KI
^ 
^ 
^ 
^    X@ @ @ @6 6 6 6* (,.?@@K$ $ $ $% % % % X24HIIN7 7 7 78 8 8 8 #(#<>WXX( ( ( (* * * * h}m44G
 ,0"&	% % % % %> EIR R R R R
 
 
 
	 	 	 	- - - - - - - - "(,%))-*., , , , , , ,r&   r   )r'   r   r(   r)   )r/   r0   r(   r)   )]r   
__future__r   socketrM   sslr   sysr   timerI   errnor   rm   	ipaddressr   r+   typingr   r   r   r	   r
   r   cryptography.x509r   r   OpenSSLr   rQ   r   r   service_identityr   r   r   r   service_identity.pyopensslr   r   r   r   pymongo.errorsr   r   r   pymongo.ocsp_cacher   pymongo.ocsp_supportr   r   pymongo.socket_checkerr   r>   r   pymongo.write_concernr   r   r   r   r   r   ImportErrorSSLv23_METHODPROTOCOL_SSLv23OP_NO_SSLv2OP_NO_SSLv3OP_NO_COMPRESSIONgetattrr   HAS_SNIIS_PYOPENSSLErrorrO   r   VERIFY_NONECERT_OPTIONALVERIFY_PEERCERT_REQUIREDVERIFY_FAIL_IF_NO_PEER_CERTr   itemsr   r.   rR   rS   WantX509LookupErrorrK   r4   r   r6   rx   r   r    r&   r$   <module>r0     s    # " " " " "                 ! ! ! ! ! ! / / / / / / I I I I I I I I I I I I I I I I U U U U U U       % % % % % % D D D D D D F F F F F F J J J J J J N N N N N N D D D D D D , , , , , , ) ) ) ) ) ) G G G G G G G G B B B B B B 8 8 8 8 8 8 2 2 2 2 2 2 .------WT]]NNNMM   MMM $* gd$91==   : $*d.d.1QQ IHK4E4E4G4GHHH 
    ($*=t?WX . . . .J J J J Jt J J JZ0 0 0 0 0 0 0 0^ ^ ^ ^ ^ ^ ^ ^ ^ ^s   %B, ,B65B6