
    G)f+a                        d Z ddgZddlZddlZddlZ	 ddlZej                  ej                  ej                  ej                  dZ
ddlmZmZ ddlmZ ddlmZmZmZmZmZ d	d
lmZmZmZmZ d	dlmZmZmZm Z  ddl!m"Z"m#Z# de$de%fdZ& G d de      Z' G d de'      Z( G d de(      Z) G d de      Z* G d de*      Z+ G d de*      Z,y# e$ r dZY w xY w)zFModule implementing low-level socket communication with MySQL servers.MySQLTcpSocketMySQLUnixSocket    N)TLSv1TLSv1.1TLSv1.2TLSv1.3)ABCabstractmethod)deque)AnyDequeListOptionalTuple   )InterfaceErrorNotSupportedErrorOperationalErrorProgrammingError)COMPRESSED_PACKET_HEADER_LENGTHMAX_PAYLOAD_LENGTHMIN_COMPRESS_LENGTHPACKET_HEADER_LENGTH   )StreamWriteropen_connectionerrreturnc                 f    | j                   st        |       S | j                    d| j                   S )z`Reformat the IOError error message.

    This function reformats the IOError error message.
     )errnostrstrerror)r   s    X/var/www/html/flask-app/venv/lib/python3.12/site-packages/mysql/connector/aio/network.py_strioerrorr%   G   s,    
 993s8GSYYKq*GG    c                   ~    e Zd ZdZe	 	 ddedededee	   dee	   ddfd	       Z
ed
ej                  dedefd       Zy)NetworkBrokeraP  Broker class interface.

    The network object is a broker used as a delegate by a socket object. Whenever the
    socket wants to deliver or get packets to or from the MySQL server it needs to rely
    on its network broker (netbroker).

    The netbroker sends `payloads` and receives `packets`.

    A packet is a bytes sequence, it has a header and body (referred to as payload).
    The first `PACKET_HEADER_LENGTH` or `COMPRESSED_PACKET_HEADER_LENGTH`
    (as appropriate) bytes correspond to the `header`, the remaining ones represent the
    `payload`.

    The maximum payload length allowed to be sent per packet to the server is
    `MAX_PAYLOAD_LENGTH`. When  `send` is called with a payload whose length is greater
    than `MAX_PAYLOAD_LENGTH` the netbroker breaks it down into packets, so the caller
    of `send` can provide payloads of arbitrary length.

    Finally, data received by the netbroker comes directly from the server, expect to
    get a packet for each call to `recv`. The received packet contains a header and
    payload, the latter respecting `MAX_PAYLOAD_LENGTH`.
    Nwriteraddresspayloadpacket_numbercompressed_packet_numberr   c                    K   yw)a  Send `payload` to the MySQL server.

        If provided a payload whose length is greater than `MAX_PAYLOAD_LENGTH`, it is
        broken down into packets.

        Args:
            sock: Object holding the socket connection.
            address: Socket's location.
            payload: Packet's body to send.
            packet_number: Sequence id (packet ID) to attach to the header when sending
                           plain packets.
            compressed_packet_number: Same as `packet_number` but used when sending
                                      compressed packets.

        Raises:
            :class:`OperationalError`: If something goes wrong while sending packets to
                                       the MySQL server.
        N )selfr)   r*   r+   r,   r-   s         r$   writezNetworkBroker.writeg           readerc                    K   yw)a)  Get the next available packet from the MySQL server.

        Args:
            sock: Object holding the socket connection.
            address: Socket's location.

        Returns:
            packet: A packet from the MySQL server.

        Raises:
            :class:`OperationalError`: If something goes wrong while receiving packets
                                       from the MySQL server.
            :class:`InterfaceError`: If something goes wrong while receiving packets
                                     from the MySQL server.
        Nr/   )r0   r4   r*   s      r$   readzNetworkBroker.read   r2   r3   NN)__name__
__module____qualname____doc__r
   r   r"   bytesr   intr1   asyncioStreamReader	bytearrayr6   r/   r&   r$   r(   r(   O   s    .  (,26  	
  } #+3- 
 6 !5!5  	  r&   r(   c                       e Zd ZdZddZededeeef   fd       Z	dde
e   ddfdZd	ed
ededdfdZ	 ddej                   dedefdZ	 	 dd	ed
edede
e   de
e   ddfdZdej                   d
edefdZy)NetworkBrokerPlain,Broker class for MySQL socket communication.r   Nc                     d| _         y N_pktnrr0   s    r$   __init__zNetworkBrokerPlain.__init__   s	    r&   pktc                     t        |       t        k  rt        d      t        j                  d| dd dz         d   | d   }}||fS )-Recover the header information from a packet.3Can't recover header info from an incomplete packet<Ir          )lenr   
ValueErrorstructunpack)rK   pllseqids      r$   
get_headerzNetworkBrokerPlain.get_header   sW     s8**RSS MM$Aa7 23A6F 
 Ezr&   next_idc                 l    || xj                   dz  c_         n|| _         | xj                   dz  c_         yz:Set the given packet id, if any, else increment packet id.Nr      rG   r0   rY   s     r$   _set_next_pktnrz"NetworkBrokerPlain._set_next_pktnr   s*    ?KK1K!DKsr&   r)   r*   c                    K   	 |j                  |       |j                          d{    y7 # t        $ r}t        d|t	        |      f      |d}~wt
        $ r}t        d      |d}~ww xY ww)z!Write packet to the comm channel.N  r!   valuesi  r!   )r1   drainIOErrorr   r%   AttributeError)r0   r)   r*   rK   r   s        r$   
_write_pktzNetworkBrokerPlain._write_pkt   sl     	8LL,,.   	"G[-=#>  	8".C7	8s<   A3$0 .0 A30 	A0AA0A++A00A3r4   sizec                    K   t        d      }t        |      |k  rG|j                  |t        |      z
         d{   }|st        d      ||z  }t        |      |k  rG|S 7 (w)z(Read `size` bytes from the comm channel.r&   Ni  rc   )r@   rR   r6   r   )r0   r4   rh   rK   chunks        r$   _read_chunkzNetworkBrokerPlain._read_chunk   se      n#ho ++dSXo66E$4005LC	 #ho
 
	 7s   :A'A%%A'#A'r+   r,   r-   c           
        K   | j                  |       d}t        t        |      t        z        D ]d  }| j	                  ||dt        j                  d| j                        z   |||t        z    z          d{    | j                          |t        z  }f | j	                  ||t        j                  dt        |      |z
        dd t        j                  d| j                        z   ||d z          d{    y7 7 w)zSend payload to the MySQL server.

        If provided a payload whose length is greater than `MAX_PAYLOAD_LENGTH`, it is
        broken down into packets.
        r      <BNrO   rP   )r^   rangerR   r   rg   rT   packrH   )r0   r)   r*   r+   r,   r-   offset_s           r$   r1   zNetworkBrokerPlain.write   s     	]+
 s7|'99: 
	)A//++dDKK01&6,>#>?@     "((F
	) ooKKc'lV34Qq9kk$,-fg
 	
 	
	
s%   A6D8C>9A?D8D 9D Dc                   K   	 | j                  |t               d{   }| j                  |      \  }| _        || j                  ||       d{   z   S 7 ;7 # t        $ r}t        d|t        |      f      |d}~ww xY ww)z+Receive `one` packet from the MySQL server.rh   Nr`   ra   )rk   r   rX   rH   re   r   r%   )r0   r4   r*   headerpayload_lenr   s         r$   r6   zNetworkBrokerPlain.read   s     	++F9M+NNF (,v'>$K $"2"26"2"LLLL O M 	"G[-=#>	sJ   BA A4A AA BA A 	B'B  BBr   NN)r   r7   )r8   r9   r:   r;   rJ   staticmethodr<   r   r=   rX   r   r^   r   r"   rg   r>   r?   r@   rk   r1   r6   r/   r&   r$   rB   rB      s   6 
 
%S/ 
 
x}  
8| 
8c 
8 
8RV 
8 9:
**
25
	
" (,26$
$
 $
 	$

  }$
 #+3-$
 
$
L!5!5  	 r&   rB   c                   0    e Zd ZdZd fdZedededee   fd       Z	edede
eeef   fd	       Zdd
ee   ddfdZdedededdf fdZ	 	 ddedededee   dee   ddf fdZdej&                  deddf fdZdej&                  dedef fdZ xZS )NetworkBrokerCompressedrC   r   Nc                 N    t         |           d| _        t               | _        y rE   )superrJ   _compressed_pktnrr   _queue_read)r0   	__class__s    r$   rJ   z NetworkBrokerCompressed.__init__  s     !#-2Wr&   r+   pktnrc                 |   d}g }t        t        |       t        z        D ]H  }|j                  dt	        j
                  d|      z   | ||t        z    z          |dz   dz  }|t        z  }J |j                  t	        j
                  dt        |       |z
        dd t	        j
                  d|      z   | |d z          |S )	z2Prepare a payload for sending to the MySQL server.r   rm   rn   r   r\   rO   rP   N)ro   rR   r   appendrT   rp   )r+   r   rq   pktsrr   s        r$   _prepare_packetsz(NetworkBrokerCompressed._prepare_packets  s     
 s7|'99: 	)AKK++dE*+&6,>#>?@
 QY#%E((F	) 	KKc'lV34Qq9kk$&'fg	

 r&   rK   c                     t        |       t        k  rt        d      t        j                  d| dd dz         d   | d   t        j                  d| dd dz         d   }}}|||fS )rM   rN   rO   r   rP   rQ         )rR   r   rS   rT   rU   )rK   compressed_pllrW   uncompressed_plls       r$   rX   z"NetworkBrokerCompressed.get_header!  s{     s855RSS MM$Aa7 23A6FMM$Aa7 23A6  0 u&666r&   rY   c                 l    || xj                   dz  c_         n|| _         | xj                   dz  c_         yr[   )r~   r]   s     r$   _set_next_compressed_pktnrz2NetworkBrokerCompressed._set_next_compressed_pktnr/  s1    ?""a'"%,D"#%r&   r)   r*   c                 >  K   t        j                  |      }t        j                  dt	        |            dd t        j                  d| j
                        z   t        j                  dt	        |            dd z   |z   }t        |   |||       d{   S 7 w)z1Compress packet and write it to the comm channel.rO   r   rP   rn   N)zlibcompressrT   rp   rR   r~   r}   rg   )r0   r)   r*   rK   compressed_pktr   s        r$   rg   z"NetworkBrokerCompressed._write_pkt7  s     s+KKc.121Q7kk$ 6 678kk$C)!A./  	 W'====s   BBBBr,   r-   c           
      D  K   | j                  |       | j                  |       t        d      j                  | j	                  || j
                              }t        |      t        t        z
  k\  rd}t        t        |      t        z        D ]@  }| j                  |||||t        z           d{    | j                          |t        z  }B | j                  ||||d        d{    yt        |      t        kD  r| j                  |||       d{    yt        	| )  ||t        j                  dt        |            dd t        j                  d| j                        z   t        j                  dd      dd z   |z          d{    y7 7 7 7 w)zSend `payload` as compressed packets to the MySQL server.

        If provided a payload whose length is greater than `MAX_PAYLOAD_LENGTH`, it is
        broken down into packets.
        r&   r   NrO   rP   rn   )r^   r   r@   joinr   rH   rR   r   r   ro   rg   r   r}   rT   rp   r~   )
r0   r)   r*   r+   r,   r-   payload_preprq   rr   r   s
            r$   r1   zNetworkBrokerCompressed.writeB  s     	]+''(@A ~**4+@+@$+++VWw<-0DDD F 3|,0BBC -ooG\&6DV;V%W   //1,,- //&'<3HIII 7|11oofg|DDD g(KKc,&781=kk$(>(>?@kk$*1Q/0 ##  !
 J EsI   B0F 3F48F ,F--F FA7F FF F F F r4   r   c                   K   t        t        j                  t        	|   ||       d{               }d}|t        |      k  rt        j                  d|||t        z   dz
   dz         d   }t        |z   t        |      |z
  kD  rot        	|   |t               d{   }| j                  |      \  }| _        }t        	|   ||       d{   }||dk(  r|nt        j                  |      z  }| j                  j                  |||t        z   |z           |t        |z   z  }|t        |      k  ryy7 7 7 mw)z&Handle reading of a compressed packet.rt   Nr   rO   r   rQ   )r@   r   
decompressr}   rk   rR   rT   rU   r   r   rX   r~   r   r   )
r0   r4   r   rK   rq   rV   ru   r   r   r   s
            r$   _read_compressed_pktz,NetworkBrokerCompressed._read_compressed_pkty  sd    
 OO%'"5f>"5"RRS
 s3x--c&6,@#@1#DEOC $c)CHv,==  %w2!@  3    OOF+	"*$',w':6':'W!W '1, #8 ##C:N1NQT1T$UV*S00F; s3x S "Xs;   )ED>A5E"E#2EEA%E<EEEc                   K   | j                   s	 t        | 	  |t               d{   }| j	                  |      \  }| _        }|dk(  r3| j                   j                  t        | 	  ||       d{          n| j                  ||       d{    | j                   sy| j                   j                         }|d   | _        |S 7 7 X7 ;# t        $ r}t        d|t        |      f      |d}~ww xY ww)z{Receive `one` or `several` packets from the MySQL server, enqueue them, and
        return the packet at the head.
        rt   Nr   r`   ra   rP   )r   r}   rk   r   rX   r~   r   r   re   r   r%   popleftrH   )	r0   r4   r*   ru   r   r   r   rK   r   s	           r$   r6   zNetworkBrokerCompressed.read  s     $w2!@  3    OOF+	"*$ $q($$++#g1&~1NN
 33FNKKK &&(!f
= O L &S1A'Bs]   C=C CAC 6C7C CC 3C=C C C 	C:C55C::C=rw   rx   r7   )r8   r9   r:   r;   rJ   ry   r<   r=   r   r   r   rX   r   r   r   r"   rg   r1   r>   r?   r   r@   r6   __classcell__r   s   @r$   r{   r{      s7   65
 %  U  0 7 7%S#"6 7 7&(3- &4 &	>| 	>c 	> 	>RV 	>  (,2655 5 	5
  }5 #+3-5 
5n&1**&1<?&1	&1P%!5!5 % %	 % %r&   r{   c                   P   e Zd ZdZddZedefd       Zede	ddfd       Z
ddZdefd	Zd
eddfdZddZdej$                  ddfdZ	 	 ddedee   dee   ddfdZdefdZdddddg g fdee   dee   dee   dee   dee   deee      deee      dej$                  fdZy)MySQLSocketzMySQL socket communication interface.

    Examples:
        Subclasses: network.MySQLTCPSocket and network.MySQLUnixSocket.
    r   Nc                 h    d| _         d| _        d| _        d| _        t	               | _        d| _        y)zsNetwork layer where transactions are made with plain (uncompressed) packets
        is enabled by default.
        NF)_reader_writer_connection_timeout_addressrB   
_netbroker_is_connectedrI   s    r$   rJ   zMySQLSocket.__init__  s3     8</326 '+);)=#(r&   c                     | j                   S )zSocket location.)r   rI   s    r$   r*   zMySQLSocket.address  s     }}r&   kwargsc                    K   yw)zOpen the socket.Nr/   r0   r   s     r$   r   zMySQLSocket.open_connection  r2   r3   c                 "  K   | j                   rv| j                   j                          | j                   j                  $| j                   j                  j                          | j                   j	                          d{    d| _        y7 w)zClose the connection.NF)r   close	transportabortwait_closedr   rI   s    r$   close_connectionzMySQLSocket.close_connection  sf     <<LL ||%%1&&,,.,,**,,," -s   A>B BBc                     | j                   S )zCheck if the socket is connected.

        Return:
            bool: Returns `True` if the socket is connected to MySQL server.
        )r   rI   s    r$   is_connectedzMySQLSocket.is_connected  s     !!!r&   timeoutc                     || _         y)zSet the connection timeout.N)r   )r0   r   s     r$   set_connection_timeoutz"MySQLSocket.set_connection_timeout  s
    #* r&   c                 "    t               | _        y)zIEnable network layer where transactions are made with compressed packets.N)r{   r   rI   s    r$   switch_to_compressed_modez%MySQLSocket.switch_to_compressed_mode  s    13r&   ssl_contextc                    K   | j                   J | j                   j                  j                  d      }|j                  dk(  rt	        d      | j                   j                  |       d{    y7 w)a?  Upgrade an existing stream-based connection to TLS.

        The `start_tls()` method from `asyncio.streams.StreamWriter` is only available
        in Python 3.11. This method is used as a workaround.

        The MySQL TLS negotiation happens in the middle of the TCP connection.
        Therefore, passing a socket to open connection will cause it to negotiate
        TLS on an existing connection.

        Args:
            ssl_context: The SSL Context to be used.

        Raises:
            RuntimeError: If the transport does not expose the socket instance.
        Nsocketr   z,SSL is not supported when using Unix sockets)r   r   get_extra_infofamilyr   	start_tls)r0   r   r   s      r$   switch_to_sslzMySQLSocket.switch_to_ssl  s_     " ||''''66x@==A"#QRRll$$[111s   A,A6.A4/A6r+   r,   r-   c                    K   | j                   j                  | j                  | j                  |||       d{    y7 w)z!Send packets to the MySQL server.)r,   r-   N)r   r1   r   r*   )r0   r+   r,   r-   s       r$   r1   zMySQLSocket.write  s@      oo##LLLL'%= $ 
 	
 	
s   8AA Ac                 ~   K   | j                   j                  | j                  | j                         d{   S 7 w)z#Read packets from the MySQL server.N)r   r6   r   r*   rI   s    r$   r6   zMySQLSocket.read&  s+     __))$,,EEEEs   4=;=Fssl_cassl_certssl_keyssl_verify_certssl_verify_identitytls_versionstls_cipher_suitesc                    | j                   st        d      t        t        d      	 |r|j	                  d       |d   }t
        |   }	t        j                  |	      }
|dk(  rd	|vr#|
xj                  t        j                  z  c_        d
|vr#|
xj                  t        j                  z  c_        d|vr8|
xj                  t        j                  z  c_        nt        j                         }
||
_        |rt        j                  |
_        n-|rt        j                  |
_        nt        j                   |
_        |
j#                          |r	 |
j%                  |       |r	 |
j+                  ||       |r |
j-                  dj/                  |             |
S # t&        t        j(                  f$ r}t        d|       |d}~ww xY w# t&        t        j(                  f$ r}t        d|       |d}~ww xY w# t0        $ r}t3        d      |d}~wt&        t4        t        j6                  t        j(                  f$ r}t        t9        |            |d}~ww xY w)zBuild a SSLContext.i   rc   Nz&Python installation has no SSL supportT)reverser   r   r   r   r   zInvalid CA Certificate: zInvalid Certificate/Key: :)r   r   sslRuntimeErrorsortTLS_VERSIONS
SSLContextoptionsOP_NO_TLSv1_2OP_NO_TLSv1_1OP_NO_TLSv1create_default_contextcheck_hostnameCERT_REQUIREDverify_modeCERT_OPTIONAL	CERT_NONEload_default_certsload_verify_locationsre   SSLErrorload_cert_chainset_ciphersr   	NameErrorr   NotImplementedErrorCertificateErrorr"   )r0   r   r   r   r   r   r   r   tls_versionssl_protocolcontextr   s               r$   build_ssl_contextzMySQLSocket.build_ssl_context*  s    || t,,;GHH3	4!!$!/*1o+K8..6)+ 43+<+<< 43+<+<<l23??:446%8G"&)&7&7#$&)&7&7#&)mm#&&(T11&9 U++Hg> !##CHH->$?@N  . T(+CC5)IJPSST
  . U(+DSE)JKQTTU  	W#$LMSVV  LL	
 	4 !S*3	4sl   D$G: F !G: $G
 6#G: G3GGG: 
G7#G22G77G: :	IH0I?IIrw   r7   )r8   r9   r:   r;   rJ   propertyr"   r*   r
   r   r   r   boolr   r=   r   r   r   r   r   r<   r   r1   r@   r6   r   r   r/   r&   r$   r   r     so   	)    c d  #"d "+c +d +42s~~ 2$ 28 (,26	

  }
 #+3-	

 

FI F !%"&!%*/.3,.13D4D4 3-D4 #	D4
 "$D4 &d^D4 tCy)D4 $DI.D4 
D4r&   r   c                   D     e Zd ZdZ	 d
dededef fdZdeddfd	Z	 xZ
S )r   zMySQL socket class using TCP/IP.

    Args:
        host: MySQL host name.
        port: MySQL port.
        force_ipv6: Force IPv6 usage.
    hostport
force_ipv6c                 d    t         |           || _        || _        || _        | d| | _        y )Nr   )r}   rJ   _host_port_force_ipv6r   )r0   r   r   r   r   s       r$   rJ   zMySQLTcpSocket.__init__z  s8     	

!+ $vQtf-r&   r   r   Nc                    K   t        d| j                  | j                  d| d{   \  | _        | _        d| _        y7 w)zOpen TCP/IP connection.)r   r   NTr/   )r   r   r   r   r   r   r   s     r$   r   zMySQLTcpSocket.open_connection  sG     +: ,
$**,
06,
 &
"dl "&
s   &AAA)z	127.0.0.1i  F)r8   r9   r:   r;   r"   r=   r   rJ   r   r   r   r   s   @r$   r   r   q  s?     MR..-0.EI."c "d "r&   c                   :     e Zd ZdZddef fdZdeddfdZ xZS )	r   zbMySQL socket class using UNIX sockets.

    Args:
        unix_socket: UNIX socket file path.
    unix_socketc                 0    t         |           || _        y rx   )r}   rJ   r   )r0   r   r   s     r$   rJ   zMySQLUnixSocket.__init__  s    (r&   r   r   Nc                    K   t        j                  dd| j                  i| d{   \  | _        | _        d| _        y7 w)zOpen UNIX socket connection.pathNTr/   )r>   open_unix_connectionr   r   r   r   r   s     r$   r   zMySQLUnixSocket.open_connection  sM     
 .. 

"(
 
	
LL "
s   %AAA)z/tmp/mysql.sock)	r8   r9   r:   r;   r"   rJ   r   r   r   r   s   @r$   r   r     s'    )C )"c "d "r&   )-r;   __all__r>   rT   r   r   PROTOCOL_TLSv1PROTOCOL_TLSv1_1PROTOCOL_TLSv1_2PROTOCOL_TLSr   ImportErrorabcr	   r
   collectionsr   typingr   r   r   r   r   errorsr   r   r   r   networkr   r   r   r   utilsr   r   re   r"   r%   r(   rB   r{   r   r   r   r/   r&   r$   <module>r      s   > M .
/   
 ##''''##	L $  4 4   1HW H HDC DNg gTF0 FRe4# e4P"[ "4"k "u  
Cs   3C CC