o
    <g.                     @   s   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ dd Z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 )    )partial)urlparse)settings)auth)REDIRECT_FIELD_NAMEload_backend)RemoteUserBackend)redirect_to_login)ImproperlyConfigured)resolve_url)MiddlewareMixin)SimpleLazyObjectc                 C   s   t | dst| | _| jS )N_cached_user)hasattrr   get_userr   request r   Q/var/www/html/venv/lib/python3.10/site-packages/django/contrib/auth/middleware.pyr      s   
r   c                    s$   t | dst| I d H | _| jS )N_acached_user)r   r   	aget_userr   r   r   r   r   auser   s   
r   c                   @   s   e Zd Zdd ZdS )AuthenticationMiddlewarec                    s4   t  ds	tdt fdd _tt  _d S )NsessionzThe Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE setting to insert 'django.contrib.sessions.middleware.SessionMiddleware' before 'django.contrib.auth.middleware.AuthenticationMiddleware'.c                      s   t  S )N)r   r   r   r   r   <lambda>%   s    z:AuthenticationMiddleware.process_request.<locals>.<lambda>)r   r
   r   userr   r   )selfr   r   r   r   process_request   s   
z(AuthenticationMiddleware.process_requestN)__name__
__module____qualname__r   r   r   r   r   r      s    r   c                   @   s4   e Zd ZdZeZdd Zdd Zdd Zdd	 Z	d
S )LoginRequiredMiddlewarez
    Middleware that redirects all unauthenticated requests to a login page.

    Views using the login_not_required decorator will not be redirected.
    c                 C   s(   |j jrd S t|ddsd S | ||S )Nlogin_requiredT)r   is_authenticatedgetattrhandle_no_permission)r   r   	view_func	view_argsview_kwargsr   r   r   process_view2   s
   z$LoginRequiredMiddleware.process_viewc                 C   s&   t |dd ptj}|stdt|S )N	login_urlzNo login URL to redirect to. Define settings.LOGIN_URL or provide a login_url via the 'django.contrib.auth.decorators.login_required' decorator.)r$   r   	LOGIN_URLr
   str)r   r&   r*   r   r   r   get_login_url;   s   z%LoginRequiredMiddleware.get_login_urlc                 C   s   t |d| jS )Nredirect_field_name)r$   r.   )r   r&   r   r   r   get_redirect_field_nameE   s   z/LoginRequiredMiddleware.get_redirect_field_namec           	      C   sp   |  }t| |}t|d d \}}t|d d \}}|r%||kr/|r+||kr/| }t||| |S )N   )build_absolute_urir   r-   r   get_full_pathr	   r/   )	r   r   r&   pathresolved_login_urllogin_schemelogin_netloccurrent_schemecurrent_netlocr   r   r   r%   H   s   z,LoginRequiredMiddleware.handle_no_permissionN)
r   r   r    __doc__r   r.   r)   r-   r/   r%   r   r   r   r   r!   )   s    	
r!   c                   @   s0   e Zd ZdZdZdZdd Zdd Zdd	 Zd
S )RemoteUserMiddlewarea  
    Middleware for utilizing web-server-provided authentication.

    If request.user is not authenticated, then this middleware attempts to
    authenticate the username passed in the ``REMOTE_USER`` request header.
    If authentication is successful, the user is automatically logged in to
    persist the user in the session.

    The header used is configurable and defaults to ``REMOTE_USER``.  Subclass
    this class and change the ``header`` attribute if you need to use a
    different header.
    REMOTE_USERTc                 C   s   t |ds	tdz|j| j }W n ty'   | jr$|jjr$| | Y d S w |jjr>|j	 | 
||kr9d S | | tj||d}|rR||_t|| d S d S )Nr   zThe Django remote user auth middleware requires the authentication middleware to be installed.  Edit your MIDDLEWARE setting to insert 'django.contrib.auth.middleware.AuthenticationMiddleware' before the RemoteUserMiddleware class.)remote_user)r   r
   METAheaderKeyErrorforce_logout_if_no_headerr   r#   _remove_invalid_userget_usernameclean_usernamer   authenticatelogin)r   r   usernamer   r   r   r   r   o   s(   



z$RemoteUserMiddleware.process_requestc                 C   s<   |j tj }t|}z||}W |S  ty   Y |S w )zr
        Allow the backend to clean the username, if the backend defines a
        clean_username method.
        )r   r   BACKEND_SESSION_KEYr   rC   AttributeError)r   rF   r   backend_strbackendr   r   r   rC      s   
z#RemoteUserMiddleware.clean_usernamec                 C   sT   zt |jtjd}W n ty   t| Y dS w t|tr(t| dS dS )z
        Remove the current authenticated user in the request which is invalid
        but only if the user is authenticated via the RemoteUserBackend.
         N)	r   r   getr   rG   ImportErrorlogout
isinstancer   )r   r   stored_backendr   r   r   rA      s   
z)RemoteUserMiddleware._remove_invalid_userN)	r   r   r    r9   r>   r@   r   rC   rA   r   r   r   r   r:   [   s    'r:   c                   @   s   e Zd ZdZdZdS )PersistentRemoteUserMiddlewarea  
    Middleware for web-server provided authentication on logon pages.

    Like RemoteUserMiddleware but keeps the user authenticated even if
    the header (``REMOTE_USER``) is not found in the request. Useful
    for setups when the external authentication via ``REMOTE_USER``
    is only expected to happen on some "logon" URL and the rest of
    the application wants to use Django's authentication mechanism.
    FN)r   r   r    r9   r@   r   r   r   r   rQ      s    
rQ   N)	functoolsr   urllib.parser   django.confr   django.contribr   django.contrib.authr   r   django.contrib.auth.backendsr   django.contrib.auth.viewsr	   django.core.exceptionsr
   django.shortcutsr   django.utils.deprecationr   django.utils.functionalr   r   r   r   r!   r:   rQ   r   r   r   r   <module>   s"    2Y