
    ^f;                         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 Z G d d	e          Z G d
 d          Z G d de          Z G d de          Z G d de          Z G d de          ZdS )z+
Provides various authentication policies.
    N)authenticateget_user_model)CsrfViewMiddleware)gettext_lazy)HTTP_HEADER_ENCODING
exceptionsc                     | 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.
    HTTP_AUTHORIZATION    )METAget
isinstancestrencoder   )requestauths     O/var/www/html/env/lib/python3.11/site-packages/rest_framework/authentication.pyget_authorization_headerr      sE     <0#66D$ 1{{/00Kr   c                       e Zd Zd ZdS )	CSRFCheckc                     |S N )selfr   reasons      r   _rejectzCSRFCheck._reject   s    r   N)__name__
__module____qualname__r   r   r   r   r   r      s#            r   r   c                       e Zd ZdZd Zd ZdS )BaseAuthenticationzF
    All authentication classes should extend BaseAuthentication.
    c                      t          d          )zS
        Authenticate the request and return a two-tuple of (user, token).
        z#.authenticate() must be overridden.)NotImplementedErrorr   r   s     r   r   zBaseAuthentication.authenticate&   s     ""GHHHr   c                     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$   s     r   authenticate_headerz&BaseAuthentication.authenticate_header,   s	     	r   N)r   r   r   __doc__r   r&   r   r   r   r!   r!   !   s?         I I I    r   r!   c                   *    e Zd ZdZdZd ZddZd ZdS )BasicAuthenticationz>
    HTTP Basic authentication against username/password.
    apic                 :   t          |                                          }|r|d                                         dk    rdS t          |          dk    r#t	          d          }t          j        |          t          |          dk    r#t	          d          }t          j        |          	 	 t          j        |d                   	                    d          }n=# t          $ r0 t          j        |d                   	                    d	          }Y nw xY w|                    d
          }nC# t          t          t          j        f$ r$ t	          d          }t          j        |          w xY w|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   msgauth_decoded
auth_partsuseridpasswords           r   r   z BasicAuthentication.authenticate;   s   
 (006688 	tAw}}(224t99>>DEEC1#666YY]]YZZC1#666	7K%/Q88??HH% K K K%/Q88??	JJK%//44JJ-x~> 	7 	7 	7UVVC1#666	7 &a=*Q-,,VXwGGGs+   2-C  D3  7DD3 DD3 3A E3Nc                     t                      j        |d|i}t          dd|i|}|!t          j        t          d                    |j        s!t          j        t          d                    |dfS )z
        Authenticate the userid and password against username and password
        with optional request for context.
        rA   r   NzInvalid username/password.User inactive or deleted.r   )r   USERNAME_FIELDr   r   r3   r2   	is_active)r   r@   rA   r   credentialsusers         r   r<   z,BasicAuthentication.authenticate_credentialsY   s     +V
 ;;G;{;;<1!4P2Q2QRRR~ 	R1!4O2P2PQQQd|r   c                     d| j         z  S )NzBasic realm="%s")www_authenticate_realmr$   s     r   r&   z'BasicAuthentication.authenticate_headerl   s    !D$???r   r   )r   r   r   r'   rI   r   r<   r&   r   r   r   r)   r)   5   s`          #H H H<   &@ @ @ @ @r   r)   c                       e Zd ZdZd Zd ZdS )SessionAuthenticationz<
    Use Django's session framework for authentication.
    c                 v    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`.
        rG   N)getattr_requestrE   enforce_csrfr   r   rG   s      r   r   z"SessionAuthentication.authenticateu   sP     w'66  	4> 	4'""" d|r   c                     d }t          |          }|                    |           |                    |ddi           }|rt          j        d|z            dS )zK
        Enforce CSRF validation for session based authentication.
        c                     d S r   r   )r   s    r   dummy_get_responsez>SessionAuthentication.enforce_csrf.<locals>.dummy_get_response   s    4r   Nr   zCSRF Failed: %s)r   process_requestprocess_viewr   PermissionDenied)r   r   rS   checkr   s        r   rO   z"SessionAuthentication.enforce_csrf   sz    	 	 	 ,--g&&&##GT2r:: 	J-.?&.HIII	J 	Jr   N)r   r   r   r'   r   rO   r   r   r   rK   rK   p   sA           $J J J J Jr   rK   c                   4    e Zd ZdZdZdZd Z	 d Zd Z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                 .    | j         | j         S ddlm} |S )Nr   )rZ   )modelrest_framework.authtoken.modelsrZ   )r   rZ   s     r   	get_modelzTokenAuthentication.get_model   s)    :!:999999r   c                 v   t          |                                          }|rG|d                                         | j                                                                        k    rd S t          |          dk    r#t          d          }t          j        |          t          |          dk    r#t          d          }t          j        |          	 |d         	                                }n1# t          $ r$ t          d          }t          j        |          w xY w|                     |          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/   r0   keywordr   r1   r2   r   r3   r6   UnicodeErrorr<   )r   r   r   r=   tokens        r   r   z TokenAuthentication.authenticate   s   '006688 	tAw}}$,*<*<*>*>*E*E*G*GGG4t99>>DEEC1#666YY]]STTC1#666	7GNN$$EE 	7 	7 	7_``C1#666	7 ,,U333s   C5 5.D#c                 T   |                                  }	 |j                            d                              |          }n/# |j        $ r" t          j        t          d                    w xY w|j        j	        s!t          j        t          d                    |j        |fS )NrG   )keyzInvalid token.rC   )
r^   objectsselect_relatedr   DoesNotExistr   r3   r2   rG   rE   )r   rd   r\   rb   s       r   r<   z,TokenAuthentication.authenticate_credentials   s      	GM0088<<<EEEE! 	G 	G 	G1!4D2E2EFFF	G z# 	R1!4O2P2PQQQ
E""s   .A ,A1c                     | j         S r   )r`   r$   s     r   r&   z'TokenAuthentication.authenticate_header   s
    |r   )
r   r   r   r'   r`   r\   r^   r   r<   r&   r   r   r   rY   rY      sk          GE  4 4 4*
# 
# 
#    r   rY   c                       e Zd ZdZdZ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                     t          ||j                            | j                            }|r|j        r|d fS d S d S )N)r   remote_user)r   r   r   headerrE   rP   s      r   r   z%RemoteUserAuthentication.authenticate   sU    G9I9I$+9V9VWWW 	 DN 	 $<	  	  	  	 r   N)r   r   r   r'   rn   r   r   r   r   rj   rj      s4          F         r   rj   )r'   r4   r:   django.contrib.authr   r   django.middleware.csrfr   django.utils.translationr   r2   rest_frameworkr   r   r   r   r!   r)   rK   rY   rj   r   r   r   <module>rs      s      < < < < < < < < 5 5 5 5 5 5 6 6 6 6 6 6 ; ; ; ; ; ; ; ;
 
 
    "          (8@ 8@ 8@ 8@ 8@, 8@ 8@ 8@v$J $J $J $J $J. $J $J $JN< < < < <, < < <~         1          r   