
    iK                         e d           ZddlmZ  ee e             ee                     ddlZddlmZm	Z	 ddl
mZmZmZ ddlmZmZ ddlmZmZ dd	lmZ  e d
          Zej        Zej        Zg dZej        Zej        Zej        dd         dk    Z ej        j!        Z"ed             Z# G d de          Z$e$Zd Z! G d de          Z%e%Z e&ed          rej'        Z(d Z)e)Z'e)Z*dS dS )ssl    )slurp_properties)srckeysN)greeniohubs)GreenSocketCONNECT_ERRCONNECT_SUCCESS)
trampolineIOClosed)	get_errnoPY33)contextmanagersocket)	SSLSocket
SSLContextwrap_socketsslwrap_simplecreate_default_context_create_default_https_context   )      c               /     K   t           j                            dd           }t          j        j                            dd           }t          t          j        j        d<   t
          t           j        d<   	 d V  |t           j        d<   |t          j        j        d<   d S # |t           j        d<   |t          j        j        d<   w xY w)Nr   r   )_original_wrap_socket__globals__get_original_sslsocket_create_original_sslcontext)argskwargstmp_sslcontexttmp_sslsockets       =/usr/local/lib/python3.11/dist-packages/eventlet/green/ssl.py_original_ssl_contextr&      s      *6::<NNN'/;??TRRM;N+K86J%l3M:H),7?L#/<<< ;I),7?L#/<LLLLs   6B %Cc                       e Zd ZdZddddeeddfdZed             ZdddeeddfdZ	d Z
d	 Zd
 Zd Z fdZd fd	Zd fd	ZddZddZd dZd!dZd"dZd  fd	Zd! fd	Z fdZ fdZd Zd Zd Zd Z xZS )#GreenSSLSocketa   This is a green version of the SSLSocket class from the ssl module added
    in 2.6.  For documentation on it, please see the Python standard
    documentation.

    Python nonblocking ssl objects don't give errors when the other end
    of the socket is closed (they do notice when the other end is shutdown,
    though).  Any write/read operations will simply hang if the socket is
    closed from the other end.  There is no obvious fix for this problem;
    it appears to be a limitation of Python's ssl object implementation.
    A workaround is to set a reasonable timeout on the socket using
    settimeout(), and to close/reopen the connection when a timeout
    occurs at an unexpected juncture in the code.
    NFTc	                 T   t          |t                    st          |          }t                      5  |
                    d          }|rat                              |j        |d|
                    dd          |
                    d          ||
                    d                    }n6|                     |j        ||||||d|
                    d          		  	        }d d d            n# 1 swxY w Y   ||_        ||_	        ||_
        ||_        ||_        t          |_        |S )
N_contextFsuppress_ragged_eofsTserver_hostnamesession)sockserver_sidedo_handshake_on_connectr+   r,   contextr-   ciphers)	r.   keyfilecertfiler/   	cert_reqsssl_versionca_certsr0   r2   )
isinstancer   r&   r   r   r   fd_wrap_socketr3   r4   r5   r6   r7   r(   	__class__)clsr.   r3   r4   r/   r5   r6   r7   r0   r!   kwr1   rets                r%   __new__zGreenSSLSocket.__new__8   sn    $,, 	%t$$D"$$ 	 	ffZ((G )11 +,1)+0F)M)M$&FF+<$=$=#FF9-- 2   &&#% +' +%,1FF9-- ' 
 
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	0 !%&
s   B/C..C25C2c	                    t          |          }	|	xj        |z  c_        |s|r|	                    ||           |r|	                    |           |r|	                    |           |	                    | ||          S )N)protocol)r4   r3   )r.   r/   r0   )r    optionsload_cert_chainload_verify_locationsset_ciphersr   )
r.   r3   r4   r/   r5   r6   r7   r0   r2   r1   s
             r%   r:   zGreenSSLSocket._wrap_socket^   s     '<<<9$ 	w 	##! $     	4))(333 	)(((""#$; # 
 
 	
    c	                    t          |t                    st          |          }|j        | _        	 t          j        D ]}t          | |           n# t          $ r Y nw xY w|                                | _        t          
                    | d           t                              |           dk    sJ || _        |r| j        r|                                  d S d S d S )N        )r8   r   act_non_blockingorig_socket_delegate_methodsdelattrAttributeError
gettimeout_timeoutr   
settimeoutr0   
_connecteddo_handshake)selfr.   r3   r4   r/   r5   r6   r7   r0   r!   r=   fns               r%   __init__zGreenSSLSocket.__init__t   s    $,, 	%t$$D $ 5	!3 " "b!!!!" 	 	 	D	 )) 	&&tS111"--d33s:::: (?$" 	 t 	 	  	  	  	 s   A 
AAc                     || _         d S NrO   )rS   timeouts     r%   rP   zGreenSSLSocket.settimeout   s    rF   c                     | j         S rW   rX   rS   s    r%   rN   zGreenSSLSocket.gettimeout   s
    }rF   c                 F    |rd| _         d | _        d S d| _         d| _        d S )NFTrH   )rI   rO   )rS   flags     r%   setblockingzGreenSSLSocket.setblocking   s0     	 $)D! DMMM$(D!DMMMrF   c           	         | j         r ||i |S 	 	  ||i |S # t          $ r}t          |          t          k    r3t	          | d|                                 t          d                     nit          |          t          k    r3t	          | d|                                 t          d                     nt          rd|j	        d         v rt           Y d }~nd }~ww xY w)NT	timed outreadrY   timeout_excwriterY   rc   zunexpected eof   )rI   SSLErrorr   SSL_ERROR_WANT_READr   rN   rc   SSL_ERROR_WANT_WRITE
_is_py_3_7r!   r   )rS   funcar=   excs        r%   _call_trampoliningz!GreenSSLSocket._call_trampolining   s+     	4>b>>!4>b>>)    ~~)<<<"4(,+/??+<+</:;/G/GI I I I I #3+???"4)-+/??+<+</:;/G/GI I I I I $ (8CHQK(G(G '#s    
C"B4CC"c                 R    |                      t                      j        |          S )zhWrite DATA to the underlying SSL channel.  Returns
        number of bytes of DATA actually transmitted.)rn   superre   )rS   datar;   s     r%   re   zGreenSSLSocket.write   s(     &&GGM4! ! 	!rF      c                     	 |                      t                      j        ||          S # t          $ r	 |Y dS Y dS w xY w)zORead up to LEN bytes and return them.
        Return zero-length string on EOF.NrF   r   )rn   rp   rb   r   )rS   lenbufferr;   s      r%   rb   zGreenSSLSocket.read   s[    	**c6+ + + 	 	 	~ssqq		s   '+ >>r   c                     | j         r(|                     t                      j        ||          S t	          | dt          d                     t                              | ||          S )NTr`   re   rc   )_sslobjrn   rp   sendr   rc   r   )rS   rq   flagsr;   s      r%   ry   zGreenSSLSocket.send   sg    < 	2**dE+ + + t4[5M5MNNNN;;tT5111rF   c                     | j         rt          d| j        z            t          | dt	          d                     t
                              | |||          S )Nz%sendto not allowed on instances of %sTr`   rw   )rx   
ValueErrorr;   r   rc   r   sendto)rS   rq   addrrz   s       r%   r}   zGreenSSLSocket.sendto   sb    < 	:D!^, - - - t4[5M5MNNNN==tT5999rF   c           	      d   | j         r|dk    rt          d| j        z            t          |          }d}|}||k     rP|                     |          }||z  }|dk    r t          | dt          d                     n
||d          }||k     P|S 	 	 t                              | ||          S # t          j
        $ rr}| j        r t          |          }|t          j        v r3t          | d|                                 t          d                     n|t          j        v rY d }~dS  d }~ww xY w)Nr   z6non-zero flags not allowed in calls to sendall() on %sTr`   rw   rd    )rx   r|   r;   rt   ry   r   rc   r   sendallrJ   errorrI   r   r   SOCKET_BLOCKINGrN   SOCKET_CLOSED)	rS   rq   rz   amountcountdata_to_sendveernos	            r%   r   zGreenSSLSocket.sendall   sz   < 	zz LN#$ $ $ YYFEL6>>IIl++
66t4[=U=UVVVVV#'<L 6>> M!>>$e<<<"( 	 	 	, $Q<<Dw666"4t+/??+<+<+VaJbJbd d d d d!666!rrrrr	s   B. .D/=A&D*)D**D/c                 2    |                      ||d          S )NF)into)
_base_recv)rS   buflenrz   s      r%   recvzGreenSSLSocket.recv   s    vu5999rF   c                 d    |r|t          |          }n|d}|                     ||d|          S )Nrr   T)r   buffer_)rt   r   )rS   ru   nbytesrz   s       r%   	recv_intozGreenSSLSocket.recv_into  sA     	fn[[FF^F vu4HHHrF   c           	      h   |rt           j        }nt           j        }| j        rS|dk    rt	          d|j        z  | j                  |r|                     ||          }n|                     |          }|S 	 	 | ||g}|r|                    d|            || S # t          j
        $ r}| j        r t          |          }	|	t          j        v rI	 t          | d|                                 t#          d                     n)# t$          $ r Y Y d }~dS w xY w|	t          j        v rY d }~dS  d }~ww xY w)Nr   z1non-zero flags not allowed in calls to %s() on %sTrf   r`   ra   rF   )r   r   r   rx   r|   __name__r;   rb   insertrJ   r   rI   r   r   r   r   rN   rc   r   r   )
rS   r   rz   r   r   plain_socket_functionrb   r!   r   r   s
             r%   r   zGreenSSLSocket._base_recv  s    	0$*$4!!$*K! < 	zz G)2348ND D D  )yy11yy((K &%0D 0Aw///00$77"(   , $Q<<Dw666'& $4(,(9(9{S^G_G_a a a a a  ( ' ' '#&333333'!666"ssssssB   8!B D1)%D,2DD,
DD,DD,+D,,D1c                     | j         s2t          | d|                                 t          d                     t	                                          |||          S NTr`   ra   )rI   r   rN   rc   rp   recvfrom)rS   r~   r   rz   r;   s       r%   r   zGreenSSLSocket.recvfrom2  s\    $ 	=t$0A0A#.{#;#;= = = =wwfe444rF   c                     | j         s2t          | d|                                 t          d                     t	                                          |||          S r   )rI   r   rN   rc   rp   recvfrom_into)rS   ru   r   rz   r;   s       r%   r   zGreenSSLSocket.recvfrom_into8  s\    $ 	=t$0A0A#.{#;#;= = = =ww$$VVU;;;rF   c                 j    t          |                     t                      j                            S rW   )r   rn   rp   unwraprS   r;   s    r%   r   zGreenSSLSocket.unwrap>  s0    422GGN    	rF   c                 P    |                      t                      j                  S )zPerform a TLS/SSL handshake.)rn   rp   rR   r   s    r%   rR   zGreenSSLSocket.do_handshakeB  s%    &&GG " " 	"rF   c           	         t           j        }| j        r || |          S t          j                    j        }|                                 p	 	  || |          S # t          j        $ rO}t          |          t          v rt          | d           nt          |          t          v rY d }~d S  Y d }~nd }~ww xY wo |            |                                 z   }	 	  || |           n{# t          j        $ ri}t          |          t          v r,t          | d| |            z
  t          d                     nt          |          t          v rY d }~d S  Y d }~nd }~ww xY w |            |k    rt          d          )NT)re   r`   rd   )r   connectrI   r   get_hubclockrN   rJ   r   r   r	   r   r
   rc   )rS   r~   real_connectr   rm   ends         r%   _socket_connectzGreenSSLSocket._socket_connectG  s   ~   	7<d+++LNN(E   (	""+|D$777&, " " "$S>>[88&t488888&s^^>>"FFFFF!	 98888"	" egg 1 117
"$T40000&, " " "$S>>[88& $D(+eegg;{C[C[] ] ] ] ] 's^^>>"FFFFF!] ] ] ] ]" uww#~~)+6667s=   A B8)>B3-B33B8C* *E"9AEEE"c           	         | j         rt          d          |                     |           d}	 t          j        } || j        || j        | j        | j        | j	        | j
        g| j        R  }nB# t          $ r5 t          r| j        n| j        }|                    | || j                  }Y nw xY w	 t$           || _         n# t&          $ r
 || _         Y nw xY w| j        r|                                  dS dS )zQConnects to remote ADDR, and then wraps the connection in
        an SSL channel.z/attempt to connect already-connected SSLSocket!F)r,   N)rx   r|   r   _sslsslwrap_sockr3   r4   r5   r6   r7   r2   rM   r   r1   r*   r:   r,   	SSLObject	NameErrorr0   rR   )rS   r~   r/   r   sslobjr1   s         r%   r   zGreenSSLSocket.connectk  sD   
 < 	PNOOOT"""		;lG WTZdlDM!^T-=!];-1\; ; ;FF  	c 	c 	c&*=dllG))$TMa)bbFFF	c	"I "DLL  	" 	" 	"!DLLL	"
 ' 	 	  	 s#   A. .<B-,B-1C   CCc           	         | j         rt                              |           \  }}n	 	 t                              |           \  }}nk# t          j        $ rX}t          |          t          j        vr t          | d| 	                                t          d                     Y d}~nd}~ww xY w t          |           |dd| j        | j                  }||fS )zAccepts a new connection from a remote client, and returns
        a tuple containing that new connection wrapped with a server-side
        SSL channel, and the address of the remote client.Tr`   ra   NF)r/   r0   r+   r*   )rI   r   acceptrJ   r   r   r   r   r   rN   rc   typer+   r*   )rS   newsockr~   r   new_ssls        r%   r   zGreenSSLSocket.accept  s    
   	E"MM$//MGTTEE$*MM$$7$7MGT"( E E E ||7+BBBt$8I8I+6{+C+CE E E E E E E E EE	E $t**$)!%!:]
 
 
 s   A B-AB((B-c                      t          d          )NzCan't dup an ssl object)NotImplementedErrorr[   s    r%   dupzGreenSSLSocket.dup  s    !";<<<rF   )rr   N)r   )rr   r   )Nr   rW   )r   
__module____qualname____doc__	CERT_NONEPROTOCOL_TLSr?   staticmethodr:   rU   rP   rN   r^   rn   re   rb   ry   r}   r   r   r   r   r   r   r   rR   r   r   r   r   __classcell__r;   s   @r%   r(   r(   *   s=         t!Y(4(,$ $ $ $L 
 
 \
* &*D"i)D)-       <              4! ! ! ! !
 
 
 
 
 
2 2 2 2 2 2: : : :   B: : : :I I I I% % % %N5 5 5 5 5 5< < < < < <    " " " " "
"7 "7 "7H     >  6= = = = = = =rF   r(   c                 "    t          | g|R i |S rW   r(   )r.   rl   r=   s      r%   r   r     s     $))))b)))rF   c                   f    e Zd ZdZd Z eej        d          rej        j         fd            Zej	        j         fd            Z	ej
        j         fd            Z
 eed          rej        j         fd            Z eed	          rej        j         fd
            Z xZS  xZS  xZS )GreenSSLContext c                 &    t          |g|R d| i|S )Nr*   r   )rS   r.   rl   r=   s       r%   r   zGreenSSLContext.wrap_socket  s%    d<Q<<<<<<<rF   setterc                 n    t          t          t                    j                            | |           d S rW   )rp   r    rB   __set__rS   valuer;   s     r%   rB   zGreenSSLContext.options  s/    &(<==EMMdTYZZZZZrF   c                 n    t          t          t                    j                            | |           d S rW   )rp   r    verify_flagsr   r   s     r%   r   zGreenSSLContext.verify_flags  s0    &(<==JRRSWY^_____rF   c                 n    t          t          t                    j                            | |           d S rW   )rp   r    verify_moder   r   s     r%   r   zGreenSSLContext.verify_mode  s0    &(<==IQQRVX]^^^^^rF   maximum_versionc                 n    t          t          t                    j                            | |           d S rW   )rp   r    r   r   r   s     r%   r   zGreenSSLContext.maximum_version  0    *,@AAQYYZ^`efffffrF   minimum_versionc                 n    t          t          t                    j                            | |           d S rW   )rp   r    r   r   r   s     r%   r   zGreenSSLContext.minimum_version  r   rF   )r   r   r   	__slots__r   hasattrr    rB   r   r   r   r   r   r   r   s   @r%   r   r     s       I= = =
 w#+X66 g 
	%	,	[ 	[ 	[ 	[ 
-	,	[ 
	*	1	` 	` 	` 	` 
2	1	` 
	)	0	_ 	_ 	_ 	_ 
1	0	_ 7'):;; 	g!18g g g g 98g 7'):;; 	g!18g g g g 98g g g g g3g g g g.	g 	g 	g 	grF   r   r   c                  6    t          | i |}t          |_        |S rW   ) _original_create_default_contextr   r;   )rl   r=   r1   s      r%   green_create_default_contextr     s#    
 3A<<<+rF   )+
__import____ssleventlet.patcherr   globalsdirsyseventletr   r   eventlet.greenior   r	   r
   eventlet.hubsr   r   eventlet.supportr   r   
contextlibr   rJ   r   rY   rc   __patched__r   r   r   r    version_inforj   r   r   r&   r(   r   r   r   r   r   r   r   rF   r%   <module>r      s;  
5 - - - - - -  		33u:: 6 6 6 6 



 " " " " " " " "          / . . . . . . . , , , , , , , , % % % % % %j""		!? ? ? o ' bqb!V+
(4  	M 	M 	M|= |= |= |= |=( |= |= |=~ 	* * *"g "g "g "g "g* "g "g "gJ 

 75*++ A','C$   :$@!!!A ArF   