B
    CVvgˆ!  ã               @   s„   d dl mZ d dlmZ d dlmZmZ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 )é    )Úget_user_model)Ú
Permission)ÚExistsÚOuterRefÚQc               @   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-install-o3oxmrkh/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 )N)r   )r   r   )r	   r   r   r   r   r   Úget_all_permissions   s    zBaseBackend.get_all_permissionsc             C   s   || j ||d�kS )N)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 ytj |¡}W n" tjk
rZ   tƒ  |¡ Y nX | |¡rt|  |¡rt|S d 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"   3   s    z"ModelBackend.user_can_authenticatec             C   s
   |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 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_permissions>   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>S   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_permissionsC   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%   )r:   )r	   r   r   r   r   r   r   V   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.
        Úgroup)r:   )r	   r   r   r   r   r   r   ]   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&   r5   r   r6   Úsuperr   r<   )r	   r   r   )Ú	__class__r   r   r   d   s
    
z ModelBackend.get_all_permissionsc                s   |j otƒ j|||d�S )N)r   )r&   r=   r   )r	   r   r   r   )r>   r   r   r   k   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)r1   r   )Ú	app_labelr   r   ú	<genexpr>s   s   z0ModelBackend.has_module_perms.<locals>.<genexpr>)r&   Úanyr   )r	   r   rA   r   )rA   r   Úhas_module_permsn   s    
zModelBackend.has_module_permsTc       
      C   sò   t |tƒr<y| d¡\}}W qN tk
r8   tdƒ‚Y qNX nt |tƒsNtdƒ‚tƒ }|dk	rf|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 }	|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.NÚpk)Zgroup__user)r%   )rE   )r0   r/   T)r7   )r&   )Ú
isinstanceÚstrÚsplitÚ
ValueErrorr   Ú	TypeErrorr   r   Únoner   r   rE   r   r,   r-   )
r	   r   r&   Zinclude_superusersr   rA   r0   r   Zpermission_qZuser_qr   r   r   Ú	with_permw   s,    



zModelBackend.with_permc             C   s<   yt jj|d�}W n t jk
r(   d S X |  |¡r8|S d S )N)rE   )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"   r)   r.   r:   r   r   r   r   rD   rL   r   Ú__classcell__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S d}|   |¡}| jrFtjjf tj|iŽ\}}|rn|  ||¡}n(ytj |¡}W n tjk
rl   Y nX |  	|¡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.
        N)
Úclean_usernameÚcreate_unknown_userr   r   Zget_or_creater   Úconfigure_userr    r!   r"   )r	   r
   Zremote_userr%   r#   Úcreatedr   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   rS   Þ   s    z RemoteUserBackend.configure_userN)r   r   r   rM   rR   r   rQ   rS   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   rU   ç   s   rU   N)Zdjango.contrib.authr   Zdjango.contrib.auth.modelsr   Zdjango.db.modelsr   r   r   r   r   r   rO   rP   rU   r   r   r   r   Ú<module>   s    ?