
    G)fD/                        d Z ddlmZ dg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mZmZmZmZmZmZ dd	lmZ d
dlmZ d
dlmZmZ d
dlmZ erd
dlmZ  G d d      Zy)z6Implementing support for MySQL Authentication Plugins.    )annotationsMySQLAuthenticatorN)TYPE_CHECKINGAnyDictOptional   )InterfaceErrorNotSupportedErrorget_exception)AUTH_SWITCH_STATUSDEFAULT_CHARSET_IDDEFAULT_MAX_ALLOWED_PACKET
ERR_STATUSEXCHANGE_FURTHER_STATUS
MFA_STATUS	OK_STATUS)HandShakeType   )logger)MySQLAuthPluginget_auth_plugin)MySQLProtocol)MySQLSocketc                      e Zd ZdZddZedd       Zedd       Z	 	 	 d	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ		 	 	 	 	 	 ddZ
d	d	d	d	ded
eddddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)r   z$Implements the authentication phase.c                X    d| _         i | _        i | _        d| _        d| _        d| _        y)zConstructor. FN)	_username
_passwords_plugin_config_ssl_enabled_auth_strategy_auth_plugin_classselfs    _/var/www/html/flask-app/venv/lib/python3.12/site-packages/mysql/connector/aio/authentication.py__init__zMySQLAuthenticator.__init__=   s0     *,.0"'9=15    c                    | j                   S )z&Signals whether or not SSL is enabled.)r!   r$   s    r&   ssl_enabledzMySQLAuthenticator.ssl_enabledF   s        r(   c                    | j                   S )a  Custom arguments that are being provided to the authentication plugin.

        The parameters defined here will override the ones defined in the
        auth plugin itself.

        The plugin config is a read-only property - the plugin configuration
        provided when invoking `authenticate()` is recorded and can be queried
        by accessing this property.

        Returns:
            dict: The latest plugin configuration provided when invoking
                  `authenticate()`.
        )r    r$   s    r&   plugin_configz MySQLAuthenticator.plugin_configK   s     """r(   Nc                    || j                   }|| j                  }t        j                  d|        t	        ||      || j
                  j                  |d      | j                        | _        y)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 invoked 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.
        NzSwitching to strategy %s)plugin_nameauth_plugin_classr   )r*   )	r   r#   r   debugr   r   getr*   r"   )r%   new_strategy_namestrategy_classusernamepassword_factors        r&   _switch_auth_strategyz(MySQLAuthenticator._switch_auth_strategy\   sq    & ~~H!!44N/1BC
o)^
 OO4((
r(   c                  K   d}|d   t         k(  r=|| j                  vrt        d      t        j                  |      \  }}| j                  ||       t        j                  d|| j                  j                          | j                  j                  ||fi | j                   d{   }|d   t        k(  rEt        j                  |      } | j                  j                  ||fi | j                   d{   }|d   t        k(  rt        j                  d       |S |d   t         k(  rt#        |      |dz  }|d   t         k(  r=t        j$                  d	       y7 7 iw)
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.
        r	      z5Failed Multi Factor Authentication (invalid N factor))r5   zMFA %i factor %sNzMFA completed succesfullyr   z"MFA terminated with a no ok packet)r   r   r
   r   parse_auth_next_factorr6   r   r0   r"   nameauth_switch_responser    r   parse_auth_more_dataauth_more_responser   r   r   warning)r%   sockpktn_factorr2   	auth_datas         r&   _mfa_n_factorz MySQLAuthenticator._mfa_n_factor~   si    * !f
"t.$K  ,9+O+OPS+T(y&&'8(&SLL+Xt7J7J7O7OP@++@@i#'#6#6 C 1v00)>>sC	BD//BB)'+':':  1v"89
1v##C((MH7 !f
": 	;<)s,   B*E),E%-AE)=E'>AE)E)'E)c                  K   |d   t         k(  rt        |      dk(  rt        d      |d   t         k(  rnt        j                  d       t        j                  |      \  }}| j                  |        | j                  j                  ||fi | j                   d{   }|d   t        k(  rZt        j                  d       t        j                  |      } | j                  j                  ||fi | j                   d{   }|d   t        k(  r,t        j                  d| j                  j                         |S |d   t         k(  rYt        j                  d       t        j                  d	| j                  j                         | j#                  ||       d{   S |d   t$        k(  rt'        |      y7  7 7 !w)
a  Handle 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.
        r8      zAuthentication 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 requestNzExchanging further packetsz%s completed succesfullyz$Starting multi-factor authenticationzMFA 1 factor %s)r   lenr   r   r0   r   parse_auth_switch_requestr6   r"   r;   r    r   r<   r=   r   r:   r   rC   r   r   )r%   r?   r@   r2   rB   s        r&   _handle_server_responsez*MySQLAuthenticator._handle_server_response   s    & q6''CHM#>  q6''LLFG+8+R+RSV+W(y&&'89@++@@i#'#6#6 C q6,,LL56%::3?I>++>>i#'#6#6 C q6YLL3T5H5H5M5MNJq6ZLL?@LL*D,?,?,D,DE++D#666q6Z$$/ 7s8   BGF=A%GG BG G!G GGr   r   Fc                  K   || _         |||d| _        t        j                  |      | _        || _        t        j                  ||||||	|
||||| j                  | j                        \  }| _
        |rdnd} |j                  |g|  d{    t        |j                          d{         }| j                  ||       d{   }|t        d      d|S 7 O7 47 w)a  Perform the authentication phase.

        During re-authentication you must 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	      )	handshaker4   passworddatabasecharsetclient_flagsmax_allowed_packetauth_pluginr/   
conn_attrsis_change_user_requestr*   r,   )r   r   )NNNzGot a NULL ok_pkt)r   r   copydeepcopyr    r#   r   	make_authr*   r,   r"   writebytesreadrH   r
   )r%   r?   rK   r4   	password1	password2	password3rM   rN   rO   rP   rQ   r/   rR   rS   r,   response_payload	send_argsr@   ok_pkts                       r&   authenticatezMySQLAuthenticator.authenticate   s     j "'I)D"mmM:"3 1>0G0G%1#/!#9((,,1
-$-" 5F,	djj)6I666 $))+%&33D#>>> !454? 	7 &>s6   BC&C C&-C".C&C$C&"C&$C&)returnNone)ra   bool)ra   zDict[str, Any])NNr   )
r2   strr3   Optional[str]r4   re   r5   intra   rb   )r?   r   r@   rX   ra   zOptional[bytes]) r?   r   rK   r   r4   rd   rZ   rd   r[   rd   r\   rd   rM   re   rN   rf   rO   rf   rP   rf   rQ   re   r/   re   rR   zOptional[Dict[str, str]]rS   rc   r,   r   ra   rX   )__name__
__module____qualname____doc__r'   propertyr*   r,   r6   rC   rH   r   r   r`    r(   r&   r   r   :   s   .6 ! ! # #& )-"&  
 
 & 
  	 

  
 
 
D44 4 
	4l55 5 
	5v "&)"<%)+//3',VV !V 	V
 V V V  V V V  V #V )V -V !%V  !V" 
#Vr(   ) rj   
__future__r   __all__rT   typingr   r   r   r   errorsr
   r   r   protocolr   r   r   r   r   r   r   typesr   r   pluginsr   r   r   networkr   r   rl   r(   r&   <module>ru      sS   : = "
   5 5 E E   "  5 #$G Gr(   