o
    ÔèFhW!  ã                   @   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   ó   d S ©N© )ÚselfÚrequestÚkwargsr
   r
   úU/var/www/html/loop/nvenv/lib/python3.10/site-packages/django/contrib/auth/backends.pyÚauthenticate	   ó   zBaseBackend.authenticatec                 C   r   r	   r
   )r   Úuser_idr
   r
   r   Úget_user   r   zBaseBackend.get_userNc                 C   ó   t ƒ S r	   ©Úset©r   Úuser_objÚobjr
   r
   r   Úget_user_permissions   ó   z BaseBackend.get_user_permissionsc                 C   r   r	   r   r   r
   r
   r   Úget_group_permissions   r   z!BaseBackend.get_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                 C   s   || j ||d�v S r   )r   ©r   r   Úpermr   r
   r
   r   Úhas_perm   s   zBaseBackend.has_permr	   )	Ú__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   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                 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   r0   r
   r
   r   r-   3   s   z"ModelBackend.user_can_authenticatec                 C   s
   |j  ¡ S r	   )Úuser_permissionsÚall)r   r   r
   r
   r   Ú_get_user_permissions:   s   
z"ModelBackend._get_user_permissionsc                 C   s0   t ƒ j d¡}d| ¡  }tjjdi ||i¤ŽS )NÚgroupsz	group__%sr
   )r   Ú_metaÚ	get_fieldÚrelated_query_namer   ÚobjectsÚfilter)r   r   Úuser_groups_fieldÚuser_groups_queryr
   r
   r   Ú_get_group_permissions=   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.
        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>)r1   Úis_anonymousr   ÚhasattrÚis_superuserr   r;   r5   r2   Úvalues_listÚorder_byÚsetattr)r   r   r   Ú	from_nameÚperm_cache_nameÚpermsr
   r
   r   Ú_get_permissionsB   s   
ÿ
zModelBackend._get_permissionsc                 C   ó   |   ||d¡S )zs
        Return a set of permission strings the user `user_obj` has from their
        `user_permissions`.
        r0   ©rO   r   r
   r
   r   r   W   ó   z!ModelBackend.get_user_permissionsc                 C   rP   )zq
        Return a set of permission strings the user `user_obj` has from the
        groups they belong.
        ÚgrouprQ   r   r
   r
   r   r   ^   rR   z"ModelBackend.get_group_permissionsc                    s8   |j r
|js
|d urtƒ S t|dƒstƒ  |¡|_|jS )NÚ_perm_cache)r1   rF   r   rG   Úsuperr   rT   r   ©Ú	__class__r
   r   r   e   s
   
z ModelBackend.get_all_permissionsc                    s   |j otƒ j|||d�S r   )r1   rU   r    r   rV   r
   r   r    l   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)rB   r   ©Ú	app_labelr
   r   Ú	<genexpr>s   s
   € ÿ
ÿz0ModelBackend.has_module_perms.<locals>.<genexpr>)r1   Úanyr   )r   r   r[   r
   rZ   r   Úhas_module_permso   s   þzModelBackend.has_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.
        rX   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)r0   ©r_   )rA   r@   T)rH   )r1   )Ú
isinstanceÚstrÚsplitÚ
ValueErrorr   Ú	TypeErrorr&   r(   Únoner   r   r_   r   r;   r<   )	r   r   r1   Úinclude_superusersr   r[   rA   Úpermission_qÚuser_qr
   r
   r   Ú	with_permx   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 )Nra   )r&   r(   r%   r*   r-   )r   r   r0   r
   r
   r   r   ›   s   ÿzModelBackend.get_user)NNr	   )TTN)r!   r"   r#   Ú__doc__r   r-   r6   r?   rO   r   r   r   r    r^   rk   r   Ú__classcell__r
   r
   rV   r   r$      s    



	#r$   c                   @   ó   e Zd Zdd„ ZdS )ÚAllowAllUsersModelBackendc                 C   ó   dS ©NTr
   r3   r
   r
   r   r-   ¤   r   z/AllowAllUsersModelBackend.user_can_authenticateN©r!   r"   r#   r-   r
   r
   r
   r   ro   £   ó    ro   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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_userr&   r(   Úget_or_creater'   r)   r*   Úconfigure_userr-   )r   r   Úremote_userru   r0   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   rv   Õ   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   r0   ru   r
   r
   r   ry   Þ   s   z RemoteUserBackend.configure_userN)T)r!   r"   r#   rl   rw   r   rv   ry   r
   r
   r
   r   rt   ¨   s    	rt   c                   @   rn   )ÚAllowAllUsersRemoteUserBackendc                 C   rp   rq   r
   r3   r
   r
   r   r-   è   r   z4AllowAllUsersRemoteUserBackend.user_can_authenticateNrr   r
   r
   r
   r   r{   ç   rs   r{   N)Údjango.contrib.authr   Údjango.contrib.auth.modelsr   Údjango.db.modelsr   r   r   r&   r   r$   ro   rt   r{   r
   r
   r
   r   Ú<module>   s     ?