U
    ec?                     @   sj   d Z ddlZddlZddlmZ dd ZG dd d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f| S )zEncrypt/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   9/tmp/pip-unpacked-wheel-ix8dg7li/mysqlx/authentication.py
<listcomp>0   s     zxor_string.<locals>.<listcomp>B)zipstructpack)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__7   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_nameC   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   O   s    zMySQL41AuthPlugin.namec                 C   s   dS )r   ZMYSQL41r   r   r   r   r   r    W   s    zMySQL41AuthPlugin.auth_namec                 C   s   | j rrt| j tr| j dn| j }t| }t| }t|t||  d}d| j dt	| dS d| j dS )zHashing for MySQL 4.1 authentication.

        Args:
            data (str): The authentication data.

        Returns:
            str: The authentication response.
        utf-8    z *)
r   
isinstancestrencodehashlibsha1digestr   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%   L   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   x   s    zPlainAuthPlugin.namec                 C   s   dS )r   ZPLAINr   r   r   r   r   r       s    zPlainAuthPlugin.auth_namec                 C   s   d| j  d| j S )zeReturns the authentication data.

        Returns:
            str: The authentication data.
        r(   r   r   r   r   r   r1      s    zPlainAuthPlugin.auth_dataNr2   r   r   r   r   r3   u   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   sj   t | jtr| jdn| j}t| }tt| |  }t||d}d| j d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&       r(   )
r)   r   r*   r+   r,   sha256r.   r   r   r   r/   r   r   r   r1      s    
z Sha256MemoryAuthPlugin.auth_dataNr2   r   r   r   r   r4      s   r4   )
r$   r,   r   Zhelpersr   r   r   r%   r3   r4   r   r   r   r   <module>   s   )