Ë
    Ü_Ëií@  ã                  ó°  — 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' ddl(m)Z* ddl(m+Z+ ddl,m-Z- erddlm.Z.  ed«      Z/	 ddl0Z0dZ1ejf                  Z4ejj                  Z5ejl                  Z6ejn                  Z7 e8edd«      Z9dZ:dZ;ejx                  Z=ej|                  ej~                  ej€                  ej‚                  ej„                  ej‚                  ej†                  z  iZDeDj‹                  «       D � �ci c]  \  } }|| “Œ
 c}} ZFdd„ZGej�                  ej’                  ej”                  fZKej�                  ZLej’                  ZMej”                  ZNdd„ZO G d„ dej                   «      ZQ G d„ d«      ZR G d„ d«      ZSy# e2$ r dZ1Y �ŒBw xY wc c}} w )zÃA 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)Ú_ocsp_callback)ÚSocketChecker)Ú_errno_from_exception)Úvalidate_boolean)Ú
VerifyModeÚ_TTFÚOP_NO_RENEGOTIATIONc                óF   — 	 t        | «       y# t        t        f$ r Y yw xY w)NTF)Ú_ip_addressÚ
ValueErrorÚUnicodeError)Úaddresss    ú\/var/www/pod-logistic/pod-api/venv/lib/python3.12/site-packages/pymongo/pyopenssl_context.pyÚ_is_ip_addressr   S   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#   c   s   € à�8‰8Ð-Ñ-Ð-ó    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Úsockr+   Ú	__class__s       €r   r-   z_sslConn.__init__l   s'   ø€ ô -Ó.ˆÔØ$8ˆÔ!Ü‰Ñ˜˜dÕ#r$   c                ód  — | j                  «       }|rt        j                  «       }	 	  ||i |¤ŽS # t        $ rõ}|dk(  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   r    z	timed outz!Underlying socket has been closedF)Ú
gettimeoutÚ_timeÚ	monotonicÚBLOCKING_IO_ERRORSÚfilenoÚ_socketÚtimeoutÚSSLErrorÚ
isinstanceÚ_SSLÚWantReadErrorÚWantWriteErrorr*   Úselect)	r.   Úcallr!   Úkwargsr9   Ústartr"   Ú	want_readÚ
want_writes	            r   Ú_callz_sslConn._callv   s  € Ø—/‘/Ó#ˆÙÜ—O‘OÓ%ˆEØðÙ˜TÐ, VÑ,Ð,øÜ%ò à˜a’<Ø�Ià—;‘;“= BÒ&Ù¤5§?¡?Ó#4°uÑ#<¸wÒ#FÜ%Ÿo™o¨kÓ:ÀÐDÜ"Ð#FÓGÈTÐQÜ˜c¤4×#5Ñ#5Ô6Ø $�IØ!&‘JÜ ¤T×%8Ñ%8Ô9Ø %�IØ!%‘Jà $�IØ!%�JØ×#Ñ#×*Ñ*¨4°¸JÈÔPÙœuŸ™Ó0°5Ñ8¸7ÒBÜ!Ÿ/™/¨+Ó6¸DÐ@Ýûð+ús   ©1 ±	D/ºC*D*Ä*D/c                ó@   •—  | j                   t        ‰| �  g|¢­i |¤ŽS r(   )rE   r,   Údo_handshake)r.   r!   rA   r1   s      €r   rG   z_sslConn.do_handshake”   s#   ø€ Øˆt�z‰zœ%™'Ñ.Ð@°Ò@¸Ñ@Ð@r$   c                ó²   •— 	  | j                   t        ‰| �  g|¢­i |¤ŽS # t        j                  $ r"}| j
                  rt        |«      rY d }~y‚ d }~ww xY w)Nr$   )rE   r,   Úrecvr<   ÚSysCallErrorr+   r#   ©r.   r!   rA   r"   r1   s       €r   rI   z_sslConn.recv—   sS   ø€ ð	Ø�4—:‘:œe™g™lÐ<¨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   )rE   r,   Ú	recv_intor<   rJ   r+   r#   rK   s       €r   rO   z_sslConn.recv_into    sT   ø€ ð	Ø�4—:‘:œe™gÑ/ÐA°$ÒA¸&ÑAÐAøÜ× Ñ ò 	à×(Ò(¬[¸Ô-=ÜØûð		úrL   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ÚlenrE   r,   ÚsendÚOSErrorr   Ú_EINTR)	r.   ÚbufÚflagsÚviewÚtotal_lengthÚ
total_sentÚsentr"   r1   s	           €r   Úsendallz_sslConn.sendall©   s’   ø€ Ü˜#‹ˆÜ˜3“xˆØˆ
Ø˜<Ò'ðØ—z‘z¤%¡'¡,°°Z°[Ð0AÀ5ÓI�ð �qŠyÜÐ1Ó2Ð2Ø˜$ÑˆJð ˜<Õ'øô ò Ü(¨Ó-´Ò7ÜØûðús    A Á	BÁ$A<Á;A<Á<B)r/   z_SSL.Contextr0   zOptional[_socket.socket]r+   Úbool)r@   zCallable[..., _T]r!   r   rA   r   Úreturnr   )r!   r   rA   r   r^   ÚNone)r!   r   rA   r   r^   Úbytes)r!   r   rA   r   r^   Úint)r   )rV   r`   rW   ra   r^   r_   )
Ú__name__Ú
__module__Ú__qualname__r-   rE   rG   rI   rO   r\   Ú__classcell__)r1   s   @r   r&   r&   k   sC   ø„ ð$àð$ð 'ð$ð #õ	$óõ<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©r.   s    r   r-   z_CallbackData.__init__Á   s   € ØBFˆÔØ37ˆÔ Ü#-£<ˆÕ r$   N©r^   r_   )rb   rc   rd   Ú__doc__r-   © r$   r   rg   rg   ¾   s
   „ Ù:ô0r$   rg   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)
rr   r<   ÚContextrs   rg   rt   ru   rj   Úset_ocsp_client_callbackr   )r.   Úprotocols     r   r-   zSSLContext.__init__Î   s\   € Ø!ˆŒÜ—L‘L §¡Ó0ˆŒ	Ü+›oˆÔØ#ˆÔð
 37ˆ×ÑÔ/Ø�	‰	×*Ñ*´NÈ×I\ÑI\Ð*Õ]r$   c                ó   — | j                   S )zhThe protocol version chosen when constructing the context.
        This attribute is read-only.
        )rr   rl   s    r   r{   zSSLContext.protocolÚ   s   € ð
 �~‰~Ðr$   c                óD   — t         | j                  j                  «          S )zÉWhether 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_MAPrs   Úget_verify_moderl   s    r   Ú__get_verify_modezSSLContext.__get_verify_modeá   s   € ô
 # 4§9¡9×#<Ñ#<Ó#>Ñ?Ð?r$   c                ój   — 	 	 	 	 	 	 	 	 	 	 	 	 dd„}| j                   j                  t        |   |«       y)zSetter for verify_mode.c                ó   — t        |«      S r(   )r]   )Ú_connobjÚ_x509objÚ_errnumÚ	_errdepthÚretcodes        r   Ú_cbz)SSLContext.__set_verify_mode.<locals>._cbë   s   € ô ˜“=Ð r$   N)rƒ   z_SSL.Connectionr„   z_crypto.X509r…   ra   r†   ra   r‡   ra   r^   r]   )rs   Ú
set_verifyÚ_VERIFY_MAP)r.   Úvaluerˆ   s      r   Ú__set_verify_modezSSLContext.__set_verify_modeè   sZ   € ð	!Ø%ð	!à"ð	!ð ð	!ð ð		!ð
 ð	!ð ó	!ð  	�	‰	×Ñœ[¨Ñ/°Õ5r$   c                ó   — | j                   S r(   )ru   rl   s    r   Ú__get_check_hostnamezSSLContext.__get_check_hostnameÿ   s   € Ø×#Ñ#Ð#r$   c                ó*   — t        d|«       || _        y )NÚcheck_hostname)r   ru   ©r.   r‹   s     r   Ú__set_check_hostnamezSSLContext.__set_check_hostname  s   € ÜÐ)¨5Ô1Ø$ˆÕr$   c                ó.   — | j                   j                  S r(   )rt   rj   rl   s    r   Ú__get_check_ocsp_endpointz$SSLContext.__get_check_ocsp_endpoint  s   € Ø×"Ñ"×6Ñ6Ð6r$   c                ó>   — t        d|«       || j                  _        y )NÚ
check_ocsp)r   rt   rj   r‘   s     r   Ú__set_check_ocsp_endpointz$SSLContext.__set_check_ocsp_endpoint  s   € Ü˜ uÔ-Ø27ˆ×ÑÕ/r$   c                ó8   — | j                   j                  d«      S rN   )rs   Úset_optionsrl   s    r   Ú__get_optionszSSLContext.__get_options  s   € ð �y‰y×$Ñ$ QÓ'Ð'r$   c                óL   — | j                   j                  t        |«      «       y r(   )rs   r™   ra   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>._pwcb1  s    ø€ ð  Ð+Ð+Ð+Ø—‘ wÓ/Ð/r$   N)r    ra   r¡   r]   r¢   zOptional[bytes]r^   r`   )rs   Úset_passwd_cbÚuse_certificate_chain_fileÚuse_privatekey_fileÚcheck_privatekey)r.   ÚcertfileÚkeyfiler£   r¤   s      ` r   Úload_cert_chainzSSLContext.load_cert_chain  sZ   ø€ ñ  õ0ð �I‰I×#Ñ# EÔ*Ø�	‰	×,Ñ,¨XÔ6Ø�	‰	×%Ñ% gÒ&9°Ô:Ø�	‰	×"Ñ"Õ$r$   c                ó<   — | j                   j                  ||«       y)z­Load a set of "certification authority"(CA) certificates used to
        validate other peers' certificates when `~verify_mode` is other than
        ssl.CERT_NONE.
        N)rs   Úload_verify_locations)r.   ÚcafileÚcapaths      r   r­   z SSLContext.load_verify_locations=  s   € ð 	�	‰	×'Ñ'¨°Õ7r$   c                ól   — t         r$| j                  t        j                  «       «       yt	        d«      ‚)z&Attempt to load CA certs from certifi.z±tlsAllowInvalidCertificates 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   s    r   Ú_load_certifizSSLContext._load_certifiF  s+   € åØ×&Ñ&¤w§}¡}£Õ7ä%ð'óð r$   c                ód  — | j                   j                  «       }|€J ‚t        j                  j                  j
                  }t        j                  |«      D ]V  \  }}}|dk(  sŒ|du s||v sŒ|j                  t        j                  j                  t        j                  |«      «      «       ŒX y)z2Attempt to load CA certs from Windows trust store.NÚx509_asnT)rs   Úget_cert_storeÚ
_stdlibsslÚPurposeÚSERVER_AUTHÚoidÚenum_certificatesÚadd_certÚ_cryptoÚX509Úfrom_cryptographyÚx509Úload_der_x509_certificate)r.   ÚstoreÚ
cert_storer¼   ÚcertÚencodingÚtrusts          r   Ú_load_wincertszSSLContext._load_wincertsR  s™   € à—Y‘Y×-Ñ-Ó/ˆ
ØÐ%Ð%Ð%Ü× Ñ ×,Ñ,×0Ñ0ˆä%/×%AÑ%AÀ%Ó%Hò 	Ñ!ˆD�(˜EØ˜:Ó%Ø˜D‘= C¨5¢LØ×'Ñ'ÜŸ™×6Ñ6´t×7UÑ7UÐVZÓ7[Ó\õñ	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µ   rs   Úset_default_verify_paths)r.   Ú	storenames     r   Úload_default_certszSSLContext.load_default_certs_  sy   € ô
 �=‰=˜GÒ#ð%Ø!/ò 3�IØ×'Ñ'¨	Õ2ñ3ô
 �]‰]˜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)rs   rÒ   rl   s    r   rÒ   z#SSLContext.set_default_verify_pathso  s   € ð 	�	‰	×*Ñ*Õ,r$   c                óŽ  — t        | j                  ||«      }|r|j                  |«       |du r|j                  «        nj|r+t	        |«      s |j                  |j                  d«      «       | j                  t        j                  k7  r|j                  «        |j                  «        |rY|j                  «        | j                  r=|�;ddlm} 	 t	        |«      r|j!                  ||«       |S |j#                  ||«       	 |S |S # t        j$                  t        j&                  f$ r}	t)        t+        |	«      «      d‚d}	~	ww xY w)zZWrap an existing Python socket connection and return a TLS socket
        object.
        TÚidnaNr   )Ú	pyopenssl)r&   rs   Úset_sessionÚset_accept_stater   Úset_tlsext_host_namerŸ   Úverify_moder¹   Ú	CERT_NONEÚrequest_ocspÚset_connect_staterG   r�   Úservice_identityrØ   Úverify_ip_addressÚverify_hostnameÚCertificateErrorÚVerificationErrorr   Ústr)
r.   r0   Úserver_sideÚdo_handshake_on_connectr+   Úserver_hostnameÚsessionÚssl_connrØ   r"   s
             r   Úwrap_socketzSSLContext.wrap_socketw  s2  € ô ˜DŸI™I tÐ-AÓBˆÙØ× Ñ  Ô)Ø˜$ÑØ×%Ñ%Õ'ñ ¤~°oÔ'Fð ×-Ñ-¨o×.DÑ.DÀVÓ.LÔMØ×Ñ¤:×#7Ñ#7Ò7à×%Ñ%Ô'Ø×&Ñ&Ô(ñ #ð ×!Ñ!Ô#ð ×"Ò" Ð'BÝ6ð	@Ü% oÔ6Ø!×3Ñ3°H¸oÔNð ˆð "×1Ñ1°(¸OÕLð ˆˆxˆøô	 %×5Ñ5Ü$×6Ñ6ðò @ô ,¬C°«HÓ5¸4Ð?ûð	@ús   ÃD Ã0D Ä#EÄ*D?Ä?E)r{   ra   )r^   ra   )r^   r   )r‹   r   r^   r_   )r^   r]   )r‹   r   r^   r_   )r^   zOptional[bool])r‹   r]   r^   r_   )r‹   ra   r^   r_   )NN)r©   zUnion[str, bytes]rª   zUnion[str, bytes, None]r£   úOptional[str]r^   r_   )r®   rì   r¯   rì   r^   r_   rm   )rÄ   rå   r^   r_   )FTTNN)r0   z_socket.socketræ   r]   rç   r]   r+   r]   rè   rì   ré   zOptional[_SSL.Session]r^   r&   )rb   rc   rd   rn   Ú	__slots__r-   Ú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_endpointrj   Ú_SSLContext__get_optionsÚ_SSLContext__set_optionsÚoptionsr«   r­   rµ   rÉ   rÔ   rÒ   rë   ro   r$   r   rq   rq   Ç   sV  „ ñð K€Ió
^ð òó ðó@ó6ñ* Ð,Ð.?Ó@€Kó$ó%ñ Ð2Ð4HÓI€Nó7ó8ñ #Ð#<Ð>WÓXÐó(ó*ñ �} mÓ4€Gð
 ,0Ø"&ð	%à#ð%ð )ð%ð  ð	%ð
 
ó%ð> EIð8Ø#ð8Ø4Að8à	ó8ó
óó-ó -ð "Ø(,Ø%)Ø)-Ø*.ð1àð1ð ð1ð "&ð	1ð
 #ð1ð 'ð1ð (ð1ð 
ô1r$   rq   )r   r   r^   r]   )r"   ÚBaseExceptionr^   r]   )Trn   Ú
__future__r   Úsocketr8   Ússlr¹   ÚsysrÏ   Útimer4   Úerrnor   rU   Ú	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   Ú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   r=   r>   ÚWantX509LookupErrorr6   ÚBLOCKING_IO_READ_ERRORÚBLOCKING_IO_WRITE_ERRORÚBLOCKING_IO_LOOKUP_ERRORr#   Ú
Connectionr&   rg   rq   )Úkeyr‹   s   00r   ú<module>r     s¼  ðñõ
 #ã Û Û Û Ý !Ý /ß I× Iå  Û Ý Ý %å DÝ ,Ý )Ý /Ý BÝ 8Ý 2áÝñ ˆTƒ]€ðÛà€Mð ×$Ñ$€à×Ñ€Ø×Ñ€Ø×*Ñ*Ð á˜dÐ$9¸1Ó=Ð ð €Ø€ð �:‰:€ð ×Ñ˜$×*Ñ*Ø×Ñ˜d×.Ñ.Ø×Ñ˜d×.Ñ.°×1QÑ1QÑQð€ð 5@×4EÑ4EÓ4G×H¡j c¨5�u˜c‘zÓHÐ ó
ð ×(Ñ(¨$×*=Ñ*=¸t×?WÑ?WÐXÐ Ø×+Ñ+Ð Ø×-Ñ-Ð Ø×3Ñ3Ð ó.ôPˆt�‰ô P÷f0ñ 0÷aò aøðe ò ØƒMðüó2 Is   ÂG Ä:GÇGÇG