U
    @fK                     @   s,  e d ZddlmZ eee eed 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ddddddgZejZejZejdd dkZ ejj!Z"edd Z#G dd deZ$e$Zdd Z!G dd deZ%e%Ze&edr(ej'Z(dd Z)e)Z'e)Z*dS )ssl    )slurp_properties)ZsrckeysN)greeniohubs)GreenSocketCONNECT_ERRCONNECT_SUCCESS)
trampolineIOClosed)	get_errnoPY33)contextmanagersocket	SSLSocket
SSLContextwrap_socketZsslwrap_simplecreate_default_context_create_default_https_context   )      c               	   o   s\   t jdd }tjjdd }ttjjd< tt jd< z
d V  W 5 |t jd< |tjjd< X d S )Nr   r   )_original_wrap_socket__globals__get_original_sslsocket_create_original_sslcontext)argskwargsZtmp_sslcontextZtmp_sslsocket r   L/var/www/html/chatgpt/venv/lib/python3.8/site-packages/eventlet/green/ssl.py_original_ssl_context   s    


r!   c                       s   e Zd ZdZddddeeddfddZedd Zdddeeddfd	d
Z	dd Z
dd Zdd Zdd Z fddZd5 fdd	Zd6 fdd	Zd7ddZd8ddZd9dd Zd:d!d"Zd;d#d$Zd< fd%d&	Zd= fd'd(	Z fd)d*Z fd+d,Zd-d. Zd/d0 Zd1d2 Zd3d4 Z  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	                 O   s   t |tst|}t h |
d}|rXtj|j|d|
dd|
d||
dd}n$| j|j||||||d|
dd		}W 5 Q R X ||_||_	||_
||_||_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_certsr)   r+   )
isinstancer   r!   r   r   r   fd_wrap_socketr,   r-   r.   r/   r0   r"   	__class__)clsr'   r,   r-   r(   r.   r/   r0   r)   r   kwr*   retr   r   r    __new__8   s@    



zGreenSSLSocket.__new__c	           
      C   sZ   t |d}	|	 j|O  _|s |r.|	j||d |r<|	| |rJ|	| |	j| ||dS )N)protocol)r-   r,   )r'   r(   r)   )r   optionsload_cert_chainload_verify_locationsset_ciphersr   )
r'   r,   r-   r(   r.   r/   r0   r)   r+   r*   r   r   r    r3   ^   s     


zGreenSSLSocket._wrap_socketc	                 O   s   t |tst|}|j| _ztjD ]}t| | q"W n tk
rH   Y nX | | _t	
| d t	| dksrt|| _|r| jr|   d S )N        )r1   r   act_non_blockingorig_socketZ_delegate_methodsdelattrAttributeError
gettimeout_timeoutr   
settimeoutAssertionErrorr)   
_connecteddo_handshake)selfr'   r,   r-   r(   r.   r/   r0   r)   r   r6   fnr   r   r    __init__t   s    



zGreenSSLSocket.__init__c                 C   s
   || _ d S NrD   )rI   timeoutr   r   r    rE      s    zGreenSSLSocket.settimeoutc                 C   s   | j S rL   rM   rI   r   r   r    rC      s    zGreenSSLSocket.gettimeoutc                 C   s"   |rd| _ d | _nd| _ d| _d S )NFTr>   )r?   rD   )rI   flagr   r   r    setblocking   s
    zGreenSSLSocket.setblockingc              
   O   s   | j r|||S z|||W S  tk
r } zjt|tkrTt| d|  tdd n@t|tkrzt| d|  tdd ntrd|j	d krt
n W 5 d }~X Y qX qd S )NT	timed outreadrN   timeout_excwriterN   rU   zunexpected eof   )r?   SSLErrorr   SSL_ERROR_WANT_READr	   rC   rU   SSL_ERROR_WANT_WRITE
_is_py_3_7r   r
   )rI   funcar6   excr   r   r    _call_trampolining   s(    
z!GreenSSLSocket._call_trampoliningc                    s   |  t j|S )zhWrite DATA to the underlying SSL channel.  Returns
        number of bytes of DATA actually transmitted.)r`   superrW   )rI   datar4   r   r    rW      s     zGreenSSLSocket.write   c                    sB   z|  t j||W S  tk
r<   |dkr2Y dS Y dS Y nX dS )zORead up to LEN bytes and return them.
        Return zero-length string on EOF.N    r   )r`   ra   rT   r
   )rI   lenbufferrc   r   r    rT      s      zGreenSSLSocket.readr   c                    s<   | j r| t j||S t| dtdd t| ||S d S )NTrR   rW   rU   )_sslobjr`   ra   sendr	   rU   r   )rI   rb   flagsrc   r   r    rj      s      zGreenSSLSocket.sendc                 C   s<   | j rtd| j n"t| dtdd t| |||S d S )Nz%sendto not allowed on instances of %sTrR   rh   )ri   
ValueErrorr4   r	   rU   r   sendto)rI   rb   addrrk   r   r   r    rm      s    zGreenSSLSocket.sendtoc           	   
   C   s   | j rt|dkrtd| j t|}d}|}||k rp| |}||7 }|dkrbt| dtdd q,||d  }q,|S zt| ||W S  t	j
k
r } zN| jr t|}|tjkrt| d|  tdd n|tjkrW Y 
dS  W 5 d }~X Y qtX qtd S )Nr   z6non-zero flags not allowed in calls to sendall() on %sTrR   rh   rV    )ri   rl   r4   rf   rj   r	   rU   r   sendallr@   errorr?   r   r   SOCKET_BLOCKINGrC   SOCKET_CLOSED)	rI   rb   rk   amountcountZdata_to_sendveernor   r   r    rp      s>    

 

zGreenSSLSocket.sendallc                 C   s   | j ||ddS )NF)into)
_base_recv)rI   buflenrk   r   r   r    recv   s    zGreenSSLSocket.recvc                 C   s4   |r|d krt |}n|d kr"d}| j||d|dS )Nrd   T)ry   buffer_)rf   rz   rI   rg   nbytesrk   r   r   r    	recv_into  s
    
zGreenSSLSocket.recv_intoc           
      C   s  |rt j}nt j}| jrR|dkr2td|j | j|rD| ||}n
| |}|S z$| ||g}|rn|d| || W S  t	j
k
r
 } zr| jr t|}	|	tjkrzt| d|  tdd W n tk
r   Y W Y $dS X n|	tjk rW Y 
dS  W 5 d }~X Y qRX qRd S )Nr   z1non-zero flags not allowed in calls to %s() on %srX   TrR   rS   re   )r   r   r|   ri   rl   __name__r4   rT   insertr@   rq   r?   r   r   rr   r	   rC   rU   r
   rs   )
rI   r   rk   ry   r}   Zplain_socket_functionrT   r   rw   rx   r   r   r    rz     sJ    



  

zGreenSSLSocket._base_recvc                    s.   | j st| d|  tdd t |||S NTrR   rS   )r?   r	   rC   rU   ra   recvfrom)rI   rn   r{   rk   rc   r   r    r   2  s
    zGreenSSLSocket.recvfromc                    s.   | j st| d|  tdd t |||S r   )r?   r	   rC   rU   ra   recvfrom_intor~   rc   r   r    r   8  s
    zGreenSSLSocket.recvfrom_intoc                    s   t | t jS rL   )r   r`   ra   unwraprO   rc   r   r    r   >  s    zGreenSSLSocket.unwrapc                    s   |  t jS )zPerform a TLS/SSL handshake.)r`   ra   rH   rO   rc   r   r    rH   B  s    zGreenSSLSocket.do_handshakec              
   C   s2  t j}| jr|| |S t j}|  d krz|| |W S  tjk
r } z6t	|t
krft| dd nt	|tkr|W Y 
d S  W 5 d }~X Y q,X q,n| |   }z|| | W nh tjk
r } zFt	|t
krt| d||  tdd nt	|tkrW Y 
d S  W 5 d }~X Y nX | |krtdqd S )NT)rW   rR   rV   )r   connectr?   r   Zget_hubclockrC   r@   rq   r   r   r	   r   rU   )rI   rn   Zreal_connectr   r_   endr   r   r    _socket_connectG  s:    


  

zGreenSSLSocket._socket_connectc                 C   s   | j rtd| | d}z
tj}W n6 tk
r\   tr@| jn| j}|j	| || j
d}Y n*X || j|| j| j| j| j| jf| j }zt W n tk
r   || _ Y nX || _ | jr|   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)ri   rl   r   _sslsslwraprB   r   r*   r#   r3   r%   _sockr,   r-   r.   r/   r0   r+   	SSLObject	NameErrorr)   rH   )rI   rn   r(   r   r*   sslobjr   r   r    r   k  s.    

 zGreenSSLSocket.connectc              
   C   s   | j rt| \}}nfzt| \}}W q|W q tjk
rx } z,t|tjkrP t| d| 	 t
dd W 5 d}~X Y qX qt| |dd| j| jd}||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.TrR   rS   NF)r(   r)   r$   r#   )r?   r   acceptr@   rq   r   r   rr   r	   rC   rU   typer$   r#   )rI   newsockrn   rw   Znew_sslr   r   r    r     s&    zGreenSSLSocket.acceptc                 C   s   t dd S )NzCan't dup an ssl object)NotImplementedErrorrO   r   r   r    dup  s    zGreenSSLSocket.dup)rd   N)r   )r   )r   )rd   r   )Nr   )N)rd   r   )Nr   )r   
__module____qualname____doc__	CERT_NONEPROTOCOL_TLSr8   staticmethodr3   rK   rE   rC   rQ   r`   rW   rT   rj   rm   rp   r|   r   rz   r   r   r   rH   r   r   r   r   __classcell__r   r   rc   r    r"   *   sJ     
&
  

	
!



'$r"   c                 O   s   t | f||S rL   r"   )r'   r^   r6   r   r   r    r     s    c                       s   e Zd ZdZdd Zeejdrejj fddZej	j fddZ	ej
j fd	d
Z
eedrzejj fddZeedrejj fddZ  ZS )GreenSSLContextr   c                 O   s   t |f|d| i|S )Nr#   r   )rI   r'   r^   r6   r   r   r    r     s    zGreenSSLContext.wrap_socketsetterc                    s   t ttj| | d S rL   )ra   r   r:   __set__rI   valuerc   r   r    r:     s    zGreenSSLContext.optionsc                    s   t ttj| | d S rL   )ra   r   verify_flagsr   r   rc   r   r    r     s    zGreenSSLContext.verify_flagsc                    s   t ttj| | d S rL   )ra   r   verify_moder   r   rc   r   r    r     s    zGreenSSLContext.verify_modemaximum_versionc                    s   t ttj| | d S rL   )ra   r   r   r   r   rc   r   r    r     s    zGreenSSLContext.maximum_versionminimum_versionc                    s   t ttj| | d S rL   )ra   r   r   r   r   rc   r   r    r     s    zGreenSSLContext.minimum_version)r   r   r   	__slots__r   hasattrr   r:   r   r   r   r   r   r   r   r   rc   r    r     s   

r   c                  O   s   t | |}t|_|S rL   ) _original_create_default_contextr   r4   )r^   r6   r*   r   r   r    green_create_default_context  s    
r   )+
__import__Z__sslZeventlet.patcherr   globalsdirsysZeventletr   r   Zeventlet.greenior   r   r   Zeventlet.hubsr	   r
   Zeventlet.supportr   r   
contextlibr   r@   r   rN   rU   Z__patched__r   r   r   r   version_infor\   r   r   r!   r"   r   r   r   r   r   r   r   r   r   r    <module>   sJ       
   %	