o
    {,h2                     @   s   d dl mZ 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 )    )sync_to_async)get_user_model)
Permission)ExistsOuterRefQc                   @   s|   e Z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dZdddZdddZdddZd	S )BaseBackendc                 K      d S N selfrequestkwargsr   r   R/var/www/html/rh/venv/lib/python3.10/site-packages/django/contrib/auth/backends.pyauthenticate      zBaseBackend.authenticatec                    s   t | j|fi |I d H S r
   )r   r   r   r   r   r   aauthenticate   s   zBaseBackend.aauthenticatec                 C   r	   r
   r   r   user_idr   r   r   get_user   r   zBaseBackend.get_userc                    s   t | j|I d H S r
   )r   r   r   r   r   r   	aget_user   s   zBaseBackend.aget_userNc                 C      t  S r
   setr   user_objobjr   r   r   get_user_permissions      z BaseBackend.get_user_permissionsc                       t | j||I d H S r
   )r   r   r   r   r   r   aget_user_permissions      z!BaseBackend.aget_user_permissionsc                 C   r   r
   r   r   r   r   r   get_group_permissions   r   z!BaseBackend.get_group_permissionsc                    r    r
   )r   r#   r   r   r   r   aget_group_permissions    r"   z"BaseBackend.aget_group_permissionsc                 C   s    h | j ||d| j||dS N)r   )r   r#   r   r   r   r   get_all_permissions#   s
   zBaseBackend.get_all_permissionsc                    s.   h | j ||dI d H | j||dI d H S r%   )r!   r$   r   r   r   r   aget_all_permissions)   s   z BaseBackend.aget_all_permissionsc                 C   s   || j ||dv S r%   )r&   r   r   permr   r   r   r   has_perm/   s   zBaseBackend.has_permc                    s   ||  ||I d H v S r
   )r'   r(   r   r   r   	ahas_perm2   r"   zBaseBackend.ahas_permr
   )__name__
__module____qualname__r   r   r   r   r   r!   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dZ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+ fdd	Zd+ fdd	Zd+ fdd	Zdd  Zd!d" Zd,d$d%Zd&d' Zd(d) Z  ZS )-ModelBackendz9
    Authenticates against settings.AUTH_USER_MODEL.
    Nc                 K   s|   |d u r
| tj}|d u s|d u rd S ztj|}W n tjy-   t | Y d S w ||r:| |r<|S d S d S r
   )	get	UserModelUSERNAME_FIELD_default_managerget_by_natural_keyDoesNotExistset_passwordcheck_passworduser_can_authenticater   r   usernamepasswordr   userr   r   r   r   ;   s   zModelBackend.authenticatec                    s   |d u r| tj}|d u s|d u rd S ztj|I d H }W n tjy1   t | Y d S w ||I d H rA| |rC|S d S d S r
   )	r0   r1   r2   r3   aget_by_natural_keyr5   r6   acheck_passwordr8   r9   r   r   r   r   J   s   zModelBackend.aauthenticatec                 C   s   t |ddS )z{
        Reject users with is_active=False. Custom user models that don't have
        that attribute are allowed.
        	is_activeT)getattrr   r<   r   r   r   r8   [   s   z"ModelBackend.user_can_authenticatec                 C   s
   |j  S r
   )user_permissionsallr   r   r   r   r   _get_user_permissionsb   s   
z"ModelBackend._get_user_permissionsc                 C   s   t jj|j dS )N)	group__in)r   objectsfiltergroupsrC   rD   r   r   r   _get_group_permissionse   s   z#ModelBackend._get_group_permissionsc                 C   s   |j r
|js
|durt S d| }t||s;|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.
        N_%s_perm_cache_get_%s_permissionscontent_type__app_labelcodenamec                 S   s   h | ]
\}}d ||f qS )%s.%sr   .0ctnamer   r   r   	<setcomp>y   s    z0ModelBackend._get_permissions.<locals>.<setcomp>r?   is_anonymousr   hasattris_superuserr   rG   rC   r@   values_listorder_bysetattrr   r   r   	from_nameperm_cache_namepermsr   r   r   _get_permissionsh   s   

zModelBackend._get_permissionsc                    s   |j r|js|durt S d| }t||s?|jr tj }n	t| d| |}|	dd
 }t||dd |2 I dH  t||S )zSee _get_permissions().NrK   rL   rM   rN   c                    s(   h | z3 d H W \}}d||f q6 S )NrO   r   rP   r   r   r   rT      s   & z1ModelBackend._aget_permissions.<locals>.<setcomp>rU   r\   r   r   r   _aget_permissions}   s   

zModelBackend._aget_permissionsc                 C      |  ||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         z!ModelBackend.get_user_permissionsc                       |  ||dI dH S )zSee get_user_permissions().r<   Nra   r   r   r   r   r!         z"ModelBackend.aget_user_permissionsc                 C   rb   )zq
        Return a set of permission strings the user `user_obj` has from the
        groups they belong.
        grouprc   r   r   r   r   r#      rd   z"ModelBackend.get_group_permissionsc                    re   )zSee get_group_permissions().rh   Nrf   r   r   r   r   r$      rg   z#ModelBackend.aget_group_permissionsc                    s8   |j r
|js
|d urt S t|dst ||_|jS )N_perm_cache)r?   rV   r   rW   superr&   ri   r   	__class__r   r   r&      s
   
z ModelBackend.get_all_permissionsc                    s   |j ot j|||dS r%   )r?   rj   r*   r(   rk   r   r   r*      s   zModelBackend.has_permc                    s    |j ot j|||dI d H S r%   )r?   rj   r+   r(   rk   r   r   r+      s   zModelBackend.ahas_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   &    | ]}|d | d  kV  qd S N.indexrQ   r)   	app_labelr   r   	<genexpr>   
    
z0ModelBackend.has_module_perms.<locals>.<genexpr>)r?   anyr&   r   r   rt   r   rs   r   has_module_perms   s   zModelBackend.has_module_permsc                    s*   |j ot fdd| |I dH D S )zSee has_module_perms()c                 3   rm   rn   rp   rr   rs   r   r   ru      rv   z1ModelBackend.ahas_module_perms.<locals>.<genexpr>N)r?   rw   r'   rx   r   rs   r   ahas_module_perms   s   zModelBackend.ahas_module_permsTc           	      C   s   t |trz	|d\}}W n ty   tdw t |ts#td|dur,tj S t	t
ddt	t
ddB }t |trH|t	|jdM }n|t	||d	M }ttj|}|ra|t	d
dO }|durl|t	|dM }tj|S )z
        Return users that have permission "perm". By default, filter out
        inactive users and include superusers.
        ro   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)group__user)r<   r{   )rN   rM   T)rX   )r?   )
isinstancestrsplit
ValueErrorr   	TypeErrorr1   r3   noner   r   r{   r   rG   rH   )	r   r)   r?   include_superusersr   rt   rN   permission_quser_qr   r   r   	with_perm   s0   



zModelBackend.with_permc                 C   s<   z	t jj|d}W n t jy   Y d S w | |r|S d S Nr}   )r1   r3   r0   r5   r8   r   r   r<   r   r   r   r      s   zModelBackend.get_userc                    sD   zt jj|dI d H }W n t jy   Y d S w | |r |S d S r   )r1   r3   agetr5   r8   r   r   r   r   r      s   zModelBackend.aget_user)NNr
   )TTN)r,   r-   r.   __doc__r   r   r8   rE   rJ   r`   ra   r   r!   r#   r$   r&   r*   r+   ry   rz   r   r   r   __classcell__r   r   rk   r   r/   6   s*    





	
#r/   c                   @      e Zd Zdd ZdS )AllowAllUsersModelBackendc                 C      dS NTr   rA   r   r   r   r8      r   z/AllowAllUsersModelBackend.user_can_authenticateNr,   r-   r.   r8   r   r   r   r   r          r   c                   @   s@   e Zd ZdZdZdd Zdd Zdd Zd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di tj|i\}}nztj|}W n
 tjy1   Y nw | j|||d}| 	|rA|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createdr   )
clean_usernamecreate_unknown_userr1   r3   get_or_creater2   r4   r5   configure_userr8   r   r   remote_userr   r<   r:   r   r   r   r   	  s    	

zRemoteUserBackend.authenticatec                    s   |sdS d}d}|  |}| jr#tjjdi tj|iI dH \}}nztj|I dH }W n
 tjy8   Y nw | j|||dI dH }| 	|rK|S dS )zSee authenticate().NFr   r   )
r   r   r1   r3   aget_or_creater2   r=   r5   aconfigure_userr8   r   r   r   r   r   '  s"   

zRemoteUserBackend.aauthenticatec                 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   r   >  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   r   G  s   z RemoteUserBackend.configure_userc                    s   t | j|||I dH S )zSee configure_user()N)r   r   r   r   r   r   r   O  s   z!RemoteUserBackend.aconfigure_userN)T)
r,   r-   r.   r   r   r   r   r   r   r   r   r   r   r   r      s    
	r   c                   @   r   )AllowAllUsersRemoteUserBackendc                 C   r   r   r   rA   r   r   r   r8   U  r   z4AllowAllUsersRemoteUserBackend.user_can_authenticateNr   r   r   r   r   r   T  r   r   N)asgiref.syncr   django.contrib.authr   django.contrib.auth.modelsr   django.db.modelsr   r   r   r1   r   r/   r   r   r   r   r   r   r   <module>   s    , @Z