U
    ¤�©j51  ã                   @   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                   @   s(  e Zd ZdZedeeeeeee e	ee
eef  eeef dœ	dd„ƒZedededdddddf
eeeee eeeee ee ee
eef  e	e	ee
eef  eeef dœd	d
„ƒZdeee eeeeeedf  ee f dœdd„Zdeeedf eeeeee df  ee f dœ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kr"i }z&t||ƒ|||d�}|j| f|Ž}	W n6 ttfk
r~ }
 ztd|
› �ƒ|
‚W 5 d}
~
X Y nX |	dkr˜td|j› �ƒ‚|tj@ r²t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	   ZSECURE_CONNECTIONr   Úlen)r   r   r   r   r    r!   r"   r#   Úauth_strategyr&   Úerr© r,   ú@/tmp/pip-unpacked-wheel-d6bt0v6z/mysql/connector/aio/protocol.pyÚauth_plugin_first_response:   s4    #  ÿ  ÿ"
ÿÿýz(MySQLProtocol.auth_plugin_first_responser   )Ú	handshaker   r   ÚdatabaseÚcharsetr   Úmax_allowed_packetr    r!   Ú
conn_attrsÚis_change_user_requestr"   r#   r$   c              
   C   s   |  ¡ }g }|
rt d¡ t d¡ | dkr6tdƒd‚|  d¡dkrNtdƒd‚z|pZ| d }W n8 ttfk
r– } ztd|› d	�ƒd‚W 5 d}~X Y nX t d
|¡ |
rÌ| t 	dt
|ƒ› d�tj|¡¡ n,d}| t 	d|› t
|ƒ› d�||||¡¡ tj| d |||||||d�\}}| |¡ | t ||¡¡ |
�rN| t 	d|¡¡ |tj@ �rl| |  ¡ d ¡ |tj@ �r’|	dk	�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<BZsxZxxxxxxxxxxxxxxxxxxxxxxz<IIH)r   r   r   r   r    r!   r"   r#   z<Hr%   ó    )Úencoder   Údebugr   Úgetr'   ÚKeyErrorÚappendÚstructÚpackr)   r
   ZCHANGE_USERr   r.   Zconnect_with_dbr	   ZPLUGIN_AUTHZCONNECT_ARGSZmake_conn_attrsÚjoin)r/   r   r   r0   r1   r   r2   r    r!   r3   r4   r"   r#   Z
b_usernameZresponse_payloadr+   Zfillerr&   r*   r,   r,   r-   Ú	make_auth|   sn    3




ÿþýÿûÿø


zMySQLProtocol.make_authr   úutf-8.)ÚsockÚcolumnsÚcountr1   r$   c           
      Ã   s´   g }d}d}d}|s¬||krq¬|  ¡ I dH }	|	d dkrH|  |	¡}d}n&|	d dkrnd}|  ||	dd… |¡}|dkrŠ|dk	rŠ| |¡ n|dkr¢|dkr¢t|	ƒ‚|d7 }q||fS )zxRead MySQL binary protocol result.

        Reads all or given number of binary resultset rows from the socket.
        Nr   é   éþ   é   r   )ÚreadÚ	parse_eofZ_parse_binary_valuesr;   r   )
ÚselfrA   rB   rC   r1   ÚrowsÚeofÚvaluesÚiÚpacketr,   r,   r-   Úread_binary_resultø   s&    

z MySQLProtocol.read_binary_result)rA   ÚversionrC   r$   c                 Ã   s4  |}g }d}d}d}|s ||kr$�q,|  ¡ I dH }	|	 d¡r¦|	dd… g}
|  ¡ I dH }	|	 d¡r„|
 |	dd… ¡ |  ¡ I dH }	qX|
 |	dd… ¡ td |
¡ƒ}n@|	d dkrÎ|	d dk rÎ|  |	¡}d}nd}tt|	dd… ƒƒ}|dk�r|dk	�r| |¡ n|dk�r"|dk�r"t|	ƒ‚|d7 }q||fS )	z·Read 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   s   ÿÿÿrD   r6   rE   é   r   )rG   Ú
startswithr;   r   r>   rH   Úbytesr   )rI   rA   rP   rC   Ú_rJ   rK   ZrowdatarM   rN   Zdatasr,   r,   r-   Úread_text_result  s6    



zMySQLProtocol.read_text_result)NFN)r   r@   )r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstaticmethodrS   ÚstrÚintr   Úboolr   r   r   r   r.   r   r   r   r?   r   r   r   r   r   rO   rU   r,   r,   r,   r-   r   4   s†      ø
÷Aó
ò  ûÿÿú% ÿ 
 ÿÿþ)%rY   Ú__all__r<   Útypingr   r   r   r   r   Ú	constantsr	   r
   Úerrorsr   r   r   r   Úprotocolr   r   r   Z_MySQLProtocolÚtypesr   r   r   r   Úutilsr   r   Únetworkr   Zpluginsr   r   Zplugins.caching_sha2_passwordr   r,   r,   r,   r-   Ú<module>   s   