o
    b<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z,ddlZej	ej
ejdZeedr5ejed< nejed< eedrEejrEdZnd	ZW n   d	ZY 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   V/var/www/secure340b-portal/env/lib/python3.10/site-packages/mysql/connector/network.py_strioerror@   s   r   c                 C   s   g }t | }tj}||kr0|dtd| | d|   | |d } t | }|d }||ks|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rPe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 )Ni    )sock_connection_timeout_packet_number_compressed_packet_numberr   _packet_queueZrecvsizeselfr   r   r   __init__c   s   
zBaseMySQLSocket.__init__c                 C   "   | j d | _ | j dkrd| _ | j S )zIncrements the packet numberr	      r   )r)   r,   r   r   r   next_packet_numberk      
z"BaseMySQLSocket.next_packet_numberc                 C   r/   )z'Increments the compressed packet numberr	   r0   r   )r*   r,   r   r   r   next_compressed_packet_numbers   r2   z-BaseMySQLSocket.next_compressed_packet_numberc                 C      t )zOpen the socketNotImplementedErrorr,   r   r   r   open_connection{      zBaseMySQLSocket.open_connectionc                 C   r4   )zGet the location of the socketr5   r,   r   r   r   get_address   r8   zBaseMySQLSocket.get_addressc              	   C   s>   z| j tj | j   | `W dS  tjtfy   Y dS w )z&Shut down the socket before closing itN)r'   shutdownsocket	SHUT_RDWRcloser+   errorAttributeErrorr,   r   r   r   r:      s   

zBaseMySQLSocket.shutdownc              	   C   s0   z
| j   | `W dS  tjtfy   Y dS w )zClose the socketN)r'   r=   r+   r;   r>   r?   r,   r   r   r   close_connection   s   

z BaseMySQLSocket.close_connectionc                 C   s   |    d S N)r:   r,   r   r   r   __del__   s   zBaseMySQLSocket.__del__Nc                 C   s   |du r| j  n|| _t|| j}|D ]/}z| j| W q ty6 } ztjd|  t	|fdd}~w t
yB   tjddw dS )z Send packets to the MySQL serverN  r   values  r   )r1   r)   r$   r'   sendallIOErrorr   OperationalErrorr9   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rt||}d|}	~t	
|	dd }
tdt|
dd td| j d }|||
  |	dd }	t|	}| j ||krt	
|	d| }
tdt|
dd td| j d	 }|||
  |	|d }	t|	}| j ||ksg|	rt	
|	}
tdt|
dd td| j td|dd  }|||
  ~	netd|dd td| | }t|}|d
krt	
|}
|tdt|
dd td| j td|dd  |
  n"td|dd td| j tdddd  }|||  |D ]2}z	| j| W q1 tyV } ztjd|  t|fdd}~w tyc   tjddw dS )z+Send compressed packets to the MySQL serverN     @  r   r   r   r   s    @ r   2   rC   rD   rF   rG   )r1   r)   r3   r*   r   r
   r   r$   joinzlibcompressr   r   r   r'   rH   rI   r   rJ   r9   r   r?   )r-   r   rK   rL   r    r"   Zzpktsr#   r!   ZtmpbufZzbufheaderpktZ
zip_packetr   r   r   r   send_compressed   s   

	



zBaseMySQLSocket.send_compressedc           	   
   C   s  zrt d}d}|dk r'| jd| }|stjdd||7 }t|}|dk s|d | _td|dd d d }|}|	t | t
|}|dd	 }|rp| j||}|dkrd|dkrdtjdd||d	 }||8 }|sO|W S  ty } ztjd
|  t|fdd	}~ww )%Receive packets from the MySQL serverrP   r        rG   r   r       NrC   rD   )	bytearrayr'   recvr   r   r   r)   r   unpackextend
memoryview	recv_intorI   rJ   r9   r   )	r-   rN   Z
packet_lenchunkpayload_lenrestZpacket_viewreadr   r   r   r   
recv_plain   s<   
zBaseMySQLSocket.recv_plainc              
   C   s   zdt d}d}|dk r'| jd| }|stjdd||7 }t|}|dk s|d | _td|dd d d }|}t	d}|dkr`| j|}|sRtjdd||7 }|t| }|dksD|| W S  t
y} } ztjd	|  t|fd
d}~ww )rY   rP   r   rZ   r[   rG   r   r   r\   rC   rD   N)r]   r'   r^   r   r   r   r)   r   r_   r   rI   rJ   r9   r   )r-   rV   Z
header_lenrc   rd   re   payloadr   r   r   r   recv_py26_plain  s8   

zBaseMySQLSocket.recv_py26_plainr      )rj      c                 C   sT   |r(t d|dd d d }| j|d|d   ||d d }|sdS dS )zSplit compressed payloadr   r   r   r\   rZ   N)r   r_   r+   r   )r-   Zpacket_bunchpayload_lengthr   r   r   _split_zipped_payload5  s
   z%BaseMySQLSocket._split_zipped_payloadc              
   C   sN  z| j  }|d | _|W S  ty   Y nw td}g }z| jd}|r>t|dk r>||7 }| jd}|r>t|dk s,|rt|dk rLtj	ddt
d|dd d	 d }|d | _t
d|d
d d	 d }t|}t||k r| j|t| }|stj	dd|| }t||k sw|dkr| | | j  }|d | _|W S |||f |dkrn&td}| jd}|rt|dk r||7 }| jd}|rt|dk s|s@W n ty }	 ztjd|  t|	fdd}	~	ww td}
|D ]\}}|
t|7 }
q| |
 ~
z| j  }|d | _|W S  ty&   Y dS w )z0Receive compressed packets from the MySQL serverr   rP   r	      r[   rG   r   r   r\   rZ   rQ   rC   rD   N)r+   popleftr)   
IndexErrorr]   r'   r^   r   r   r   r   r_   r*   r   rm   r   rI   rJ   r9   r   rT   
decompress)r-   rW   rV   rM   ZabyteZzip_payload_lengthrl   Zzip_payloadrc   r   tmprh   r   r   r   recv_compressed<  s   





(


zBaseMySQLSocket.recv_compressedc                 C   s    || _ | jr| j| dS 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zT|rtj}n	|rtj}ntj}|du s |s*t }	|s)d|	_nK|j	dd |d }
t
sD|
dkrDt|d	krD|d	 }
t|
 }t|}	|
dkrud
|vr]|	 jtjO  _d|vri|	 jtjO  _d|vru|	 jtjO  _d|	_||	_|	  |rz|	| W n ttjfy } z| j   td|d}~ww |rz|	|| W n ttjfy } z| j   td|d}~ww |r|	| t| dr|	j| j | jd| _ n|	| j | _ |rYd|	_| jg}tjdkr| jdkrddg}t !| j}|"|d g|d	   d}g }|D ],}zt#| j $ | W n tj%yC } z|&t'| W Y d}~qd}~ww d} |s\| j   tdd(|W dS W dS  t)yk   t*d tjtfy } ztjd| + t,|fdd}~w tj%y } ztt'|d}~w t-y } ztt'|d}~ww )zSwitch the socket to use SSLi   rG   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 supportrC   rD   ).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_locationsrI   SSLErrorr=   r   load_cert_chainset_ciphershasattrwrap_socketrx   osnamer;   gethostbyaddrr`   match_hostnamegetpeercertCertificateErrorr   r   rS   	NameErrorZNotSupportedErrorr9   r   r6   )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)FFNN)__name__
__module____qualname____doc__r.   propertyr1   r3   r7   r9   r:   r@   rB   rO   sendrX   rg   ri   sysversion_infor^   rm   rs   rv   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 rA   )superr   r.   unix_socket)r-   r   	__class__r   r   r.     s   
zMySQLUnixSocket.__init__c                 C   s   | j S rA   )r   r,   r   r   r   r9     s   zMySQLUnixSocket.get_addressc              
   C   s   zt  t jt j| _| j| j | j| j W d S  ty3 } zt	j
d|  t|fdd }~w tyE } zt	
t|d }~ww )Ni  rD   )r;   AF_UNIXSOCK_STREAMr'   rt   r(   connectr   rI   r   r   r9   r   	Exceptionr   )r-   r   r   r   r   r7      s   zMySQLUnixSocket.open_connection)r   r   r   r   r   r.   r9   r7   __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.
    r|     Fc                    s*   t t|   || _|| _|| _d| _d S )Nr   )r   r   r.   rx   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   rx   r   r,   r   r   r   r9     s   zMySQLTCPSocket.get_addressc           	   
   C   sl  dgd }zIt | j| jdt jt j}|D ]}| jr%|d t jkr%|} n|d t jkr0|} nq| jrC|d du rCt	
d| j|d du rM|d }W n tyg } zt	j
d|  t|fdd}~ww |\| _}}}}zt  | j||| _| j| j | j| W dS  ty } zt	j
d| j| jt|fdd}~w ty } zt	t|d}~ww )z7Open the TCP/IP connection to the MySQL server
        N   r   zNo IPv6 address found for {0}i  rD   )r;   getaddrinforx   r   r   SOL_TCPr   AF_INET6AF_INETr   r   r   rI   r9   r   r   r'   rt   r(   r   r   rJ   r   )	r-   addrinfo	addrinfosinfor   socktypeproto_sockaddrr   r   r   r7     s\   

zMySQLTCPSocket.open_connection)r|   r   Fr   r   r   r   r   r     s
    r   )r   collectionsr   r   r;   r   r   rT   r}   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>   sD   


   