o
    ǯh                     @   s  U 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mZ d dlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ejZeejeefsYefZdd eD Ze e! e"d< edeeZ#G dd dej$Z%G dd de%Z&e&Z'de#de(fddZ)dS )    )OptionalTypeVar)get_user_model)AbstractBaseUser)gettext_lazy)HTTP_HEADER_ENCODINGauthentication)Request   )AuthenticationFailedInvalidToken
TokenError)	TokenUser)api_settings)Token)get_md5_hash_passwordc                 C   s   h | ]}| tqS  )encoder   ).0hr   r   d/var/www/Befach/backend/venv/lib/python3.10/site-packages/rest_framework_simplejwt/authentication.py	<setcomp>   s    
r   AUTH_HEADER_TYPE_BYTESAuthUserc                       s   e Zd ZdZdZdZd fddZdedee	e
ef  fd	d
ZdedefddZdedefddZdedee fddZdedefddZdede
fddZ  ZS )JWTAuthenticationzy
    An authentication plugin that authenticates requests through a JSON web
    token provided in a request header.
    apizapplication/jsonreturnNc                    s   t  j|i | t | _d S N)super__init__r   
user_model)selfargskwargs	__class__r   r   r   $   s   zJWTAuthentication.__init__requestc                 C   sD   |  |}|d u rd S | |}|d u rd S | |}| ||fS r   )
get_headerget_raw_tokenget_validated_tokenget_user)r!   r&   header	raw_tokenvalidated_tokenr   r   r   authenticate(   s   


zJWTAuthentication.authenticatec                 C   s   d td | jS )Nz{} realm="{}"r   )formatAUTH_HEADER_TYPESwww_authenticate_realm)r!   r&   r   r   r   authenticate_header5   s   z%JWTAuthentication.authenticate_headerc                 C   s&   |j tj}t|tr|t}|S )zc
        Extracts the header containing the JSON web token from the given
        request.
        )METAgetr   AUTH_HEADER_NAME
isinstancestrr   r   )r!   r&   r+   r   r   r   r'   ;   s   

zJWTAuthentication.get_headerr+   c                 C   sL   |  }t|dkrdS |d tvrdS t|dkr"ttddd|d S )zm
        Extracts an unvalidated JSON web token from the given "Authorization"
        header value.
        r   N   z<Authorization header must contain two space-delimited valuesbad_authorization_headercoder
   )splitlenr   r   _)r!   r+   partsr   r   r   r(   H   s   zJWTAuthentication.get_raw_tokenr,   c                 C   sp   g }t jD ])}z||W   S  ty. } z||j|j|jd d W Y d}~qd}~ww ttd|d)zk
        Validates an encoded JSON web token and returns a validated token
        wrapper object.
        r   )token_class
token_typemessageNz(Given token not valid for any token type)detailmessages)	r   AUTH_TOKEN_CLASSESr   append__name__rA   r"   r   r>   )r!   r,   rD   	AuthTokener   r   r   r)   _   s$   
	z%JWTAuthentication.get_validated_tokenr-   c                 C   s   z|t j }W n ty   ttdw z| jjjd
i t j|i}W n | jj	y5   t
tdddw t jrD|jsDt
tdddt jrZ|t jt|jkrZt
tddd|S )zU
        Attempts to find and return a user using the given validated token.
        3Token contained no recognizable user identificationzUser not founduser_not_foundr:   zUser is inactiveuser_inactivez%The user's password has been changed.password_changedNr   )r   USER_ID_CLAIMKeyErrorr   r>   r    objectsr4   USER_ID_FIELDDoesNotExistr   CHECK_USER_IS_ACTIVE	is_activeCHECK_REVOKE_TOKENREVOKE_TOKEN_CLAIMr   password)r!   r-   user_iduserr   r   r   r*   x   s,   zJWTAuthentication.get_user)r   N)rG   
__module____qualname____doc__r1   
media_typer   r	   r   tupler   r   r.   r7   r2   bytesr'   r(   r)   r*   __classcell__r   r   r$   r   r      s    r   c                   @   s"   e Zd ZdZdedefddZdS )JWTStatelessUserAuthenticationz
    An authentication plugin that authenticates requests through a JSON web
    token provided in a request header without performing a database lookup to obtain a user instance.
    r-   r   c                 C   s    t j|vrttdt |S )zg
        Returns a stateless user object which is backed by the given validated
        token.
        rJ   )r   rN   r   r>   TOKEN_USER_CLASS)r!   r-   r   r   r   r*      s   

z'JWTStatelessUserAuthentication.get_userN)rG   rZ   r[   r\   r   r   r*   r   r   r   r   ra      s    ra   rY   r   c                 C   s   | d uo
t j p
| jS r   )r   rS   rT   )rY   r   r   r    default_user_authentication_rule   s   rc   N)*typingr   r   django.contrib.authr   django.contrib.auth.modelsr   django.utils.translationr   r>   rest_frameworkr   r   rest_framework.requestr	   
exceptionsr   r   r   modelsr   settingsr   tokensr   utilsr   r0   r6   listr^   r   setr_   __annotations__r   BaseAuthenticationr   ra   JWTTokenUserAuthenticationboolrc   r   r   r   r   <module>   s,    y