a
    còf7  ã                   @   sl   d Z ddlZddlZddlmZ dd„ ZG dd„ deƒZG d	d
„ d
eƒZG dd„ deƒZ	G dd„ deƒZ
dS )z.Implementation of MySQL Authentication Plugin.é    Né   )Úhexlifyc                 C   s,   dd„ t | |ƒD ƒ}tjd |¡g|¢R Ž S )zõEncrypt/Decrypt function used for password encryption in
    authentication, using a simple XOR.

    Args:
        hash1 (str): The first hash.
        hash2 (str): The second hash.

    Returns:
        str: A string with the xor applied.
    c                 S   s   g | ]\}}||A ‘qS © r   )Ú.0Úh1Úh2r   r   úR/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/mysqlx/authentication.pyÚ
<listcomp>0   ó    zxor_string.<locals>.<listcomp>z{0}B)ÚzipÚstructÚpackÚformat)Úhash1Úhash2Z	hash_sizeÚxoredr   r   r   Ú
xor_string%   s    r   c                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
ÚBaseAuthPluginz7Base class for implementing the authentication plugins.Nc                 C   s   || _ || _d S )N)Ú	_usernameÚ	_password)ÚselfÚusernameÚpasswordr   r   r   Ú__init__6   s    zBaseAuthPlugin.__init__c                 C   s   t ‚dS )úUReturns the plugin name.

        Returns:
            str: The plugin name.
        N©ÚNotImplementedError©r   r   r   r   Úname:   s    zBaseAuthPlugin.namec                 C   s   t ‚dS )úeReturns the authentication name.

        Returns:
            str: The authentication name.
        Nr   r   r   r   r   Ú	auth_nameB   s    zBaseAuthPlugin.auth_name)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r    r   r   r   r   r   4   s   
r   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚMySQL41AuthPluginzCClass implementing the MySQL Native Password authentication plugin.c                 C   s   dS )r   zMySQL 4.1 Authentication Pluginr   r   r   r   r   r   M   s    zMySQL41AuthPlugin.namec                 C   s   dS )r   ZMYSQL41r   r   r   r   r   r    U   s    zMySQL41AuthPlugin.auth_namec                 C   s|   | j rnt| j tƒr| j  d¡n| j }t |¡ ¡ }t |¡ ¡ }t|t || ¡ ¡ dƒ}d d| j	t
|ƒ¡S d d| j	¡S )z®Hashing for MySQL 4.1 authentication.

        Args:
            data (str): The authentication data.

        Returns:
            str: The authentication response.
        úutf-8é   z{0} {1} *{2} Ú z{0} {1} )r   Ú
isinstanceÚstrÚencodeÚhashlibÚsha1Údigestr   r   r   r   ©r   Údatar   r   r   r   r   r   r   Ú	auth_data]   s    	
ÿÿzMySQL41AuthPlugin.auth_dataN©r!   r"   r#   r$   r   r    r1   r   r   r   r   r%   K   s   r%   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚPlainAuthPluginz9Class implementing the MySQL Plain authentication plugin.c                 C   s   dS )r   zPlain Authentication Pluginr   r   r   r   r   r   r   s    zPlainAuthPlugin.namec                 C   s   dS )r   ZPLAINr   r   r   r   r   r    z   s    zPlainAuthPlugin.auth_namec                 C   s   d  | j| j¡S )zeReturns the authentication data.

        Returns:
            str: The authentication data.
        ú {0} {1})r   r   r   r   r   r   r   r1   ‚   s    zPlainAuthPlugin.auth_dataNr2   r   r   r   r   r3   p   s   r3   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚSha256MemoryAuthPluginz;Class implementing the SHA256_MEMORY authentication plugin.c                 C   s   dS )r   z#SHA256_MEMORY Authentication Pluginr   r   r   r   r   r   �   s    zSha256MemoryAuthPlugin.namec                 C   s   dS )r   ZSHA256_MEMORYr   r   r   r   r   r    •   s    z Sha256MemoryAuthPlugin.auth_namec                 C   sf   t | jtƒr| j d¡n| j}t |¡ ¡ }t t |¡ ¡ | ¡ ¡ }t||dƒ}d | j	t
|ƒ¡S )a   Hashing for SHA256_MEMORY authentication.

        The scramble is of the form:
            SHA256(SHA256(SHA256(PASSWORD)),NONCE) XOR SHA256(PASSWORD)

        Args:
            data (str): The authentication data.

        Returns:
            str: The authentication response.
        r&   é    r4   )r)   r   r*   r+   r,   Úsha256r.   r   r   r   r   r/   r   r   r   r1   �   s    
ÿÿz Sha256MemoryAuthPlugin.auth_dataNr2   r   r   r   r   r5   ‹   s   r5   )r$   r,   r   Úhelpersr   r   Úobjectr   r%   r3   r5   r   r   r   r   Ú<module>   s   %