3
(h                 @   sh   d dl mZ d dlmZ d dlm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 )    )unicode_literals)get_user_model)
Permissionc               @   sr   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ddZdddZdd Zdd ZdS )ModelBackendz9
    Authenticates against settings.AUTH_USER_MODEL.
    Nc             K   sj   t  }|d kr|j|j}y|jj|}W n" |jk
rL   | j| Y nX |j|rf| j|rf|S d S )N)	r   getUSERNAME_FIELD_default_managerget_by_natural_keyDoesNotExistZset_passwordZcheck_passworduser_can_authenticate)selfusernamepasswordkwargs	UserModeluser r   @/tmp/pip-install-q3hcpn_q/Django/django/contrib/auth/backends.pyauthenticate   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      s    z"ModelBackend.user_can_authenticatec             C   s
   |j j S )N)Zuser_permissionsall)r   user_objr   r   r   _get_user_permissions"   s    z"ModelBackend._get_user_permissionsc             C   s,   t  jjd}d|j  }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_permissions%   s    z#ModelBackend._get_group_permissionsc             C   s   |j  s|js|dk	rt S d| }t||s||jr@tjj }nt| d| |}|j	ddj
 }t||tdd |D  t||S )z
        Returns 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_permissionsZcontent_type__app_labelcodenamec             s   s   | ]\}}d ||f V  qdS )z%s.%sNr   ).0ctnamer   r   r   	<genexpr>:   s    z0ModelBackend._get_permissions.<locals>.<genexpr>)r   is_anonymoussethasattrZis_superuserr   r   r   r   Zvalues_listZorder_bysetattr)r   r   obj	from_nameZperm_cache_nameZpermsr   r   r   _get_permissions*   s    
zModelBackend._get_permissionsc             C   s   | j ||dS )zt
        Returns a set of permission strings the user `user_obj` has from their
        `user_permissions`.
        r   )r*   )r   r   r(   r   r   r   get_user_permissions=   s    z!ModelBackend.get_user_permissionsc             C   s   | j ||dS )zr
        Returns a set of permission strings the user `user_obj` has from the
        groups they belong.
        group)r*   )r   r   r(   r   r   r   get_group_permissionsD   s    z"ModelBackend.get_group_permissionsc             C   sJ   |j  s|js|d k	rt S t|dsD| j||_|jj| j| |jS )N_perm_cache)r   r$   r%   r&   r+   r.   updater-   )r   r   r(   r   r   r   get_all_permissionsK   s    
z ModelBackend.get_all_permissionsc             C   s   |j s
dS || j||kS )NF)r   r0   )r   r   permr(   r   r   r   has_permS   s    zModelBackend.has_permc             C   s<   |j s
dS x,| j|D ]}|d|jd |krdS qW dS )zV
        Returns True if user_obj has any permissions in the given app_label.
        FN.T)r   r0   index)r   r   Z	app_labelr1   r   r   r   has_module_permsX   s    zModelBackend.has_module_permsc             C   sB   t  }y|jj|d}W n |jk
r.   d S X | j|r>|S d S )N)pk)r   r   r   r
   r   )r   Zuser_idr   r   r   r   r   get_userc   s    zModelBackend.get_user)NN)N)N)N)N)__name__
__module____qualname____doc__r   r   r   r   r*   r+   r-   r0   r2   r5   r7   r   r   r   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   m   s    z/AllowAllUsersModelBackend.user_can_authenticateN)r8   r9   r:   r   r   r   r   r   r<   l   s   r<   c               @   s,   e Zd ZdZdZdd Zdd Z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}| j |}t }| jrJ|jjf |j|i\}}|rr| j|}n(y|jj|}W n |jk
rp   Y nX | j	|r|S dS )a  
        The username passed as ``remote_user`` is considered trusted.  This
        method simply returns the ``User`` object with the given username,
        creating a new ``User`` object if ``create_unknown_user`` is ``True``.

        Returns None if ``create_unknown_user`` is ``False`` and a ``User``
        object with the given username is not found in the database.
        N)
clean_usernamer   create_unknown_userr   Zget_or_creater   configure_userr	   r
   r   )r   Zremote_userr   r   r   createdr   r   r   r      s    	
zRemoteUserBackend.authenticatec             C   s   |S )z
        Performs any cleaning on the "username" prior to using it to get or
        create the user object.  Returns the cleaned username.

        By default, returns the username unchanged.
        r   )r   r   r   r   r   r>      s    z RemoteUserBackend.clean_usernamec             C   s   |S )z
        Configures a user after creation and returns the updated user.

        By default, returns the user unmodified.
        r   )r   r   r   r   r   r@      s    z RemoteUserBackend.configure_userN)r8   r9   r:   r;   r?   r   r>   r@   r   r   r   r   r=   q   s
   
 	r=   c               @   s   e Zd Zdd ZdS )AllowAllUsersRemoteUserBackendc             C   s   dS )NTr   )r   r   r   r   r   r      s    z4AllowAllUsersRemoteUserBackend.user_can_authenticateN)r8   r9   r:   r   r   r   r   r   rB      s   rB   N)
__future__r   Zdjango.contrib.authr   Zdjango.contrib.auth.modelsr   objectr   r<   r=   rB   r   r   r   r   <module>   s   eA