U
    e                     @   s   d Z ddlZddlZddlmZ ddl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 dd	lmZ G d
d dejZG dd dejZdS )zg
This module allows importing AbstractBaseUser even when django.contrib.auth is
not in INSTALLED_APPS.
    N)settings)password_validation)check_passwordis_password_usablemake_password)models)get_random_stringsalted_hmac)RemovedInDjango51Warning)gettext_lazyc                   @   s*   e Zd Zedd Zd
ddZdd Zd	S )BaseUserManagerc                 C   sJ   |pd}z|  dd\}}W n tk
r4   Y nX |d |  }|S )zS
        Normalize the email address by lowercasing the domain part of it.
         @   )striprsplit
ValueErrorlower)clsemailZ
email_nameZdomain_part r   A/tmp/pip-unpacked-wheel-lctamlir/django/contrib/auth/base_user.pynormalize_email   s    zBaseUserManager.normalize_email
   7abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789c                 C   s   t jdtdd t||S )z
        Generate a random password with the given length and given
        allowed_chars. The default value of allowed_chars does not have "I" or
        "O" or letters and digits that look similar -- just to avoid confusion.
        z5BaseUserManager.make_random_password() is deprecated.   )category
stacklevel)warningswarnr
   r   )selflengthallowed_charsr   r   r   make_random_password$   s    
z$BaseUserManager.make_random_passwordc                 C   s   | j f | jj|iS N)getmodelUSERNAME_FIELD)r    usernamer   r   r   get_by_natural_key5   s    z"BaseUserManager.get_by_natural_keyN)r   r   )__name__
__module____qualname__classmethodr   r#   r)   r   r   r   r   r      s   
  
r   c                       s   e Zd ZejedddZejeddddZdZ	g Z
dZG dd	 d	Zd
d Z fddZdd Zdd Zdd Zedd Zedd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd*d$d%Zed&d' Zed(d) Z  ZS )+AbstractBaseUserpassword   )
max_lengthz
last loginT)ZblanknullNc                   @   s   e Zd ZdZdS )zAbstractBaseUser.MetaTN)r*   r+   r,   Zabstractr   r   r   r   MetaE   s   r3   c                 C   s   |   S r$   get_usernamer    r   r   r   __str__H   s    zAbstractBaseUser.__str__c                    s0   t  j|| | jd k	r,t| j|  d | _d S r$   )supersave	_passwordr   Zpassword_changed)r    argskwargs	__class__r   r   r9   K   s    
zAbstractBaseUser.savec                 C   s   t | | jS )z"Return the username for this User.)getattrr'   r6   r   r   r   r5   Q   s    zAbstractBaseUser.get_usernamec                 C   s   t | | j| |   d S r$   )setattrr'   normalize_usernamer5   r6   r   r   r   cleanU   s    zAbstractBaseUser.cleanc                 C   s
   |   fS r$   r4   r6   r   r   r   natural_keyX   s    zAbstractBaseUser.natural_keyc                 C   s   dS )zj
        Always return False. This is a way of comparing User objects to
        anonymous users.
        Fr   r6   r   r   r   is_anonymous[   s    zAbstractBaseUser.is_anonymousc                 C   s   dS )zt
        Always return True. This is a way to tell if the user has been
        authenticated in templates.
        Tr   r6   r   r   r   is_authenticatedc   s    z!AbstractBaseUser.is_authenticatedc                 C   s   t || _|| _d S r$   )r   r/   r:   )r    raw_passwordr   r   r   set_passwordk   s    
zAbstractBaseUser.set_passwordc                    s    fdd}t | j|S )z~
        Return a boolean of whether the raw_password was correct. Handles
        hashing formats behind the scenes.
        c                    s"     |  d  _ jdgd d S )Nr/   )Zupdate_fields)rG   r:   r9   )rF   r6   r   r   setteru   s    
z/AbstractBaseUser.check_password.<locals>.setter)r   r/   )r    rF   rH   r   r6   r   r   o   s    zAbstractBaseUser.check_passwordc                 C   s   t d | _d S r$   )r   r/   r6   r   r   r   set_unusable_password}   s    z&AbstractBaseUser.set_unusable_passwordc                 C   s
   t | jS )zX
        Return False if set_unusable_password() has been called for this user.
        )r   r/   r6   r   r   r   has_usable_password   s    z$AbstractBaseUser.has_usable_passwordc                 C   s   |   S )z7
        Return an HMAC of the password field.
        )_get_session_auth_hashr6   r   r   r   get_session_auth_hash   s    z&AbstractBaseUser.get_session_auth_hashc                 c   s   t jD ]}| j|dV  qd S )N)secret)r   ZSECRET_KEY_FALLBACKSrK   )r    Zfallback_secretr   r   r   get_session_auth_fallback_hash   s    
z/AbstractBaseUser.get_session_auth_fallback_hashc                 C   s   d}t || j|dd S )NzAdjango.contrib.auth.models.AbstractBaseUser.get_session_auth_hashsha256)rM   	algorithm)r	   r/   	hexdigest)r    rM   Zkey_saltr   r   r   rK      s    z'AbstractBaseUser._get_session_auth_hashc                 C   s$   z| j W S  tk
r   Y dS X d S )Nr   )ZEMAIL_FIELDAttributeError)r   r   r   r   get_email_field_name   s    z%AbstractBaseUser.get_email_field_namec                 C   s   t |trtd|S |S )NNFKC)
isinstancestrunicodedata	normalize)r   r(   r   r   r   rA      s    z#AbstractBaseUser.normalize_username)N) r*   r+   r,   r   Z	CharField_r/   ZDateTimeFieldZ
last_loginZ	is_activeZREQUIRED_FIELDSr:   r3   r7   r9   r5   rB   rC   propertyrD   rE   rG   r   rI   rJ   rL   rN   rK   r-   rS   rA   __classcell__r   r   r=   r   r.   9   s4   


	
r.   )__doc__rW   r   Zdjango.confr   Zdjango.contrib.authr   Zdjango.contrib.auth.hashersr   r   r   Z	django.dbr   Zdjango.utils.cryptor   r	   Zdjango.utils.deprecationr
   Zdjango.utils.translationr   rY   Managerr   ZModelr.   r   r   r   r   <module>   s   $