o
     eW                     @   s  U d dl mZ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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s]e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SetTuple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   Z/var/www/html/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__rC   r$   r   r@   )r#   r.   rF   	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 |jsAt
tdddt jrW|t jt|jkrWt
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"   objectsr6   USER_ID_FIELDDoesNotExistr   	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)rI   
__module____qualname____doc__r3   
media_typer!   r   r   r   r   r   r0   r9   r4   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.
        rL   )r   rP   r   r@   TOKEN_USER_CLASS)r#   r/   r   r   r   r,      s   

z'JWTStatelessUserAuthentication.get_userN)rI   r[   r\   r]   r   r   r,   r   r   r   r   ra      s    ra   rZ   r   c                 C   s   | d uo| j S r   )rU   )rZ   r   r   r    default_user_authentication_rule   s   rc   N)+typingr   r   r   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   r2   r8   listtupler   r_   __annotations__r   BaseAuthenticationr   ra   JWTTokenUserAuthenticationboolrc   r   r   r   r   <module>   s,    y