a
    còf<V  ã                   @   s  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ZzXddlZej	ej
ejdœZeedƒrjejed< n
ejed< eedƒrŠejrŠdZnd	ZW n   d	ZY n0 d
dlmZmZ d
dlmZ d
dlmZ dd„ Zdd„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )zGModule implementing low-level socket communication with MySQL servers.
é    )ÚdequeN)ÚTLSv1úTLSv1.1úTLSv1.2ÚPROTOCOL_TLSúTLSv1.3ÚHAS_TLSv1_3TFé   )Ú	constantsÚerrors)ÚInterfaceError)Úinit_bytearrayc                 C   s    | j st| ƒS dj| j | jd�S )z_Reformat the IOError error message

    This function reformats the IOError error message.
    z{errno} {strerr})ÚerrnoZstrerr)r   ÚstrÚformatÚstrerror)Úerr© r   úT/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/mysql/connector/network.pyÚ_strioerror@   s    r   c                 C   sˆ   g }t | ƒ}tj}||krZ| dt d|¡ | d|…  ¡ | |d… } t | ƒ}|d }q| t d|¡dd… t d|¡ |  ¡ |S )z0Prepare a packet for sending to the MySQL serveró   ÿÿÿú<BNr	   ú<Ir   é   )Úlenr
   ÚMAX_PACKET_LENGTHÚappendÚstructÚpack)ÚbufÚpktnrÚpktsÚpllenÚ	maxpktlenr   r   r   Ú_prepare_packetsJ   s     
ÿ

ÿÿr$   c                   @   sÂ   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zd'dd„ZeZd(dd„Zdd„ Zdd„ Zejdd… dkr˜eZeZneZdd„ Zd d!„ Zd"d#„ Zd)d%d&„ZdS )*ÚBaseMySQLSocketa  Base class for MySQL socket communication

    This class should not be used directly but overloaded, changing the
    at least the open_connection()-method. Examples of subclasses are
      mysql.connector.network.MySQLTCPSocket
      mysql.connector.network.MySQLUnixSocket
    c                 C   s*   d | _ d | _d| _d| _tƒ | _d| _d S )Néÿÿÿÿi    )ÚsockÚ_connection_timeoutÚ_packet_numberÚ_compressed_packet_numberr   Ú_packet_queueZrecvsize©Úselfr   r   r   Ú__init__c   s    zBaseMySQLSocket.__init__c                 C   s"   | j d | _ | j dkrd| _ | j S )zIncrements the packet numberr	   éÿ   r   )r)   r,   r   r   r   Únext_packet_numberk   s    
z"BaseMySQLSocket.next_packet_numberc                 C   s"   | j d | _ | j dkrd| _ | j S )z'Increments the compressed packet numberr	   r/   r   )r*   r,   r   r   r   Únext_compressed_packet_numbers   s    
z-BaseMySQLSocket.next_compressed_packet_numberc                 C   s   t ‚dS )zOpen the socketN©ÚNotImplementedErrorr,   r   r   r   Úopen_connection{   s    zBaseMySQLSocket.open_connectionc                 C   s   t ‚dS )zGet the location of the socketNr2   r,   r   r   r   Úget_address   s    zBaseMySQLSocket.get_addressc              	   C   s>   z | j  tj¡ | j  ¡  | `W n tjtfy8   Y n0 dS )z&Shut down the socket before closing itN)r'   ÚshutdownÚsocketÚ	SHUT_RDWRÚcloser+   ÚerrorÚAttributeErrorr,   r   r   r   r6   ƒ   s    
zBaseMySQLSocket.shutdownc              	   C   s0   z| j  ¡  | `W n tjtfy*   Y n0 dS )zClose the socketN)r'   r9   r+   r7   r:   r;   r,   r   r   r   Úclose_connectionŒ   s
    
z BaseMySQLSocket.close_connectionc                 C   s   |   ¡  d S ©N)r6   r,   r   r   r   Ú__del__”   s    zBaseMySQLSocket.__del__Nc                 C   sœ   |du r| j  n|| _t|| jƒ}|D ]p}z| j |¡ W q& tyx } z&tjd|  ¡ t	|ƒfd�‚W Y d}~q&d}~0  t
y”   tjdd�‚Y q&0 q&dS )z Send packets to the MySQL serverNé  ©r   ÚvalueséÖ  ©r   )r0   r)   r$   r'   ÚsendallÚIOErrorr   ÚOperationalErrorr5   r   r;   )r-   r   Úpacket_numberÚcompressed_packet_numberÚpacketsÚpacketr   r   r   r   Ú
send_plain—   s    ÿzBaseMySQLSocket.send_plainc                 C   sÞ  |du r| j  n|| _|du r&| j n|| _| j}t|ƒ}g }tj}||k�r”t||ƒ}d |¡}	~t	 
|	dd… ¡}
t dt|
ƒ¡dd… t d| j¡ d }| ||
 ¡ |	dd… }	t|	ƒ}| j ||k�r8t	 
|	d|… ¡}
t dt|
ƒ¡dd… t d| j¡ d	 }| ||
 ¡ |	|d… }	t|	ƒ}| j qÈ|	�r�t	 
|	¡}
t dt|
ƒ¡dd… t d| j¡ t d|¡dd…  }| ||
 ¡ ~	nÊt d|¡dd… t d|¡ | }t|ƒ}|d
k�rt	 
|¡}
| t dt|
ƒ¡dd… t d| j¡ t d|¡dd…  |
 ¡ nDt d|¡dd… t d| j¡ t dd¡dd…  }| || ¡ |D ]v}z| j |¡ W n^ t�y¶ } z&tjd|  ¡ t|ƒfd�‚W Y d}~n(d}~0  t�yÔ   tjdd�‚Y n0 �qbdS )z+Send compressed packets to the MySQL serverNó    é @  r   r   r   r   s    @ r   é2   r?   r@   rB   rC   )r0   r)   r1   r*   r   r
   r   r$   ÚjoinÚzlibÚcompressr   r   r   r'   rD   rE   r   rF   r5   r   r;   )r-   r   rG   rH   r    r"   Zzpktsr#   r!   ZtmpbufZzbufÚheaderÚpktZ
zip_packetr   r   r   r   Úsend_compressedª   s”    


ÿþ
ÿþ
ÿþ
ÿÿ

ÿþýÿþÿzBaseMySQLSocket.send_compressedc           	   
   C   s"  zÜt dƒ}d}|dk rH| j d| ¡}|s6tjdd�‚||7 }t|ƒ}q|d | _t d|dd… d ¡d }|}| 	t |ƒ¡ t
|ƒ}|dd	… }|rØ| j ||¡}|dkrÂ|dkrÂtjdd�‚||d	… }||8 }q”|W S  t�y } z&tjd
|  ¡ t|ƒfd�‚W Y d	}~n
d	}~0 0 d	S )ú%Receive packets from the MySQL serverrL   r   é   éÝ  rC   r   r   ó    Nr?   r@   )Ú	bytearrayr'   Úrecvr   r   r   r)   r   ÚunpackÚextendÚ
memoryviewÚ	recv_intorE   rF   r5   r   )	r-   rJ   Z
packet_lenÚchunkÚpayload_lenÚrestZpacket_viewÚreadr   r   r   r   Ú
recv_plainï   s4    


ÿzBaseMySQLSocket.recv_plainc              
   C   s   z¼t dƒ}d}|dk rH| j d| ¡}|s6tjdd�‚||7 }t|ƒ}q|d | _t d|dd… d ¡d }|}t	dƒ}|dkr´| j |¡}|sžtjdd�‚||7 }|t|ƒ }qz|| W S  t
yú } z&tjd	|  ¡ t|ƒfd
�‚W Y d}~n
d}~0 0 dS )rU   rL   r   rV   rW   rC   r   r   rX   r?   r@   N)rY   r'   rZ   r   r   r   r)   r   r[   r   rE   rF   r5   r   )r-   rR   Z
header_lenr_   r`   ra   Úpayloadr   r   r   r   Úrecv_py26_plain  s0    


ÿzBaseMySQLSocket.recv_py26_plainr   é   )rf   é   c                 C   sN   |rJt  d|dd… d ¡d }| j |d|d … ¡ ||d d… }q dS )zSplit compressed payloadr   r   r   rX   rV   N)r   r[   r+   r   )r-   Zpacket_bunchÚpayload_lengthr   r   r   Ú_split_zipped_payload5  s    z%BaseMySQLSocket._split_zipped_payloadc              
   C   sH  z| j  ¡ }|d | _|W S  ty,   Y n0 tdƒ}g }�zd| j d¡}|rpt|ƒdk rp||7 }| j d¡}qJ|�ržt|ƒdk rŽtj	dd�‚t
 d|dd… d	 ¡d }|d | _t
 d|d
d… d	 ¡d }t|ƒ}t|ƒ|k �r| j |t|ƒ ¡}|�stj	dd�‚|| }qØ|dk�rD|  |¡ | j  ¡ }|d | _|W S | ||f¡ |dk�r`�qžtdƒ}| j d¡}|rpt|ƒdk rp||7 }| j d¡}�qtqpW n@ t�yà }	 z&tjd|  ¡ t|	ƒfd�‚W Y d}	~	n
d}	~	0 0 tdƒ}
|D ]\}}|
t |¡7 }
�qî|  |
¡ ~
z| j  ¡ }|d | _|W S  t�yB   Y n0 dS )z0Receive compressed packets from the MySQL serverr   rL   r	   é   rW   rC   r   r   rX   rV   rM   r?   r@   N)r+   Úpopleftr)   Ú
IndexErrorrY   r'   rZ   r   r   r   r   r[   r*   r   ri   r   rE   rF   r5   r   rP   Ú
decompress)r-   rS   rR   rI   ZabyteZzip_payload_lengthrh   Zzip_payloadr_   r   Útmprd   r   r   r   Úrecv_compressed<  sv    

ÿÿ
ÿ





ÿ


zBaseMySQLSocket.recv_compressedc                 C   s   || _ | jr| j |¡ dS )zSet the connection timeoutN)r(   r'   Ú
settimeout)r-   Útimeoutr   r   r   Úset_connection_timeoutˆ  s    z&BaseMySQLSocket.set_connection_timeoutFc                 C   s¬  | j stjdd�‚�zÊ|r"tj}n|r.tj}ntj}|du s@|sTt ¡ }	|sêd|	_n–|j	dd� |d }
t
sˆ|
dkrˆt|ƒd	krˆ|d	 }
t|
 }t |¡}	|
dkrêd
|vrº|	 jtjO  _d|vrÒ|	 jtjO  _d|vrê|	 jtjO  _d|	_||	_|	 ¡  |�rXz|	 |¡ W nD ttjf�yV } z$| j  ¡  td |¡ƒ‚W Y d}~n
d}~0 0 |�r´z|	 ||¡ W nD ttjf�y² } z$| j  ¡  td |¡ƒ‚W Y d}~n
d}~0 0 |�rÄ|	 |¡ t| dƒ�ræ|	j| j | jd�| _ n|	 | j ¡| _ |�rÜd|	_| jg}tjdk�rL| jdk�rLddg}t  !| j¡}| "|d g|d	  ¡ d}g }|D ]^}zt #| j  $¡ |¡ W n6 tj%�y¨ } z| &t'|ƒ¡ W Y d}~nd}~0 0 d} �q¸�qX|�sÜ| j  ¡  td d (|¡¡ƒ‚W nÈ t)�yü   t *d¡‚Y n¬ tjtf�y@ } z&tjd|  +¡ t,|ƒfd�‚W Y d}~npd}~0  tj%�yt } zt t'|ƒ¡‚W Y d}~n<d}~0  t-�y¦ } zt t'|ƒ¡‚W Y d}~n
d}~0 0 dS )zSwitch the socket to use SSLi   rC   NFT)Úreverser   r   r	   r   r   r   zInvalid CA Certificate: {}zInvalid Certificate/Key: {}Úserver_host)Úserver_hostnameÚntÚ	localhostú	127.0.0.1z$Unable to verify server identity: {}z, z&Python installation has no SSL supportr?   r@   ).r'   r   r   ÚsslÚCERT_REQUIREDÚCERT_OPTIONALÚ	CERT_NONEÚcreate_default_contextÚcheck_hostnameÚsortÚTLS_V1_3_SUPPORTEDr   ÚTLS_VERSIONSÚ
SSLContextÚoptionsÚOP_NO_TLSv1_2ÚOP_NO_TLSv1_1ÚOP_NO_TLSv1Úverify_modeÚload_default_certsÚload_verify_locationsrE   ÚSSLErrorr9   r   Úload_cert_chainÚset_ciphersÚhasattrÚwrap_socketrt   ÚosÚnamer7   Úgethostbyaddrr\   Úmatch_hostnameÚgetpeercertÚCertificateErrorr   r   rO   Ú	NameErrorZNotSupportedErrorr5   r   r3   )r-   ÚcaÚcertÚkeyZverify_certZverify_identityZcipher_suitesZtls_versionsÚ	cert_reqsÚcontextZtls_versionÚssl_protocolr   Z	hostnamesÚaliasesZmatch_foundZerrsÚhostnamer   r   r   Úswitch_to_ssl�  s°    ÿ
ÿ

ÿ
ÿ
ÿ
$

ÿ
ÿÿ"zBaseMySQLSocket.switch_to_ssl)NN)NN)FFNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r.   Úpropertyr0   r1   r4   r5   r6   r<   r>   rK   ÚsendrT   rc   re   ÚsysÚversion_inforZ   ri   ro   rr   rž   r   r   r   r   r%   Z   s>   

	  ÿ
  ÿ
E!L   þr%   c                       s2   e Zd ZdZd	‡ fdd„	Zdd„ Zdd„ Z‡  ZS )
ÚMySQLUnixSocketzoMySQL socket class using UNIX sockets

    Opens a connection through the UNIX socket of the MySQL Server.
    ú/tmp/mysql.sockc                    s   t t| ƒ ¡  || _d S r=   )Úsuperr§   r.   Úunix_socket)r-   rª   ©Ú	__class__r   r   r.   ù  s    zMySQLUnixSocket.__init__c                 C   s   | j S r=   )rª   r,   r   r   r   r5   ý  s    zMySQLUnixSocket.get_addressc              
   C   s¦   z2t   t jt j¡| _| j | j¡ | j | j¡ W nn typ } z&t	j
d|  ¡ t|ƒfd�‚W Y d }~n:d }~0  ty  } zt	 
t|ƒ¡‚W Y d }~n
d }~0 0 d S )NiÒ  r@   )r7   ÚAF_UNIXÚSOCK_STREAMr'   rp   r(   Úconnectrª   rE   r   r   r5   r   Ú	Exceptionr   )r-   r   r   r   r   r4      s    ÿÿzMySQLUnixSocket.open_connection)r¨   ©rŸ   r    r¡   r¢   r.   r5   r4   Ú__classcell__r   r   r«   r   r§   ó  s   r§   c                       s2   e Zd ZdZd‡ fdd„	Zdd„ Zd	d
„ Z‡  ZS )ÚMySQLTCPSocketzXMySQL socket class using TCP/IP

    Opens a TCP/IP connection to the MySQL Server.
    rx   éê  Fc                    s*   t t| ƒ ¡  || _|| _|| _d| _d S )Nr   )r©   r³   r.   rt   Úserver_portÚ
force_ipv6Ú_family)r-   ÚhostÚportr¶   r«   r   r   r.     s
    zMySQLTCPSocket.__init__c                 C   s   d  | j| j¡S )Nz{0}:{1})r   rt   rµ   r,   r   r   r   r5     s    zMySQLTCPSocket.get_addressc           	   
   C   s˜  dgd }z”t  | j| jdt jt j¡}|D ]8}| jrL|d t jkrL|} qdq*|d t jkr*|} qdq*| jrˆ|d du rˆt	 
d | j¡¡‚|d du rœ|d }W n> tyÜ } z&t	j
d|  ¡ t|ƒfd�‚W Y d}~nd}~0 0 |\| _}}}}z0t   | j||¡| _| j | j¡ | j |¡ W nt t�y` } z(t	j
d| j| jt|ƒfd�‚W Y d}~n<d}~0  t�y’ } zt	 t|ƒ¡‚W Y d}~n
d}~0 0 dS )z7Open the TCP/IP connection to the MySQL server
        Né   r   zNo IPv6 address found for {0}iÓ  r@   )r7   Úgetaddrinfort   rµ   r®   ÚSOL_TCPr¶   ÚAF_INET6ÚAF_INETr   r   r   rE   r5   r   r·   r'   rp   r(   r¯   r°   rF   r   )	r-   ÚaddrinfoÚ	addrinfosÚinfor   ÚsocktypeÚprotoÚ_Úsockaddrr   r   r   r4     sN    
ý
ÿÿýÿzMySQLTCPSocket.open_connection)rx   r´   Fr±   r   r   r«   r   r³     s   r³   )r¢   Úcollectionsr   r�   r7   r   r¥   rP   ry   ÚPROTOCOL_TLSv1ÚPROTOCOL_TLSv1_1ÚPROTOCOL_TLSv1_2r�   r�   r   ÚPROTOCOL_SSLv23r   r€   Ú r
   r   r   Úutilsr   r   r$   Úobjectr%   r§   r³   r   r   r   r   Ú<module>   s@   ý


   