§
    ¡˜ºh#7  ã                  óÈ   — d Z ddlmZ ddlZddlmZmZ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 dd	lmZmZmZmZmZmZmZmZ dd
lmZmZ erddlmZ  G d„ d¦  «        ZdS )z5Implementing support for MySQL Authentication Pluginsé    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚDictÚOptionalé   )ÚInterfaceErrorÚNotSupportedErrorÚget_exception)Úlogger)ÚMySQLAuthPluginÚget_auth_plugin)ÚAUTH_SWITCH_STATUSÚDEFAULT_CHARSET_IDÚDEFAULT_MAX_ALLOWED_PACKETÚ
ERR_STATUSÚEXCHANGE_FURTHER_STATUSÚ
MFA_STATUSÚ	OK_STATUSÚMySQLProtocol)ÚConnAttrsTypeÚHandShakeType)ÚMySQLSocketc                  óœ   — e Zd ZdZd2d„Zed3d„¦   «         Zed4d„¦   «         Zed	e	fd5d„Z
	 	 	 d6d7d„Zd8d „Zd8d!„Zd"d"d"d"ded	e	dddd#fd9d1„ZdS ):ÚMySQLAuthenticatoraÀ  Implements the authentication phase.

    The caller has access to the following API:
        - ssl_enabled (property, read-only): signals whether or not SSL is enabled.

        - plugin_config (property, read-only): custom arguments that will be provided
        to the authentication plugin when called.

        - setup_ssl (method): Set up an SSL communication channel.

        - authenticate (method): Performs the authentication phase.
    ÚreturnÚNonec                óZ   — d| _         i | _        i | _        d| _        d| _        d| _        dS )zConstructor.Ú FN)Ú	_usernameÚ
_passwordsÚ_plugin_configÚ_ssl_enabledÚ_auth_strategyÚ_auth_plugin_class©Úselfs    úf/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/mysql/connector/authentication.pyÚ__init__zMySQLAuthenticator.__init__E   s6   € à ˆŒØ*,ˆŒØ.0ˆÔØ"'ˆÔØ9=ˆÔØ15ˆÔÐÐó    Úboolc                ó   — | j         S )z&Signals whether or not SSL is enabled.)r#   r&   s    r(   Ússl_enabledzMySQLAuthenticator.ssl_enabledN   s   € ð Ô Ð r*   úDict[str, Any]c                ó   — | j         S )zÈCustom arguments that will be provided to the authentication
        plugin when called.

        The parameters defined here will override the ones defined in
        the auth plugin itself.
        )r"   r&   s    r(   Úplugin_configz MySQLAuthenticator.plugin_configS   s   € ð Ô"Ð"r*   r   Úsockr   ÚhostÚstrÚssl_optionsúOptional[Dict[str, Any]]ÚcharsetÚintÚclient_flagsÚmax_allowed_packetÚbytesc                ó^  — |€i }t          j        |||¬¦  «        }|                     |¦  «         t          j        d¦  «         |                     |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     dd¦  «        |                     d	d¦  «        |                     d
¦  «        |                     d¦  «        ¬¦  «        }t          j        d¦  «         |                     ||¦  «         t          j        d¦  «         d| _        |S )aÚ  Set up an SSL communication channel.

        Args:
            sock: Pointer to the socket connection.
            host: Server host name.
            ssl_options: SSL and TLS connection options (see
                `network.MySQLSocket.build_ssl_context`).
            charset: Client charset (see [1]), only the lower 8-bits.
            client_flags: Integer representing client capabilities flags.
            max_allowed_packet: Maximum packet size.

        Returns:
            ssl_request_payload: Payload used to carry out SSL authentication.

        References:
            [1]: https://dev.mysql.com/doc/dev/mysql-server/latest/
                page_protocol_basic_character_set.html#a_protocol_character_set
        N)r6   r8   r9   zBuilding SSL contextÚcaÚcertÚkeyÚverify_certFÚverify_identityÚtls_versionsÚtls_ciphersuites)Ússl_caÚssl_certÚssl_keyÚssl_verify_certÚssl_verify_identityrA   Útls_cipher_suiteszSwitching to SSLzSSL has been enabledT)	r   Úmake_auth_sslÚsendr   ÚdebugÚbuild_ssl_contextÚgetÚswitch_to_sslr#   )	r'   r1   r2   r4   r6   r8   r9   Ússl_request_payloadÚssl_contexts	            r(   Ú	setup_sslzMySQLAuthenticator.setup_ssl]   s)  € ð6 ÐØˆKõ ,Ô9ØØ%Ø1ð
ñ 
ô 
Ðð
 	�	Š	Ð%Ñ&Ô&Ð&åŒÐ+Ñ,Ô,Ð,Ø×,Ò,Ø—?’? 4Ñ(Ô(Ø —_’_ VÑ,Ô,Ø—O’O EÑ*Ô*Ø'ŸOšO¨M¸5ÑAÔAØ +§¢Ð0AÀ5Ñ IÔ IØ$Ÿš¨Ñ8Ô8Ø)ŸošoÐ.@ÑAÔAð -ñ 
ô 
ˆõ 	ŒÐ'Ñ(Ô(Ð(Ø×Ò˜;¨Ñ-Ô-Ð-åŒÐ+Ñ,Ô,Ð,Ø ˆÔà"Ð"r*   Nr   Únew_strategy_nameÚstrategy_classúOptional[str]ÚusernameÚpassword_factorc                óÔ   — |€| j         }|€| j        }t          j        d|¦  «          t	          ||¬¦  «        || j                             |d¦  «        | j        ¬¦  «        | _        dS )až  Switch the authorization plugin.

        Args:
            new_strategy_name: New authorization plugin name to switch to.
            strategy_class: New authorization plugin class to switch to
                (has higher precedence than the authorization plugin name).
            username: Username to be used, if not defined the username
                provided when `authentication` was called is used.
            password_factor: Up to three levels of authentication (MFA) are allowed,
                hence you can choose the password corresponding to the 1st,
                2nd, or 3rd factor. 1st is the default.

        Returns:
            None.
        NzSwitching to strategy %s)Úplugin_nameÚauth_plugin_classr   )r-   )	r    r%   r   rK   r   r!   rM   r-   r$   )r'   rR   rS   rU   rV   s        r(   Ú_switch_auth_strategyz(MySQLAuthenticator._switch_auth_strategy–   sˆ   € ð, ÐØ”~ˆHàÐ!Ø!Ô4ˆNåŒÐ/Ð1BÑCÔCÐCð
�oØ)¸^ð
ñ 
ô 
ð ØŒO×Ò °Ñ4Ô4ØÔ(ð
ñ 
ô 
ˆÔÐÐr*   ÚpktúOptional[bytes]c                óŒ  — d}|d         t           k    �r|| j        vrt          d¦  «        ‚t          j        |¦  «        \  }}|                      ||¬¦  «         t          j        d|| j        j	        ¦  «          | j        j
        ||fi | j        ¤Ž}|d         t          k    r-t          j        |¦  «        } | j        j        ||fi | j        ¤Ž}|d         t          k    rt          j        d¦  «         |S |d         t           k    rt#          |¦  «        ‚|dz  }|d         t           k    �°t          j        d¦  «         d	S )
a  Handle MFA (Multi-Factor Authentication) response.

        Up to three levels of authentication (MFA) are allowed.

        Args:
            sock: Pointer to the socket connection.
            pkt: MFA response.

        Returns:
            ok_packet: If last server's response is an OK packet.
            None: If last server's response isn't an OK packet and no ERROR was raised.

        Raises:
            InterfaceError: If got an invalid N factor.
            errors.ErrorTypes: If got an ERROR response.
        é   é   z5Failed Multi Factor Authentication (invalid N factor))rV   zMFA %i factor %szMFA completed succesfullyr   z"MFA terminated with a no ok packetN)r   r!   r	   r   Úparse_auth_next_factorrZ   r   rK   r$   ÚnameÚauth_switch_responser"   r   Úparse_auth_more_dataÚauth_more_responser   r   r   Úwarning)r'   r1   r[   Ún_factorrR   Ú	auth_datas         r(   Ú_mfa_n_factorz MySQLAuthenticator._mfa_n_factor»   sx  € ð* ˆØ�!Œf�
Ò"Ñ"Ø˜tœÐ.Ð.Ý$ØKñô ð õ ,9Ô+OÐPSÑ+TÔ+TÑ(Ð˜yØ×&Ò&Ð'8È(Ð&ÑSÔSÐSÝŒLÐ+¨X°tÔ7JÔ7OÑPÔPÐPà:�$Ô%Ô:Ø�iðð Ø#'Ô#6ðð ˆCð �1ŒvÕ0Ò0Ð0Ý)Ô>¸sÑCÔC�	Ø<�dÔ)Ô<Ø˜)ðð Ø'+Ô':ðð �ð �1Œv�Ò"Ð"Ý”Ð8Ñ9Ô9Ð9Ø�
à�1Œv�Ò#Ð#Ý# CÑ(Ô(Ð(à˜‰MˆHð7 �!Œf�
Ò"Ñ"õ: 	ŒÐ;Ñ<Ô<Ð<Øˆtr*   c                ó<  — |d         t           k    r"t          |¦  «        dk    rt          d¦  «        ‚|d         t           k    rYt          j        d¦  «         t          j        |¦  «        \  }}|                      |¦  «          | j        j	        ||fi | j
        ¤Ž}|d         t          k    rAt          j        d¦  «         t          j        |¦  «        } | j        j        ||fi | j
        ¤Ž}|d         t          k    r!t          j        d| j        j        ¦  «         |S |d         t           k    rIt          j        d¦  «         t          j        d| j        j        ¦  «         |                      ||¦  «        S |d         t$          k    rt'          |¦  «        ‚d	S )
aý  Handles server's response.

        Args:
            sock: Pointer to the socket connection.
            pkt: Server's response after completing the `HandShakeResponse`.

        Returns:
            ok_packet: If last server's response is an OK packet.
            None: If last server's response isn't an OK packet and no ERROR was raised.

        Raises:
            errors.ErrorTypes: If got an ERROR response.
            NotSupportedError: If got Authentication with old (insecure) passwords.
        r_   é   z‡Authentication with old (insecure) passwords is not supported. For more information, lookup Password Hashing in the latest MySQL manualz+Server's response is an auth switch requestzExchanging further packetsz%s completed succesfullyz$Starting multi-factor authenticationzMFA 1 factor %sN)r   Úlenr
   r   rK   r   Úparse_auth_switch_requestrZ   r$   rb   r"   r   rc   rd   r   ra   r   rh   r   r   )r'   r1   r[   rR   rg   s        r(   Ú_handle_server_responsez*MySQLAuthenticator._handle_server_responseñ   s³  € ð& ˆqŒ6Õ'Ò'Ð'­C°©H¬H¸ªM¨MÝ#ð>ñô ð ð ˆqŒ6Õ'Ò'Ð'ÝŒLÐFÑGÔGÐGÝ+8Ô+RÐSVÑ+WÔ+WÑ(Ð˜yØ×&Ò&Ð'8Ñ9Ô9Ð9Ø:�$Ô%Ô:Ø�iðð Ø#'Ô#6ðð ˆCð ˆqŒ6Õ,Ò,Ð,ÝŒLÐ5Ñ6Ô6Ð6Ý%Ô:¸3Ñ?Ô?ˆIØ8�$Ô%Ô8Ø�iðð Ø#'Ô#6ðð ˆCð ˆqŒ6•YÒÐÝŒLÐ3°TÔ5HÔ5MÑNÔNÐNØˆJàˆqŒ6•ZÒÐÝŒLÐ?Ñ@Ô@Ð@ÝŒLÐ*¨DÔ,?Ô,DÑEÔEÐEØ×%Ò% d¨CÑ0Ô0Ð0àˆqŒ6•ZÒÐÝ Ñ$Ô$Ð$àˆtr*   r   FÚ	handshaker   Ú	password1Ú	password2Ú	password3ÚdatabaseÚauth_pluginrY   Ú
conn_attrsúOptional[ConnAttrsType]Úis_change_user_requestr0   r   c                óŠ  — || _         |||dœ| _        t          j        |¦  «        | _        || _        t          j        ||||||	|
||||| j        | j	        ¬¦  «        \  }| _
        |rdnd} |j        |g|¢R Ž  t          |                     ¦   «         ¦  «        }|                      ||¦  «        }|€t          d¦  «        d‚|S )aë  Performs the authentication phase.

        During re-authentication you should set `is_change_user_request` to True.

        Args:
            sock: Pointer to the socket connection.
            handshake: Initial handshake.
            username: Account's username.
            password1: Account's password factor 1.
            password2: Account's password factor 2.
            password3: Account's password factor 3.
            database: Initial database name for the connection
            charset: Client charset (see [1]), 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.
            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:
            ok_packet: OK packet.

        Raises:
            InterfaceError: If OK packet is NULL.

        References:
            [1]: https://dev.mysql.com/doc/dev/mysql-server/latest/
                page_protocol_basic_character_set.html#a_protocol_character_set
        )r   r^   é   )rn   rU   Úpasswordrr   r6   r8   r9   rs   rY   rt   rv   r-   r0   )r   r   )NNNzGot a NULL ok_pkt)r    r!   ÚcopyÚdeepcopyr"   r%   r   Ú	make_authr-   r0   r$   rJ   r:   Úrecvrm   r	   )r'   r1   rn   rU   ro   rp   rq   rr   r6   r8   r9   rs   rY   rt   rv   r0   Úresponse_payloadÚ	send_argsr[   Úok_pkts                       r(   ÚauthenticatezMySQLAuthenticator.authenticate(  sø   € ðj "ˆŒØ'¨I¸)ÐDÐDˆŒÝ"œm¨MÑ:Ô:ˆÔØ"3ˆÔõ 1>Ô0GØØØØØØ%Ø1Ø#Ø/Ø!Ø#9ØÔ(ØÔ,ð1
ñ 1
ô 1
Ñ-Ð˜$Ô-ð" 5ÐF�F�F¸,ˆ	ØˆŒ	Ð"Ð/ YÐ/Ð/Ð/Ð/õ �D—I’I‘K”KÑ Ô ˆà×-Ò-¨d°CÑ8Ô8ˆØˆ>Ý Ð!4Ñ5Ô5¸4Ð?àˆr*   )r   r   )r   r+   )r   r.   )r1   r   r2   r3   r4   r5   r6   r7   r8   r7   r9   r7   r   r:   )NNr   )
rR   r3   rS   rT   rU   rT   rV   r7   r   r   )r1   r   r[   r:   r   r\   ) r1   r   rn   r   rU   r3   ro   r3   rp   r3   rq   r3   rr   rT   r6   r7   r8   r7   r9   r7   rs   rT   rY   rT   rt   ru   rv   r+   r0   r   r   r:   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   Úpropertyr-   r0   r   r   rQ   rZ   rh   rm   r�   © r*   r(   r   r   7   s,  € € € € € ðð ð6ð 6ð 6ð 6ð ð!ð !ð !ñ „Xð!ð ð#ð #ð #ñ „Xð#ð *ØØ"<ð7#ð 7#ð 7#ð 7#ð 7#ðx )-Ø"&Ø ð#
ð #
ð #
ð #
ð #
ðJ4ð 4ð 4ð 4ðl5ð 5ð 5ð 5ðv ØØØØ"&Ø)ØØ"<Ø%)Ø+/Ø.2Ø',ðVð Vð Vð Vð Vð Vð Vr*   r   ) r…   Ú
__future__r   rz   Útypingr   r   r   r   Úerrorsr	   r
   r   r   Úpluginsr   r   Úprotocolr   r   r   r   r   r   r   r   Útypesr   r   Únetworkr   r   r‡   r*   r(   ú<module>r�      sh  ðð: <Ð ;Ø "Ð "Ð "Ð "Ð "Ð "à €€€à 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5à DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DØ Ð Ð Ð Ð Ð Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 0Ð /Ð /Ð /Ð /Ð /Ð /Ð /àð %Ø$Ð$Ð$Ð$Ð$Ð$ðGð Gð Gð Gð Gñ Gô Gð Gð Gð Gr*   