
    IilJ                       S r SSKJr  SSKrSSKrSSKrSSKr	SSK
rSSKJr  SSKJr  SSKJrJrJrJrJrJr  SSKJr  SSKrSSKJr  SSKJr   SS	K!J"r#  SS
K!J$r$  SSK%J&r&  SSK'J(r(J)r)  SSK*J+r,  SSK*J-r-  SSK.J/r/  \(       a  SSKJ0r0  \" S5      r1 SSK2r2Sr3\Rj                  r6\Rn                  r7\Rp                  r8\Rr                  r9\:" \SS5      r;Sr<Sr=\R|                  r?\R                  \R                  \R                  \R                  \R                  \R                  \R                  -  0rF\FR                  5        V Vs0 s H  u  pX_M	     snn rHSS jrI\R                  \R                  \R                  4rM\R                  rN\R                  rO\R                  rPSS jrQ " S S\R                  5      rS " S S5      rT " S S5      rUg! \4 a    Sr3 GNFf = fs  snn f )MA CPython compatible SSLContext implementation wrapping PyOpenSSL's
context.
    )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                H     [        U 5        g! [        [        4 a     gf = f)NTF)_ip_address
ValueErrorUnicodeError)addresss    ?/venv/lib/python3.13/site-packages/pymongo/pyopenssl_context.py_is_ip_addressr    R   s)    G% s    !!c                     U R                   S:H  $ )z<Return True if the OpenSSL.SSL.SysCallError is a ragged EOF.)zUnexpected EOF)args)excs    r   _ragged_eofr%   b   s    88---    c                     ^  \ rS rSr      S	U 4S jjrS
S jrSU 4S jjrSU 4S jjrSU 4S jjrSSU 4S jjjr	Sr
U =r$ )_sslConnj   c                N   > [        5       U l        X0l        [        TU ]  X5        g N)_SocketCheckersocket_checkersuppress_ragged_eofssuper__init__)selfctxsockr.   	__class__s       r   r0   _sslConn.__init__k   s#     -.$8!#r&   c                   U R                  5       nU(       a  [        R                  " 5       n  U" U0 UD6$ ! [         Ga  nU R	                  5       S:X  aF  U(       a3  [        R                  " 5       W-
  U:  a  [
        R                  " S5      S e[        S5      S e[        U[        R                  5      (       a  SnSnO([        U[        R                  5      (       a  SnSnOSnSnU R                  R                  XX5        U(       a3  [        R                  " 5       W-
  U:  a  [
        R                  " S5      S e S nAGM  S nAff = f)NTr"   z	timed outz!Underlying socket has been closedF)
gettimeout_time	monotonicBLOCKING_IO_ERRORSfileno_sockettimeoutSSLError
isinstance_SSLWantReadErrorWantWriteErrorr-   select)	r1   callr#   kwargsr=   startr$   	want_read
want_writes	            r   _call_sslConn._callr   s   //#OO%ET,V,,% ;;=B&5??#4u#<w#F%ook:D"#FGTQc4#5#566 $I!&JT%8%899 %I!%J $I!%J##**4JPu0587B!//+6D@%s   7 E
C<EE
c                @   > U R                   " [        TU ]  /UQ70 UD6$ r+   )rI   r/   do_handshake)r1   r#   rE   r4   s      r   rL   _sslConn.do_handshake   s!    zz%'.@@@@r&   c                   >  U R                   " [        TU ]  /UQ70 UD6$ ! [        R                   a,  nU R
                  (       a  [        U5      (       a   S nAge S nAff = f)Nr&   )rI   r/   recvr@   SysCallErrorr.   r%   r1   r#   rE   r$   r4   s       r   rO   _sslConn.recv   sT    	::egl<T<V<<   	(([-=-=		   ! A!!AAA!c                   >  U R                   " [        TU ]  /UQ70 UD6$ ! [        R                   a,  nU R
                  (       a  [        U5      (       a   S nAge S nAff = fNr   )rI   r/   	recv_intor@   rP   r.   r%   rQ   s       r   rV   _sslConn.recv_into   sU    	::eg/A$A&AA   	(([-=-=		rS   c                  > [        U5      n[        U5      nSnXT:  a;   U R                  [        TU ]  X5S  U5      nUS::  a  [        S5      eXV-  nXT:  a  M:  g g ! [
         a  n[        U5      [        :X  a   S nAMd  e S nAff = f)Nr   zconnection closed)
memoryviewlenrI   r/   sendOSErrorr   _EINTR)	r1   bufflagsviewtotal_length
total_sentsentr$   r4   s	           r   sendall_sslConn.sendall   s    #3x
'zz%',[0A5I qy122J '  (-7s   A 
B%A?>A??B)r-   r.   )r2   z_SSL.Contextr3   zOptional[_socket.socket]r.   bool)rD   zCallable[..., _T]r#   r   rE   r   returnr   )r#   r   rE   r   rg   None)r#   r   rE   r   rg   bytes)r#   r   rE   r   rg   int)r   )r^   ri   r_   rj   rg   rh   )__name__
__module____qualname____firstlineno__r0   rI   rL   rO   rV   rd   __static_attributes____classcell__)r4   s   @r   r(   r(   j   s?    $$'?$W[$6A r&   r(   c                  "    \ rS rSrSrSS jrSrg)_CallbackData   z0Data class which is passed to the OCSP callback.c                >    S U l         S U l        [        5       U l        g r+   )trusted_ca_certscheck_ocsp_endpointr   ocsp_response_cacher1   s    r   r0   _CallbackData.__init__   s    BF37 #-< r&   )rv   rw   ru   Nrg   rh   )rk   rl   rm   rn   __doc__r0   ro    r&   r   rr   rr      s
    :0r&   rr   c                     \ rS rSrSrSrSS jr\SS j5       rSS jr	SS jr
\" \	\
5      rSS jrSS	 jr\" \\5      rSS
 jrSS jr\" \\5      rS S jrS!S jr\" \\5      r  S"       S#S jjr S"     S$S jjrS S jrS%S jrS S jrS S jr     S&             S'S jjr     S&             S'S jjrSrg)(
SSLContext   r   )	_protocol_ctx_callback_data_check_hostnamec                    Xl         [        R                  " U R                   5      U l        [	        5       U l        SU l        SU R
                  l        U R                  R                  [        U R
                  S9  g )NT)callbackdata)
r   r@   Contextr   rr   r   r   rv   set_ocsp_client_callbackr   )r1   protocols     r   r0   SSLContext.__init__   sZ    !LL0	+o#
 37/		**NI\I\*]r&   c                    U R                   $ )zXThe protocol version chosen when constructing the context.
This attribute is read-only.
)r   rx   s    r   r   SSLContext.protocol   s    
 ~~r&   c                D    [         U R                  R                  5          $ )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_moderx   s    r   __get_verify_modeSSLContext.__get_verify_mode   s    
 #499#<#<#>??r&   c                l                SS jnU R                   R                  [        U   U5        g)zSetter for verify_mode.c                    [        U5      $ r+   )rf   )_connobj_x509obj_errnum	_errdepthretcodes        r   _cb)SSLContext.__set_verify_mode.<locals>._cb   s     = r&   N)r   z_SSL.Connectionr   z_crypto.X509r   rj   r   rj   r   rj   rg   rf   )r   
set_verify_VERIFY_MAP)r1   valuer   s      r   __set_verify_modeSSLContext.__set_verify_mode   sZ    	!%	!"	! 	! 		!
 	! 	!  			[/5r&   c                    U R                   $ r+   )r   rx   s    r   __get_check_hostnameSSLContext.__get_check_hostname   s    ###r&   c                (    [        SU5        Xl        g )Ncheck_hostname)r   r   r1   r   s     r   __set_check_hostnameSSLContext.__set_check_hostname   s    )51$r&   c                .    U R                   R                  $ r+   )r   rv   rx   s    r   __get_check_ocsp_endpoint$SSLContext.__get_check_ocsp_endpoint  s    ""666r&   c                <    [        SU5        XR                  l        g )N
check_ocsp)r   r   rv   r   s     r   __set_check_ocsp_endpoint$SSLContext.__set_check_ocsp_endpoint  s    u-27/r&   c                8    U R                   R                  S5      $ rU   )r   set_optionsrx   s    r   __get_optionsSSLContext.__get_options
  s     yy$$Q''r&   c                L    U R                   R                  [        U5      5        g r+   )r   r   rj   r   s     r   __set_optionsSSLContext.__set_options  s     			c%j)r&   Nc                  ^ T(       a#  SU4S jjnU R                   R                  U5        U R                   R                  U5        U R                   R                  U=(       d    U5        U R                   R	                  5         g)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                0   > Tc   eTR                  S5      $ )Nzutf-8)encode)_max_length_prompt_twice
_user_datapasswords      r   _pwcb)SSLContext.load_cert_chain.<locals>._pwcb*  s       +++w//r&   N)r   rj   r   rf   r   zOptional[bytes]rg   ri   )r   set_passwd_cbuse_certificate_chain_fileuse_privatekey_filecheck_privatekey)r1   certfilekeyfiler   r   s      ` r   load_cert_chainSSLContext.load_cert_chain  sZ      0 II##E*		,,X6		%%g&9:		""$r&   c                    U R                   R                  X5        [        [        R                  S5      (       d   Uc   e[        U5      U R                  l        gg)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hasattrr@   
Connectionr   r   ru   )r1   cafilecapaths      r   r    SSLContext.load_verify_locations6  sL     			''7t(<==%%%3I&3QD0 >r&   c                x    [         (       a%  U R                  [        R                  " 5       5        g[	        S5      e)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_ConfigurationErrorrx   s    r   _load_certifiSSLContext._load_certifiC  s-    =&&w}}7%' r&   c                v   U R                   R                  5       nUc   e[        R                  R                  R
                  n[        R                  " U5       H\  u  pEnUS:X  d  M  USL d  X6;   d  M  UR                  [        R                  R                  [        R                  " U5      5      5        M^     g)z2Attempt to load CA certs from Windows trust store.Nx509_asnT)r   get_cert_store
_stdlibsslPurposeSERVER_AUTHoidenum_certificatesadd_cert_cryptoX509from_cryptographyx509load_der_x509_certificate)r1   store
cert_storer   certencodingtrusts          r   _load_wincertsSSLContext._load_wincertsO  s    YY--/
%%%  ,,00%/%A%A%%H!DE:%D=CL''66t7U7UVZ7[\ &Ir&   c                    [         R                  S:X  a   S H  nU R                  U5        M     O$[         R                  S:X  a  U R	                  5         U R
                  R                  5         g! [         a    U R	                  5          N7f = f)z7A PyOpenSSL version of load_default_certs from CPython.win32)CAROOTdarwinN)_sysplatformr   PermissionErrorr   r   set_default_verify_paths)r1   	storenames     r   load_default_certsSSLContext.load_default_certs\  st    
 ==G#%!/I''	2 "0
 ]]h& 		**, # %""$%s   A0 0BBc                8    U R                   R                  5         g)z]Specify that the platform provided CA certificates are to be used
for verification purposes.
N)r   r   rx   s    r   r   #SSLContext.set_default_verify_pathsl  s     			**,r&   c                V  #    [        U R                  X5      n[        R                  " 5       nU(       a  UR	                  U5        USL a  UR                  5         OU(       a0  [        U5      (       d   UR                  UR                  S5      5        U R                  [        R                  :w  a$  UR                  SUR                  5      I Sh  vN   UR                  5         U(       av  UR                  SUR                  5      I Sh  vN   U R                   (       aA  Ub>  SSKJn	   [        U5      (       a  U	R'                  Xu5        U$ U	R)                  Xu5         U$ U$  N NZ! ["        R*                  ["        R,                  4 a  n
[/        [1        U
5      5      SeSn
A
ff = f7fzJWrap an existing Python socket connection and return a TLS socket
object.
TidnaNr   )	pyopenssl)r(   r   asyncioget_running_loopset_sessionset_accept_stater    set_tlsext_host_namer   verify_moder   	CERT_NONErun_in_executorrequest_ocspset_connect_staterL   r   service_identityr   verify_ip_addressverify_hostnameSICertificateErrorSIVerificationErrorr   str)r1   r3   server_sidedo_handshake_on_connectr.   server_hostnamesessionssl_connloopr   r$   s              r   a_wrap_socketSSLContext.a_wrap_sockett  sm     DIItB'')  )$%%' ~o'F'F --o.D.DV.LM:#7#77**41F1FGGG&&( # &&tX-B-BCCC ""'B6	@%o66!33HN  "11(L x1 H D %77$88 @ ,CH54?	@sT   CF)E$:F)E&F)+!E( F)E( F)&F)($F&F!!F&&F)c                   [        U R                  X5      nU(       a  UR                  U5        USL a  UR                  5         OuU(       a0  [	        U5      (       d   UR                  UR                  S5      5        U R                  [        R                  :w  a  UR                  5         UR                  5         U(       ab  UR                  5         U R                  (       aA  Ub>  SSKJn   [	        U5      (       a  UR!                  Xu5        U$ UR#                  Xu5         U$ U$ ! [        R$                  [        R&                  4 a  n	[)        [+        U	5      5      SeSn	A	ff = fr   )r(   r   r   r   r    r  r   r  r   r  r  r  rL   r   r  r   r  r	  r
  r  r   r  )
r1   r3   r  r  r.   r  r  r  r   r$   s
             r   wrap_socketSSLContext.wrap_socket  s1    DIItB  )$%%' ~o'F'F --o.D.DV.LM:#7#77%%'&&( # !!# ""'B6	@%o66!33HN  "11(L x	 %77$88 @ ,CH54?	@s   ,!D% D% %$E#	EE#)r   r   r   r   )r   rj   )rg   rj   )rg   r   )r   r   rg   rh   )rg   rf   )r   r   rg   rh   )rg   zOptional[bool])r   rf   rg   rh   rz   )r   rj   rg   rh   )NN)r   zUnion[str, bytes]r   zUnion[str, bytes, None]r   Optional[str]rg   rh   )r   r  r   r  rg   rh   )r   r  rg   rh   )FTTNN)r3   z_socket.socketr  rf   r  rf   r.   rf   r  r  r  zOptional[_SSL.Session]rg   r(   )rk   rl   rm   rn   r{   	__slots__r0   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_endpointrv   _SSLContext__get_options_SSLContext__set_optionsoptionsr   r   r   r   r   r   r  r  ro   r|   r&   r   r~   r~      s    KI
^  @6* ,.?@K$% 24HIN78 ##<>WX(* }m4G
 ,0"&	%#% )%  	%
 
%> EIR#R4AR	R
- - "(,%))-*.22 2 "&	2
 #2 '2 (2 
2n "(,%))-*.11 1 "&	1
 #1 '1 (1 
1 1r&   r~   )r   r   rg   rf   )r$   BaseExceptionrg   rf   )Vr{   
__future__r   r   socketr<   sslr   sysr   timer8   errnor   r]   	ipaddressr   r   typingr   r   r	   r
   r   r   cryptography.x509r   r  OpenSSLr   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   ImportErrorSSLv23_METHODPROTOCOL_SSLv23OP_NO_SSLv2OP_NO_SSLv3OP_NO_COMPRESSIONgetattrr   HAS_SNIIS_PYOPENSSLErrorr>   r  VERIFY_NONECERT_OPTIONALVERIFY_PEERCERT_REQUIREDVERIFY_FAIL_IF_NO_PEER_CERTr   itemsr   r    rA   rB   WantX509LookupErrorr:   BLOCKING_IO_READ_ERRORBLOCKING_IO_WRITE_ERRORBLOCKING_IO_LOOKUP_ERRORr%   r   r(   rr   r~   )keyr   s   00r   <module>rI     s   #      ! / I I     % D , ) G B 8 2 T]M $$** d$91=   :: $**d..d..1Q1QQ 5@4E4E4GH4Gjcuz4GH 
 (($*=*=t?W?WX ++ -- 33 .Jt JZ0 0Y YY  M2 Is   G G!GG