
    =h@                       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=ej~                  Z@ej                  ZAej                  ZBej                  ZC eDedd      ZEdZFdZGej                  ZIej                  ej                  ej                  ej                  ej                  ej                  ej                  z  iZPePj                         D  ci c]  \  } }|| 
 c}} ZRd#dZSej                  ej                  ej                  fZWd$dZX G d dej                        ZZ G d d       Z[ G d! d"      Z\y# e>$ r dZ=Y w xY wc c}} w )%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                F    	 t        |        y# t        t        f$ r Y yw xY w)NTF)_ip_address
ValueErrorUnicodeError)addresss    i/var/www/html/phonemate/phone_mate_backend/venv/lib/python3.12/site-packages/pymongo/pyopenssl_context.py_is_ip_addressr%   U   s)    G% s      c                     | j                   dk(  S )z<Return True if the OpenSSL.SSL.SysCallError is a ragged EOF.)zUnexpected EOF)args)excs    r$   _ragged_eofr*   b   s    88---    c                  f     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 )_sslConnc                R    t               | _        || _        t        |   ||       y N)_SocketCheckersocket_checkersuppress_ragged_eofssuper__init__)selfctxsockr2   	__class__s       r$   r4   z_sslConn.__init__k   s'     -.$8!d#r+   c                T   | j                         }|rt        j                         }	 	  ||i |S # t        $ r}| j	                         dk(  r>|r0t        j                         z
  |kD  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                  j                  | |||       |r0t        j                         z
  |kD  rt        j                  d      d Y d }~d }~ww xY w)NTr'   z	timed outz!Underlying socket has been closedF)
gettimeout_time	monotonicBLOCKING_IO_ERRORSfileno_sockettimeoutSSLError
isinstance_SSLWantReadErrorWantWriteErrorr1   select)	r5   callr(   kwargsr@   startr)   	want_read
want_writes	            r$   _callz_sslConn._callr   s
   //#OO%ET,V,,% ;;=B&5??#4u#<w#F%ook:D"#FGTQc4#5#56 $I!&JT%8%89 %I!%J $I!%J##**4JPu0587B!//+6D@%s   1 	D'C#D""D'c                @     | j                   t        |   g|i |S r/   )rL   r3   do_handshake)r5   r(   rH   r8   s      r$   rN   z_sslConn.do_handshake   s#    tzz%'.@@@@r+   c                    	  | j                   t        |   g|i |S # t        j                  $ r"}| j
                  rt        |      rY d }~y d }~ww xY w)Nr+   )rL   r3   recvrC   SysCallErrorr2   r*   r5   r(   rH   r)   r8   s       r$   rP   z_sslConn.recv   sS    	4::egl<T<V<<   	(([-=		   ! AAAAc                    	  | j                   t        |   g|i |S # t        j                  $ r"}| j
                  rt        |      rY d }~y d }~ww xY wNr   )rL   r3   	recv_intorC   rQ   r2   r*   rR   s       r$   rV   z_sslConn.recv_into   sT    	4::eg/A$A&AA   	(([-=		rS   c                   t        |      }t        |      }d}||k  r;	 | j                  t        |   ||d  |      }|dk  rt        d      ||z  }||k  r:y y # t
        $ r}t        |      t        k(  rY d }~a d }~ww xY w)Nr   zconnection closed)
memoryviewlenrL   r3   sendOSErrorr   _EINTR)	r5   bufflagsviewtotal_length
total_sentsentr)   r8   s	           r$   sendallz_sslConn.sendall   s    #3x
<'zz%',Z[0A5I qy122$J <'  (-7s   A 	B$A<;A<<B)r6   z_SSL.Contextr7   zOptional[_socket.socket]r2   bool)rG   zCallable[..., _T]r(   r   rH   r   returnr   )r(   r   rH   r   re   None)r(   r   rH   r   re   bytes)r(   r   rH   r   re   int)r   )r]   rg   r^   rh   re   rf   )
__name__
__module____qualname__r4   rL   rN   rP   rV   rc   __classcell__)r8   s   @r$   r-   r-   j   s?    $$'?$W[$6A r+   r-   c                      e Zd ZdZddZy)_CallbackDataz0Data class which is passed to the OCSP callback.c                >    d | _         d | _        t               | _        y r/   )trusted_ca_certscheck_ocsp_endpointr   ocsp_response_cacher5   s    r$   r4   z_CallbackData.__init__   s    =A37 #-< r+   Nre   rf   )ri   rj   rk   __doc__r4    r+   r$   rn   rn      s
    :0r+   rn   c                  6   e Zd ZdZdZddZedd       ZddZddZ	 eee	      Z
ddZddZ eee      Zdd	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	 	 	 	 	 d#	 	 	 	 	 	 	 	 	 	 	 	 	 d$dZy)%
SSLContextzUA CPython compatible SSLContext implementation wrapping PyOpenSSL's
    context.
    )	_protocol_ctx_callback_data_check_hostnamec                    || _         t        j                  | j                         | _        t	               | _        d| _        d| j
                  _        | j                  j                  t        | j
                         y )NT)callbackdata)
ry   rC   Contextrz   rn   r{   r|   rq   set_ocsp_client_callbackr   )r5   protocols     r$   r4   zSSLContext.__init__   s\    !LL0	+o#
 37/		**NI\I\*]r+   c                    | j                   S )zhThe protocol version chosen when constructing the context.
        This attribute is read-only.
        )ry   rs   s    r$   r   zSSLContext.protocol   s    
 ~~r+   c                D    t         | j                  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_MAPrz   get_verify_moders   s    r$   __get_verify_modezSSLContext.__get_verify_mode   s    
 #499#<#<#>??r+   c                j    	 	 	 	 	 	 	 	 	 	 	 	 dd}| j                   j                  t        |   |       y)zSetter for verify_mode.c                    t        |      S r/   )rd   )_connobj_x509obj_errnum	_errdepthretcodes        r$   _cbz)SSLContext.__set_verify_mode.<locals>._cb   s     = r+   N)r   z_SSL.Connectionr   z_crypto.X509r   rh   r   rh   r   rh   re   rd   )rz   
set_verify_VERIFY_MAP)r5   valuer   s      r$   __set_verify_modezSSLContext.__set_verify_mode   sZ    	!%	!"	! 	! 		!
 	! 	!  			[/5r+   c                    | j                   S r/   )r|   rs   s    r$   __get_check_hostnamezSSLContext.__get_check_hostname   s    ###r+   c                *    t        d|       || _        y )Ncheck_hostname)r   r|   r5   r   s     r$   __set_check_hostnamezSSLContext.__set_check_hostname   s    )51$r+   c                .    | j                   j                  S r/   )r{   rq   rs   s    r$   __get_check_ocsp_endpointz$SSLContext.__get_check_ocsp_endpoint  s    ""666r+   c                >    t        d|       || j                  _        y )N
check_ocsp)r   r{   rq   r   s     r$   __set_check_ocsp_endpointz$SSLContext.__set_check_ocsp_endpoint  s    u-27/r+   c                8    | j                   j                  d      S rU   )rz   set_optionsrs   s    r$   __get_optionszSSLContext.__get_options
  s     yy$$Q''r+   c                L    | j                   j                  t        |             y r/   )rz   r   rh   r   s     r$   __set_optionszSSLContext.__set_options  s     			c%j)r+   Nc                    r!dfd}| j                   j                  |       | j                   j                  |       | j                   j                  |xs |       | j                   j	                          y)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.
        c                .    J j                  d      S )Nzutf-8)encode)_max_length_prompt_twice
_user_datapasswords      r$   _pwcbz)SSLContext.load_cert_chain.<locals>._pwcb*  s       +++w//r+   N)r   rh   r   rd   r   rg   re   rg   )rz   set_passwd_cbuse_certificate_chain_fileuse_privatekey_filecheck_privatekey)r5   certfilekeyfiler   r   s      ` r$   load_cert_chainzSSLContext.load_cert_chain  sZ      0 II##E*		,,X6		%%g&9:		""$r+   c                    | j                   j                  ||       t        t        j                  d      s|J t        |      | j                  _        yy)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)rz   load_verify_locationshasattrrC   
Connectionr   r{   rp   )r5   cafilecapaths      r$   r   z SSLContext.load_verify_locations6  sK     			''7t(<=%%%3I&3QD0 >r+   c                l    t         r$| j                  t        j                                y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_ConfigurationErrorrs   s    r$   _load_certifizSSLContext._load_certifiC  s+    &&w}}7%' r+   c                H   | j                   j                         }t        j                  j                  j
                  }t        j                  |      D ]L  \  }}}|dk(  s|du s||v s|j                  t        j                  j                  t        |                   N y)z2Attempt to load CA certs from Windows trust store.x509_asnTN)rz   get_cert_store
_stdlibsslPurposeSERVER_AUTHoidenum_certificatesadd_cert_cryptoX509from_cryptography_load_der_x509_certificate)r5   store
cert_storer   certencodingtrusts          r$   _load_wincertszSSLContext._load_wincertsO  s    YY--/
  ,,00%/%A%A%%H!D(E:%D=C5L''667QRV7WX &Ir+   c                   t         j                  dk(  r	 dD ]  }| j                  |        n#t         j                  dk(  r| j	                          | j
                  j                          y# t        $ r | j	                          Y 6w xY w)z7A PyOpenSSL version of load_default_certs from CPython.win32)CAROOTdarwinN)_sysplatformr   PermissionErrorr   rz   set_default_verify_paths)r5   	storenames     r$   load_default_certszSSLContext.load_default_certsZ  st    
 ==G#%!/I''	2 "0
 ]]h& 		**, # %""$%s   A, ,BBc                8    | j                   j                          y)zmSpecify that the platform provided CA certificates are to be used
        for verification purposes.
        N)rz   r   rs   s    r$   r   z#SSLContext.set_default_verify_pathsj  s     			**,r+   c                B   t        | j                  ||      }|r|j                  |       |du r|j                          nj|r+t	        |      s |j                  |j                  d             | j                  t        j                  k7  r|j                          |j                          |rG|j                          | j                  r+|)	 t	        |      rt        ||       |S t        ||       	 |S |S # t         t"        f$ r}t%        t'        |            dd}~ww xY w)zZWrap an existing Python socket connection and return a TLS socket
        object.
        TidnaN)r-   rz   set_sessionset_accept_stater%   set_tlsext_host_namer   verify_moder   	CERT_NONErequest_ocspset_connect_staterN   r   _verify_ip_address_verify_hostname_SICertificateError_SIVerificationErrorr   str)	r5   r7   server_sidedo_handshake_on_connectr2   server_hostnamesessionssl_connr)   s	            r$   wrap_socketzSSLContext.wrap_socketr  s    DIIt-AB  )$%%' ~o'F --o.D.DV.LM:#7#77%%'&&( # !!# ""'B@%o6*8_E
  )?C x ,-AB @+CH54?@s   C5 $C5 5DDD)r   rh   )re   rh   )re   r   )r   r   re   rf   )re   rd   )r   r   re   rf   )re   zOptional[bool])r   rd   re   rf   rt   )r   rh   re   rf   )NN)r   zUnion[str, bytes]r   zUnion[str, bytes, None]r   Optional[str]re   rf   )r   r   r   r   re   rf   )r   r   re   rf   )FTTNN)r7   z_socket.socketr   rd   r   rd   r2   rd   r   r   r   zOptional[_SSL.Session]re   r-   )ri   rj   rk   ru   	__slots__r4   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_endpointrq   _SSLContext__get_options_SSLContext__set_optionsoptionsr   r   r   r   r   r   r   rv   r+   r$   rx   rx      sZ    KI
^  @6* ,.?@K$% 24HIN78 ##<>WX(* }m4G
 ,0"&	%#% )%  	%
 
%> EIR#R4AR	R
	- - "(,%))-*.,, , "&	,
 #, ', (, 
,r+   rx   )r#   r   re   rd   )r)   BaseExceptionre   rd   )]ru   
__future__r   socketr?   sslr   sysr   timer;   errnor   r\   	ipaddressr   r    typingr   r   r   r	   r
   r   cryptography.x509r   r   OpenSSLr   rC   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   r0   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ErrorrA   r   VERIFY_NONECERT_OPTIONALVERIFY_PEERCERT_REQUIREDVERIFY_FAIL_IF_NO_PEER_CERTr   itemsr   r%   rD   rE   WantX509LookupErrorr=   r*   r   r-   rn   rx   )keyr   s   00r$   <module>r#     s   #     ! / I I U  % D F J N D , ) G B 8 2-T]M $$** d$91=   :: $**d..d..1Q1QQ 5@4E4E4GH4Gjc5ucz4GH 
 (($*=*=t?W?WX .Jt JZ0 0^ ^S  M2 Is   "F< G
<GG