U
    e: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 zHd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)TLSv1TLSv1.1TLSv1.2PROTOCOL_TLS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   X/var/www/html/assets/scripts/venv/lib/python3.8/site-packages/mysql/connector/network.py_strioerrorE   s    r   )bufpktnrr   c                 C   s   g }t | }t}||krX|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   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 )Ni    )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   )r2   r6   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   r9   r   )r3   r6   r   r   r   next_compressed_packet_numberw   s    
z-BaseMySQLSocket.next_compressed_packet_numberc                 C   s   t dS )zOpen the socketNNotImplementedErrorr6   r   r   r   open_connection~   s    zBaseMySQLSocket.open_connectionc                 C   s   t dS )zGet the location of the socketNr<   r6   r   r   r   get_address   s    zBaseMySQLSocket.get_addressc              	   C   s>   z | j tj | j   | `W n ttfk
r8   Y nX dS )z&Shut down the socket before closing itN)r0   shutdownsocket	SHUT_RDWRcloser4   AttributeErrorOSErrorr6   r   r   r   r@      s    
zBaseMySQLSocket.shutdownc              	   C   s0   z| j   | `W n ttfk
r*   Y nX dS )zClose the socketN)r0   rC   r4   rD   rE   r6   r   r   r   close_connection   s
    
z BaseMySQLSocket.close_connectionc                 C   s   |    d S N)r@   r6   r   r   r   __del__   s    zBaseMySQLSocket.__del__)r   packet_numbercompressed_packet_numberr   c                 C   s   |}|dkr|    n|| _t|| j}|D ]~}z| j| W q, tk
r| } ztd|  t|fd|W 5 d}~X Y q, t	k
r } ztdd|W 5 d}~X Y q,X q,dS )z Send packets to the MySQL serverN  r   values  r   )
r:   r2   r,   r0   sendallIOErrorr   r?   r   rD   )r7   r   rI   rJ   _packetspacketr   r   r   r   
send_plain   s"    
 zBaseMySQLSocket.send_plainc                 C   s  |dkr|    n|| _|dkr*|   n|| _| j}t|}g }t}||krt||}d|}	~t	|	dd }
t
dt|
dd t
d| j d }|||
  |	dd }	t|	}|   ||kr>t	|	d| }
t
dt|
dd t
d| j d	 }|||
  |	|d }	t|	}|   q|	rt	|	}
t
dt|
dd t
d| j t
d|dd  }|||
  ~	nt
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 ]}z| j| W nl tk
r } ztd|  t|fd|W 5 d}~X Y n0 tk
r } ztdd|W 5 d}~X Y nX qhdS )z+Send compressed packets to the MySQL serverN     @  r#   r   r$   r"   s    @ r!   2   rK   rL   rN   rO   )r:   r2   r;   r3   r%   r   r,   joinzlibcompressr'   r(   r&   r0   rP   rQ   r   r?   r   rD   )r7   r   rI   rJ   r    r*   Zzpktsr+   r)   ZtmpbufZzbufheaderpktZ
zip_packetr   r   r   r   send_compressed   s    







$

 zBaseMySQLSocket.send_compressedc           	   
   C   s  zt d}d}|dk rF| jd| }|s4tdd||7 }t|}q|d | _td|dd d d }|}|t | t	|}|dd	 }|r| j
||}|dkr|dkrtdd||d	 }||8 }q|W S  tk
r } ztd
|  t|fd|W 5 d	}~X Y nX d	S )z%Receive packets from the MySQL serverrV   r        rO   r$   r#       NrK   rL   )	bytearrayr0   recvr   r%   r2   r'   unpackextend
memoryview	recv_intorQ   r   r?   r   )	r7   rT   Z
packet_lenchunkZpayload_lenrestZpacket_viewreadr   r   r   r   
recv_plain  s:    




 zBaseMySQLSocket.recv_plain)packet_bunchr   c                 C   sN   |rJt d|dd d d }| j|d|d   ||d d }q dS )zSplit compressed payloadr#   r   r$   ra   r_   N)r'   rd   r4   r&   )r7   rl   payload_lengthr   r   r   _split_zipped_payload+  s    z%BaseMySQLSocket._split_zipped_payloadc              
   C   sF  z| j  }|d | _|W S  tk
r.   Y nX td}g }z`| jd}|rrt|dk rr||7 }| jd}qL|rt|dk rtddt	
d|dd d	 d }|d | _t	
d|d
d d	 d }t|}t||k r| j|t| }|s
tdd|| }q|dkrB| | | j  }|d | _|W S |||f |dkr^qtd}| jd}|rrt|dk rr||7 }| jd}qrqrW n> tk
r }	 ztd|  t|	fd|	W 5 d}	~	X Y nX td}
|D ]\}}|
t|7 }
q| |
 ~
z| j  }|d | _|W S  tk
r@   Y nX dS )z0Receive compressed packets from the MySQL serverr$   rV   r      r`   rO   r#   r   ra   r_   rW   rK   rL   N)r4   popleftr2   
IndexErrorrb   r0   rc   r%   r   r'   rd   r3   r   rn   r&   rQ   r   r?   r   rZ   
decompress)r7   r]   r\   rS   ZabyteZzip_payload_lengthrm   Zzip_payloadrh   r   tmppayloadr   r   r   recv_compressed2  sr    










 


zBaseMySQLSocket.recv_compressed)timeoutr   c                 C   s   || _ | jr| j| dS )zSet the connection timeoutN)r1   r0   
settimeout)r7   rv   r   r   r   set_connection_timeout~  s    z&BaseMySQLSocket.set_connection_timeoutF)cacertkeyverify_certverify_identitycipher_suitestls_versionsr   c                 C   s  | j stddz|r tj}n|r,tj}ntj}|dks>|sRt }	|sd|	_n|jdd |d }
t	s|
dkrt
|d	kr|d	 }
t|
 }t|}	|
dkrd
|kr|	 jtjO  _d|kr|	 jtjO  _d|kr|	 jtjO  _d|	_||	_|	  |rVz|	| W nD ttjfk
rT } z| j   td| |W 5 d}~X Y nX |rz|	|| W nD ttjfk
r } z| j   td| |W 5 d}~X Y nX |r|	| t| dr|	j| j | jd| _ n|	| j | _ |rd|	_| jr| jgng }tjdkrV| jdkrVddg}t| j}| |d g|d	   d}g }|D ]\}zt!| j " | W n4 tj#k
r } z|$t%| W 5 d}~X Y nX d} qqb|s| j   tdd&| W n t'k
r } zt(d|W 5 d}~X Y n tjtfk
rV } ztd| ) t*|fd|W 5 d}~X Y nd tj#k
r } ztt%||W 5 d}~X Y n2 t+k
r } ztt%||W 5 d}~X Y nX dS )zSwitch the socket to use SSLi   rO   NFT)reverser   r   r   r   r   r   zInvalid CA Certificate: zInvalid Certificate/Key: r5   )server_hostnament	localhost	127.0.0.1z"Unable to verify server identity: z, z&Python installation has no SSL supportrK   rL   ),r0   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_locationsrQ   SSLErrorrC   load_cert_chainset_ciphershasattrwrap_socketr5   osnamerA   gethostbyaddrre   match_hostnamegetpeercertCertificateErrorr&   r   rY   	NameErrorr   r?   r   r=   )r7   ry   rz   r{   r|   r}   r~   r   	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__r8   intr:   r;   r	   r>   r?   r@   rF   rH   bytesr   rU   sendr^   rb   rk   rc   rn   ru   rx   r   boolr   r   r   r   r   r   r   r-   ]   sZ   
	    S"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    || _d S rG   )superr8   r   )r7   r   	__class__r   r   r8     s    
zMySQLUnixSocket.__init__r.   c                 C   s   | j S rG   )r   r6   r   r   r   r?     s    zMySQLUnixSocket.get_addressc              
   C   s   z2t  t jt j| _| j| j | j| j W nj tk
rn } zt	d| 
 t|fd|W 5 d }~X Y n0 tk
r } zt	t||W 5 d }~X Y nX d S )Ni  rL   )rA   AF_UNIXSOCK_STREAMr0   rw   r1   connectr   rQ   r   r?   r   	Exceptionr   )r7   r   r   r   r   r>     s       zMySQLUnixSocket.open_connection)argskwargsr   c                 O   s   t dt dS )zSwitch the socket to use SSL.z2SSL is disabled when using unix socket connectionsN)warningswarnWarning)r7   r   r   r   r   r   r     s    zMySQLUnixSocket.switch_to_ssl)r   )r   r   r   r   r   r8   r?   r>   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.
    r     FN)hostport
force_ipv6r   c                    s&   t    || _|| _|| _d| _d S )Nr   )r   r8   r5   server_portr   _family)r7   r   r   r   r   r   r   r8     s
    
zMySQLTCPSocket.__init__r.   c                 C   s   | j  d| j S )N:)r5   r   r6   r   r   r   r?   (  s    zMySQLTCPSocket.get_addressc           	   
   C   s  d}zt | j| jdt jt j}|D ]6}| jrD|d t jkrD|} q\|d t jkr$|} q\q$| jr~|d dkr~t	d| j |d dkr|d }W n< t
k
r } zt	d|  t|fd|W 5 d}~X Y nX |\| _}}}}z0t  | j||| _| j| j | j| W np t
k
rR } z t	d| j| jt|fd|W 5 d}~X Y n2 tk
r } ztt||W 5 d}~X Y nX dS )z.Open the TCP/IP connection to the MySQL server)NNNNNr   NzNo IPv6 address found for i  rL   )rA   getaddrinfor5   r   r   SOL_TCPr   AF_INET6AF_INETr   rQ   r?   r   r   r0   rw   r1   r   r   r   r   )	r7   addrinfo	addrinfosinfor   socktypeprotorR   sockaddrr   r   r   r>   +  sZ    
 zMySQLTCPSocket.open_connection)r   r   F)r   r   r   r   r   r   r   r8   r?   r>   r   r   r   r   r   r     s          	r   )-r   r   rA   r'   r   rZ   collectionsr   r   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   rQ   r   r   r   r   r,   r-   r   r   r   r   r   r   <module>   s@   
 
   %