3
Šãde)W  ã               @   sJ  d Z ddlZddlZddlZddlZddlZddlmZ yHddlZej	ej
ejdœZeedƒrdejnejed< eedƒo|ejZW n ek
r˜   dZY nX dd	lmZmZmZmZmZmZ d
dlmZ d
dlmZmZmZ d
dl m!Z! d
dl"m#Z# e$e%dœdd„Z&e'e(ee' dœdd„Z)G dd„ dƒZ*G dd„ de*ƒZ+G dd„ de*ƒZ,dS )zGModule implementing low-level socket communication with MySQL servers.
é    N)Údeque)ÚTLSv1zTLSv1.1zTLSv1.2ÚPROTOCOL_TLSzTLSv1.3ÚHAS_TLSv1_3F)ÚAnyÚDequeÚListÚOptionalÚTupleÚUnioné   )ÚMAX_PACKET_LENGTH)ÚInterfaceErrorÚNotSupportedErrorÚOperationalError)ÚStrOrBytesPath)Úinit_bytearray)ÚerrÚreturnc             C   s    | 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   © r   úN/var/www/agendate/envp3/lib/python3.6/site-packages/mysql/connector/network.pyÚ_strioerrorE   s    r   )ÚbufÚpktnrr   c             C   sŠ   g }t | ƒ}t}xJ||krZ|jdtjd|ƒ | d|…  ƒ | |d… } t | ƒ}|d }qW |jtjd|ƒdd… tjd|ƒ |  ƒ |S )z0Prepare a packet for sending to the MySQL servers   ÿÿÿz<BNr   z<Ir   é   )Úlenr   ÚappendÚstructÚpack)r   r   ÚpktsÚpllenÚ	maxpktlenr   r   r   Ú_prepare_packetsO   s    
"*r&   c            
   @   s2  e Zd ZdZddœdd„Zedœdd„Zedœdd	„Zedœd
d„Z	edœdd„Z
ddœdd„Zddœdd„Zddœdd„Zd'eee ee ddœdd„ZeZd(eee ee ddœdd„Zedœdd„ZeZeddœdd„Zee dœdd„Zee dd œd!d"„Zd)eeeeeee eee  d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
    N)r   c             C   s0   d | _ d | _d| _d| _tƒ | _d | _d| _d S )Nr   i    éÿÿÿÿr(   )ÚsockÚ_connection_timeoutÚ_packet_numberÚ_compressed_packet_numberr   Ú_packet_queueÚserver_hostZrecvsize)Úselfr   r   r   Ú__init__f   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_numberp   s    
z"BaseMySQLSocket.next_packet_numberc             C   s"   | j d | _ | j dkrd| _ | j S )z'Increments the compressed packet numberr   r1   r   )r,   )r/   r   r   r   Únext_compressed_packet_numberw   s    
z-BaseMySQLSocket.next_compressed_packet_numberc             C   s   t ‚dS )zOpen the socketN)ÚNotImplementedError)r/   r   r   r   Úopen_connection~   s    zBaseMySQLSocket.open_connectionc             C   s   t ‚dS )zGet the location of the socketN)r4   )r/   r   r   r   Úget_address‚   s    zBaseMySQLSocket.get_addressc             C   s>   y | j jtjƒ | j jƒ  | `W n ttfk
r8   Y nX dS )z&Shut down the socket before closing itN)r)   ÚshutdownÚsocketÚ	SHUT_RDWRÚcloser-   ÚAttributeErrorÚOSError)r/   r   r   r   r7   †   s    
zBaseMySQLSocket.shutdownc             C   s0   y| j jƒ  | `W n ttfk
r*   Y nX dS )zClose the socketN)r)   r:   r-   r;   r<   )r/   r   r   r   Úclose_connection�   s
    
z BaseMySQLSocket.close_connectionc             C   s   | j ƒ  d S )N)r7   )r/   r   r   r   Ú__del__—   s    zBaseMySQLSocket.__del__)r   Úpacket_numberÚcompressed_packet_numberr   c             C   s´   |}|dkr| j ƒ  n|| _t|| jƒ}x†|D ]~}y| jj|ƒ W q. tk
r~ } z td| jƒ t|ƒfd�|‚W Y dd}~X q. t	k
rª } ztdd�|‚W Y dd}~X q.X q.W dS )z Send packets to the MySQL serverNi  )r   ÚvaluesiÖ  )r   )
r2   r+   r&   r)   ÚsendallÚIOErrorr   r6   r   r;   )r/   r   r?   r@   Ú_ÚpacketsÚpacketr   r   r   r   Ú
send_plainš   s    

zBaseMySQLSocket.send_plainc             C   sú  |dkr| j ƒ  n|| _|dkr*| jƒ  n|| _| j}t|ƒ}g }t}||k�ržt||ƒ}dj|ƒ}	~tj	|	dd… ƒ}
t
jdt|
ƒƒdd… t
jd| jƒ d }|j||
 ƒ |	dd… }	t|	ƒ}| jƒ  xt||k�r@tj	|	d|… ƒ}
t
jdt|
ƒƒdd… t
jd| jƒ d	 }|j||
 ƒ |	|d… }	t|	ƒ}| jƒ  qÎW |	�rštj	|	ƒ}
t
jdt|
ƒƒdd… t
jd| jƒ t
jd|ƒdd…  }|j||
 ƒ ~	nÊt
jd|ƒdd… t
jd|ƒ | }t|ƒ}|d
k�r$tj	|ƒ}
|jt
jdt|
ƒƒdd… t
jd| jƒ t
jd|ƒdd…  |
 ƒ nDt
jd|ƒdd… t
jd| jƒ t
jddƒdd…  }|j|| ƒ xŒ|D ]„}y| jj|ƒ W nl tk
�rÀ } z td| jƒ t|ƒfd�|‚W Y dd}~X n0 tk
�rî } ztdd�|‚W Y dd}~X nX �qnW dS )z+Send compressed packets to the MySQL serverNó    i @  z<Ir   r   z<Bs    @ s   ÿÿÿé2   i  )r   rA   iÖ  )r   )r2   r+   r3   r,   r   r   r&   ÚjoinÚzlibÚcompressr!   r"   r    r)   rB   rC   r   r6   r   r;   )r/   r   r?   r@   r   r$   Zzpktsr%   r#   ZtmpbufZzbufÚheaderÚpktZ
zip_packetr   r   r   r   Úsend_compressed´   sb    




**
:$

B6
zBaseMySQLSocket.send_compressedc       	      C   s"  yÞt dƒ}d}x:|dk rH| jjd| ƒ}|s6tdd�‚||7 }t|ƒ}qW |d | _tjd|dd… d ƒd }|}|jt |ƒƒ t	|ƒ}|dd	… }xD|rÚ| jj
||ƒ}|dkrÄ|dkrÄtdd�‚||d	… }||8 }q˜W |S  tk
�r } z td
| jƒ t|ƒfd�|‚W Y d	d	}~X nX d	S )z%Receive packets from the MySQL serverrH   r   é   iÝ  )r   r   z<Ió    Ni  )r   rA   )Ú	bytearrayr)   Úrecvr   r   r+   r!   ÚunpackÚextendÚ
memoryviewÚ	recv_intorC   r   r6   r   )	r/   rF   Z
packet_lenÚchunkZpayload_lenÚrestZpacket_viewÚreadr   r   r   r   Ú
recv_plain  s4    



zBaseMySQLSocket.recv_plain)Úpacket_bunchr   c             C   sR   xL|rLt jd|dd… d ƒd }| jj|d|d … ƒ ||d d… }qW dS )zSplit compressed payloadz<Ir   r   rQ   rP   N)r!   rT   r-   r    )r/   r\   Úpayload_lengthr   r   r   Ú_split_zipped_payload+  s    z%BaseMySQLSocket._split_zipped_payloadc          !   C   sX  y| j jƒ }|d | _|S  tk
r,   Y nX tdƒ}g }�yr| jjdƒ}x(|rrt|ƒdk rr||7 }| jjdƒ}qLW �x4|�rªt|ƒdk r”tdd�‚t	j
d|dd… d	 ƒd }|d | _t	j
d|d
d… d	 ƒd }t|ƒ}x>t|ƒ|k �r| jj|t|ƒ ƒ}|�stdd�‚|| }qàW |dk�rJ| j|ƒ | j jƒ }|d | _|S |j||fƒ |dk�rdP tdƒ}| jjdƒ}x.|�r¦t|ƒdk �r¦||7 }| jjdƒ}�qzW qxW W n> tk
�rì }	 z td| jƒ t|	ƒfd�|	‚W Y dd}	~	X nX tdƒ}
x |D ]\}}|
tj|ƒ7 }
�qüW | j|
ƒ ~
y| j jƒ }|d | _|S  tk
�rR   Y nX dS )z0Receive compressed packets from the MySQL serverr   rH   r   é   iÝ  )r   z<Ir   rQ   rP   i @  i  )r   rA   N)r-   Úpopleftr+   Ú
IndexErrorrR   r)   rS   r   r   r!   rT   r,   r   r^   r    rC   r   r6   r   rK   Ú
decompress)r/   rN   rM   rE   ZabyteZzip_payload_lengthr]   Zzip_payloadrX   r   ÚtmpÚpayloadr   r   r   Úrecv_compressed2  sl    













zBaseMySQLSocket.recv_compressed)Útimeoutr   c             C   s   || _ | jr| jj|ƒ dS )zSet the connection timeoutN)r*   r)   Ú
settimeout)r/   rf   r   r   r   Úset_connection_timeout~  s    z&BaseMySQLSocket.set_connection_timeoutF)ÚcaÚcertÚkeyÚverify_certÚverify_identityÚcipher_suitesÚtls_versionsr   c          3   C   sÂ  | j stdd�‚�yØ|r tj}n|r,tj}ntj}|dks@| rTtjƒ }	|sìd|	_n˜|jdd� |d }
t	 rŠ|
dkrŠt
|ƒd	krŠ|d	 }
t|
 }tj|ƒ}	|
dkrìd
|kr¼|	 jtjO  _d|krÔ|	 jtjO  _d|krì|	 jtjO  _d|	_||	_|	jƒ  |�rZy|	j|ƒ W nD ttjfk
�rX } z | j jƒ  td|› �ƒ|‚W Y dd}~X nX |�r¶y|	j||ƒ W nD ttjfk
�r´ } z | j jƒ  td|› �ƒ|‚W Y dd}~X nX |�rÆ|	j|ƒ t| dƒ�rè|	j| j | jd�| _ n|	j| j ƒ| _ |�rèd|	_| j�r| jgng }tjdk�rZ| jdk�rZddg}tj| jƒ}|j |d g|d	  ƒ d}g }x`|D ]X}ytj!| j j"ƒ |ƒ W n4 tj#k
�r¶ } z|j$t%|ƒƒ W Y dd}~X nX d}P �qhW |�sè| j jƒ  tddj&|ƒ› �ƒ‚W nÒ t'k
�r } zt(dƒ|‚W Y dd}~X n¦ tjtfk
�rZ } z td| j)ƒ t*|ƒfd�|‚W Y dd}~X nd tj#k
�rŒ } ztt%|ƒƒ|‚W Y dd}~X n2 t+k
�r¼ } ztt%|ƒƒ|‚W Y dd}~X nX dS )zSwitch the socket to use SSLi   )r   NFT)Úreverser   zTLSv1.3r   zTLSv1.2zTLSv1.1r   zInvalid CA Certificate: zInvalid Certificate/Key: r.   )Úserver_hostnameÚntÚ	localhostz	127.0.0.1z"Unable to verify server identity: z, z&Python installation has no SSL supporti  )r   rA   ),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_locationsrC   ÚSSLErrorr:   Úload_cert_chainÚset_ciphersÚhasattrÚwrap_socketr.   ÚosÚnamer8   ÚgethostbyaddrrU   Úmatch_hostnameÚgetpeercertÚCertificateErrorr    r   rJ   Ú	NameErrorr   r6   r   r4   )r/   ri   rj   rk   rl   rm   rn   ro   Ú	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__r0   Úintr2   r3   r   r5   r6   r7   r=   r>   Úbytesr	   rG   ÚsendrO   rR   r[   rS   r^   re   rh   r   Úboolr   r   r–   r   r   r   r   r'   ]   s4   
	  N"L   r'   c                   sX   e Zd ZdZdeddœ‡ fdd„Zedœdd	„Zddœd
d„Zeeddœdd„Z	‡  Z
S )ÚMySQLUnixSocketzoMySQL socket class using UNIX sockets

    Opens a connection through the UNIX socket of the MySQL Server.
    ú/tmp/mysql.sockN)Úunix_socketr   c                s   t ƒ jƒ  || _d S )N)Úsuperr0   r¡   )r/   r¡   )Ú	__class__r   r   r0   ú  s    
zMySQLUnixSocket.__init__)r   c             C   s   | j S )N)r¡   )r/   r   r   r   r6   þ  s    zMySQLUnixSocket.get_addressc             C   s¢   y2t j t jt jƒ| _| jj| jƒ | jj| jƒ W nj tk
rn } z t	d| j
ƒ t|ƒfd�|‚W Y d d }~X n0 tk
rœ } zt	t|ƒƒ|‚W Y d d }~X nX d S )NiÒ  )r   rA   )r8   ÚAF_UNIXÚSOCK_STREAMr)   rg   r*   Úconnectr¡   rC   r   r6   r   Ú	Exceptionr   )r/   r   r   r   r   r5     s    zMySQLUnixSocket.open_connection)ÚargsÚkwargsr   c             O   s   t jdtƒ dS )zSwitch the socket to use SSL.z2SSL is disabled when using unix socket connectionsN)ÚwarningsÚwarnÚWarning)r/   r¨   r©   r   r   r   r–     s    zMySQLUnixSocket.switch_to_ssl)r    )r—   r˜   r™   rš   r   r0   r6   r5   r   r–   Ú__classcell__r   r   )r£   r   rŸ   ô  s   rŸ   c                   sJ   e Zd ZdZdeeeddœ‡ fdd„Zed	œd
d„Zdd	œdd„Z	‡  Z
S )ÚMySQLTCPSocketzXMySQL socket class using TCP/IP

    Opens a TCP/IP connection to the MySQL Server.
    ú	127.0.0.1éê  FN)ÚhostÚportÚ
force_ipv6r   c                s&   t ƒ jƒ  || _|| _|| _d| _d S )Nr   )r¢   r0   r.   Úserver_portr³   Ú_family)r/   r±   r²   r³   )r£   r   r   r0     s
    
zMySQLTCPSocket.__init__)r   c             C   s   | j › d| j› �S )Nú:)r.   r´   )r/   r   r   r   r6   (  s    zMySQLTCPSocket.get_addressc       	       C   sˆ  d}y�t j| j| jdt jt jƒ}x:|D ]2}| jrD|d t jkrD|}P |d t jkr&|}P q&W | jr~|d dkr~t	d| j› �ƒ‚|d dkr’|d }W n< t
k
rÐ } z t	d| jƒ t|ƒfd�|‚W Y dd}~X nX |\| _}}}}y0t j | j||ƒ| _| jj| jƒ | jj|ƒ W np t
k
�rR } z"t	d| j| jt|ƒfd�|‚W Y dd}~X n2 tk
�r‚ } ztt|ƒƒ|‚W Y dd}~X nX dS )z.Open the TCP/IP connection to the MySQL serverNr   zNo IPv6 address found for iÓ  )r   rA   )NNNNN)r8   Úgetaddrinfor.   r´   r¥   ÚSOL_TCPr³   ÚAF_INET6ÚAF_INETr   rC   r6   r   rµ   r)   rg   r*   r¦   r§   r   r   )	r/   ÚaddrinfoZ	addrinfosÚinfor   ÚsocktypeÚprotorD   Úsockaddrr   r   r   r5   +  sJ    
zMySQLTCPSocket.open_connection)r¯   r°   F)r—   r˜   r™   rš   r   r›   rž   r0   r6   r5   r­   r   r   )r£   r   r®     s
   r®   )-rš   rŠ   r8   r!   rª   rK   Úcollectionsr   rt   ÚPROTOCOL_TLSv1ÚPROTOCOL_TLSv1_1ÚPROTOCOL_TLSv1_2r|   rˆ   r   ÚPROTOCOL_SSLv23r   r{   ÚImportErrorÚtypingr   r   r   r	   r
   r   Ú	constantsr   Úerrorsr   r   r   Útypesr   Úutilsr   rC   r   r   rœ   r›   r&   r'   rŸ   r®   r   r   r   r   Ú<module>    s:   


 
   %