o
    g(1                     @   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)lc_intread_lc_string_list   )MySQLSocket)MySQLAuthPluginget_auth_plugin)"MySQLCachingSHA2PasswordAuthPluginc                    @   s|  e Zd ZdZe			d$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 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 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auth_pluginauth_plugin_classssl_enabledplugin_configreturnc           
   
   C   s   |s|dkr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 rMtd|j tt|| }||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   len)
r   r   r   r   r    r!   r"   auth_strategyr&   err r,   V/var/www/html/api-tag/env/lib/python3.10/site-packages/mysql/connector/aio/protocol.pyauth_plugin_first_response:   s.   "z(MySQLProtocol.auth_plugin_first_responser   	handshakedatabasecharsetclient_flags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xxxxxxxxxxxxxxxxxxxxxxxz<IIB)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)r/   r   r   r0   r1   r2   r3   r   r    r4   r5   r!   r"   
b_usernameresponse_payloadr+   fillerr&   r*   r,   r,   r-   	make_authw   sp   3






	
zMySQLProtocol.make_authr   utf-8sockcolumnscountread_timeout.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 rL|durL|| n|du rX|du rXt|
|	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   r1   rO   rowseofvaluesipacketr,   r,   r-   read_binary_result   s,   
z MySQLProtocol.read_binary_resultversionc                    s<  |}g }d}d}d}		 |s|	|kr	 ||fS | |I dH }
|
dr_|
dd g}| |I dH }
|
drN||
dd  | |I dH }
|
ds8||
dd  td|}n |
d dkrs|
d dk rs| |
}d}nd}t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   rP   r9   rQ      r   )rS   
startswithr>   r   rF   rT   bytesr   )rV   rL   r]   rN   rO   _rW   rX   rowdatarZ   r[   datasr,   r,   r-   read_text_result  s>   



zMySQLProtocol.read_text_result)NFN)r   rK   N)r   N)__name__
__module____qualname____doc__staticmethodr`   strr   boolr   r   r   r   r.   r   r   r   intrJ   r   r   r   r   r   r\   rd   r,   r,   r,   r-   r   4   s    
<	

~
)
)%rh   __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   