o
    ,wiԇ                  	   @   s(  d Z ddlmZ ddlZejZddlZddlmZm	Z	 ddlm
Z ddlmZ eZddlmZ g dZeed	r@ed	 g Znd	g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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ee) edg ddZ*ee* e Z+de+v re+,d ej-Z.G d d! d!ej/Z0G d"d# d#e1Z2G d$d% d%e.Z-G d&d' d'eZ3e3e-_4ed(Z5ed)Z6ed*Z7ddd+ee$dd,d,df	d-d	Z8e$dfd.d/Z9dS )0zSSL wrapper for socket objects on Python 3.

For the documentation, refer to :mod:`ssl` module manual.

This module implements cooperative SSL socket wrappers.
    )absolute_importN)sockettimeout_default)timeout)copy_globals)ref)
SSLContext	SSLSocketget_server_certificatewrap_socket)AF_INET)SOCK_STREAM)SO_TYPE)
SOL_SOCKET)SSLWantReadError)SSLWantWriteError)SSLEOFError)SSLZeroReturnError)	CERT_NONE)SSLError)SSL_ERROR_EOF)SSL_ERROR_WANT_READ)SSL_ERROR_WANT_WRITE)PROTOCOL_SSLv23)CHANNEL_BINDING_TYPES)CERT_REQUIRED)DER_cert_to_PEM_cert)create_connectionr    )names_to_ignoredunder_names_to_keep
namedtuplec                       s    e Zd ZdZ fddZ  ZS )_contextawaresock)_sslsockc                    s   t  |||| || _d S N)super__init__r#   )selffamilytypeprotofilenosslsocket_wref	__class__r   G/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/gevent/ssl.pyr&   [   s   
z_contextawaresock.__init__)__name__
__module____qualname__	__slots__r&   __classcell__r   r   r-   r/   r"   X   s    r"   c                   @   s    e Zd ZdZdd Zdd ZdS )	_Callbackuser_functionc                 C   s
   || _ d S r$   r6   )r'   r7   r   r   r/   r&   d   s   
z_Callback.__init__c                 G   s   |  }| j|g|R  S r$   )r#   r7   )r'   connargsr   r   r/   __call__g   s   z_Callback.__call__N)r0   r1   r2   r3   r&   r:   r   r   r   r/   r5   `   s    r5   c                       s  e Zd ZdZdZ					dddZeejdr6ejj	 fdd	Zej
j	 fd
dZ
ejj	 fddZeedrOejj	 fddZejj	 fddZeedree fddZej	 fddZeedre fddZej	 fddZ  ZS  fddZ  ZS )r   r   NFTc              	   C   s   | j |||||| |dS )N)sockserver_sidedo_handshake_on_connectsuppress_ragged_eofsserver_hostname_context_session)sslsocket_class)r'   r;   r<   r=   r>   r?   sessionr   r   r/   r   r   s   zSSLContext.wrap_socketsetterc                       t ttj| | d S r$   )r%   orig_SSLContextoptions__set__r'   valuer-   r   r/   rG         zSSLContext.optionsc                    rE   r$   )r%   rF   verify_flagsrH   rI   r-   r   r/   rL      rK   zSSLContext.verify_flagsc                    rE   r$   )r%   rF   verify_moderH   rI   r-   r   r/   rM      rK   zSSLContext.verify_modeminimum_versionc                    rE   r$   )r%   rF   rN   rH   rI   r-   r   r/   rN      rK   zSSLContext.minimum_versionc                    rE   r$   )r%   rF   maximum_versionrH   rI   r-   r   r/   rO      rK   zSSLContext.maximum_version_msg_callbackc                       t  j}t|tr|j}|S r$   )r%   rP   
isinstancer5   r7   r'   resultr-   r   r/   rP         
zSSLContext._msg_callbackc                    sD   |r
t |r
t|}tt_ztttj| | W tt_d S tt_w r$   )callabler5   rF   __ssl__r   r%   rP   rH   rI   r-   r   r/   rP      s   sni_callbackc                    rQ   r$   )r%   rX   rR   r5   r7   rS   r-   r   r/   rX      rU   zSSLContext.sni_callbackc                    s,   |r
t |r
t|}tttj| | d S r$   )rV   r5   r%   rF   rX   rH   rI   r-   r   r/   rX      s   c                    s$   |r
t |r
t|}t | d S r$   )rV   r5   r%   set_servername_callback)r'   server_name_callbackr-   r   r/   rY      s   z"SSLContext.set_servername_callback)FTTNN)r0   r1   r2   r3   rB   r   hasattrrF   rG   rD   rL   rM   rN   rO   propertyrP   rX   rY   r4   r   r   r-   r/   r   k   s@    




r   c                       s  e Zd ZdZddddeeddeeddddddddfddZdd	 Z	d
d Z
edd Zejdd Zedd Zejdd Zedd Zdd ZdaddZdd ZdbddZdd Zdcdd Zd!d" Zeed#rud$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zdefd.d/Zdad0d1Z d2d3 Z!ddd4d5Z"ded7d8Z#dfd9d:Z$ded;d<Z%dfd=d>Z&d?d@ Z'dAdB Z(dCdD Z)dEdF Z*dGdH Z+dIdJ Z,dKdL Z-dgdMdNZ.dOdP Z/dQdR Z0dSdT Z1 fdUdVZ2dhdXdYZ3dZd[ Z4ee5j6d\rd]d^ Z7d_d` Z8  Z9S   Z9S )ir	   zp
    gevent `ssl.SSLSocket
    <https://docs.python.org/3/library/ssl.html#ssl-sockets>`_ for
    Python 3.
    NFTr   c                 C   s  |r|| _ nR|r|std|r|std|r|s|}t|| _ || j _|r-| j | |r6| j || |r>| j | |rF| j | || _|| _	|| _
|| _|| _|| _|tttkrdtd|rt|rltd|d urttd| j jr~|s~td|| _|| _|| _|| _|| _d}d }|d ur| }tj| |j|j|j| d |   n|d urtj| |d	 n	tj| |	|
|d
 d| _!d | _"z| j#$  W nx t%yG } zk|j&t&j'kr| (   | ) }| *d z| +d}W n  t%y } z|j&t&j't&j,fvr d}W Y d }~nd }~ww | *| |r=d}t-|j&|}||_.d |_/z| (  W | t%y<   Y |w W Y d }~nd }~ww d}| 0| || _1|rz!| 2||| _"|rt|  }|dkrmtd| 3  W d S W d S  t%y   | (   w d S )Nz5certfile must be specified for server-side operationszcertfile must be specifiedz!only stream sockets are supportedz4server_hostname can only be specified in client modez,session can only be specified in client modez'check_hostname requires server_hostnameF)r(   r)   r*   r+   )r+   )r(   r)   r*          z5Closed before TLS handshake with data in recv buffer.T        zHdo_handshake_on_connect should not be specified for non-blocking sockets)4r@   
ValueErrorr   rM   load_verify_locationsload_cert_chainset_npn_protocolsset_cipherskeyfilecertfile	cert_reqsssl_versionca_certsciphers
getsockoptr   r   r   NotImplementedErrorcheck_hostnamerA   r<   r?   r=   r>   
gettimeoutr   r&   r(   r)   r*   r+   detach_closed_sslobj_sockgetpeernameOSErrorerrnoENOTCONNclosegetblockingsetblockingrecvEINVALr   reasonlibrary
settimeout
_connected_SSLSocket__create_sslobjdo_handshake)r'   r;   re   rf   r<   rg   rh   ri   r=   r(   r)   r*   r+   r>   npn_protocolsrj   r?   rA   r@   	connectedsock_timeouteblockingnotconn_pre_handshake_datar|    notconn_pre_handshake_data_errorr   r   r   r/   r&      s   





&

zSSLSocket.__init__c                 C   s   t ||||t| S r$   )r"   _wref)r'   r(   r)   r*   r+   r   r   r/   _gevent_sock_classd  s   zSSLSocket._gevent_sock_classc                 C   s&   d| j | jd ur| j f S df S )Nz server=%s, cipher=%r )r<   rq   cipherr'   r   r   r/   _extra_reprg  s   zSSLSocket._extra_reprc                 C   s   | j S r$   )r@   r   r   r   r/   contextn  s   zSSLSocket.contextc                 C   s   || _ || j_d S r$   )r@   rq   r   )r'   ctxr   r   r/   r   r  s   c                 C      | j dur	| j jS dS )z!The SSLSession for client socket.N)rq   rC   r   r   r   r/   rC   w     
zSSLSocket.sessionc                 C   s    || _ | jd ur|| j_d S d S r$   )rA   rq   rC   )r'   rC   r   r   r/   rC   }  s   
c                 C   r   )z.Was the client session reused during handshakeN)rq   session_reusedr   r   r   r/   r     r   zSSLSocket.session_reusedc                 C   s   t d| jj )NzCan't dup() %s instances)rl   r.   r0   r   r   r   r/   dup  s   zSSLSocket.dupc                 C   s   d S r$   r   )r'   msgr   r   r/   _checkClosed  s   zSSLSocket._checkClosedc                 C   s   | j s	|   d S d S r$   )r   rs   r   r   r   r/   _check_connected  s   zSSLSocket._check_connected  c              
   C   s8  |    d}	 | jstd|dkr|du rdS dS z|dur+|| j||7 }|W S | j|p1dW S  tyJ   | jdkr@ | j| jtd Y nQ t	y`   | jdkrV | j| j
td Y n; tyv   | jru|du rqd Y S | Y S   ty } z|jd tkr| jr|du rdn|W  Y d}~S  d}~ww q)	zRead up to LEN bytes and return them.
        Return zero-length string on EOF.

        .. versionchanged:: 24.2.1
           No longer requires a non-None *buffer* to implement ``len()``.
           This is a backport from 3.11.8.
        r   Tz'Read on closed or unwrapped SSL socket.Nr^      r_   timeout_exc)r   rq   r`   readr   r   _wait_read_event_SSLErrorReadTimeoutr   _write_eventr   r>   r   r9   r   )r'   nbytesbuffer
bytes_readexr   r   r/   r     s>   	

zSSLSocket.readc              
   C   s   |    	 | jstdz| j|W S  tyR } z3|jd tkr1| jdkr( | j| j	t
d n|jd tkrG| jdkr> | j| jt
d n W Y d}~nd}~ww q)zhWrite DATA to the underlying SSL channel.  Returns
        number of bytes of DATA actually transmitted.Tz(Write on closed or unwrapped SSL socket.r   r_   r   N)r   rq   r`   writer   r9   r   r   r   r   _SSLErrorWriteTimeoutr   r   )r'   datar   r   r   r/   r     s&   

zSSLSocket.writec                 C   sD   |    |   z	| jj}W ||S  ty!   | jj}Y ||S w )zReturns a formatted version of the data in the
        certificate provided by the other end of the SSL channel.
        Return None if no certificate was provided, {} if a
        certificate was provided, but not validated.)r   r   rq   peer_certificateAttributeErrorgetpeercert)r'   binary_formcr   r   r/   r     s   

zSSLSocket.getpeercertc                 C   "   |    | jr
tjsd S | j S r$   )r   rq   _sslHAS_NPNselected_npn_protocolr   r   r   r/   r        
zSSLSocket.selected_npn_protocolHAS_ALPNc                 C   r   r$   )r   rq   r   r   selected_alpn_protocolr   r   r   r/   r     r   z SSLSocket.selected_alpn_protocolc                 C   s
   | j  S )zReturn a list of ciphers shared by the client during the handshake or
            None if this is not a valid server connection.
            )rq   shared_ciphersr   r   r   r/   r     s   
zSSLSocket.shared_ciphersc                 C   s   | j sdS | j  S )z^Return a string identifying the protocol version used by the
            current SSL channel. N)rq   versionr   r   r   r/   r     s   
zSSLSocket.versionc                 C      |    | js	d S | j S r$   )r   rq   r   r   r   r   r/   r        
zSSLSocket.cipherc                 C   r   r$   )r   rq   compressionr   r   r   r/   r      r   zSSLSocket.compressionc                 C   s   |    |tu r| j}| jrP|dkrtd| j 	 z| j|W S  ty8   | jdkr0Y dS | | j	 Y n t
yN   | jdkrFY dS | | j Y nw qt| |||S )Nr   z3non-zero flags not allowed in calls to send() on %sTr_   )r   r   r   rq   r`   r.   r   r   r   r   r   r   r   send)r'   r   flagsr   r   r   r/   r   &  s0   

zSSLSocket.sendc                 C   sB   |    | jrtd| j |d u rt| ||S t| |||S )Nz%sendto not allowed on instances of %s)r   rq   r`   r.   r   sendto)r'   r   flags_or_addraddrr   r   r/   r   =  s   zSSLSocket.sendtoc                 O      t d| j )Nz&sendmsg not allowed on instances of %srl   r.   r'   r9   kwargsr   r   r/   sendmsgF  s   zSSLSocket.sendmsgc                 C   sX   |    | jr|dkrtd| j zt| ||W S  ty+   | jdkr*td w )Nr   z6non-zero flags not allowed in calls to sendall() on %sr_   z&The operation did not complete (write))	r   rq   r`   r.   r   sendall_socket_timeoutr   r   )r'   r   r   r   r   r/   r   L  s   
zSSLSocket.sendallr   c                 C   sH   |    | jr|dkrtd| j |dkrdS | |S t| ||S )Nr   z3non-zero flags not allowed in calls to recv() on %sr^   )r   rq   r`   r.   r   r   rz   r'   buflenr   r   r   r/   rz   \  s   
zSSLSocket.recvc                 C   s   |    |du r'|dur#t|}|j}W d   n1 sw   Y  |s'd}| jr;|dkr5td| j | ||S t| |||S )z
        .. versionchanged:: 24.2.1
           No longer requires a non-None *buffer* to implement ``len()``.
           This is a backport from 3.11.8.
        Nr   r   z8non-zero flags not allowed in calls to recv_into() on %s)	r   
memoryviewr   rq   r`   r.   r   r   	recv_into)r'   r   r   r   viewr   r   r/   r   j  s   
zSSLSocket.recv_intoc                 C   s*   |    | jrtd| j t| ||S )Nz'recvfrom not allowed on instances of %s)r   rq   r`   r.   r   recvfromr   r   r   r/   r   ~  s   zSSLSocket.recvfromc                 C   s,   |    | jrtd| j t| |||S )Nz,recvfrom_into not allowed on instances of %s)r   rq   r`   r.   r   recvfrom_into)r'   r   r   r   r   r   r/   r     s   zSSLSocket.recvfrom_intoc                 O   r   )Nz&recvmsg not allowed on instances of %sr   r   r   r   r/   recvmsg     zSSLSocket.recvmsgc                 O   r   )Nz+recvmsg_into not allowed on instances of %sr   r   r   r   r/   recvmsg_into  r   zSSLSocket.recvmsg_intoc                 C   s   |    | jr| j S dS Nr   )r   rq   pendingr   r   r   r/   r     s   
zSSLSocket.pendingc                 C   s   |    d | _t| | d S r$   )r   rq   r   shutdown)r'   howr   r   r/   r     s   zSSLSocket.shutdownc              
   C   s  | j stdt|  z| j j}W n ty   | j j}Y nw | j}	 z| }W nQ ty=   | jdkr5 | 	| j
 Y n< tyQ   | jdkrI | 	| j Y n( tyY   Y n! tya   Y n tyx } z|jdkrsW Y d }~n d }~ww q#d | _ || ju sJ | S )NNo SSL wrapper around Tr_   r   )rq   r`   strr   r   unwraprr   r   r   r   r   r   r   r   r   rt   ru   )r'   r   sr   r   r   r/   r     sD   


zSSLSocket.unwrapc                 C   s   d | _ t|  d S r$   )rq   r   _real_closer   r   r   r/   r     s   zSSLSocket._real_closec                 C   sx   |    	 z| j  W dS  ty$   | jdkr | j| jtd Y n ty:   | jdkr0 | j| j	td Y nw q)zPerform a TLS/SSL handshake.Tr_   r   N)
r   rq   r   r   r   r   r   _SSLErrorHandshakeTimeoutr   r   r   r   r   r/   r     s   


zSSLSocket.do_handshakec                 C   s   | j j| j|| j| j|dS )N)ownerrC   )r   _wrap_socketrr   r?   )r'   r<   rC   r   r   r/   __create_sslobj  s   
zSSLSocket.__create_sslobjc                 C   s   | j rtd| jrtd| d| j| _z |r t| |}nd }t| | |s4| j	r1| 
  d| _|W S  tyA   d | _ w )Nz!can't connect in server-side modez/attempt to connect already-connected SSLSocket!FT)r<   r`   r   r   rA   rq   r   
connect_exconnectr=   r   socket_error)r'   r   r   rcr   r   r/   _real_connect  s&   zSSLSocket._real_connectc                 C   s   |  |d dS )QConnects to remote ADDR, and then wraps the connection in
        an SSL channel.FNr   r'   r   r   r   r/   r     s   zSSLSocket.connectc                 C   s   |  |dS )r   Tr   r   r   r   r/   r     s   zSSLSocket.connect_exc                    sB   t   \}}z| jj|| j| jdd}||fW S    |   )z
        Accepts 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.
        T)r=   r>   r<   )r%   acceptr@   r   r=   r>   rw   )r'   newsockr   r-   r   r/   r     s   
zSSLSocket.accept
tls-uniquec                 C   sV   t | jdr| j|S |tvrtd|dkrtd|| jdu r&dS | j S )zGet channel binding data for current connection.  Raise ValueError
        if the requested `cb_type` is not supported.  Return bytes of the data
        or None if the data is not available (e.g. before the handshake).
        get_channel_bindingz Unsupported channel binding typer   z({0} channel binding type not implementedN)r[   rq   r   r   r`   rl   formattls_unique_cb)r'   cb_typer   r   r/   r   -  s   

zSSLSocket.get_channel_bindingc                 C   s    | j r| j  S tdt|  )Nr   )rq   verify_client_post_handshaker`   r   r   r   r   r/   r   =  s   
z&SSLSocket.verify_client_post_handshakeget_verified_chainc                 C   $   | j  }|d u rg S dd |D S )Nc                 S      g | ]}| tjqS r   public_bytesr   ENCODING_DER.0certr   r   r/   
<listcomp>K      z0SSLSocket.get_verified_chain.<locals>.<listcomp>)rq   r   r'   chainr   r   r/   r   E     
zSSLSocket.get_verified_chainc                 C   r   )Nc                 S   r   r   r   r   r   r   r/   r   S  r   z2SSLSocket.get_unverified_chain.<locals>.<listcomp>)rq   get_unverified_chainr   r   r   r/   r   M  r   zSSLSocket.get_unverified_chainr$   )r   N)F)r   )r   r   r   )FN)r   ):r0   r1   r2   __doc__r   r   r   r   r&   r   r   r\   r   rD   rC   r   r   r   r   r   r   r   r   r[   r   r   r   r   r   r   r   r   r   r   r   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rW   r	   r   r   r4   r   r   r-   r/   r	      s    
 






=

	
	




<

r	   zThe read operation timed outzThe write operation timed outz!The handshake operation timed outFTc
           
      C   s   t | |||||||||	d
S )N
r;   re   rf   r<   rg   rh   ri   r=   r>   rj   )r	   r   r   r   r/   r   _  s   c              	   C   s   | \}}|durt }nt}t| %}t||||d}|d}W d   n1 s*w   Y  W d   n1 s9w   Y  d }}t|S )zRetrieve the certificate from the server at the specified address,
    and return it as a PEM-encoded string.
    If 'ca_certs' is specified, validate the server cert against it.
    If 'ssl_version' is specified, use it in the connection attempt.N)rh   rg   ri   T)r   r   r   r   r   r   )r   rh   ri   _rg   r;   sslsockdercertr   r   r/   r
   n  s   
r
   ):r   
__future__r   sslrW   r   ru   gevent.socketr   r   r   r   gevent._utilr   rt   r   weakrefr   r   __implements__r[   append	__extra__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   globals__imports____all__remover   rF   r   r"   objectr5   r	   rB   r   r   r   r   r
   r   r   r   r/   <module>   s   

	

c     
