U
    [+d4$                     @   s   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 e ZG d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 )    N)get_user_model)
Permission)ExistsOuterRefQ)RemovedInDjango50Warning)func_supports_parameterc                   @   sD   e Zd Zdd Zdd ZdddZddd	Zdd
dZdddZdS )BaseBackendc                 K   s   d S N )selfrequestkwargsr   r   @/tmp/pip-unpacked-wheel-n7e__lmp/django/contrib/auth/backends.pyauthenticate   s    zBaseBackend.authenticatec                 C   s   d S r
   r   )r   user_idr   r   r   get_user   s    zBaseBackend.get_userNc                 C   s   t  S r
   setr   user_objobjr   r   r   get_user_permissions   s    z BaseBackend.get_user_permissionsc                 C   s   t  S r
   r   r   r   r   r   get_group_permissions   s    z!BaseBackend.get_group_permissionsc                 C   s   | j ||d| j||dS N)r   )r   r   r   r   r   r   get_all_permissions   s    zBaseBackend.get_all_permissionsc                 C   s   || j ||dkS r   )r   r   r   permr   r   r   r   has_perm   s    zBaseBackend.has_perm)N)N)N)N)	__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r	      s   


r	   c                       s   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdddZ	dddZ
d fdd	Zd  fdd	Zdd Zd!ddZdd Z  ZS )"ModelBackendz9
    Authenticates against settings.AUTH_USER_MODEL.
    Nc                 K   sx   |d kr| tj}|d ks$|d kr(d S ztj|}W n" tjk
rZ   t | Y nX ||rt| |rt|S d S r
   )	get	UserModelUSERNAME_FIELD_default_managerget_by_natural_keyDoesNotExistset_passwordZcheck_passworduser_can_authenticate)r   r   usernamepasswordr   userr   r   r   r   (   s    zModelBackend.authenticatec                 C   s   t |dd}|p|dkS )z{
        Reject users with is_active=False. Custom user models that don't have
        that attribute are allowed.
        	is_activeN)getattr)r   r-   r.   r   r   r   r*   7   s    z"ModelBackend.user_can_authenticatec                 C   s
   |j  S r
   )Zuser_permissionsall)r   r   r   r   r   _get_user_permissions?   s    z"ModelBackend._get_user_permissionsc                 C   s,   t  jd}d|  }tjjf ||iS )Ngroupsz	group__%s)r   Z_meta	get_fieldZrelated_query_namer   objectsfilter)r   r   Zuser_groups_fieldZuser_groups_queryr   r   r   _get_group_permissionsB   s    z#ModelBackend._get_group_permissionsc                 C   s   |j r|js|dk	rt S d| }t||sv|jr>tj }nt| d| |}|	dd
 }t||dd |D  t||S )z
        Return the permissions of `user_obj` from `from_name`. `from_name` can
        be either "group" or "user" to return permissions from
        `_get_group_permissions` or `_get_user_permissions` respectively.
        Nz_%s_perm_cachez_get_%s_permissionscontent_type__app_labelcodenamec                 S   s   h | ]\}}d ||f qS )z%s.%sr   ).0ctnamer   r   r   	<setcomp>X   s     z0ModelBackend._get_permissions.<locals>.<setcomp>)r.   is_anonymousr   hasattris_superuserr   r4   r0   r/   Zvalues_listZorder_bysetattr)r   r   r   	from_nameZperm_cache_nameZpermsr   r   r   _get_permissionsG   s    
  zModelBackend._get_permissionsc                 C   s   |  ||dS )zs
        Return a set of permission strings the user `user_obj` has from their
        `user_permissions`.
        r-   rB   r   r   r   r   r   \   s    z!ModelBackend.get_user_permissionsc                 C   s   |  ||dS )zq
        Return a set of permission strings the user `user_obj` has from the
        groups they belong.
        grouprC   r   r   r   r   r   c   s    z"ModelBackend.get_group_permissionsc                    s8   |j r|js|d k	rt S t|ds2t ||_|jS )N_perm_cache)r.   r=   r   r>   superr   rE   r   	__class__r   r   r   j   s
    
z ModelBackend.get_all_permissionsc                    s   |j ot j|||dS r   )r.   rF   r   r   rG   r   r   r   q   s    zModelBackend.has_permc                    s"   |j o t fdd| |D S )zU
        Return True if user_obj has any permissions in the given app_label.
        c                 3   s$   | ]}|d | d  kV  qd S )N.)index)r9   r   	app_labelr   r   	<genexpr>x   s   z0ModelBackend.has_module_perms.<locals>.<genexpr>)r.   anyr   )r   r   rL   r   rK   r   has_module_permst   s    zModelBackend.has_module_permsTc           	      C   s   t |tr<z|d\}}W qN tk
r8   tdY qNX nt |tsNtd|dk	r`tj S t	t
ddt	t
ddB }t |tr|t	|jdM }n|t	||d	M }ttj|}|r|t	d
dO }|dk	r|t	|dM }tj|S )z
        Return users that have permission "perm". By default, filter out
        inactive users and include superusers.
        rI   zDPermission name should be in the form app_label.permission_codename.z>The `perm` argument must be a string or a permission instance.Npk)Zgroup__user)r-   rP   )r8   r7   T)r?   )r.   )
isinstancestrsplit
ValueErrorr   	TypeErrorr$   r&   noner   r   rP   r   r4   r5   )	r   r   r.   Zinclude_superusersr   rL   r8   Zpermission_qZuser_qr   r   r   	with_perm}   s.    



zModelBackend.with_permc                 C   s>   zt jj|d}W n t jk
r*   Y d S X | |r:|S d S )NrQ   )r$   r&   r#   r(   r*   )r   r   r-   r   r   r   r      s
    zModelBackend.get_user)NN)N)N)N)N)TTN)r   r    r!   __doc__r   r*   r1   r6   rB   r   r   r   r   rO   rX   r   __classcell__r   r   rG   r   r"   #   s   


	
#r"   c                   @   s   e Zd Zdd ZdS )AllowAllUsersModelBackendc                 C   s   dS NTr   r   r-   r   r   r   r*      s    z/AllowAllUsersModelBackend.user_can_authenticateNr   r    r!   r*   r   r   r   r   r[      s   r[   c                   @   s.   e Zd ZdZdZdd Zdd Zd
ddZd	S )RemoteUserBackenda  
    This backend is to be used in conjunction with the ``RemoteUserMiddleware``
    found in the middleware module of this package, and is used when the server
    is handling authentication outside of Django.

    By default, the ``authenticate`` method creates ``User`` objects for
    usernames that don't already exist in the database.  Subclasses can disable
    this behavior by setting the ``create_unknown_user`` attribute to
    ``False``.
    Tc                 C   s   |sdS d}d}|  |}| jr:tjjf tj|i\}}n(ztj|}W n tjk
r`   Y nX t| j	dr| j	|||d}n*t
jd| jj dtd |r| 	||}| |r|S dS )ai  
        The username passed as ``remote_user`` is considered trusted. Return
        the ``User`` object with the given username. Create a new ``User``
        object if ``create_unknown_user`` is ``True``.

        Return None if ``create_unknown_user`` is ``False`` and a ``User``
        object with the given username is not found in the database.
        NFcreated)r`   z1`created=True` must be added to the signature of z.configure_user().)category)clean_usernamecreate_unknown_userr$   r&   Zget_or_creater%   r'   r(   r   configure_userwarningswarnrH   r!   r   r*   )r   r   Zremote_userr`   r-   r+   r   r   r   r      s,    	

zRemoteUserBackend.authenticatec                 C   s   |S )z
        Perform any cleaning on the "username" prior to using it to get or
        create the user object.  Return the cleaned username.

        By default, return the username unchanged.
        r   )r   r+   r   r   r   rb      s    z RemoteUserBackend.clean_usernamec                 C   s   |S )zp
        Configure a user and return the updated user.

        By default, return the user unmodified.
        r   )r   r   r-   r`   r   r   r   rd      s    z RemoteUserBackend.configure_userN)T)r   r    r!   rY   rc   r   rb   rd   r   r   r   r   r_      s
   *	r_   c                   @   s   e Zd Zdd ZdS )AllowAllUsersRemoteUserBackendc                 C   s   dS r\   r   r]   r   r   r   r*      s    z4AllowAllUsersRemoteUserBackend.user_can_authenticateNr^   r   r   r   r   rg      s   rg   )re   Zdjango.contrib.authr   Zdjango.contrib.auth.modelsr   Zdjango.db.modelsr   r   r   Zdjango.utils.deprecationr   Zdjango.utils.inspectr   r$   r	   r"   r[   r_   rg   r   r   r   r   <module>   s    K