
v^#                 @   s   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 e   Z Gd d   d  Z Gd d	   d	 e  Z Gd
 d   d e  Z Gd d   d e  Z Gd d   d e  Z d S)    N)get_user_model)
Permission)ExistsOuterRefQ)RemovedInDjango31Warningc               @   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-build-8lau8j11/django/django/contrib/auth/backends.pyauthenticate   s    zBaseBackend.authenticatec             C   s   d  S)Nr	   )r
   user_idr	   r	   r   get_user   s    zBaseBackend.get_userNc             C   s   t    S)N)set)r
   user_objobjr	   r	   r   get_user_permissions   s    z BaseBackend.get_user_permissionsc             C   s   t    S)N)r   )r
   r   r   r	   r	   r   get_group_permissions   s    z!BaseBackend.get_group_permissionsc             C   s(   |  j  | d | |  j | d |  S)Nr   )r   r   )r
   r   r   r	   r	   r   get_all_permissions   s    zBaseBackend.get_all_permissionsc             C   s   | |  j  | d | k S)Nr   )r   )r
   r   permr   r	   r	   r   has_perm   s    zBaseBackend.has_perm)	__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 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 d d  Z d d   Z   S)ModelBackendz9
    Authenticates against settings.AUTH_USER_MODEL.
    Nc             K   s   | d  k r | j  t j  } | d  k s6 | d  k r: d  Sy t j j |  } Wn% t j k
 rw t   j |  Yn# X| j |  r |  j |  r | Sd  S)N)	get	UserModelUSERNAME_FIELD_default_managerget_by_natural_keyDoesNotExistZ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  j   S)N)Zuser_permissionsall)r
   r   r	   r	   r   _get_user_permissions?   s    z"ModelBackend._get_user_permissionsc             C   s;   t    j j d  } d | j   } t j j | | 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  s | j s | d k	 r& t   Sd | } t | |  s | j rZ t j j   } n t |  d |  |  } | j	 d d  j
   } 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>W   s   	 z0ModelBackend._get_permissions.<locals>.<setcomp>)r'   is_anonymousr   hasattris_superuserr   r-   r)   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   |  j  | | d  S)zs
        Return a set of permission strings the user `user_obj` has from their
        `user_permissions`.
        r&   )r;   )r
   r   r   r	   r	   r   r   Z   s    z!ModelBackend.get_user_permissionsc             C   s   |  j  | | d  S)zq
        Return a set of permission strings the user `user_obj` has from the
        groups they belong.
        group)r;   )r
   r   r   r	   r	   r   r   a   s    z"ModelBackend.get_group_permissionsc                sQ   | j  s | j s | d  k	 r& t   St | d  sJ t   j |  | _ | j S)N_perm_cache)r'   r6   r   r7   superr   r=   )r
   r   r   )	__class__r	   r   r   h   s
    z ModelBackend.get_all_permissionsc                s"   | j  o! t   j | | d | S)Nr   )r'   r>   r   )r
   r   r   r   )r?   r	   r   r   o   s    zModelBackend.has_permc                s/   | j  o. t   f d d   |  j |  D  S)zU
        Return True if user_obj has any permissions in the given app_label.
        c             3   s.   |  ]$ } | d  | j  d     k Vq d  S)N.)index)r2   r   )	app_labelr	   r   	<genexpr>w   s   z0ModelBackend.has_module_perms.<locals>.<genexpr>)r'   anyr   )r
   r   rB   r	   )rB   r   has_module_permsr   s    zModelBackend.has_module_permsTc       
      C   sR  t  | t  rL y | j d  \ } } Wqg t k
 rH t d   Yqg Xn t  | t  sg t d   t   } | d k	 r | j j   St	 d t
 d   t	 d t
 d   B} t  | t  r | t	 d | j  M} n | t	 d | d	 |  M} t t j j |   }	 | r#|	 t	 d
 d  O}	 | d k	 rB|	 t	 d |  M}	 | j j |	  S)z
        Return users that have permission "perm". By default, filter out
        inactive users and include superusers.
        r@   zDPermission name should be in the form app_label.permission_codename.z>The `perm` argument must be a string or a permission instance.NZgroup__userpkr&   r1   r0   r8   Tr'   )
isinstancestrsplit
ValueErrorr   	TypeErrorr   r    noner   r   rF   r   r-   r.   )
r
   r   r'   Zinclude_superusersr   rB   r1   r   Zpermission_qZuser_qr	   r	   r   	with_perm{   s,    		(zModelBackend.with_permc             C   sL   y t  j j d |  } Wn t  j k
 r4 d  SYn X|  j |  rH | Sd  S)NrF   )r   r    r   r"   r#   )r
   r   r&   r	   r	   r   r      s
    	zModelBackend.get_user)r   r   r   __doc__r   r#   r*   r/   r;   r   r   r   r   rE   rM   r   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#      s    z/AllowAllUsersModelBackend.user_can_authenticateN)r   r   r   r#   r	   r	   r	   r   rO      s   rO   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 Sd } |  j  |  } |  j r t j j t j | i   \ } } | r | | f } y t j |  j | |  Wn5 t	 k
 r | f } t
 j d |  j j t  Yn X|  j |   } n. y t j j |  } Wn t j k
 r Yn X|  j |  r | Sd 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.
        NzEUpdate %s.configure_user() to accept `request` as the first argument.)clean_usernamecreate_unknown_userr   r    Zget_or_creater   inspectZgetcallargsconfigure_userrK   warningswarnr?   r   r   r!   r"   r#   )r
   r   Zremote_userr&   r$   createdargsr	   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   rQ      s    z RemoteUserBackend.clean_usernamec             C   s   | S)z
        Configure a user after creation and return the updated user.

        By default, return the user unmodified.
        r	   )r
   r   r&   r	   r	   r   rT      s    z RemoteUserBackend.configure_userN)r   r   r   rN   rR   r   rQ   rT   r	   r	   r	   r   rP      s
   
(	rP   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)r   r   r   r#   r	   r	   r	   r   rY      s   rY   )rS   rU   Zdjango.contrib.authr   Zdjango.contrib.auth.modelsr   Zdjango.db.modelsr   r   r   Zdjango.utils.deprecationr   r   r   r   rO   rP   rY   r	   r	   r	   r   <module>   s   	I