o
    #f0                     @   s   d Z dgZddlZddlmZmZmZmZmZ ddl	m
Z
mZ ddl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mZmZmZ ddlmZmZ ddlmZ ddl m!Z!m"Z" ddl#m$Z$ G dd deZdS )z,Implements the MySQL Client/Server protocol.MySQLProtocol    N)AnyDictListOptionalTuple   )
ClientFlag	ServerCmd)InterfaceErrorProgrammingErrorget_exception)logger)DEFAULT_CHARSET_IDDEFAULT_MAX_ALLOWED_PACKETr   )BinaryProtocolTypeDescriptionTypeEofPacketTypeHandShakeType)	int1storeread_lc_string_list   )MySQLSocket)MySQLAuthPluginget_auth_plugin)"MySQLCachingSHA2PasswordAuthPluginc                    @   sl  e Zd ZdZe			d#dededededed	ee d
e	dee
eef  deeef fddZedededdddddf
dedededee dedededee d	ee dee
eef  de	d
e	dee
eef  deeef fddZ		d$dedee dededeeeedf  ee f f
ddZ	d%ded eedf dedeeeee df  ee f fd!d"ZdS )&r   zSImplements MySQL client/server protocol.

    Create and parses MySQL packets.
    NF	auth_datausernamepasswordclient_flagsauth_pluginauth_plugin_classssl_enabledplugin_configreturnc              
   C   s   |sdt |||dfS |du ri }zt|||||d}|j| fi |}	W n ttfy< }
 ztd|
 |
d}
~
ww |	du rItd|j |tj@ rVtt	|	|	 n|	d }	|	|fS )a  Prepare the first authentication response.

        Args:
            auth_data: Authorization data from initial handshake.
            username: Account's username.
            password: Account's password.
            client_flags: Integer representing client capabilities flags.
            auth_plugin: Authorization plugin name.
            auth_plugin_class: Authorization plugin class (has higher precedence
                               than the authorization plugin name).
            ssl_enabled: Whether SSL is enabled or not.
            plugin_config: Custom configuration to be passed to the auth plugin
                           when invoked. The parameters defined here will override
                           the ones defined in the auth plugin itself.

        Returns:
            auth_response: Authorization plugin response.
            auth_strategy: Authorization plugin instance created based
                           on the provided `auth_plugin` and `auth_plugin_class`
                           parameters.

        Raises:
            InterfaceError: If authentication fails or when got a NULL auth response.
            )r"   NzFailed authentication: z8Got NULL auth response while authenticating with plugin )
r   r   auth_response	TypeErrorr   namer	   SECURE_CONNECTIONr   len)r   r   r   r   r    r!   r"   r#   auth_strategyr&   err r-   R/home/ubuntu/dev/venv/lib/python3.10/site-packages/mysql/connector/aio/protocol.pyauth_plugin_first_response:   s4   #z(MySQLProtocol.auth_plugin_first_responser   	handshakedatabasecharsetmax_allowed_packet
conn_attrsis_change_user_requestc              
   C   s  |  }g }|
rtd td | du rtdd| ddu r'tddz|p-| d }W n ttfyF } z	td| d	dd}~ww td
| |
ra|t	dt
| dtj| nd}|t	d| t
| d|||| tj| d |||||||d\}}|| |t|| |
r|t	d| |tj@ r||  d  |tj@ r|	dur|t|	 d||fS )a  Make a MySQL Authentication packet.

        Args:
            handshake: Initial handshake.
            username: Account's username.
            password: Account's password.
            database: Initial database name for the connection
            charset: Client charset (see [2]), only the lower 8-bits.
            client_flags: Integer representing client capabilities flags.
            max_allowed_packet: Maximum packet size.
            auth_plugin: Authorization plugin name.
            auth_plugin_class: Authorization plugin class (has higher precedence
                               than the authorization plugin name).
            conn_attrs: Connection attributes.
            is_change_user_request: Whether is a `change user request` operation or not.
            ssl_enabled: Whether SSL is enabled or not.
            plugin_config: Custom configuration to be passed to the auth plugin
                           when invoked. The parameters defined here will override
                           the one defined in the auth plugin itself.

        Returns:
            handshake_response: Handshake response as per [1].
            auth_strategy: Authorization plugin instance created based
                           on the provided `auth_plugin` and `auth_plugin_class`.

        Raises:
            ProgrammingError: Handshake misses authentication info.

        References:
            [1]: https://dev.mysql.com/doc/dev/mysql-server/latest/                page_protocol_connection_phase_packets_protocol_handshake_response.html

            [2]: https://dev.mysql.com/doc/dev/mysql-server/latest/                page_protocol_basic_character_set.html#a_protocol_character_set
        zGot a `change user` requestzStarting authorization phaseNzGot a NULL handshaker   z$Handshake misses authentication infor    z-Handshake misses authentication plugin info ()z#The provided initial strategy is %sz<Bsxxxxxxxxxxxxxxxxxxxxxxxz<IIH)r   r   r   r   r    r!   r"   r#   z<Hr%       )encoder   debugr   getr'   KeyErrorappendstructpackr*   r
   CHANGE_USERr   r/   connect_with_dbr	   PLUGIN_AUTHCONNECT_ARGSmake_conn_attrsjoin)r0   r   r   r1   r2   r   r3   r    r!   r4   r5   r"   r#   
b_usernameresponse_payloadr,   fillerr&   r+   r-   r-   r.   	make_auth|   sr   3








zMySQLProtocol.make_authr   utf-8sockcolumnscount.c           
         s   g }d}d}d}	 |s||kr	 ||fS |  I dH }	|	d dkr*| |	}d}n|	d dkr=d}| ||	dd |}|du rK|durK|| n|du rW|du rWt|	|d7 }q
)zxRead MySQL binary protocol result.

        Reads all or given number of binary resultset rows from the socket.
        Nr   T         r   )read	parse_eof_parse_binary_valuesr>   r   )
selfrL   rM   rN   r2   rowseofvaluesipacketr-   r-   r.   read_binary_result   s,   
z MySQLProtocol.read_binary_resultversionc                    s6  |}g }d}d}d}	 |s||kr	 ||fS |  I dH }	|	dr^|	dd g}
|  I dH }	|	drK|
|	dd  |  I dH }	|	ds6|
|	dd  ttd|
}n|	d dkrr|	d dk rr| |	}d}n
d}t|	dd }|du r|dur|| n|du r|du rt|	|d	7 }q)
zRead MySQL text result.

        Reads all or given number of rows from the socket.

        Returns a tuple with 2 elements: a list with all rows and
        the EOF packet.
        Nr   Ts   rO   r9   rP      r   )rR   
startswithr>   r   	bytearrayrF   rS   r   )rU   rL   r\   rN   _rV   rW   rowdatarY   rZ   datasr-   r-   r.   read_text_result  s>   



zMySQLProtocol.read_text_result)NFN)r   rK   )r   )__name__
__module____qualname____doc__staticmethodbytesstrintr   boolr   r   r   r   r/   r   r   r   rJ   r   r   r   r   r   r[   rc   r-   r-   r-   r.   r   4   s    
	A	


"
)%rg   __all__r?   typingr   r   r   r   r   	constantsr	   r
   errorsr   r   r   r   protocolr   r   r   _MySQLProtocoltypesr   r   r   r   utilsr   r   networkr   pluginsr   r   plugins.caching_sha2_passwordr   r-   r-   r-   r.   <module>   s   