a
    Sic;                     @   s   d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z
 ddlmZmZ dd ZG d	d
 d
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 )z+
Provides various authentication policies.
    N)authenticateget_user_model)CsrfViewMiddleware)gettext_lazy)HTTP_HEADER_ENCODING
exceptionsc                 C   s&   | j dd}t|tr"|t}|S )z
    Return request's 'Authorization:' header, as a bytestring.

    Hide some test client ickyness where the header can be unicode.
    ZHTTP_AUTHORIZATION    )METAget
isinstancestrencoder   )requestauth r   Y/var/www/html/django/DPS/env/lib/python3.9/site-packages/rest_framework/authentication.pyget_authorization_header   s    

r   c                   @   s   e Zd Zdd ZdS )	CSRFCheckc                 C   s   |S Nr   )selfr   reasonr   r   r   _reject   s    zCSRFCheck._rejectN)__name__
__module____qualname__r   r   r   r   r   r      s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )BaseAuthenticationzF
    All authentication classes should extend BaseAuthentication.
    c                 C   s   t ddS )zS
        Authenticate the request and return a two-tuple of (user, token).
        z#.authenticate() must be overridden.N)NotImplementedErrorr   r   r   r   r   r   &   s    zBaseAuthentication.authenticatec                 C   s   dS )z
        Return a string to be used as the value of the `WWW-Authenticate`
        header in a `401 Unauthenticated` response, or `None` if the
        authentication scheme should return `403 Permission Denied` responses.
        Nr   r   r   r   r   authenticate_header,   s    z&BaseAuthentication.authenticate_headerN)r   r   r   __doc__r   r   r   r   r   r   r   !   s   r   c                   @   s.   e Zd ZdZdZdd Zd
ddZdd	 ZdS )BasicAuthenticationz>
    HTTP Basic authentication against username/password.
    apic              
   C   s   t | }|r |d  dkr$dS t|dkrDtd}t|nt|dkrbtd}t|zNzt|d 	d}W n& t
y   t|d 	d	}Y n0 |d
}W n, tt
tjfy   td}t|Y n0 |d |d  }}| |||S )z
        Returns a `User` if a correct username and password have been supplied
        using HTTP Basic authentication.  Otherwise returns `None`.
        r   s   basicN   z.Invalid basic header. No credentials provided.   zCInvalid basic header. Credentials string should not contain spaces.zutf-8zlatin-1:z?Invalid basic header. Credentials not correctly base64 encoded.)r   splitlowerlen_r   AuthenticationFailedbase64	b64decodedecodeUnicodeDecodeError	partition	TypeErrorbinasciiErrorauthenticate_credentials)r   r   r   msgZauth_decodedZ
auth_partsuseridpasswordr   r   r   r   ;   s(    
z BasicAuthentication.authenticateNc                 C   sT   t  j|d|i}tf d|i|}|du r8ttd|jsLttd|dfS )z
        Authenticate the userid and password against username and password
        with optional request for context.
        r5   r   NzInvalid username/password.User inactive or deleted.)r   USERNAME_FIELDr   r   r)   r(   	is_active)r   r4   r5   r   credentialsuserr   r   r   r2   Y   s    z,BasicAuthentication.authenticate_credentialsc                 C   s
   d| j  S )NzBasic realm="%s")www_authenticate_realmr   r   r   r   r   l   s    z'BasicAuthentication.authenticate_header)N)r   r   r   r   r;   r   r2   r   r   r   r   r   r    5   s
   
r    c                   @   s    e Zd ZdZdd Zdd ZdS )SessionAuthenticationz<
    Use Django's session framework for authentication.
    c                 C   s.   t |jdd}|r|jsdS | | |dfS )z{
        Returns a `User` if the request session currently has a logged in user.
        Otherwise returns `None`.
        r:   N)getattr_requestr8   enforce_csrfr   r   r:   r   r   r   r   u   s
    

z"SessionAuthentication.authenticatec                 C   s@   dd }t |}|| ||ddi }|r<td| dS )zK
        Enforce CSRF validation for session based authentication.
        c                 S   s   d S r   r   )r   r   r   r   dummy_get_response   s    z>SessionAuthentication.enforce_csrf.<locals>.dummy_get_responseNr   zCSRF Failed: %s)r   process_requestprocess_viewr   PermissionDenied)r   r   rA   checkr   r   r   r   r?      s    
z"SessionAuthentication.enforce_csrfN)r   r   r   r   r   r?   r   r   r   r   r<   p   s   r<   c                   @   s8   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dS )TokenAuthenticationa  
    Simple token based authentication.

    Clients should authenticate by passing the token key in the "Authorization"
    HTTP header, prepended with the string "Token ".  For example:

        Authorization: Token 401f7ac837da42b97f613d789819ff93537bee6a
    TokenNc                 C   s    | j d ur| j S ddlm} |S )Nr   )rG   )modelZrest_framework.authtoken.modelsrG   )r   rG   r   r   r   	get_model   s    
zTokenAuthentication.get_modelc                 C   s   t | }|r*|d  | j  kr.d S t|dkrNtd}t|nt|dkrltd}t|z|d 	 }W n$ t
y   td}t|Y n0 | |S )Nr   r"   z.Invalid token header. No credentials provided.r#   z=Invalid token header. Token string should not contain spaces.zIInvalid token header. Token string should not contain invalid characters.)r   r%   r&   keywordr   r'   r(   r   r)   r,   UnicodeErrorr2   )r   r   r   r3   tokenr   r   r   r      s    
z TokenAuthentication.authenticatec                 C   sd   |   }z|jdj|d}W n" |jyB   ttdY n0 |jj	sZttd|j|fS )Nr:   )keyzInvalid token.r6   )
rI   objectsselect_relatedr
   DoesNotExistr   r)   r(   r:   r8   )r   rM   rH   rL   r   r   r   r2      s    z,TokenAuthentication.authenticate_credentialsc                 C   s   | j S r   )rJ   r   r   r   r   r      s    z'TokenAuthentication.authenticate_header)
r   r   r   r   rJ   rH   rI   r   r2   r   r   r   r   r   rF      s   	rF   c                   @   s   e Zd ZdZdZdd ZdS )RemoteUserAuthenticationa  
    REMOTE_USER authentication.

    To use this, set up your web server to perform authentication, which will
    set the REMOTE_USER environment variable. You will need to have
    'django.contrib.auth.backends.RemoteUserBackend in your
    AUTHENTICATION_BACKENDS setting
    REMOTE_USERc                 C   s,   t ||j| jd}|r(|jr(|d fS d S )N)r   remote_user)r   r	   r
   headerr8   r@   r   r   r   r      s    
z%RemoteUserAuthentication.authenticateN)r   r   r   r   rT   r   r   r   r   r   rQ      s   rQ   )r   r*   r0   django.contrib.authr   r   django.middleware.csrfr   django.utils.translationr   r(   rest_frameworkr   r   r   r   r   r    r<   rF   rQ   r   r   r   r   <module>   s   ;'?